如果在 Python 中使用 selenium 找不到元素,则继续执行脚本

Yog*_*tup 6 python selenium

如果在 Python 中使用 selenium 找不到元素,我无法弄清楚如何继续执行脚本。

此代码循环浏览报告,找到刷新按钮,然后单击下载按钮。唯一的问题是,有些报告没有刷新按钮。因此,如果找不到按钮,我希望脚本继续。

我对 python/selenium 还是个新手,所以这就是我发布整个代码的原因。我需要知道要插入什么才能完成这项工作!预先感谢您对这个头部撞击问题的帮助

这是 selenium 尝试点击刷新按钮的地方

browser.find_element_by_css_selector("#ctl00_PlaceHolderMain_ReportViewer1_HtmlOutputReportResults2_updateFilters_TitleAnchor").click()
Run Code Online (Sandbox Code Playgroud)

完整代码:

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
Run Code Online (Sandbox Code Playgroud)

Duc*_*her 8

使用try/except块来处理异常并继续。

try:
    browser.find_element_by_css_selector("#ctl00_PlaceHolderMain_ReportViewer1_HtmlOutputReportResults2_updateFilters_TitleAnchor").click()
except NoSuchElementException:
    # do stuff
Run Code Online (Sandbox Code Playgroud)

请注意,Florent B. 的答案将在页面上找到多个元素,而不是一个。因此,根据您需要查找的内容以及其中的数量,这可能会导致较小的性能问题。如果您实际上需要查找多个元素,他的解决方案将很好地工作,但对于OP的问题,最佳实践表明我们使用旨在处理手头任务的方法,而不是设计用于处理多个同一任务的方法。这就像正则表达式的贪婪匹配与惰性匹配。如果您只需要第一个匹配,那么编写一个惰性模式会更有效,即使编写贪婪模式在技术上仍然可行。