我正在尝试解决一个无法解决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)
...
答案 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
将转到循环中的下一项,而不在单击后运行语句。