gpt4 book ai didi

python - 如何在 Selenium 中避免 StaleElementReferenceException - Python

转载 作者:太空宇宙 更新时间:2023-11-03 13:35:45 27 4
gpt4 key购买 nike

我一直在编写 Python Selenium 脚本,似乎无法令人满意地解决我遇到的这个 StaleElementReferenceException。

我加载了我的页面并单击了一个按钮,该按钮打开了一个允许用户向订单中添加新信用卡的表单。此时,我执行 WebDriverWait 来暂停脚本,直到此表单上的“保存”按钮可见。那时,重新创建页面对象,因为它已更改,我的目的是填充字段并保存卡片。

问题是刷新页面对象后,脚本因 StaleElementReferenceException 而失败。我的理解是 WebDriverWait 将暂停执行,让页面有时间加载所有需要加载的元素,但这似乎没有发生。相反,页面对象刷新中的某些内容是陈旧的并导致错误(每次创建对象的不同部分)。

如果我只是取消对“time.sleep(2)”行的注释,那么这个脚本运行良好并且会通过。所以我知道我只需要在刷新对象之前让页面有时间正确重新加载。 WebDriverWait 似乎并没有为我有效地做到这一点。

有没有更正确的方法可以在没有 sleep 命令的情况下执行此操作?

checkout = CheckoutProcess(self.driver)

# Add Credit Card
checkout.add_credit_card()

# Wait for form to display
WebDriverWait(self.driver,30).until(
expected_conditions.presence_of_element_located((By.CLASS_NAME, 'total')))

# time.sleep(2)

# Refresh the page object so form can be filled in
checkout = CheckoutProcess(self.driver) # Script Fails Here
checkout.populate_credit_card_data(
credit_card_name, credit_card_number,
credit_card_expiration_date, credit_card_cvc)
checkout.click_credit_card_save_button()

最佳答案

当您正在交互的元素被销毁然后重新创建时,将抛出 StaleElementReferenceException。如今,大多数复杂的网页都会在用户与之交互时动态移动内容,这需要销毁和重新创建 DOM 中的元素。

尝试做

wait.until(ExpectedConditions.stalenessOf(whatever element));

wait.until(ExpectedConditions.presenceOfElementLocated(By.id("whatever elemnt")))

希望对你有帮助

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

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