python - 如何优雅地处理 selenium 中的 NoSuchElementElement 异常?

标签 python python-3.x selenium

我有大约 20 个元素要通过 xpath 查找。我正在使用这个。

e1 = element.find_element_by_xpath('.//div[contains(@class, "myclass")]').text

当找不到元素时,抛出NoSuchElementException
一种解决方案是使用:find_elements_by_xpath

e1 = element.find_elements_by_xpath('.//div[contains(@class, "myclass")]')
# Then check for length
if len(e1) > 0:
   text1 = e1[0].text

这是一个元素的 3 行代码。
如果我同时使用tryexcept,那么会有60行代码 完成这样一项微不足道的任务。

如何优雅地处理这个问题?另外,有什么方法可以直接从 xpath 中找到 text 而不是像这样执行 element.text :

# This should return text inside of that element
text = element.find_element_by_xpath('.//div[contains(@class, "myclass")]/text()')

最佳答案

最简单的最佳实践方式,according to the Selenium docs ,要做到这一点就是按照您的建议使用 .find_elements() 将其包装在一个函数中以使其更易于重用,保持代码干燥,并使代码更易于阅读。

与其将定位器仅限于 XPath,不如在您的方法中使用 By。

from selenium.webdriver.common.by import By

def get_text(element, locator):
    elements = element.find_elements(locator)
    if len(elements) > 0:
        return elements[0].text
    return ""

注意:此处返回“”(空字符串)而不是None。如果在找不到时返回 None,则在对返回值执行某些操作时必须检查 None,否则会出现异常。

然后你就这样调用它

e1 = get_text(element, (By.XPATH, './/div[contains(@class, "myclass")]'))

或者更好的是,使用 CSS 选择器,因为它速度更快、支持更好,并且在这种情况下不太可能给您带来意外的元素。

e1 = get_text(element, (By.CSS_SELECTOR, "div.myclass"))

此外,您不能在浏览器的 XPath 中使用 /text(),因为浏览器仅支持 XPath 1.0,而 /text() 是更高版本.

关于python - 如何优雅地处理 selenium 中的 NoSuchElementElement 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67626747/

相关文章:

python - 在 python re.findall 中使用多个标志

python - 如何比较两个嵌套数据结构以进行单元测试?

sqlite - 使用Python3和sqlite3和复杂的unicode字符串

python - 如何使用 postgresql 从 Django 中的两个表中检索数据

python - Pygtk调整和垂直比例: How to invert curser max/min

python - 在 python 中导入到导入器范围的名称

python-3.x - sklearn : Pandas Dataframe vs Numpy ndarray - Which is more efficient to hold a [600k * 1k] data of different data types

通过循环内的 CSS 选择器的 Python Selenium 驱动程序

java - 如何在java selenium中单击动态<li>元素?

testing - 我可以通过浏览器连接到远程计算机来将 selenium 用于桌面应用程序自动化吗?