Selenium / python - 单击特定div中的所有元素

时间:2017-08-22 04:32:10

标签: python selenium web-scraping web-crawler

我正在学习使用selenium并尝试使用其中一个SAP页面。

链接是: https://help.sap.com/viewer/2e167338c1b24da9b2a94e68efd79c42/4.2.4/en-US/

我打算做的是在目录面板上显示此页面的所有叶子/最后一级网址。不幸的是,链接不是html,只有当我们点击左侧面板上的每个侧面按钮时,它才会展开,同样,每次点击按钮都可以有更多的嵌套按钮!我需要点击所有这些并获取基础数据。

我首先确定xpath并尝试点击它们,但它会出现以下错误:

import time
driver = webdriver.Chrome("/Users/tarun/Downloads/chromedriver")

driver.get("https://help.sap.com/viewer/2e167338c1b24da9b2a94e68efd79c42/4.2.4/en-US/")
time.sleep(20) #tried this
htmlSource = driver.page_source

buttonsSidePanel = driver.find_elements_by_xpath('//*[@id="toc"]/treecontrol/div/div[*]/div[1]/div[1]')
#also tried - //*[@id="toc"]/treecontrol/div/div[*]/div[1]/div[1]/span[1]
for x in buttonsSidePanel:
    x.click()
    time.sleep(1)


driver.close()

错误:ElementNotVisibleException: Message: element not visible

我在这方面有几个问题(道歉,如果其中一些是天真的)  1.)当我检查元素时,元素在html中可见!我无法弄清楚它做错了什么?

  1. 此外,如果按钮单击显示更多按钮,或者有什么方法可以一次单击所有按钮然后刮取数据,我如何递归地单击基础按钮?我查看了一些stackoverflow问题,但无法解决我的任务
  2. 3.)点击按钮后,现在我们如何抓取新生成的内容?

2 个答案:

答案 0 :(得分:1)

这可能是因为请求的元素不会立即可见,连接会继续。

尝试使用预期条件等待(EC等待)。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
button = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, '//*[@id="toc"]/treecontrol/div/div[*]/div[1]/div[1]')))

这将等到元素可见,然后执行进一步的步骤。

答案 1 :(得分:1)

您可以尝试使用selenium的execute_script运行简单的js脚本。 试试这个。你可以识别使用类名。

jscode='''
var allButtons=document.getElementsByClassName('collapseicon');
for( b of allButtons){
   b.click();
 }
'''

driver.execute_script(jscode);

另外要包括孩子下载,你在下面的调用中得到所有的页面内容/响应,请求模块检查这个,

import requests
url = "https://help.sap.com/http.svc/getpagecontent?deliverableInfo=1&deliverable_loio=2e167338c1b24da9b2a94e68efd79c42&language=en-US&state=PRODUCTION&toc=1&version=4.2.4"
r = requests.get(url)
print (r.json())