Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 强制Python中的Selenium等待浏览器加载完成_Django_Python 3.x_Selenium_Tdd_Functional Testing - Fatal编程技术网

Django 强制Python中的Selenium等待浏览器加载完成

Django 强制Python中的Selenium等待浏览器加载完成,django,python-3.x,selenium,tdd,functional-testing,Django,Python 3.x,Selenium,Tdd,Functional Testing,我目前正在为“”中的示例编程,更具体地说是第一个功能测试 我的代码的关键部分如下: 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(

我目前正在为“”中的示例编程,更具体地说是第一个功能测试

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

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')
  • 输入框中写着“购买孔雀羽毛”
  • 它按下回车键
  • 之后,它会立即尝试查找表中的项
  • 问题是我的电脑没有那么快。找到项目时,浏览器仍在尝试加载脚本,断言失败

    我知道有两种类型的等待Selenium:隐式(已经应用)和显式(做了一些研究)。我对这两个问题的看法如下:

    • 隐式等待是无用的,因为无论项目是否是我正在寻找的,都会找到这些项目
    • 显式等待是无用的,因为在发送表单之前和之后,页面都是相同的,因此没有什么可等待的
    • time.sleep()
      如果使用太多,将挂起脚本
    • 是的,我还检查了
      item\u 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>
    
    
    克哈塞雷斯酒店
    克哈塞雷斯酒店
    {%csrf_令牌%}
    1:{{new_item_text}}
    
    您可以使用以下方法等待特定的时间:


    我试着按照书中的例子,表格从一开始就存在。我用视图代码编辑了我的OP。@user1231958好的,明白了,更新了一个新想法。希望能有帮助。我会接受你的问题,因为我发现发生了其他事情,导致硒中毒,但我不知道会是什么。而且,你的想法也会很有用!非常感谢。
    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")
    )