Python Selenium:检查元素是否存在于循环中,如果为true,请单击,如果不存在,请继续

Python Selenium:检查元素是否存在于循环中,如果为true,请单击,如果不存在,请继续,python,selenium,Python,Selenium,我正试图解决一个问题,这个问题我想不起来硒的最佳解决方案是什么 我想检查元素是否存在并显示。如果是,请单击它并关闭它,然后继续执行其余代码。我想对每个循环进行评估,以查看我的列表 截至目前的示例/伪代码: …我将把包装在try,catch语句中。通过这种方式,您可以尝试在每个循环中单击元素,但捕获当元素不存在/可见时引发的异常 注意:如果使用的是隐式等待,则每个元素检查都将进行 无论您将隐式等待设置为多少秒。我不会 建议在应用程序中使用隐式,并使用显式等待 Selenium脚本。您将在这两个页

我正试图解决一个问题,这个问题我想不起来硒的最佳解决方案是什么

我想检查元素是否存在并显示。如果是,请单击它并关闭它,然后继续执行其余代码。我想对每个循环进行评估,以查看我的列表

截至目前的示例/伪代码:


我将把
包装在try,catch语句中。通过这种方式,您可以尝试在每个循环中单击元素,但捕获当元素不存在/可见时引发的异常

注意:如果使用的是隐式等待,则每个元素检查都将进行 无论您将隐式等待设置为多少秒。我不会 建议在应用程序中使用隐式,并使用显式等待 Selenium脚本。您将在这两个页面上找到文档

以下是使用您的示例的示例:

from selenium.common.exceptions import NoSuchElementException, ElementNotVisibleException

for i in (urlList):
    browser.get(i)
    try:
        browser.find_element_by_xpath(".//div[contains(@class,'wizard-tooltip-btn skip')]").click()
    except (ElementNotVisibleException, NoSuchElementException):
        pass
    browser.find_element_by_xpath(".//div[@data-name='data-window']").click()
    title_element = browser.find_element_by_class_name('pane-legend-title__description')
    ticker = browser.find_element_by_class_name('chart-data-window-header')
    tickerClean = ticker.text.split(',')[0]
    latestClose = browser.find_element_by_xpath('/html/body/div[1]/div[3]/div/div[1]/div[1]/div[3]/div/div[2]/div[1]/div[1]/div[2]/div[4]/div[2]')
    latestBase = browser.find_element_by_xpath('/html/body/div[1]/div[3]/div/div[1]/div[1]/div[3]/div/div[2]/div[1]/div[3]/div[2]/div[9]/div[2]/span')
    data.append(title_element.text + ',' + tickerClean + ',' + latestBase.text + ',' + latestClose.text)
    print('Done' + title_element.text + ',' + tickerClean + ',' + latestBase.text + ',' + latestClose.text)
如果您反对try,catch
方法,并且不想处理捕获异常,您可以使用
find_elements
真实地检查列表中元素的存在性,并在通过时单击它,如下所示:

for i in (urlList):
    browser.get(i)
    if browser.find_elements_by_xpath(".//div[contains(@class,'wizard-tooltip-btn skip')]"):
        browser.find_element_by_xpath(".//div[contains(@class,'wizard-tooltip-btn skip')]").click()
    browser.find_element_by_xpath(".//div[@data-name='data-window']").click()
    title_element = browser.find_element_by_class_name('pane-legend-title__description')
    ticker = browser.find_element_by_class_name('chart-data-window-header')
    tickerClean = ticker.text.split(',')[0]
    latestClose = browser.find_element_by_xpath('/html/body/div[1]/div[3]/div/div[1]/div[1]/div[3]/div/div[2]/div[1]/div[1]/div[2]/div[4]/div[2]')
    latestBase = browser.find_element_by_xpath('/html/body/div[1]/div[3]/div/div[1]/div[1]/div[3]/div/div[2]/div[1]/div[3]/div[2]/div[9]/div[2]/span')
    data.append(title_element.text + ',' + tickerClean + ',' + latestBase.text + ',' + latestClose.text)
    print('Done' + title_element.text + ',' + tickerClean + ',' + latestBase.text + ',' + latestClose.text)
我无法从问题的措辞判断,但如果在找到并单击元素后,确实想要运行循环中的其余语句,请在它传递到您选择的任何示例后添加
continue
,例如:

try:
    browser.find_element_by_xpath(".//div[contains(@class,'wizard-tooltip-btn skip')]").click()
    continue
except (ElementNotVisibleException, NoSuchElementException):
    pass
或:


continue
将转到循环中的下一项,而不在单击后运行语句。

这不会像您预期的那样移动,您将遇到隐式等待。仅当您将
implicitwait
设置为大于默认值
0
。我会写一个注释来注意这一点。他们不能对每一行代码都使用显式等待,所以隐式等待是最好的。但是由于使用隐式等待,我们需要面对这些后果。如果元素的负载在pageload之外,则只需要使用AJAX之类的动态事件等待元素存在。在这种情况下,我强烈建议对每个加载使用
显式
等待事件。我不使用隐式,并且使用selenium编写了数千行代码,因此您可以对每个需要它的元素使用
WebDriverWait
。无论如何,我不会面临这个问题,因为我使用的是位于selenium顶部的WATIR,它不使用这个驱动程序级别的等待,它的核心是显式的等待。所以我可以检查b元素是否存在?同时,我不会放弃等待元素存在和元素可见的过程。只有当我们自动化非常稳定的产品时,我们才直接使用selenium。我在可能的情况下使用WATIR,但在selenium中,如果使用隐式等待,则不可能。事实上,这是可能的,但它不会像您期望的那样移动,因为当您检查元素是否存在时,您将被隐式等待锁定。由于WATIR有自己的计时器,也不会使用驱动程序级别的等待,因此完全可以按照您的要求,只需检查
b.element.exist?
b.element.present?
try:
    browser.find_element_by_xpath(".//div[contains(@class,'wizard-tooltip-btn skip')]").click()
    continue
except (ElementNotVisibleException, NoSuchElementException):
    pass
if browser.find_elements_by_xpath(".//div[contains(@class,'wizard-tooltip-btn skip')]"):
    browser.find_element_by_xpath(".//div[contains(@class,'wizard-tooltip-btn skip')]").click()
    continue