2012-03-22 134 views
3

我有這些包括:Python的硒(等待幀,元素查找)

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

的瀏覽器通過

browser = webdriver.Firefox() 
browser.get(loginURL) 

不過有時我做

browser.switch_to_frame("nameofframe") 

設置和它贏得沒有工作(有時候會,有時候不會)。

我不知道這是否是因爲硒實際上不是等待它執行的代碼或什麼的其餘部分之前頁面加載。有沒有辦法強制網頁加載?

因爲有時候我會做這樣的事情

browser.find_element_by_name("txtPassword").send_keys(password + Keys.RETURN) 
#sends login information, goes to next page and clicks on Relevant Link Text 
browser.find_element_by_partial_link_text("Relevant Link Text").click() 

,它會工作的偉大的大部分時間,但有時我會得到一個錯誤的地方都找不到「相關鏈接文字」,因爲它不能「看到」它或其他某種東西。

此外,有沒有更好的方法來檢查元素是否存在與否?那是,什麼是處理的最佳方式:

browser.find_element_by_id("something") 

當該元素可能會或可能不存在?

+0

我要補充的是,元素的東西,當它不能找到的東西拋出一個錯誤。你通常使用try /除了所有find_element命令嗎? – 2012-03-22 14:22:09

+0

*哦,非常傷心* :( – 2012-03-22 15:49:05

+0

不允許轉貼,如果您想要關注,請閱讀[faq#bounty]中的此部分。 – Will 2012-03-26 18:28:50

回答

9

你可以使用WebDriverWait

from contextlib import closing 
from selenium.webdriver import Chrome as Browser 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.common.exceptions import NoSuchFrameException 


def frame_available_cb(frame_reference): 
    """Return a callback that checks whether the frame is available.""" 
    def callback(browser): 
     try: 
      browser.switch_to_frame(frame_reference) 
     except NoSuchFrameException: 
      return False 
     else: 
      return True 
    return callback 

with closing(Browser()) as browser: 
    browser.get(url) 
    # wait for frame 
    WebDriverWait(browser, timeout=10).until(frame_available_cb("frame name")) 
+1

+1。顯性/隱性等待是最可靠的解決方案這一點。 – 2012-03-26 09:22:37