selenium学习笔记(智能等待)
博主在尝试对百度首页用selenium完成自动登录的功能
反复多次尝试元素定位方法也未写错、最后发现问题原因:
脚本运行速度快于页面加载速度
如百度首页登录例子、脚本已经开始寻找登录弹窗
但是页面仍在加载、导致程序报错
博主就整理下智能等待的方法
首先是显示等待:即等待页面某个元素出现、超时则抛出错误
1 #!/usr/bin/env python 2 # -*- coding: utf_8 -*- 3 4 from learn_webdriver import Webdriver 5 from selenium import webdriver 6 from selenium.webdriver.support.ui import WebDriverWait 7 from time import sleep 8 9 browser_chrome = webdriver.Chrome(Webdriver.chrome()) 10 browser_chrome.get("http://www.baidu.com") 11 12 browser_chrome.find_element_by_css_selector("html body div#wrapper div#head div.head_wrapper div#u1 a.lb").click() 13 # 定位百度首页中登录按钮元素 14 WebDriverWait(browser_chrome, 10).until(lambda the_driver: 15 browser_chrome.find_element_by_class_name("tang-foreground").is_displayed()) 16 browser_chrome.find_element_by_class_name("tang-foreground").find_element_by_name("userName").send_keys(u"baidu用户名") 17 # 定位到登录窗口后再定位到用户名输入框 18 browser_chrome.find_element_by_name("password").send_keys(u"baidu密码") 19 sleep(2) 20 print browser_chrome.title 21 browser_chrome.quit()
这里主要是使用 WebDriverWait() 类构建方法、直到找到登录弹窗元素为止
下面是隐形等待:即设置等待时间、等待页面完成新的操作后、若超时则抛出错误
1 #!/usr/bin/env python 2 # -*- coding: utf_8 -*- 3 4 from learn_webdriver import Webdriver 5 from selenium import webdriver 6 from selenium.webdriver.support.ui import WebDriverWait 7 from time import sleep 8 9 browser_chrome = webdriver.Chrome(Webdriver.chrome()) 10 browser_chrome.get("http://www.baidu.com") 11 12 browser_chrome.find_element_by_css_selector("html body div#wrapper div#head div.head_wrapper div#u1 a.lb").click() 13 # 定位百度首页中登录按钮元素 14 browser_chrome.implicitly_wait(30) 15 # 添加智能等待时间 16 div_user = browser_chrome.find_element_by_class_name("tang-foreground").find_element_by_name("userName") 17 div_user.send_keys(u"baidu用户名") 18 div_pass = browser_chrome.find_element_by_name("password").send_keys(u"baidu密码") 19 sleep(2) 20 print browser_chrome.title 21 browser_chrome.quit()
implicitly方法智能设置等待时间30S、超时则抛出异常