我被困在编写Python Selenium脚本中,似乎无法令人满意地解决我得到的这个StaleElementReistrceException。
我加载了我的页面,然后单击一个按钮,打开一个表单,允许用户向订单中添加新的信用卡。在这一点上,我做了一个WebDriverWait来暂停脚本,直到这个表单上的Save按钮变为可见。此时,重新创建页面对象,因为它已更改,我的目的是填充字段并保存卡片。
问题是,刷新页面对象后,脚本失败,出现StaleElementReferenceException。我的理解是,WebDriverWait将暂停执行,给页面时间来加载所有需要加载的元素,但这似乎没有发生。相反,页面对象刷新中的某些内容过时并导致错误(每次创建对象的不同部分)。
如果我只是取消注释行'time.sleep(2)',那么这个脚本运行正常,它会通过。所以我知道我只需要在刷新对象之前给页面时间正确地重新加载。网络驱动程序似乎对我来说没有有效地做到这一点。
没有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()
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import StaleElementReferenceException
def objectIdentificationUsingWaits(self, maxTimeOut, locatorProperties, locatorType = "xpath"):
element = None
try:
WebDriverWait(self.driver, maxTimeOut, ignored_exceptions=[StaleElementReferenceException]).until(
EC.presence_of_element_located((self.getLocatorType(locatorType), locatorProperties)))
element = self.driver.find_element(locatorType, locatorProperties)
except:
print("Exception occurred during object identification.")
return element
我遇到了同样的问题,并通过实现此包装器来解决它,该包装器在捕获异常时重试:
from selenium.common.exceptions import StaleElementReferenceException
def _loop_is_text_present(text, max_attempts=3):
attempt = 1
while True:
try:
return self.browser.is_text_present(text)
except StaleElementReferenceException:
if attempt == max_attempts:
raise
attempt += 1
灵感来源:http://darrellgrainger.blogspot.com/2012/06/staleelementexception.html
当您正在交互的元素被销毁然后重新创建时,会抛出StaleElementReessceException。如今,大多数复杂的网页都会在用户与它交互时动态移动事物,这需要销毁和重新创建DOM中的元素。
试着做
wait.until(ExpectedConditions.stalenessOf(whatever element));
或
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("whatever elemnt")))
希望对你有帮助
我使用Java实现了很多Selenium测试—有时,我的测试会因为StaleElementReferenceException而失败。 你能建议一些使测试更稳定的方法吗?
问题内容: 在我的一个Selenium测试案例中,我有一个问题,我不想拥有MouseOver效果。这是我的工作: 点击“登录”按钮(页面右上方) 等待页面加载 单击搜索结果中的“购买”按钮(页面右中角)。 问题是,在“登录”和“购买”之间的中间存在一个带有MouseOver效果的“购物篮”链接。因此,当我在“登录”按钮上调用Click(),然后在“购买”按钮上调用时,我会触发MouseOver,这
问题内容: 我正在尝试通过从客户端向服务器发送密钥和随机数来认证用户。 我的代码未向我显示客户端的响应。执行下面的代码时,我得到了一个空指针异常。 问题答案: 解决大多数问题的固定步骤: 阅读堆栈跟踪以确定哪一行代码引发NPE 在该行代码处设置一个断点 使用调试器,在遇到断点时,确定该行中的对象引用是 弄清楚为什么引用该文件(到目前为止,这是唯一实际的困难部分) 解决根本原因(也可能很困难)
问题内容: 我有两个简单的Java代码。第一个将恒定功率定义为power = a.pow(b); 第二个将恒定功率定义为power = BigInteger.ONE.shiftLeft(b) 在命令行中设置内存标志- Xmx1024m,第一个代码可以正常工作,但是第二个代码却出现错误:java.lang.OutOfMemoryError:Java堆空间 我的问题:我应该在第二个代码中更改什么以避免
问题内容: 我有一个用于将文本添加到现有.doc文件中的代码,它将通过使用apache POI将其另存为另一个名称。 以下是到目前为止我尝试过的代码 以下是我得到的 我已经添加了与此对应的所有jar文件,但仍然找不到解决方案。我对apache poi是陌生的,所以请帮我提供一些解释和示例。谢谢 问题答案: 从我对问题的评论中复制: 看起来您需要Apache POI发行版中的poi-ooxml-sc
问题内容: 我知道python中的循环导入问题已经出现过很多次了,我已经阅读了这些讨论。在这些讨论中反复提出的意见是,循环导入表明设计不良,应重新组织代码以避免循环导入。 有人可以告诉我在这种情况下如何避免循环导入吗?:我有两个类,并且我希望每个类都有一个构造函数(方法),该构造函数接受另一个类的实例并返回该类的实例。 更具体地说,一类是可变的,一类是不变的。哈希,比较等需要不可变的类。可变类也需