Python Selenium (waiting for frame, element lookups)

0
0

I have these includes:

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

Browser set up via

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

However sometimes I do

browser.switch_to_frame("nameofframe")

And it won’t work (sometimes it does, sometimes it doesn’t).

I am not sure if this is because Selenium isn’t actually waiting for pages to load before it executes the rest of the code or what. Is there a way to force a webpage load?

Because sometimes I’ll do something like

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()

And it’ll work great most of the time, but sometimes I’ll get an error where it can’t find “Relevant Link Text” because it can’t “see” it or some other such thing.

Also, is there a better way to check if an element exists or not? That is, what is the best way to handle:

browser.find_element_by_id("something")

When that element may or may not exist?

  • You must to post comments
0
0

You could use 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"))
  • You must to post comments
Showing 1 result
Your Answer
Post as a guest by filling out the fields below or if you already have an account.
Name*
E-mail*
Website