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、超时则抛出异常

原文地址:https://www.cnblogs.com/cllovewxq/p/5481901.html