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种方法的使用详解,每个代码都是可以直接运行的。欢迎提出建议,期待一起交流学习爬虫相关内容。

 

posted @ 2020-01-25 13:42  杜菲  阅读(1302)  评论(0)    收藏  举报