python3 爬虫中使用 selenium之expected_conditions模块详解
下面我将介绍如何使用 selenium之expected_conditions模块:
官方文档参考地址为:https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.expected_conditions
准备工作:在使用selenium之前,需要先安装pip install selenium,且安装chromedriver。
说明:本文中黄色高亮部分是使用该方法的地方,其他代码变化很小。
我将介绍17个方法的使用:
1. title
含义:判断标题是否为某内容
使用方式:
# -*- coding:utf-8 -*- 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.Chrome() browser.get('https://www.cnblogs.com/akinodoo/') wait = WebDriverWait(browser,1) result = wait.until(EC.title_is('杜菲 - 博客园')) print(result) browser.close()
运行结果:
True
说明:
判断网页(https://www.cnblogs.com/akinodoo/)中,它的标题是否为'杜菲 - 博客园',如果是,则返回True,如果不是,则返回False。
2. title_contains
含义:判断标题是否包含某内容
使用方式:
# -*- coding:utf-8 -*-
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.Chrome()
browser.get('https://www.cnblogs.com/akinodoo/')
wait = WebDriverWait(browser,1)
result = wait.until(EC.title_contains('杜菲'))
print(result)
browser.close()
运行结果:
True
说明:
判断网页(https://www.cnblogs.com/akinodoo/)中,它的标题是否包含'杜菲',如果包含,则返回True,如果不包含,则返回False。
已知标题的完整内容是'杜菲 - 博客园',所以代码‘杜菲’属于标题的一部分所以返回True,即contains的内容应该小于等于标题的全部内容才返回True。
3. presence_of_element_located
含义:节点加载出来,传入定位元组,如(By.ID,'home'),注意:代码中元组部分括号的数量,好几个哦!
使用方式:
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.Chrome() browser.get('https://www.cnblogs.com/akinodoo/') wait = WebDriverWait(browser,1) result = wait.until(EC.presence_of_element_located((By.ID,'home'))) print(result) browser.close()
运行结果:
<selenium.webdriver.remote.webelement.WebElement (session="0999cab7d924965b86892a57827c21a4", element="f63d24ce-d539-415a-8092-e96183ba98d7")>
说明:
判断网页(https://www.cnblogs.com/akinodoo/)中,它的ID内容为home是否存在,如果存在则输出节点,其类型为Webelement。
如果不存在,会抛出错误:(selenium.common.exceptions.TimeoutException: Message: )。
4. visibility_of_element_located
含义:节点可见,传入定位元组
使用方式:
# -*- coding:utf-8 -*- 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.Chrome() browser.get('https://www.cnblogs.com/akinodoo/') wait = WebDriverWait(browser,1) result = wait.until(EC.visibility_of_element_located((By.ID,'home'))) print(result) browser.close()
运行结果:
<selenium.webdriver.remote.webelement.WebElement (session="a23134b6b0bd50ff86571452f3a0bc5d", element="39f08abf-0bf0-44de-93b7-4bc9e3cdabd9")>
说明:
判断网页(https://www.cnblogs.com/akinodoo/)中,它的ID内容为home是否可见,如果可见则输出节点,其类型为Webelement。
如果不可见,会抛出错误:(selenium.common.exceptions.TimeoutException: Message: )。
5. visibility_of
含义:可见,传入节点对象
使用方式:
# -*- coding:utf-8 -*- 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.Chrome() browser.get('https://www.cnblogs.com/akinodoo/') wait = WebDriverWait(browser,1) ss = wait.until(EC.visibility_of_element_located((By.ID,'home'))) result = wait.until(EC.visibility_of(ss))
print(ss)
print(result)
browser.close()
运行结果:
<selenium.webdriver.remote.webelement.WebElement (session="f268204bbeb6c9d5cb3a4683d9f76cd4", element="047d76b8-f32c-4f7b-bc1d-c7a2bece5bb0")>
<selenium.webdriver.remote.webelement.WebElement (session="f268204bbeb6c9d5cb3a4683d9f76cd4", element="047d76b8-f32c-4f7b-bc1d-c7a2bece5bb0")>
说明:
判断网页(https://www.cnblogs.com/akinodoo/)中,它的ID内容为home是否可见,如果可见则将输出节点,其类型为Webelement。而产生的节点对象可以放入EC.visibility_of()方法中。
可以看到运行后输出的结果,两者是一致的。
如果不可见,会抛出错误:(selenium.common.exceptions.TimeoutException: Message: )。
6. presence_of_all_elements_located
含义:所有的节点加载出来
使用方式:
# -*- coding:utf-8 -*- 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.Chrome() browser.get('https://www.cnblogs.com/akinodoo/') wait = WebDriverWait(browser,1) result = wait.until(EC.presence_of_all_elements_located((By.ID,'main'))) print(result) browser.close()
运行结果:
[<selenium.webdriver.remote.webelement.WebElement (session="d10c5a1c126de015ae894e6ac71b14a3", element="eb1d63a9-9ec0-40c6-ac74-e8e0364f953f")>]
说明:
判断网页(https://www.cnblogs.com/akinodoo/)中,它的ID内容为main所有节点加载出来,其类型为Webelement。
7. text_to_be_present_in_element
含义:判断某个节点文本包含某文字
使用方式:
# -*- coding:utf-8 -*- 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.Chrome() browser.get('https://www.cnblogs.com/akinodoo/') wait = WebDriverWait(browser,5) result = wait.until(EC.text_to_be_present_in_element((By.ID,"footer"),'杜菲')) print(result) browser.close()
运行结果:
True
说明:
判断网页(https://www.cnblogs.com/akinodoo/)中,它的ID名为footer的节点文本中是否包含'杜菲',若果包含,则返回True,如果不包含,则返回False。
8.text_to_be_present_in_element_value
含义:判断某个节点值包含某文字
使用方式:
# -*- coding:utf-8 -*- 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.Chrome() browser.get('https://www.2cto.com/shouce/w3school/htmldom/prop_hidden_value.asp.html') wait = WebDriverWait(browser,2) result = wait.until(EC.text_to_be_present_in_element_value((By.CLASS_NAME,"button"),'Go')) print(result) browser.close()
运行结果:
True
说明:
判断网页(https://www.2cto.com/shouce/w3school/htmldom/prop_hidden_value.asp.html)中,它的CLASS_NAME名为button的节点文本中是否包含'Go',如果包含,则返回True,如果不包含,则返回False。
用的时候仔细看:
本函数text_tp_be_present_in_element_value 和上个函数 text_to_be_present_in_element长得很像,多了个‘_value’。用的地方不一样: 其中,本函数text_tp_be_present_in_element_value用于判断 <input> 元素的value属性值: 即在看源码过程中:当你发现在 input 标签里有value这个属性 ,如: <input type="submit" value="Go" class="button" title="搜索!"> 就可以使用text_tp_be_present_in_element_value,看是否value中包含某一字段。如现在value值是Go,你就可以判断是否包含'G'或者是否包含'o',再或者像我上面的代码判断是否包含'Go'
9.frame_to_be_available_and_switch_to_it
含义:用于判断是否能够加载frame,可以则切换到这个frame
使用方式:
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.Chrome() browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable') wait = WebDriverWait(browser,2) result = wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID,'iframeResult'))) print(result) browser.close()
结果:
True
说明:
判断网页(http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable)中,它的ID名为iframeResulut的节点是否存在,如果存在,则加载并转到这个节点下且返回True,否则返回False。
10.invisibility_of_element_located
含义:节点不可见,传入定位元组
使用方式:
# -*- coding:utf-8 -*- 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.Chrome() browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable') wait = WebDriverWait(browser,2) result = wait.until(EC.invisibility_of_element_located((By.ID,'footer'))) print(result) browser.close()
结果:
True
说明:
判断网页(http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable)中,它的ID名为footer的节点不可见,如果不可见,则返回True,可见则返回False
11.element_to_be_clickable
含义:节点可点击,传入定位元组
使用方式:
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.Chrome() browser.get('https://www.cnblogs.com/akinodoo/') wait = WebDriverWait(browser,2) result = wait.until(EC.element_to_be_clickable((By.ID,'blog_nav_admin'))) print(result) browser.close()
结果:
<selenium.webdriver.remote.webelement.WebElement (session="383d7f4606feeaac623c577611a269c3", element="d0001457-c8bf-4945-8eec-1796a8123c2c")>
说明:
用于查看网页(http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable)中ID名为blog_nav_admin的节点是否可点击,如果可点击,则返回它的对象,类型为WebElement。否则,报错。
12.element_to_be_selected
含义:判断某个元素对象是否被选中了,一般用在下拉列表,传入节点对象
使用方式:
# -*- coding:utf-8 -*- 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.Chrome() browser.get('https://reg.mail.163.com/unireg/call.do?cmd=register.entrance') wait = WebDriverWait(browser,2) ss = wait.until(EC.presence_of_element_located((By.XPATH,"//*[@id='mainDomainSelect']/option[1]"))) result = wait.until(EC.element_to_be_selected(ss)) print(result) browser.close()
结果:
True
说明:
判断网页(https://reg.mail.163.com/unireg/call.do?cmd=register.entrance)中是否选中了163.com这个option选项,选中则返回True,没有选中则返回False或者直接报错:selenium.common.exceptions.TimeoutException: Message。
13.element_located_to_be_selected
含义:判断某个元素是否被选中了,一般用在下拉列表,传入定位元组
使用方式:
# -*- coding:utf-8 -*- 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.Chrome() browser.get('https://reg.mail.163.com/unireg/call.do?cmd=register.entrance') wait = WebDriverWait(browser,2) result = wait.until(EC.element_located_to_be_selected((By.XPATH,"//*[@id='mainDomainSelect']/option[1]"))) print(result) browser.close()
结果:
True
说明:
判断网页(https://reg.mail.163.com/unireg/call.do?cmd=register.entrance)中是否选中了163.com这个option选项,选中则返回True,没有选中则返回False或者直接报错:selenium.common.exceptions.TimeoutException: Message。
14.element_selection_state_to_be
含义:'判断某个元素的选中状态是否符合预期,一般用在下拉列表,传入节点对象
使用方式:
# -*- coding:utf-8 -*- 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.Chrome() browser.get('https://reg.mail.163.com/unireg/call.do?cmd=register.entrance') wait = WebDriverWait(browser,2) ss = wait.until(EC.presence_of_element_located((By.XPATH,"//*[@id='mainDomainSelect']/option[1]"))) result = wait.until(EC.element_selection_state_to_be(ss,True)) print(result) browser.close()
结果:
True
说明:
判断网页(https://reg.mail.163.com/unireg/call.do?cmd=register.entrance)中是否选中了163.com这个option选项,事先预期认为返回结果是True,如果和预期相同,则最终结果返回True,否则返回False或者直接报错:selenium.common.exceptions.TimeoutException: Message。
15.element_located_selection_state_to_be
含义:判断某个元素的选中状态是否符合预期,一般用在下拉列表,传入定位元组
使用方式:
# -*- coding:utf-8 -*- 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.Chrome() browser.get('https://reg.mail.163.com/unireg/call.do?cmd=register.entrance') wait = WebDriverWait(browser,2) result = wait.until(EC.element_located_selection_state_to_be((By.XPATH,"//*[@id='mainDomainSelect']/option[1]"),True)) print(result) browser.close()
结果:
True
说明:
判断网页(https://reg.mail.163.com/unireg/call.do?cmd=register.entrance)中是否选中了163.com这个option选项,事先预期认为返回结果是True,如果和预期相同,则最终结果返回True,否则返回False或者直接报错:selenium.common.exceptions.TimeoutException: Message。
16.alert_is_present
含义:判断页面上是否存在alert,如果有就切换到alert并返回alert的内容
使用方式:
# -*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time browser = webdriver.Chrome() browser.get('http://sahitest.com/demo/alertTest.htm') wait = WebDriverWait(browser,2) browser.find_element_by_name('b1').click() time.sleep(2) result = wait.until(EC.alert_is_present()) print(result) browser.switch_to.alert.accept() time.sleep(4) browser.close()
说明:
判断网页(http://sahitest.com/demo/alertTest.htm)上是否有alert,有的话接下来点击确定。
首先通过find_element_by_name找到b1按钮,然后模拟鼠标单击该按钮,然后跳出alert页面,通过alert_is_present()发现alert的存在并返回它的节点对象。跳出的alert上面有个确定按钮,最后模拟鼠标点击alert上的确定按钮,是用browser.switch_to.alert.accept()语句实现的。
17.staleness_of
含义:等待某个元素从dom树中移除,传入节点对象
使用方式:
# -*- coding:utf-8 -*- 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.Chrome() browser.get('') #暂时未找到合适的网站例子 wait = WebDriverWait(browser,2) ss = wait.until(EC.presence_of_element_located((By.ID,"FOOT"))) result = wait.until(EC.staleness_of(ss)) print(result) browser.close()
以上是selenium之expected_conditions模块中的17种方法的使用详解,每个代码都是可以直接运行的。欢迎提出建议,期待一起交流学习爬虫相关内容。

浙公网安备 33010602011771号