webdriver忽略在某些页面上等待

时间:2017-01-23 16:12:58

标签: python selenium selenium-webdriver wait pytest

我有一种情况,我用selenium webdriver测试一些东西。当尝试登录OneDrive时,驱动程序忽略所有等待,我得到"元素不可见错误",特别是对于您输入密码的页面。这只发生在这种情况下,我使用几乎相同的代码在其他几个页面上运行登录过程的其他实例工作正常。

这是与失败代码对应的代码

def selenium_onedrive(loading_done_event, selenium, user, psw):
loading_done_event.wait()
login = selenium.find_elements_by_name('loginfmt')[0]
login.send_keys(user)
next_step = selenium.find_element_by_id('idSIButton9')
next_step.click()

password = WebDriverWait(selenium, 10).until(
    # EC.presence_of_element_located((By.NAME, "passwd"))
    EC.element_to_be_clickable((By.ID, "i0118"))
)

**password.send_keys(psw)**
# password.submit()
next_step = selenium.find_element_by_id('idSIButton9')
next_step.click()

粗线是出现错误的线。它表示无法找到元素,但忽略了等待(甚至隐含的等待)。

这是一个有效的登录代码示例

def selenium_gdrive(loading_done_event, selenium, user, psw):
loading_done_event.wait()
login = selenium.find_elements_by_name('Email')[0]
login.send_keys(user)

selenium.find_elements_by_name('signIn')[0].click()

password = WebDriverWait(selenium, 10).until(
    EC.presence_of_element_located((By.NAME, "Passwd"))
)
password.send_keys(psw)
password.submit()
# now we will be navigated to the consent page
consent_accept_button = WebDriverWait(selenium, 10).until(
    EC.element_to_be_clickable((By.ID, "submit_approve_access"))
)
consent_accept_button.click()

其他信息,使用Firefox驱动程序运行代码。如果我使用Chrome版本,它运行正常,但它不稳定并且随机连接"连接已经远程结束"

1 个答案:

答案 0 :(得分:0)

我注意到它没有加载新页面,而是动态更改表单的内容以显示每个步骤的不同字段。不知道如何正确对待这个,所以我不得不使用time.sleep(1)等待内容加载和代码来定位新元素。我知道这不是最好的方法,但现在是我找到的唯一解决方法。

最终守则

def selenium_onedrive(loading_done_event, selenium, user, psw):
    loading_done_event.wait()
    login = selenium.find_elements_by_name('loginfmt')[0]
    login.send_keys(user)
    next_step = selenium.find_element_by_id('idSIButton9')
    next_step.click()

    time.sleep(1)

    password = WebDriverWait(selenium, 10).until(
    # EC.presence_of_element_located((By.NAME, "passwd"))
    EC.element_to_be_clickable((By.ID, "i0118"))
    )

    **password.send_keys(psw)**
    # password.submit()
    next_step = selenium.find_element_by_id('idSIButton9')
    next_step.click()