这里首先引入WebDriverWait这个对象,指定最长等待时间,然后调用它的until()方法,传入要等待条件expected_conditions。比如,这里传入了presence_of_element_located这个条件,代表节点出现的意思,其参数是节点的定位元组,也就是ID为q的节点搜索框。
这样可以做到的效果就是,在10秒内如果ID为q的节点(即搜索框)成功加载出来,就返回该节点;如果超过10秒还没有加载出来,就抛出异常。
对于按钮,可以更改一下等待条件,比如改为element_to_be_clickable,也就是可点击,所以查找按钮时查找CSS选择器为.btn-search的按钮,如果10秒内它是可点击的,也就是成功加载出来了,就返回这个按钮节点;如果超过10秒还不可点击,也就是没有加载出来,就抛出异常。
运行代码,在网速较佳的情况下是可以成功加载出来的。
控制台的输出如下:
1
2
3
4
|
<selenium.webdriver.remote.webelement.WebElement (session= "07dd2fbc2d5b1ce40e82b9754aba8fa8" , element="0.564264629 4074107-1")> <selenium.webdriver.remote.webelement.WebElement (session= "07dd2fbc2d5b1ce40e82b9754aba8fa8" , element="0.564264629 4074107-2")> |
可以看到,控制台成功输出了两个节点,它们都是WebElement类型。
如果网络有问题,10秒内没有成功加载,那就抛出TimeoutException异常,此时控制台的输出如下:
1
2
3
4
5
|
TimeoutException Traceback (most recent call last) <ipython-input-4-f3d73973b223> in <module>() 7 browser.get( 'https://www.taobao.com/' ) 8 wait = WebDriverWait(browser, 10) ----> 9 input = wait.until(EC.presence_of_element_located((By.ID, 'q' ))) |
关于等待条件,其实还有很多,比如判断标题内容,判断某个节点内是否出现了某文字等。表7-1列出了所有的等待条件。
表7-1 等待条件及其含义
关于更多等待条件的参数及用法,可以参考官方文档:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.expected_conditions。
12. 前进和后退
平常使用浏览器时都有前进和后退功能,Selenium也可以完成这个操作,它使用back()方法后退,使用forward()方法前进。示例如下:
1
2
3
4
5
6
7
8
9
10
|
import time from selenium import webdriver browser = webdriver.Chrome() browser.get( 'https://www.baidu.com/' ) browser.get( 'https://www.taobao.com/' ) browser.get( 'https://www.python.org/' ) browser.back() time.sleep(1) browser.forward() browser.close() |
这里我们连续访问3个页面,然后调用back()方法回到第二个页面,接下来再调用forward()方法又可以前进到第三个页面。
13. Cookies
使用Selenium,还可以方便地对Cookies进行操作,例如获取、添加、删除Cookies等。示例如下:
1
2
3
4
5
6
7
8
|
from selenium import webdriver browser = webdriver.Chrome() browser.get( 'https://www.zhihu.com/explore' ) print (browser.get_cookies()) browser.add_cookie({ 'name' : 'name' , 'domain' : 'www.zhihu.com' , 'value' : 'germey' }) print (browser.get_cookies()) browser.delete_all_cookies() print (browser.get_cookies()) |