Я пытаюсь решить проблему, которую я не могу обернуть вокруг того, что является лучшим решением для 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)
...
Я бы .click()
в try, catch statement. Таким образом, вы можете попробовать и щелкнуть элемент каждый цикл, но поймать исключение, которое бросается, когда оно не отображается/видимо.
ПРИМЕЧАНИЕ. Если вы используете неявные ожидания, каждая проверка элемента займет много секунд, на которые вы установили Неявный Ожидание. Я бы не рекомендовал использовать Implicit и использовать Explicit Waits вместо этого в ваших сценариях 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
с catching exceptions, вы можете использовать find_elements
для Truthy, чтобы проверить существование элемента в списке и щелкнуть его, если он пройдет, например:
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
или же:
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
переходит к следующему элементу цикла без запуска операторов после нажатия.
implicitwait
больше 0
, что является значением по умолчанию. Я вставлю записку, чтобы быть в курсе этого.
b.element.exist?
илиb.element.present?