我正在学习使用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中可见!我无法弄清楚它做错了什么?
3.)点击按钮后,现在我们如何抓取新生成的内容?
答案 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())