硒:检查元素是否存在于i循环中,如果为true,则单击,如果不继续,则

时间:2018-08-01 20:41:06

标签: python selenium

我正在尝试解决一个无法解决Selenium最佳解决方案的问题。

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

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

...

for i in (urlList):
    browser.get(i)
    if #element exist and is displayed (//div[contains(@class,'wizard-tooltip-btn skip'))
       # Find it and click/close it (browser.find_element_by_xpath(".//div[contains(@class,'wizard-tooltip-btn skip')]").click())
    else:
    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)

...

1 个答案:

答案 0 :(得分:1)

我会将.click()包装在 try,catch 语句中。这样,您可以尝试在每个循环中单击该元素,但是捕获在不存在/不可见时抛出的异常。

  

注意:如果您使用的是隐式等待,则将进行每次元素检查   但是您已将隐式等待设置为许多秒。我不会   建议使用隐式,然后在您的显式等待中   硒脚本。 HERE您将在两者上找到文档。

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

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)

我无法通过问题的措辞来判断,但是如果您发现并点击了 not 后不想在循环中运行其余语句,元素,将continue传递到您选择的任何示例之后,如下所示:

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

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