Элемент иногда появляется, а иногда нет, как продолжить сценарий в любом случае? - PullRequest
1 голос
/ 01 февраля 2020

Мой сценарий селена (python) выполняет определенную работу на веб-сайте, который является панелью мониторинга, т.е. фактическая веб-страница / ссылка не изменяется, когда я взаимодействую с элементами этой панели. Я упоминаю об этом, поскольку я подумал о том, чтобы просто переключаться между различными ссылками с помощью команды driver.get (), чтобы избежать некоторых проблем, которые у меня возникают сейчас.

В какой-то момент скрипт достигает части панели инструментов, которая по какой-то причине во время некоторых моих тестовых прогонов имеет элемент, а в других случаях этот элемент отсутствует. У меня есть несколько строк, которые взаимодействуют с этим элементом так же, как и с другим элементом, который я хотел бы .click (). Поэтому, когда этот элемент отсутствует, мой скрипт перестает работать. Это сценарий, который будет повторять те же действия с небольшими изменениями в начале, поэтому мне нужно каким-то образом интегрировать какую-то команду «если», я думаю.

Моя цель - написать что-то, что делает это: - Если этот элемент НЕ присутствует, пропустите строки кода, которые взаимодействуют с ним, и перейдите к следующей строке действия. Если элемент присутствует, очевидно, продолжайте.

day = driver.find_element_by_xpath('/html/body/div[4]/table/tbody/tr[4]/td[2]/a')
ActionChains(driver).move_to_element(day).click().perform()

driver.implicitly_wait(30)

lizard2 = driver.find_element_by_xpath('/html/body/div[5]/div/div[2]/div[1]/img')
ActionChains(driver).move_to_element(lizard2).perform()
x2 = driver.find_element_by_xpath('/html/body/div[5]/div/div[2]/div[2]')
ActionChains(driver).move_to_element(x2).click().perform()

driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')

Таким образом, блок, начинающийся с 'lizard2' и переходящий к строке ActionChains, является блоком, взаимодействующим с этим элементом, который иногда становится очевидным, иногда когда сценарий перемещается назад и вперед, выполняя задачу.

Две верхние строки - это всего лишь код, который приводит меня к фазе панели мониторинга, в которой есть этот случайно появляющийся элемент. И команда прокрутки в конце, это то, что следует. Как упоминалось ранее, мне нужно игнорировать среднюю часть и перейти к части прокрутки, если эти элементы 'lizard2' и 'x2' не найдены.

Я прошу прощения, если это сбивает с толку и не очень лаконично, я рады услышать, что вы, ребята, думаете, и предоставить любую дополнительную информацию / детали, спасибо!

Ответы [ 3 ]

1 голос
/ 01 февраля 2020

Вы можете просто выполнить find_element_by_xpath в блоке try/except следующим образом:

from selenium.common.exceptions import NoSuchElementException
try:
    myElement = driver.find_element_by_xpath(...)
    #Element exists, do X
except NoSuchElementException:
    #Element doesn't exist, do Y

Редактировать: просто добавьте, что кто-то в комментариях к вашему вопросу предположил, что этот метод был "хакерским" ', это на самом деле очень Pythoni c и очень стандартный.

0 голосов
/ 01 февраля 2020

Ответ @Lucan:

Вы можете просто выполнить свой find_element_by_xpath в блоке try / Кроме того:

from selenium.common.exceptions import NoSuchElementException
try:
    myElement = driver.find_element_by_xpath(...)
    #Element exists, do X
except NoSuchElementException:
    #Element doesn't exist, do Y
0 голосов
/ 01 февраля 2020
private boolean isElementPresent(By by) {
try {
    driver.findElement(by);
    return true;
} catch (NoSuchElementException e) {
    return false;
}

}

...