Selenium: проверить, существует ли элемент в цикле, если true, нажать, если не продолжить

1

Я пытаюсь решить проблему, которую я не могу обернуть вокруг того, что является лучшим решением для 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
    Я использую WATIR там, где это возможно, но в селене это невозможно, если вы используете неявное ожидание. Фактически это возможно, но он не будет двигаться, как вы ожидали, потому что вы будете заблокированы неявным ожиданием, когда вы проверите, существует ли элемент. Поскольку у WATIR есть собственный таймер, и он не будет использовать ожидание на уровне драйвера, это вполне возможно, как вы и просите, вы можете просто проверить b.element.exist? или b.element.present?
Теги:
selenium

1 ответ

1
Лучший ответ

Я бы .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 переходит к следующему элементу цикла без запуска операторов после нажатия.

  • 0
    Это не движется, как вы ожидали, вы будете застигнуты неявным ожиданием.
  • 0
    Только если вы устанавливаете implicitwait больше 0 , что является значением по умолчанию. Я вставлю записку, чтобы быть в курсе этого.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню