Unable to locate element within an iframe through Selenium

Question:

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.

Asked By: Jeff

||

Answers:

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

Answered By: kungphu

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]");
Answered By: iamsankalp89

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
    
Answered By: undetected Selenium