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") |
何时该元素可能存在或可能不存在?
您可以使用
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")) |