2016-02-16 79 views
1

我目前正在編寫「Test-Driven Development with Python」中的示例,更具體地說是第一個功能測試。是在Python中強制Selenium以等待瀏覽器完成加載

我的代碼的關鍵部分如下:

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

我告訴硒,直到它找到任何它看起來做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. It,緊接在之後,試圖找到表中的項目。

問題是我的電腦沒那麼快。在找到這些項目時,瀏覽器仍在嘗試加載腳本,並且聲明失敗。

我知道等待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

可以等待使用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") 
) 
+0

我試圖按照書中的例子,該表是從一開始就存在。我用視圖代碼編輯了我的OP。 –

+0

@ user1231958好,gotcha,更新了一個新的想法。希望能幫助到你。 – alecxe

+0

我會接受你的問題,因爲我發現了一些其他的事情正在殺死Selenium,但我不知道它會是什麼。而且,你的想法也會很有用!謝謝! –