2014-02-24 56 views
2

下面是我的python腳本的代碼片段,它是讀取excel文件並將行中的單元格分配給變量,然後用於鍵入字段在瀏覽器中。它在很大程度上效果很好。我想要做的是在瀏覽器加載頁面之後設置某種循環來執行以下操作:強制硒以暫停並等待字段可用

通過某個ID查找元素。如果失敗,請等待5秒鐘,然後重試。如果它成功繼續與腳本的其餘部分。現在對我來說很容易,這是我第一次真正的嘗試。我試圖嵌套嘗試/除了語句,但它很快就變得非常混亂。

from selenium import webdriver 
from selenium.common.exceptions import NoSuchElementException 
from selenium.webdriver.common.keys import Keys 
import time 
import xlrd 

workbook = xlrd.open_workbook("my_excel_file.xlsx") 
worksheet = workbook.sheet_by_name('Sheet1') 
x = 0 
for current_row in range(worksheet.nrows): 
    try: 
     cmt = worksheet.row(current_row)[2].value 
     browser = webdriver.Firefox() # Get local session of firefox 
     browser.get("http://www.somewebsite.com") # Load page 
     time.sleep(5) 
     #this timer is the issue, if the field takes 6 seconds to be ready, script fails 
     comment = browser.find_element_by_id("slow_comment_box") # Find the comment box 
     comment.send_keys(str(cmt) + Keys.RETURN) 
     x += 1 
    except: 
     print ("Error on " + str(x)) 
     quit() 

有沒有一種方法可以設置這種行爲我上面所述的方式?我知道硒等待頁面加載,但文本框是不正常的,似乎有自己的加載,紡車。

總結和解決方案 答案如下。我的愚蠢的東西有一些語法錯誤。 this page was extremely useful as well.

+0

這有幫助嗎? [http://stackoverflow.com/questions/16927354/how-can-i-make-selenium-python-wait-for-the-user-to-login-before-continuing-to-r] – jcfollower

+0

我喜歡這種可能性!會做更多的閱讀並嘗試實施。 – dalearyous

回答

8

你想用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 

element = WebDriverWait(driver, 60).until(EC.visibility_of_element_located((By.Id, 'id'))) 
+0

所以在我的例子中,我是否還需要comment = browser.find_element_by_id(「slow_comment_box」)? 還是WebDriverWait爲我做這個,如果它可用? – dalearyous

+0

沒有我在努力工作,有沒有一個圖書館我失蹤?沒有語法或編譯錯誤。 – dalearyous

+0

webdriverwait將輪詢DOM給定的時間段(在這種情況下爲60秒),並且一旦發現webElement(並且在這種情況下也是可見的,意味着大小> 1px)將返回給您,或者如果超時被執行。 –

1

試圖Erki M.的迴應我去這裏瞭解更多關於硒的等待後:

http://selenium-python.readthedocs.org/en/latest/waits.html

文中提到另一種選擇那很好很簡單:

from selenium import webdriver 

browser = webdriver.Firefox() 
browser.implicitly_wait(30) 
browser.get("http://www.somewebsite.com") 

從指定一個隱含的等待時間開始,瀏覽器會耐心等待並查詢該站點是否能找到您正在查找的元素。這種方法避免了額外的輸入,也避免了提前等待什麼元素的必要性。

我應該提到的一件事情是,有時候我仍然會回到time.sleep(1),例如,在輸入輸入之後。 Implicitly_wait會給出一個元素的時間,但它不會導致命令等待足夠長的時間以使UI響應。

+0

這將是非常緩慢的重複測試! – SIslam