无法通过Selenium在iframe中定位元素

时间:2018-10-11 03:53:14

标签: python selenium selenium-webdriver webdriver webdriverwait

我是Selenium的新手。我正在尝试编写将登录到特定表单的Python脚本。表单位于http://www.tvta.ca/securedContent

我正在运行的代码是:

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

我看到一条错误消息:

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

我不确定这里缺少什么吗?我已经检查了网页的来源,登录字段的名称绝对是txtUserName。

3 个答案:

答案 0 :(得分:2)

该网站要求启用第三方Cookie;没有它们,将不会加载登录表单。很有可能您是用这种方式配置浏览器的,但是serviceHub.cordaService(CustomService::class.java)的默认值却没有。

要查看Selenium实际看到的内容,请转储webdriver.Firefox和/或使用driver.page_source截屏。

答案 1 :(得分:2)

您需要切换到框架以在文本框中写入文本,尝试检查语法一次,因为我对Python的了解较少

framLogin= driver.find_element_by_id("membeeLoginIF")
driver.switch_to.frame(framLogin)
EmailTxt = driver.find_element_by_name("txtUserName");
EmailTxt.send_Keys("Test@gmail.com");

与Java相同

WebElement framLogin= driver.findElement(By.id("membeeLoginIF"));
driver.switchTo().frame(framLogin);
WebElement EmailTxt = driver.findElement(By.name("txtUserName"));
EmailTxt.sendKeys("Test@gmail.com");

答案 2 :(得分:2)

所需元素在<iframe>之内,@ iamsankalp89的分析方向正确。但是根据最佳做法,您必须:

  • 诱导 WebDriverWait 使所需的框架可用并切换到该框架。
  • 诱使 WebDriverWait 使其可单击所需的元素,您可以使用以下解决方案:
  • 代码块:

    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")
    
  • 您必须添加以下导入:

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