Python selenium不能与WebDriverWait一起使用

use*_*575 4 python selenium selenium-webdriver

我尝试用selenium登录google.如果我像这个代码一样使用sleep(),它会起作用

browser = webdriver.Firefox()
browser.get('https://admin.google.com/')

emailElem = browser.find_element_by_id('Email')
emailElem.send_keys('mymail')
nextButton = browser.find_element_by_id('next')
nextButton.click()

sleep(5)
passwordElem = browser.find_element_by_id('Passwd')
passwordElem.send_keys('mypass')
signinButton = browser.find_element_by_id('signIn')
signinButton.click()
Run Code Online (Sandbox Code Playgroud)

如果我像这样将睡眠改为WebDriverWait

browser = webdriver.Firefox()
browser.get('https://admin.google.com/')

emailElem = browser.find_element_by_id('Email')
emailElem.send_keys('mymail')
nextButton = browser.find_element_by_id('next')
nextButton.click()


passwordElem = WebDriverWait(browser, 5).until(
    EC.presence_of_element_located(browser.find_element_by_id('Passwd'))
)
passwordElem.send_keys('mypass')
signinButton = browser.find_element_by_id('signIn')
signinButton.click()
Run Code Online (Sandbox Code Playgroud)

它显示这样的错误.

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [id="Passwd"]
Run Code Online (Sandbox Code Playgroud)

如何使用WebDriverWait?

Vag*_*gif 7

是的,盖伊说,你browser.find_element_by_id('Passwd'))不是必要的.更改((By.ID, "Passwd")))文档中显示的内容.这是代码应该是什么:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

browser = webdriver.Firefox()
browser.get('https://admin.google.com/')

emailElem = browser.find_element_by_id('youremail@example.com')
emailElem.send_keys('youremail')
nextButton = browser.find_element_by_id('next')
nextButton.click()


passwordElem = WebDriverWait(browser,     5).until(EC.presence_of_element_located((By.ID, "Passwd")))

passwordElem.send_keys('yourpassword')
signinButton = browser.find_element_by_id('signIn')
signinButton.click()
Run Code Online (Sandbox Code Playgroud)


Guy*_*Guy 5

你并不需要使用browser.find_elementexpected_conditions(这就是为什么你得到NoSuchElementException的,而不是TimeOutException).正确的使用方法是(By.ID, "id")

passwordElem = WebDriverWait(browser, 5).until(
    EC.presence_of_element_located((By.ID, "Passwd"))
)
Run Code Online (Sandbox Code Playgroud)