如果在 Python 中使用 selenium 找不到元素,则继续执行脚本
·
回答问题
如果在 Python 中使用 selenium 找不到元素,我很难弄清楚如何继续执行脚本。
此代码循环浏览报告,找到刷新按钮,然后单击下载按钮。唯一的问题是,有些报告没有刷新按钮。所以,如果找不到按钮,我希望脚本继续。
我还是 python/selenium 的新手,所以这就是我发布整个代码的原因。我需要知道要让这项工作顺利进行!提前感谢您对这个头部撞击问题的帮助
这是 selenium 尝试单击刷新按钮的地方
browser.find_element_by_css_selector("#ctl00_PlaceHolderMain_ReportViewer1_HtmlOutputReportResults2_updateFilters_TitleAnchor").click()
完整代码:
import time
import os
import os.path
import glob
import shutil
from selenium.webdriver.common.action_chains import ActionChains
from selenium.common.exceptions import MoveTargetOutOfBoundsException
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
files = glob.glob('/Users/me/Desktop/AUTOREPORTS/*')
for f in files:
os.remove(f)
open('/Users/me/Desktop/AUTOREPORTS/report.csv', "w")
for x in range(1, 73):
while True:
try:
fp = webdriver.FirefoxProfile('C:/Users/me/Documents/FirefoxProfile')
browser = webdriver.Firefox(fp)
browser.get('https://websitething.com/')
time.sleep(8)
browser.find_element_by_id("ctl00_PlaceHolderMain_login_UserName").clear()
browser.find_element_by_id("ctl00_PlaceHolderMain_login_UserName").send_keys("usr")
browser.find_element_by_id("ctl00_PlaceHolderMain_login_password").clear()
browser.find_element_by_id("ctl00_PlaceHolderMain_login_password").send_keys("paswd")
browser.find_element_by_id("ctl00_PlaceHolderMain_login_login").click()
#gets user to reporting front end
ReportMgr= browser.find_element_by_partial_link_text('Report Manager')
ReportMgr.click()
time.sleep(5)
CustomReport= browser.find_element_by_partial_link_text('Custom Report')
CustomReport.click()
time.sleep(5)
ProgramManagement= browser.find_element_by_partial_link_text('Program Management')
ProgramManagement.click()
ProgramManagement= browser.find_element_by_partial_link_text('Program Management').send_keys(Keys.ARROW_LEFT)
#pulls reports
browser.find_element_by_partial_link_text('Program Management').click()
time.sleep(60)
browser.find_element_by_partial_link_text('Program Management').send_keys(Keys.ARROW_DOWN * x, Keys.ENTER)
time.sleep(60)
browser.find_element_by_css_selector("#ctl00_PlaceHolderMain_ReportViewer1_HtmlOutputReportResults2_updateFilters_TitleAnchor").click()
time.sleep(60)
browser.find_element_by_css_selector("#ctl00_PlaceHolderMain_ReportViewer1_HtmlOutputReportResults2_CSVButton_ImageAnchor > img").click()
fname = "Report(%s).csv" % (x)
os.chdir('/Users/me/Desktop/AUTOREPORTS')
time.sleep(60)
#browser.find_element_by_partial_link_text('Program Management').click()
#time.sleep(30)
browser.quit()
except:
browser.quit()
continue
else:
break
Answers
使用try/except块来处理异常并继续。
try:
browser.find_element_by_css_selector("#ctl00_PlaceHolderMain_ReportViewer1_HtmlOutputReportResults2_updateFilters_TitleAnchor").click()
except NoSuchElementException:
# do stuff
请注意,Florent B. 的答案将在页面上找到多个元素而不是一个。因此,根据您需要查找的内容以及它们的数量,它可能会导致较小的性能问题。如果您确实需要找到多个元素,他的解决方案将可以正常工作,但是对于 OP 的问题,最佳实践要求我们使用旨在处理手头任务的方法,而不是旨在处理多个相同任务的方法。这就像贪婪匹配与使用正则表达式的懒惰匹配。如果您只需要第一个匹配项,请编写一个惰性模式,它会更有效,即使编写贪心模式在技术上仍然有效。
更多推荐

所有评论(0)