我正在编写一个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()函数打印的评论。
答案 0 :(得分:2)
正如您所见,刷新页面可能会导致元素引用的奇怪行为。您将看到的另一个常见错误是陈旧元素异常。
从堆栈跟踪中我会尝试将第二行修改为最后一行:
print 'Dropdown: ', self.ff.find_element_by_id('employeeDatabaseSelect').getText()
这样你就可以对元素有一个新的引用。
同样,另一个可能导致问题的领域是:
for option in dropdown.find_elements_by_tag_name('option'):
如果在迭代之间刷新页面,dropdown
可能不再有效。如果是这种情况,我会尝试这样做:
同样,这是每次都使用dropdown
的新参考。