这是我用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
关键字调用它时,该方法完全正常。但是,如果它在NoSuchElementException
关键字的功能中第二次被调用,它会抛出Delete Service
,如下所示:
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
答案 0 :(得分:0)
我会猜到重复一行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
,但我把它包括在内,因为你已经将它包含在上面。