Jeff
Jeff

Reputation: 93

Unable to locate element within an iframe through Selenium

I'm new to Selenium. I'm trying to write a Python script that will log in to a particular form. The form is located at http://www.tvta.ca/securedContent

The code I'm running is:

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

driver = webdriver.Firefox()
driver.get("http://tvta.ca/securedContent/")
elem = driver.find_element_by_name("txtUserName")
elem.clear()
elem.send_keys("<<my email>>")

I get an error that says:

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [name="txtUserName"]

I'm not sure what I'm missing here? I've checked the source of the webpage the login field is definitely named txtUserName.

Upvotes: 0

Views: 5009

Answers (3)

iamsankalp89
iamsankalp89

Reputation: 4739

You need to switch to the frame to write text in the textbox, try to check syntax once as I have less in good in Python

framLogin= driver.find_element_by_id("membeeLoginIF")
driver.switch_to.frame(framLogin)
EmailTxt = driver.find_element_by_name("txtUserName")
EmailTxt.send_Keys("[email protected]")

Same in Java

WebElement framLogin= driver.findElement(By.id("membeeLoginIF"));
driver.switchTo().frame(framLogin);
WebElement EmailTxt = driver.findElement(By.name("txtUserName"));
EmailTxt.sendKeys("[email protected]");

Upvotes: 4

undetected Selenium
undetected Selenium

Reputation: 193058

The desired element is within an <iframe>. So as per best practices you have to:

  • Induce WebDriverWait for the desired frame to be available and switch to it.

  • Induce WebDriverWait for the desired element to be clickable and you can use the following Locator Strategies:

    WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"membeeLoginIF")))
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.textboxWaterMark#txtUserName"))).send_keys("Jeff")
    
  • You have to add the following imports :

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

Upvotes: 3

kungphu
kungphu

Reputation: 4849

That site requires third-party cookies to be enabled; without them, the login form does not load. It's likely you have your browser configured that way but the defaults for webdriver.Firefox do not.

To see what Selenium is actually seeing, dump driver.page_source and/or take a screenshot with driver.save_screenshot(...).

Upvotes: 3

Related Questions