【问题标题】:NoSuchElementException: Message: no such element: Unable to locate element: {"method":"id","selector":"username"}NoSuchElementException:消息:没有这样的元素:无法找到元素:{“method”:“id”,“selector”:“username”}
【发布时间】:2016-08-17 22:08:29
【问题描述】:

这是我用 selenium 编写的登录网页的方法:

def login(self, username, password):
    driver.switch_to.default_content()
    driver.switch_to.frame("iframe")
    driver.find_element_by_id("username").send_keys(username)
    driver.find_element_by_id("password").send_keys(password)
    driver.find_element_by_id("loginButton").click()

这是我在 Robot Framework 中的代码:

*** Settings ***
Library           CustomSelenium2Plus.py

*** Test Cases ***
SR Create New Service
    Open Browser    https://partner.sdg.msg.lab.t-mobile.com/tpim/    Chrome
    ${webdriver}=    Get webdriver instance
    Set Driver    ${webdriver}
    Login    usrnm    pwd
    ...
    Delete Service
    Close Browser

CustomSelenium2Plus.py 是我编写的自定义库,它继承了 RobotFramework 的 Selenium2Library,并且是登录方法所在的位置。当我第一次使用Login 关键字调用它时,该方法完全可用。但是,当它在Delete Service 关键字的函数中被第二次调用时,它会抛出一个NoSuchElementException,如下所示:

def delete_service(self):
    self.logout()
    self.login("usrnm", "pwd")
    ...

我已经检查过框架是否正确。我也已经尝试让我的 WebDriver 等待 iframe 和用户名 textarea 的可见性、隐式 WebDriverWaittime.sleep(30)

编辑:HTML 代码不是我的,而且非常丑陋,但这是一个屏幕截图

从技术上讲,有四个 iframe 相互嵌套,但多次调用 driver.switch_to.frame("iframe") 会引发 NoSuchFrameException

【问题讨论】:

  • 如果您提供相关的 HTML 可能会有所帮助,以便我们仔细检查并确保没有遗漏任何简单的内容。
  • 上面显示的登录方法在执行任何操作之前没有任何等待元素,这可能是NoSuchElementException的原因,我猜,注销后,登录页面需要时间来加载元素
  • @SatishGupta 我没有包含这些代码行,但我已经在登录功能中尝试过等待。我在切换帧(加上我提到的其他内容)之前和之后放置 time.sleep(30) 只是为了确保。问题仍然存在;第一次工作,而不是第二次。
  • @EmilyZhai 您可能想尝试显式等待元素。像 new WebDriverWait(driver, 5).until(ExpectedConditions.visibilityOfElement(). 只是猜测
  • @SatishGupta 在帧切换前后都试过了。

标签: python selenium robotframework


【解决方案1】:

我猜想多次重复driver.switch_to.frame("iframe") 行会奏效。从技术上讲,该 id 在页面上不是唯一的,所以我会尝试使用索引。从您提供的 HTML 来看,您想要的 IFRAME 似乎每次都是第一个。以下将有望工作。

driver.switch_to.default_content()
driver.switch_to.frame(0)
driver.switch_to.frame(0)
driver.switch_to.frame(0)
driver.find_element_by_id("username").send_keys(username)
driver.find_element_by_id("password").send_keys(password)
driver.find_element_by_id("loginButton").click()

从技术上讲,第一行不是必需的,除非您在此之前执行代码,该代码潜入IFRAME,但我将其包括在内,因为您在上面有它。

【讨论】:

  • 第一次在一个、两个和三个 driver.switch_to.frame(0) 命令处引发 NoSuchFrameException。
  • 有些东西没有加起来...你能分享一个页面链接吗?
  • 我没有登录,你有可以分享的吗?
  • 我不认为公开分享它是一个好主意,因为它是一项公司服务,有人很容易向它发送垃圾邮件。如果我们可以单独联系,但我可以为您提供一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2018-12-31
  • 2021-05-19
  • 2018-04-09
相关资源
最近更新 更多