Python,Selenium,在元素消失后如何从while循环中退出?

问题描述 投票:2回答:2

我有一个更改文字的元素。

<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错误消息,任何帮助将不胜感激。

python selenium
2个回答
0
投票

我们应该从一个单独的函数中获取一个元素,并通过字符串比较来处理它。对于例如

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"]')

1
投票

您可以使用错误本身来了解元素是否已消失。您只需要处理它并打破循环:

    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”)。如果未找到任何内容,此函数将返回一个空列表,而不是引发错误。

然后您可以检查列表是否为空,如果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)

我认为最佳选择是第一个

,我给了您,它更干净,并使用了Glossary中的Python原理:

要求宽恕比允许容易。这种通用的Python编码风格假定有效键或属性的存在,并且在假定被证明为假的情况下捕获异常。这种干净快捷的风格的特点是存在许多try和except语句。

© www.soinside.com 2019 - 2024. All rights reserved.