我陷入了编写 Python Selenium 脚本的困境,似乎无法令人满意地解决我收到的这个 StaleElementReferenceException 。
我已加载页面并单击一个按钮,该按钮将打开一个表单,允许用户向订单添加新的信用卡。此时,我执行 WebDriverWait 来暂停脚本,直到该表单上的“保存”按钮变得可见。此时,重新创建页面对象,因为它已更改,我的目的是填充字段并保存卡片。
问题是刷新页面对象后,脚本失败并出现 StaleElementReferenceException。我的理解是,WebDriverWait 将暂停执行,为页面提供时间来加载所有需要加载的元素,但这似乎并没有发生。相反,页面对象刷新中的某些内容已过时并导致错误(每次创建对象的不同部分)。
如果我只是取消注释“time.sleep(2)”行,那么这个脚本就可以正常运行并且会通过。所以我知道我只需要在刷新对象之前给页面时间来正确重新加载。 WebDriverWait 似乎并没有对我有效地做到这一点。
有没有更正确的方法可以在没有睡眠命令的情况下执行此操作?
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));
or
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("whatever elemnt")))
希望它能帮助你
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)