加载问题
原出错代码:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://passport.weibo.cn/signin/login')
account = browser.find_element_by_id('loginName')
account.send_keys('123')
运行后产生异常(不可交互元素):
selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable
微博网页是异步加载,可能是js还没load出来
于是加入
time.sleep(t) # t表示推迟执行的秒数
可运行代码:
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get('https://passport.weibo.cn/signin/login')
time.sleep(2)
account = browser.find_element_by_id('loginName')
account.send_keys('123')
time.sleep()是强制等待,运行速度会很慢
换成隐性等待
driver.implicitly_wait(t) # 表示设置最长等待时间t,如果网页在t内加载完成则执行下一步,否则到时间截止再到下一步
隐性等待对全局有效
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://passport.weibo.cn/signin/login')
browser.implicitly_wait(10)
account = browser.find_element_by_id('loginName')
account.send_keys('123')
显然隐性等待还是会对脚本运行速度有一定拖延,浪费不必要的时间
想换成显性等待:
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
browser.get('https://passport.weibo.cn/signin/login?entry=mweibo')
WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.ID, 'loginName')))
account = browser.find_element_by_id('loginName')
account.send_keys('123')
新增语句是表示locate到id='loginName'就执行下一句的意思
但仍然会返回
selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable
十有八九就是异步加载网站JS还没加载完成的原因了