下拉选择刷新页面后,'元素不再附加到DOM'

时间:2012-07-17 14:29:51

标签: python unit-testing selenium

我正在编写一个Selenium unittest,它从下拉菜单中选择一个选项,触发页面刷新(不是完全刷新,但JS更改DOM)以根据该选择显示数据。我可以看到我的测试用例here on Pastebin

因此在重新加载数据后,selenium无法找到循环的其他选项。我实际上不需要再循环了。
我可以做一个xpath查找,看看option.text是否在页面的H2元素中,但我的尝试失败了......

for option in dropdown.find_elements_by_tag_name('option'):
    if self.ff.find_element_by_xpath("//h2[contains(text(), option.text)"):
        pass    # Employee Selected

从下面的代码中,任何人都可以帮助避免这种“附加到DOM”错误吗?基本上,如果我可以选择选项[1]或其他东西,然后继续进行理想的其余测试。

dropdown = self.ff.find_element_by_id('employeeDatabaseSelect')
for option in dropdown.find_elements_by_tag_name('option'):
    try:
        option.click()  # causes JS refresh which you need to wait for
    except Exception, e:
        print 'Exception ', e
else: sys.exit("Error: There are no employees for this employer")
print 'Dropdown: ', dropdown.getText()
WebDriverWait(self.ff, 50).until(lambda driver : driver.find_element_by_xpath("//h2[contains(text(), dropdown.getText())"))

我的堆栈跟踪看起来像这样;

 [exec] test_process (__main__.viewEmployeeUseCase) ...
 [exec] ERROR
 [exec]
 [exec] ===============================================================
 [exec] ERROR: test_process (__main__.viewEmployeeUseCase)
 [exec] ---------------------------------------------------------------
 [exec] Traceback (most recent call last):
 [exec]   File "viewEmployeeUnitTest.py", line 43, in test_process
 [exec]     print 'Dropdown: ', dropdown.getText()
 [exec] AttributeError: 'WebElement' object has no attribute 'getText'
 [exec]
 [exec] ---------------------------------------------------------------
 [exec] Ran 1 test in 16.063s
 [exec]
 [exec] FAILED (errors=1)
 [exec] Exception  Message: u'Element is no longer attached to the DOM'
 [exec] Exception  Message: u'Element is no longer attached to the DOM'
 [exec] Exception  Message: u'Element is no longer attached to the DOM'
 [exec] Exception  Message: u'Element is no longer attached to the DOM'
 [exec] Exception  Message: u'Element is no longer attached to the DOM'
 [exec] Exception  Message: u'Element is no longer attached to the DOM'
 [exec] Exception  Message: u'Element is no longer attached to the DOM'
 [exec] Dropdown:  Tearing Down!

最终Tearing Down!是我的tearDown()函数打印的评论。

1 个答案:

答案 0 :(得分:2)

正如您所见,刷新页面可能会导致元素引用的奇怪行为。您将看到的另一个常见错误是陈旧元素异常。

从堆栈跟踪中我会尝试将第二行修改为最后一行:

print 'Dropdown: ', self.ff.find_element_by_id('employeeDatabaseSelect').getText()

这样你就可以对元素有一个新的引用。

同样,另一个可能导致问题的领域是:

for option in dropdown.find_elements_by_tag_name('option'):

如果在迭代之间刷新页面,dropdown可能不再有效。如果是这种情况,我会尝试这样做:

  1. 浏览所有选项并保留其值/文字列表
  2. 浏览值/文本列表(不是元素),然后找到与其匹配的选项元素
  3. 同样,这是每次都使用dropdown的新参考。