2012-03-22 148 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