Python Selenium(等待框架,元素查找)

Python Selenium (waiting for frame, element lookups)

我有这些包括:

1
2
3
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys

浏览器设置通过

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

但是有时候我会

1
browser.switch_to_frame("nameofframe")

它不会起作用(有时会起作用,有时不会起作用)。

我不确定这是否是因为Selenium实际上并没有在执行其余的代码或什么之前等待页面加载。是否有强制网页加载的方法?

因为有时候我会做一些像

1
2
3
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()

它在大多数时候都能很好地工作,但有时我会遇到一个错误,它找不到"相关链接文本",因为它看不到它或其他类似的东西。

另外,是否有更好的方法来检查元素是否存在?也就是说,最好的处理方法是:

1
browser.find_element_by_id("something")

何时该元素可能存在或可能不存在?


您可以使用WebDriverWait

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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"))