StaleElementReferenceException错误的问题偶尔会弹出



嗨,我有这段代码正在生成我:

selenium.common.exceptions.StaleElementReferenceException: 消息:过时的元素引用:元素未附加到页面文档

它的根本原因是什么?此代码在 10 种情况下工作正常,但在 11 种情况下无效。有没有机会改进它以防止此类错误?

生成失败的行包括:

compare_announcement_text(context, option_name, element_offer_type)

和:

if element_offer_type.text == option_name:
def select_announcement(context, option_name):
"""Select announcement from 'Offer Type' drop down
:param context:
:param option_name:
:return: Announcement page
"""
offer_type = context.driver.find_element_by_xpath(Locators.offer_type)
offer_type.click()
offer_type_list = context.driver.find_elements_by_xpath(Locators.all_elements_buttons_offer_type)
offer_type_text = []
for element_offer_type in offer_type_list:
compare_announcement_text(context, option_name, element_offer_type)
offer_type_text.append(element_offer_type.text)
if option_name not in offer_type_text:
time.sleep(0.5)  # menu not fully rendered - need to wait
offer_type_list = context.driver.find_elements_by_xpath(Locators.all_elements_buttons_offer_type)
for element_offer_type in offer_type_list:
compare_announcement_text(context, option_name, element_offer_type)
from features.pages.announcement_page import AnnouncementPage
return AnnouncementPage(context)

def compare_announcement_text(context, option_name, element_offer_type):
if element_offer_type.text == option_name:
WebDriverWait(context.driver, 20).until(
expected_conditions.visibility_of_all_elements_located(
(By.XPATH, Locators.all_elements_buttons_offer_type)))
for check in range(4):
try:
ActionChains(context.driver).move_to_element(element_offer_type).click(element_offer_type).perform()
return
except selenium.common.exceptions.ElementClickInterceptedException:
time.sleep(0.5)
else:
print(f"Tried click {option_name} for 2 seconds - making final click")
ActionChains(context.driver).move_to_element(element_offer_type).click(element_offer_type).perform()
else:
print(f'Element selected in offer type is not {option_name} and is {element_offer_type.text}')

如果您先使用 find_elements_by_xpath 获取一组元素,则很容易导致此问题。

我建议你在 for 循环中再次找到元素,如下所示:

offer_type_list = context.driver.find_elements_by_xpath(Locators.all_elements_buttons_offer_type) 
offer_type_text = []
for i in range(1, len(offer_type_list)+1):
# xpath example: (//div[@class='abc'])[1]
element_offer_type = context.driver.find_element_by_xpath("("+Locators.all_elements_buttons_offer_type+")["+str(i)+"]")
compare_announcement_text(context, option_name, element_offer_type)
offer_type_text.append(element_offer_type.text)

我前段时间也遇到了同样的异常。这是因为您正在交互的元素当时未加载到 DOM 中。你可以用一个等待元素显示的webDriverWait来解决它。

@Jonx -> 这不是唯一的原因。问题也是关于应用程序,@ranger正在使用。如果它是动态的(重新加载元素,例如导致新的实时数据(,它也会引起这个问题。取决于数据进入的时间(例如,在获取对元素的引用之后但在执行操作之前(。这可能是屁股疼痛-,-

@Yun - 像这个想法,但也(如果在测试中(,使用页面对象模式,好主意是使用视图,然后在 try-except 块中执行操作,或者实际上将 Page 元素定义为属性方法,这样你会得到干净的代码,WebDriver 每次调用时都会查找元素。这缓解了问题。

是的,我知道这不是那么"性能良好"的解决方案,但是 - 一如既往 - 通过实时动态应用程序权衡稳定行为。

最新更新