<p>如果时间设置得足够高,则使用<strong>inpolicytly_wait()</strong>将解决StaleElementReferenceException问题。然而,隐式等待也导致测试用例需要很长时间才能运行。我用找到的<a href="https://stackoverflow.com/questions/5709204/random-element-is-no-longer-attached-to-the-dom-staleelementreferenceexception">here</a>、<a href="https://stackoverflow.com/questions/17174515/element-is-no-longer-attached-to-the-dom">here</a>和{a3}的思想解决了这个问题。在</p>
<p>发生此问题是因为对表进行更改时,被引用的元素不再附加到DOM。因此,我专门为处理可能过时的元素创建了定义。在</p>
<pre><code>def waitForNonStaleElement(driver, type, element):
strategy = {
"id": driver.find_element_by_id,
"link_text": driver.find_element_by_link_text,
"name": driver.find_element_by_name,
"xpath": driver.find_element_by_xpath
}
lhsType, rhsType = type.split(".", 1)
find_element = strategy.get(rhsType.lower())
try:
find_element(element)
except StaleElementReferenceException:
waitForNonStaleElement(driver, type, element)
except TypeError:
raise TypeError("ERROR : CODE TO HANDLE \""+element+"\" TYPE NEEDS TO BE CREATED")
def waitForNonStaleElementClick(driver, type, element):
strategy = {
"id": driver.find_element_by_id,
"link_text": driver.find_element_by_link_text,
"name": driver.find_element_by_name,
"xpath": driver.find_element_by_xpath
}
lhsType, rhsType = type.split(".", 1)
find_element = strategy.get(rhsType.lower())
try:
waitForNonStaleElement(driver, type, element)
find_element(element).click()
except StaleElementReferenceException:
waitForNonStaleElementClick(driver, type, element)
except TypeError:
raise TypeError("ERROR : CODE TO HANDLE \""+element+"\" TYPE NEEDS TO BE CREATED")
def waitForNonStaleElementText(driver, type, element):
strategy = {
"id": driver.find_element_by_id,
"link_text": driver.find_element_by_link_text,
"name": driver.find_element_by_name,
"xpath": driver.find_element_by_xpath
}
lhsType, rhsType = type.split(".", 1)
find_element = strategy.get(rhsType.lower())
try:
return find_element(element).text
except StaleElementReferenceException:
waitForNonStaleElementText(driver, type, element)
except TypeError:
raise TypeError("ERROR : CODE TO HANDLE \""+element+"\" TYPE NEEDS TO BE CREATED")
</code></pre>
<p><strong>waitForNonSaleElement()</strong>用于确认元素不再过时。<strong>waitForNonSaleElementClick()</strong>允许我单击可能过时的元素。<strong>waitForNonSaleElementText()</strong>允许我从可能过时的元素中检索文本。在</p>
<p>然后我使用以下方法重写搜索代码:</p>
^{pr2}$
<p>希望,如果有人遇到和我一样的问题,这会对他们有所帮助。在</p>