回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>当我尝试测试包含表的网页时,我一直获取StaleElementReferenceException。表中有点[以及一些其他信息]和两个单独的阻塞点的状态,每个阻塞点都有一个切换状态按钮,分别表示“是”和“否”。在</p>
<p>在本规范中,过程是:</p>
<ol>
<li>单击复选框仅显示阻止点。在</li>
<li>如果表中没有阻塞点,就完成了。否则。。。在</li>
<li>在第一行中保存点的名称并检查第一个阻塞状态。如果设置为“是”,则将其更改为“否”</li>
<li>检查点是否仍然存在。如果是,将第二个阻塞状态更改为“否”,并确认该点已被删除。在</li>
</ol>
<p>我在代码中添加了注释以帮助遵循我的流程:</p>
<pre><code> # << Setup >>
driver.get(url("/PointsTable/"))
assertExpectedConditionTrue(driver, "By.XPATH", "//td")
# < Confirm that the points blocking checkbox is enabled >
if not driver.find_element_by_id("BlockedPoints").is_selected():
assertExpectedConditionTrue(driver, "By.ID", "BlockedPoints")
driver.find_element_by_id("BlockedPoints").click()
assertCheckBoxEnabled(driver, "BlockedPoints")
# < First check if any points have a blocking state >
try:
assertExpectedConditionTrue(driver, "By.XPATH", "//td[contains(text(), 'No data available in table')]", None, 3)
except (NoSuchElementException):
# < Until all the points are out of blocking state, begin changing blocking statuses
# to all the points >
while True:
# < Check if all the points are set to have no blocking statuses set to Yes >
try:
assertExpectedConditionFalse(driver, "By.XPATH", "//td[contains(text(), 'No data available in table')]", None, 2)
except (NoSuchElementException, TimeoutException):
break
# < Save the name of the point
# Check the first blocking status. If it is blocking, set the block to No >
assertExpectedConditionTrue(driver, "By.XPATH", "//td")
myPointVal = driver.find_element_by_xpath("//td").text
try:
assertExpectedConditionTrue(driver, "By.XPATH", "//tbody/tr[1]/td[5]/div/button[@class='btn active btn-success btn-small point-button']", None, 2)
except (NoSuchElementException):
assertExpectedConditionTrue(driver, "By.XPATH", "//tbody/tr[1]/td[5]/div/button[@class='btn btn-small point-button']")
driver.find_element_by_xpath("//tbody/tr[1]/td[5]/div/button[@class='btn btn-small point-button']").click()
# < Save the name of the point again. Compare it to the original saved point
# If the name is the same, then the second blocking status needs to be set to No
# If the name is different, that means the point in question is no longer blocked >
assertExpectedConditionTrue(driver, "By.XPATH", "//td")
if myPointVal == driver.find_element_by_xpath("//td").text:
assertExpectedConditionTrue(driver, "By.XPATH", "//tbody/tr[1]/td[6]/div/button[@class='btn btn-small point-button']")
driver.find_element_by_xpath("//tbody/tr[1]/td[6]/div/button[@class='btn btn-small point-button']").click()
assertExpectedConditionFalse(driver, "By.XPATH", "//td", myPointVal)
</code></pre>
<p>当一个点的所有阻塞状态都被移除时,它就会从表中消失,这就是我的异常的原因。代码并不总是在同一行上失败,但当它失败时,它总是在我尝试单击“是”或“否”按钮的行上,这很可能是因为在成功地从表中删除了一个点之后,表发生了变化。在</p>
^{pr2}$
<p>它有时会使它越过代码的这一部分,而在另一个部分中失败,即在我尝试单击某个按钮之后,在另一个部分中失败。。(1) 刷新页面,或者(2)导航到第二页,其中XPATH地址相同,但XPATH地址中的对象已更改。我确实理解我出现这个问题的原因,原因如下<a href="http://docs.seleniumhq.org/exceptions/stale_element_reference.jsp" rel="nofollow">here</a>。我的问题似乎与“元素不再附加到DOM”一致</p>
<p>到目前为止,我都试过使用这两种方法时间。睡觉()和driver.implicitly_wait驱动程序()位于可能导致表更改的位置,但问题仍然存在。我如何解决这个问题?在</p>