调用 find_elements...().text 算作 find_elements 函数本身吗?

Does calling in find_elements...().text count as the find_elements function itself?

我有代码获取某个 class 的所有元素并从中提取文本元素。

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

我目前在第 3 行收到 StaleElementReferenceException。

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

为了解决这个问题,将所有文本加载到第 1 行的列表中是否可行?我试过这个:

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

但我收到一条错误消息,指出 .text 不能用于列表对象。

find_element_by_class_name 检索 Web 元素引用。
element.click()element.text 之类的操作正在尝试通过此引用(指针)访问页面上的元素。
他们不会尝试根据它的定位器再次找到该元素,他们会尝试通过它的引用来访问它。
如果元素从收集引用的那一刻起发生更改,则访问没有更多相关引用的元素将引发 StaleElementReferenceException 异常。
此外,find_elements_by_class_name 检索网络元素列表,而不是单个网络元素。
您不能对对象列表应用 .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())

查看

的逐行执行
chatblocks = driver2.find_elements_by_class_name("android.widget.TextView")
print(chatblocks)
chatblocktext = chatblocks[-3]
  1. find_elements 会 return 一个列表,在本例中是 chatblocks
  2. 打印整个列表,通常应该打印网络元素,而不是它们的 .text
  3. 求0后左边第三个元素

现在你的问题:-

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

  • 不,它不会再 运行。它是 Python 中的列表,因此 find_elements 会 returned 一个网络元素列表。在第 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)