Python, Selenium, как я могу выйти из цикла while после исчезновения элемента? - PullRequest
2 голосов
/ 26 октября 2019

У меня есть элемент с изменением текста.

<small class="cell progress-name text-center ng-star-inserted">*some changing text*</small>

После того, как текст в этом элементе исчезает, элемент также исчезает. Мне нужно найти выход из цикла while после исчезновения элемента.

previous_value = None
while True:
    current_value = browser.find_element_by_xpath('//*[@class="cell progress-name text-center ng-star-inserted"]')
    if previous_value:
        if current_value.text != previous_value:
            print(current_value.text)
            previous_value = current_value.text

    else:
        print(current_value)
        previous_value = current_value.text

    time.sleep(1)

Теперь я получаю сообщение об ошибке no such element: Unable to locate element, и любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 26 октября 2019

Вы можете использовать саму ошибку, чтобы узнать, исчез ли элемент. Вам просто нужно обработать это и разорвать цикл:

    previous_value = None
    while True:
        try:
            current_value = browser.find_element_by_xpath('//*[@class="cell progress-name text-center ng-star-inserted"]')
        except NoSuchElementException: # the element wasn't found
            break # exit from the loop

        if previous_value:
            if current_value.text != previous_value:
                print(current_value.text)
                previous_value = current_value.text

        else:
            print(current_value)
            previous_value = current_value.text

        time.sleep(1)

Не забудьте импортировать исключение from selenium.common.exceptions import NoSuchElementException.


Есть еще один способ справиться с этим. Вы можете использовать find_elements_by_xpath (с "s" в "elements"). Эта функция будет возвращать пустой список вместо броска и ошибки, если ничего не найдено.

Затем вы можете проверить, является ли список пустым и прервется ли, если True.

previous_value = None
    while True:
        current_value = browser.find_elements_by_xpath('//*[@class="cell progress-name text-center ng-star-inserted"]')
        if not current_value:
            break # the list is empty

        if previous_value:
            if current_value.text != previous_value:
                print(current_value.text)
                previous_value = current_value.text

        else:
            print(current_value)
            previous_value = current_value.text

        time.sleep(1)

Я думаю, что лучший вариант - первый , который я вам дал, он чище и использует принцип Python из Глоссария :

Проще спроситьпрощение, чем разрешение. Этот общий стиль кодирования Python предполагает наличие допустимых ключей или атрибутов и перехватывает исключения, если предположение оказывается ложным. Этот чистый и быстрый стиль характеризуется наличием множества попыток и исключений.

0 голосов
/ 26 октября 2019

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

def getElementText(XPATH):
    try:
        element = browser.find_element_by_xpath(XPATH)
        return element.text
    except:
        print(XPATH + ' : not found')
        return ''

, и мы можем получить текст элемента и посмотреть, пустой ли он, и принять решение выйти из цикла while.

previous_value = None
current_value = getElementText('//*[@class="cell progress-name text-center ng-star-inserted"]')
while current_value != '':
    if previous_value:
        if current_value != previous_value:
            print(current_value)
            previous_value = current_value
    else:
        print(current_value)
        previous_value = current_value
    time.sleep(1)
    current_value = getElementText('//*[@class="cell progress-name text-center ng-star-inserted"]')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...