在Python中强制Selenium等待浏览器加载

时间:2016-02-16 01:31:26

标签: django python-3.x selenium tdd functional-testing

我目前正在" Test-Driven Development with Python"编写示例,更具体地说是第一次功能测试。

我的代码的关键部分如下:

def setUp(self):
    self.browser = webdriver.Firefox()
    self.browser.implicitly_wait(20)

我告诉Selenium隐式等待20秒,直到找到它想要的东西。

    inputbox = self.browser.find_element_by_id('id_new_item')
    self.assertEqual(
        inputbox.get_attribute('placeholder'),
        'Enter a To-Do item'
    )

    inputbox.send_keys('Buy peacock feathers')
    inputbox.send_keys(Keys.ENTER)

    table = self.browser.find_element_by_id('id_list_table')
    rows = table.find_elements_by_tag_name('tr')
    self.assertIn('1: Buy feather peacocks', [row.text for row in rows])

这里最大的问题是以下几行:

    inputbox.send_keys('Buy peacock feathers')
    inputbox.send_keys(Keys.ENTER)

    table = self.browser.find_element_by_id('id_list_table')
  1. 写道"买孔雀羽毛"在输入框中。
  2. 按下回车。
  3. 在之后立即,尝试查找表格中的项目。
  4. 问题是我的电脑不是那么快。在找到项目时,浏览器仍在尝试加载脚本,并且断言失败。

    我知道Selenium有两种类型的等待:隐式(已经应用)和显式(对它进行了一些研究)。我对两者的问题如下:

    • 隐式等待是没用的,因为找到了项目,无论这些项目是否是我要找的东西。
    • 明确的等待是没用的,因为页面在发送表单之前和之后都是相同的,因此没有什么可以等待。
    • 如果使用太多,
    • time.sleep()会挂起脚本。
    • 是的,我还检查了item_text是否被正确引用,包括name属性:)

    我的其他选择是什么?我该怎么做才能强制Selenium等到页面加载完毕?先谢谢你。

    编辑:视图如下,遵循书中的示例。

    <html>
        <head>
            <title>Lista de Quehaceres</title>
        </head>
        <body>
            <h1>Tu Lista de Quehaceres</h1>
            <form method="POST">
                <input id="id_new_item" name="item_text" placeholder="Entre un ítem de quehacer" />
                {% csrf_token %}
            </form>
            <table id="id_list_table">
                <tr><td>1: {{ new_item_text }}</td></tr>
            </table>
        </body>
    </html>
    

1 个答案:

答案 0 :(得分:1)

您可以使用text to be present in element

等待特定的WebDriverWait
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


inputbox.send_keys('Buy peacock feathers')
inputbox.send_keys(Keys.ENTER)

table = WebDriverWait(driver, 10).until(
    EC.text_to_be_present_in_element((By.CSS_SELECTOR, "table#id_list_table tr td"), "Buy peacock feathers")
)