Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Selenium (waiting for frame, element lookups)

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?

like image 931
John Smith Avatar asked Mar 22 '12 13:03

John Smith


People also ask

How do you wait for a frame in Selenium?

We can wait for the iframe to load completely with Selenium webdriver. First of all we need to identify the iframe with the help iframe id, name, number or webelement. Then we shall use the explicit wait concept in synchronization to wait for the iframe to load.

How do I wait for an element to appear in Selenium Python?

Selenium: Waiting Until the Element Is Visiblevar wait = new WebDriverWait(driver, TimeSpan. FromSeconds(20)); As you can see, we give the WebDriverWait object two parameters: the driver itself and a TimeSpan object that represents the timeout for trying to locate the element.

How do you wait for a specific element in Selenium?

Implicit Wait directs the Selenium WebDriver to wait for a certain measure of time before throwing an exception. Once this time is set, WebDriver will wait for the element before the exception occurs. Once the command is in place, Implicit Wait stays in place for the entire duration for which the browser is open.


1 Answers

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"))
like image 99
jfs Avatar answered Oct 02 '22 20:10

jfs