调用find_元素…()。文本是否与find_元素本身的功能一样重要?

2024-04-26 07:45:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一段代码,它获取某个类的所有元素,并从中提取一个文本元素

chatblocks = driver2.find_elements_by_class_name("android.widget.TextView")
print(chatblocks)
chatblocktext = chatblocks[-3]

我目前在第3行收到StaleElementReferenceException

在第3行中调用.text函数是否再次运行find_elements函数?为什么这个陈旧的错误没有出现在第1行

要解决这个问题,将所有文本加载到第1行的列表中行吗?我试图这样做:

chatblocks = driver2.find_elements_by_class_name("android.widget.TextView").text

但是我收到了一个错误,说:文本不能用于列表对象


Tags: 函数textname文本元素by错误elements
2条回答

请参阅逐行执行

chatblocks = driver2.find_elements_by_class_name("android.widget.TextView")
print(chatblocks)
chatblocktext = chatblocks[-3]
  1. find_elements将返回一个列表,在本例中,它是聊天区
  2. 打印整个列表,该列表通常应该打印webelements,而不是它们的.text
  3. 找到0之后左侧的第三个元素

现在请各位提问:

在第3行中调用.text函数是否再次运行find_elements函数?为什么这个陈旧的错误没有出现在第1行

  • 不,它不会再跑了。它是Python中的一个列表,因此find_elements将返回一个webelement列表。在第1行,元素可用

为此:

chatblocks = driver2.find_elements_by_class_name("android.widget.TextView").text

在列表中,您不能改为执行.text

for chat in driver2.find_elements_by_class_name("android.widget.TextView"):
    print(chat.text)

find_element_by_class_name检索web元素引用。
element.click()element.text这样的操作正试图通过此引用(指针)访问页面上的元素。
他们不会试图根据元素的定位器再次找到元素,而是试图通过元素的引用来访问它。
如果从收集引用的那一刻起元素发生了更改,则在没有更多相关引用的情况下访问元素会引发StaleElementReferenceException异常。
另外,find_elements_by_class_name检索web元素列表,而不是单个web元素。
不能对对象列表应用.click().text方法。
您可以迭代列表并对列表中的每个元素应用命令,如下所示:

chatblocks = driver2.find_elements_by_class_name("android.widget.TextView")
for el in chatblocks:
    print(el.text)

chatblocks = driver2.find_elements_by_class_name("android.widget.TextView")
for el in chatblocks:
    print(el.click())

相关问题 更多 >