【发布时间】: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 的可见性、隐式 WebDriverWait 和 time.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