gpt4 book ai didi

python - StaleElementReferenceException Selenium Python

转载 作者:行者123 更新时间:2023-12-05 06:02:28 32 4
gpt4 key购买 nike

好吧,伙计们...我知道这个问题之前似乎已经得到解答,但我尝试了几种解决方案,但没有一个奏效。如果我再看到一次 StaleElementReferenceException,我就会丢掉它。我妻子的男朋友在 mock 我,请帮忙。

编辑:删除了一些代码,因为我认为它不再与压缩这篇文章相关。

更新:根据下面@vitaliis 的建议,我将代码更改为:

        while True:
xpath_atc = '//div[@class="fulfillment-add-to-cart-button"]'

try:
wait = WebDriverWait(self.driver, 60)
wait.until(EC.visibility_of_all_elements_located((By.XPATH, xpath_atc)))
except TimeoutException:
print(f'A timeout occured after 60s. Refreshing page and trying again...')
self.driver.refresh()
continue

element_arr = self.driver.find_elements_by_xpath(xpath_atc)
for i in range(len(element_arr)):
wait.until(EC.visibility_of(element_arr[i]))
if element_arr[i].text == 'Add to Cart':
element_arr[i].click()
return

time.sleep(30)
self.driver.refresh()

现在,这段代码似乎是我迄今为止尝试过的最有效的代码,因为它产生的lessStaleElementReferenceException但它仍然产生 em> 生产它们...

我真的很困惑,它不一致,有时会出现异常,有时不会。关于此问题的任何其他想法将不胜感激。

解决方案:tldr;这行得通

element = self.driver.find_element_by_xpath(xpath)
while(EC.staleness_of(disc_ele).__call__(False)):
element = self.driver.find_element_by_xpath(xpath)
text = element.text

如果有人对为什么这行得通感兴趣,我会给出我最好的猜测。 staleness_of类定义如下:

class staleness_of(object):
""" Wait until an element is no longer attached to the DOM.
element is the element to wait for.
returns False if the element is still attached to the DOM, true otherwise.
"""
def __init__(self, element):
self.element = element

def __call__(self, ignored):
try:
# Calling any method forces a staleness check
self.element.is_enabled()
return False
except StaleElementReferenceException:
return True

当与 WebDriverWait 类一起使用时,即 WebDriverWait(driver, timeout).until(EC.staleness_of(element)) 我们正在等待元素be stale 这就是我们要找的东西吗?那么,由于陈旧异常的不一致性,元素可能不是陈旧的,如果不是陈旧的,那么我们将得到一个超时异常,这不是我们想要的结果。

幸运的是,staleness_of 类有一个方法 __call__() 如果元素陈旧则返回 true,否则返回 false。因此,使用 while 循环,我们可以通过每次迭代更新元素并使用更新元素上的 __call__() 方法检查是否过时来持续检查元素是否过时。最终,更新后的元素不会过时,__call__() 方法将返回 false 退出循环。

编辑 好吧,没用。我想有一种情况,元素在 while 循环条件下不是陈旧的,但在调用 .text 时变得陈旧。

最佳答案

您的定位器是否独一无二?尝试等到您的元素可点击:

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

wait = WebDriverWait(driver, 20)
wait.until(EC.element_to_be_clickable(
(By.XPATH, '//div[@class="fulfillment-add-to-cart-button"]')))
button = driver.find_element_by_xpath('//div[@class="fulfillment-add-to-cart-button"]')
button.click()

如果有许多元素具有相同的定位器,请尝试使用 visibility_of_all_elements_located 而不是 element_to_be_clickable

我可以建议以下算法:

  1. 等待页面加载
  2. 使用find_elements_by_xpath 查找具有相同定位符的所有元素
  3. 在循环中一个一个地点击它们。但是添加直到它们可点击(在循环中)

关于python - StaleElementReferenceException Selenium Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66926485/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com