【问题标题】:Force Selenium in Python to wait until the browser is done loading在 Python 中强制 Selenium 等到浏览器完成加载
【发布时间】:2016-02-16 01:31:26
【问题描述】:

我目前正在编写“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. 紧接着尝试在表格中查找项目。

问题是我的电脑没那么快。到找到项目时,浏览器仍在尝试加载脚本,断言失败。

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

  • 隐式等待是没有用的,因为找到了项目,无论这些项目是否是我正在寻找的。​​li>
  • 显式等待是无用的,因为在发送表单之前和之后页面是相同的,因此没有什么可等待的。
  • 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>

【问题讨论】:

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


    【解决方案1】:

    您可以使用WebDriverWait 等待特定的text to be present in element

    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")
    )
    

    【讨论】:

    • 我正在尝试按照书中的示例进行操作,并且表格从一开始就存在。我用视图代码编辑了我的 OP。
    • @user1231958 好的,明白了,更新了一个新想法。希望对您有所帮助。
    • 我会接受你的问题,因为我发现还有其他事情正在杀死 Selenium,但我不知道它可能是什么。而且,你的想法也会很有用!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 2015-01-05
    • 2014-01-03
    • 1970-01-01
    • 2018-11-01
    相关资源
    最近更新 更多