NoSuchElementException:消息:没有这样的元素:无法找到元素:{"方法":" id","选择器":"用户名"}

时间:2016-08-17 22:08:29

标签: python selenium robotframework

这是我用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,隐式WebDriverWaittime.sleep(30)的可见性。

编辑:HTML代码不是我的,而且非常丑陋,但这里是一个屏幕保护程序

enter image description here

技术上有四个iframe互相嵌套,但是不止一次调用driver.switch_to.frame("iframe")会引发NoSuchFrameException

1 个答案:

答案 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,但我把它包括在内,因为你已经将它包含在上面。