我需要明确的等待吗?

时间:2013-11-25 20:28:41

标签: python selenium webdriver selenium-webdriver

实质上,我有一种情况,当用户输入HTML文本输入时,会动态地将一个元素添加到页面中。添加元素不涉及网络活动。

我想运行我的测试 - 包括检查此行为 - 尽可能广泛的浏览器并将使用云服务,例如saucelabs.com。

我想测试一下动态添加元素的数量是否正确。到目前为止我的测试:

text_input.send_keys('a') 
#send_keys('a') should make the browser immediately add an li to ul.new-elements
added_elements = browser.find_elements_by_css_selector('ul.new-elements li')
assert(len(added_elements), expected_num_of_list_items)

这在我的本地计算机上运行可靠,但从我可以看到它假设浏览器将始终在Python / Webdriver进入find_elements_by_调用之前完成DOM操作。我认为这是一个危险的假设吗?

如果是这样,我需要明确的等待吗?也许是这样的事情:

text_input.send_keys('a')
try:
    WebDriverWait(browser, 30).until(
        lambda b: len(b.find_elements_by_css_selector('ul.new-elements li')) == expected_num_of_list_items,
        'Timed out waiting for LI to be added.'
    )
except TimeoutException:
    fail('Timed out waiting for LI to be added.') #2 fail messages?

(我的理解是implicit_wait与此无关。)

2 个答案:

答案 0 :(得分:2)

你的想法是正确的。一旦开始使用显式等待,就应该忘记隐式等待。可以使用here来解释为什么不应该混用这两种类型。

答案 1 :(得分:1)

是的,你做出这个假设是正确的。

根据我对特定条件的理解,您需要断言明确的等待。对于更常用的其他场景,您可以使用“预期条件”。

了解更多here