以 下 文 章 来 源 于 可 以 叫 我 才 哥 ,作 者 道 才
明天带大家一起学(复)习模仿浏览器运行的库Selenium
,它是一个用于Web
应用程序测试的工具。Selenium
测试间接运行在浏览器中,就像真正的用户在操作一样。反对的浏览器包含IE
(7, 8, 9, 10, 11),Mozilla Firefox
,Safari
,Google Chrome
,Opera
和Edge
等。
这里我将以Chrome
为例进行Selenium
性能的演示~
0. 筹备工作
在开始后续性能演示之前,咱们须要先装置Chrome
浏览器并配置好ChromeDriver
,当然也须要装置selenium
库!
0.1. 装置selenium库
pip install selenium
0.2. 装置浏览器驱动
其实,有两种形式装置浏览器驱动:一种是常见的手动装置,另一种则是利用第三方库主动装置。
以下前提:大家都曾经装置好了Chrome
浏览器哈
手动装置
先查看本地Chrome
浏览器版本:(两种形式均可)
- 在浏览器的地址栏键入
Chrome://version
,即可查看浏览器版本号
- 或者点击
Chrome
菜单 帮忙→对于Google Chrome,查看浏览器版本号
再抉择对应版本号的驱动版本
下载地址:https://chromedriver.storage....
最初进行环境变量配置,也就是将对应的ChromeDriver
的可执行文件chromedriver.exe
文件拖到Python
的Scripts
目录下。
注:当然也能够不这样做,然而在调用的时候指定chromedriver.exe
绝对路径亦可。
主动装置
主动装置须要用到第三方库webdriver_manager
,先装置这个库,而后调用对应的办法即可。
from selenium import webdriverfrom selenium.webdriver.common.keys import Keysfrom webdriver_manager.chrome import ChromeDriverManagerbrowser = webdriver.Chrome(ChromeDriverManager().install())browser.get('http://www.baidu.com')search = browser.find_element_by_id('kw')search.send_keys('python')search.send_keys(Keys.ENTER)# 敞开浏览器browser.close()
在上述代码中,ChromeDriverManager().install()
办法就是主动装置驱动的操作,它会主动获取以后浏览器的版本并去下载对应的驱动到本地。
====== WebDriver manager ======Current google-chrome version is 96.0.4664Get LATEST chromedriver version for 96.0.4664 google-chromeThere is no [win32] chromedriver for browser in cacheTrying to download new driver from https://chromedriver.storage.googleapis.com/96.0.4664.45/chromedriver_win32.zipDriver has been saved in cache [C:\Users\Gdc\.wdm\drivers\chromedriver\win32\96.0.4664.45]
如果本地曾经有该浏览器渠道,则会提醒其已存在。
====== WebDriver manager ======Current google-chrome version is 96.0.4664Get LATEST driver version for 96.0.4664Driver [C:\Users\Gdc\.wdm\drivers\chromedriver\win32\96.0.4664.45\chromedriver.exe] found in cache
搞定以上筹备工作,咱们就能够开始本文正式内容的学习啦~
1. 根本用法
这节咱们就从初始化浏览器对象、拜访页面、设置浏览器大小、刷新页面和后退后退等根底操作。
1.1. 初始化浏览器对象
在筹备工作局部咱们提到须要将浏览器渠道增加到环境变量或者指定绝对路径,前者能够间接初始化后者则须要进行指定。
from selenium import webdriver# 初始化浏览器为chrome浏览器browser = webdriver.Chrome()# 指定绝对路径的形式path = r'C:\Users\Gdc\.wdm\drivers\chromedriver\win32\96.0.4664.45\chromedriver.exe'browser = webdriver.Chrome(path)# 敞开浏览器browser.close()
能够看到以上是有界面的浏览器,咱们还能够初始化浏览器为无界面的浏览器。
from selenium import webdriver# 无界面的浏览器option = webdriver.ChromeOptions()option.add_argument("headless")browser = webdriver.Chrome(options=option)# 拜访百度首页browser.get(r'https://www.baidu.com/')# 截图预览browser.get_screenshot_as_file('截图.png')# 敞开浏览器browser.close()
实现浏览器对象的初始化后并将其赋值给了browser
对象,接下来咱们就能够调用browser
来执行各种办法模仿浏览器的操作了。
1.2. 拜访页面
进行页面拜访应用的是get
办法,传入参数为待拜访页面的URL
地址即可。
from selenium import webdriver# 初始化浏览器为chrome浏览器browser = webdriver.Chrome()# 拜访百度首页browser.get(r'https://www.baidu.com/')# 敞开浏览器browser.close()
1.3. 设置浏览器大小
set_window_size()
办法能够用来设置浏览器大小(就是分辨率),而maximize_window
则是设置浏览器为全屏!
from selenium import webdriverimport time browser = webdriver.Chrome()# 设置浏览器大小:全屏browser.maximize_window() browser.get(r'https://www.baidu.com') time.sleep(2)# 设置分辨率 500*500browser.set_window_size(500,500) time.sleep(2)# 设置分辨率 1000*800browser.set_window_size(1000,800) time.sleep(2)# 敞开浏览器browser.close()
这里就不截图了,大家自行演示看成果哈~
1.4. 刷新页面
刷新页面是咱们在浏览器操作时很罕用的操作,这里refresh()
办法能够用来进行浏览器页面刷新。
from selenium import webdriverimport time browser = webdriver.Chrome()# 设置浏览器全屏browser.maximize_window() browser.get(r'https://www.baidu.com') time.sleep(2)try: # 刷新页面 browser.refresh() print('刷新页面')except Exception as e: print('刷新失败') # 敞开浏览器browser.close()
大家也是自行演示看成果哈,同F5
快捷键。
1.5. 后退后退
后退后退也是咱们在应用浏览器时十分常见的操作,这里forward()
办法能够用来实现后退,back()
能够用来实现后退。
from selenium import webdriverimport time browser = webdriver.Chrome()# 设置浏览器全屏browser.maximize_window() browser.get(r'https://www.baidu.com') time.sleep(2)# 关上淘宝页面browser.get(r'https://www.taobao.com') time.sleep(2)# 后退到百度页面browser.back() time.sleep(2)# 后退的淘宝页面browser.forward() time.sleep(2)# 敞开浏览器browser.close()
2. 获取页面根底属性
当咱们用selenium
关上某个页面,有一些根底属性如网页题目、网址、浏览器名称、页面源码等信息。
from selenium import webdriverbrowser = webdriver.Chrome()browser.get(r'https://www.baidu.com') # 网页题目print(browser.title)# 以后网址print(browser.current_url)# 浏览器名称print(browser.name)# 网页源码print(browser.page_source)
输入如下:
百度一下,你就晓得https://www.baidu.com/chrome<html><head><script async="" src="https://passport.baidu.com/passApi/js/wrapper.js?cdnversion=1640515789507&_=1640515789298"></script><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta content="always" name="referrer"><meta name="theme-color"..."
须要留神的是,这里的页面源码咱们就能够用正则表达式
、Bs4
、xpath
以及pyquery
等工具进行解析提取想要的信息了。
3. 定位页面元素
咱们在理论应用浏览器的时候,很重要的操作有输出文本、点击确定等等。对此,Selenium
提供了一系列的办法来不便咱们实现以上操作。常说的8种
定位页面元素的操作形式,咱们一一演示一下!
咱们以百度首页的搜寻框节点为例,搜寻python
搜寻框的html
构造:
<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
3.1. id定位
find_element_by_id()
依据id
属性获取,这里id
属性是 kw
from selenium import webdriverimport time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 在搜寻框输出 pythonbrowser.find_element_by_id('kw').send_keys('python')time.sleep(2)# 敞开浏览器browser.close()
3.2. name定位
find_element_by_name()
依据name
属性获取,这里name
属性是 wd
from selenium import webdriverimport time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 在搜寻框输出 pythonbrowser.find_element_by_name('wd').send_keys('python')time.sleep(2)# 敞开浏览器browser.close()
3.3. class定位
find_element_by_class_name()
依据class
属性获取,这里class
属性是s_ipt
from selenium import webdriverimport time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 在搜寻框输出 pythonbrowser.find_element_by_class_name('s_ipt').send_keys('python')time.sleep(2)# 敞开浏览器browser.close()
3.4. tag定位
咱们晓得HTML
是通过tag
来定义性能的,比方input
是输出,table
是表格等等。每个元素其实就是一个tag
,一个tag
往往用来定义一类性能,咱们查看百度首页的html
代码,能够看到有很多同类tag
,所以其实很难通过tag
去辨别不同的元素。
find_element_by_tag_name()
from selenium import webdriverimport time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 在搜寻框输出 pythonbrowser.find_element_by_tag_name('input').send_keys('python')time.sleep(2)# 敞开浏览器browser.close()
因为存在多个input
,以上代码会报错。
3.5. link定位
这种办法顾名思义就是用来定位文本链接的,比方百度首页上方的分类模块链接。
find_element_by_link_text()
以新闻为例
from selenium import webdriverimport time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 点击新闻 链接browser.find_element_by_link_text('新闻').click()time.sleep(2)# 敞开浏览器全副页面browser.quit()
3.6. partial定位
有时候一个超链接的文本很长,咱们如果全副输出,既麻烦,又显得代码很不美观,这时候咱们就能够只截取一部分字符串,用这种办法含糊匹配了。
find_element_by_partial_link_text()
from selenium import webdriverimport time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 点击新闻 链接browser.find_element_by_partial_link_text('闻').click()time.sleep(2)# 敞开浏览器全副页面browser.quit()
3.7. xpath定位
后面介绍的几种定位办法都是在现实状态下,有肯定应用范畴的,那就是:在以后页面中,每个元素都有一个惟一的id
或name
或class
或超链接文本
的属性,那么咱们就能够通过这个惟一的属性值来定位他们。
然而在理论工作中并非有这么美妙,那么这个时候咱们就只能通过xpath
或者css
来定位了。
find_element_by_xpath()
from selenium import webdriverimport time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 在搜寻框输出 pythonbrowser.find_element_by_xpath("//*[@id='kw']").send_keys('python')time.sleep(2)# 敞开浏览器browser.close()
3.8. css定位
这种办法绝对xpath
要简洁些,定位速度也要快些。
find_element_by_css_selector()
from selenium import webdriverimport time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 在搜寻框输出 pythonbrowser.find_element_by_css_selector('#kw').send_keys('python')time.sleep(2)# 敞开浏览器browser.close()# 应用前先导入By类from selenium.webdriver.common.by import By# 应用前先导入By类from selenium.webdriver.common.by import By
3.9. find_element的By定位
除了上述的8
种定位办法,Selenium
还提供了一个通用的办法find_element()
,这个办法有两个参数:定位形式和定位值。
# 应用前先导入By类from selenium.webdriver.common.by import By
以上的操作能够等同于以下:
browser.find_element(By.ID,'kw')browser.find_element(By.NAME,'wd')browser.find_element(By.CLASS_NAME,'s_ipt')browser.find_element(By.TAG_NAME,'input')browser.find_element(By.LINK_TEXT,'新闻')browser.find_element(By.PARTIAL_LINK_TEXT,'闻')browser.find_element(By.XPATH,'//*[@id="kw"]')browser.find_element(By.CSS_SELECTOR,'#kw')
3.10. 多个元素
如果定位的指标元素在网页中不止一个,那么则须要用到find_elements
,失去的后果会是列表模式。简略来说,就是element
前面多了复数标识s
,其余操作统一。
4. 获取页面元素属性
既然咱们有很多形式来定位页面的元素,那么接下来就能够思考获取以下元素的属性了,尤其是用Selenium
进行网络爬虫的时候。
4.1. get_attribute获取属性
以百度首页的logo为例,获取logo相干属性
<img hidefocus="true" id="s_lg_img" class="index-logo-src" src="//www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png" width="270" height="129" onerror="this.src='//www.baidu.com/img/flexible/logo/pc/index.png';this.onerror=null;" usemap="#mp">
获取logo的图片地址
from selenium import webdriverimport time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') logo = browser.find_element_by_class_name('index-logo-src')print(logo)print(logo.get_attribute('src'))# 敞开浏览器browser.close()
输入:
<selenium.webdriver.remote.webelement.WebElement (session="e95b18c43a330745af019e0041f0a8a4", element="7dad5fc0-610b-45b6-b543-9e725ee6cc5d")>https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png
4.2. 获取文本
以热榜为例,获取热榜文本和链接
<a class="title-content tag-width c-link c-font-medium c-line-clamp1" href="https://www.baidu.com/s?cl=3&tn=baidutop10&fr=top1000&wd=%E5%90%84%E5%9C%B0%E8%B4%AF%E5%BD%BB%E5%8D%81%E4%B9%9D%E5%B1%8A%E5%85%AD%E4%B8%AD%E5%85%A8%E4%BC%9A%E7%B2%BE%E7%A5%9E%E7%BA%AA%E5%AE%9E&rsv_idx=2&rsv_dl=fyb_n_homepage&sa=fyb_n_homepage&hisfilter=1" target="_blank"><span class="title-content-index c-index-single c-index-single-hot1">1</span><span class="title-content-title">各地贯彻十九届六中全会精力纪实</span></a>
获取热榜的文本,用的是text
属性,间接调用即可
from selenium import webdriverimport time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') logo = browser.find_element_by_css_selector('#hotsearch-content-wrapper > li:nth-child(1) > a')print(logo.text)print(logo.get_attribute('href'))# 敞开浏览器browser.close()
输入:
1各地贯彻十九届六中全会精力纪实https://www.baidu.com/s?cl=3&tn=baidutop10&fr=top1000&wd=%E5%90%84%E5%9C%B0%E8%B4%AF%E5%BD%BB%E5%8D%81%E4%B9%9D%E5%B1%8A%E5%85%AD%E4%B8%AD%E5%85%A8%E4%BC%9A%E7%B2%BE%E7%A5%9E%E7%BA%AA%E5%AE%9E&rsv_idx=2&rsv_dl=fyb_n_homepage&sa=fyb_n_homepage&hisfilter=1
4.3. 获取其余属性
除了属性和文本值外,还有id、地位、标签名和大小等属性。
from selenium import webdriverimport time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') logo = browser.find_element_by_class_name('index-logo-src')print(logo.id)print(logo.location)print(logo.tag_name)print(logo.size)# 敞开浏览器browser.close()
输入:
6af39c9b-70e8-4033-8a74-7201ae09d540{'x': 490, 'y': 46}img{'height': 129, 'width': 270}
5. 页面交互操作
页面交互就是在浏览器的各种操作,比方下面演示过的输出文本、点击链接等等,还有像革除文本、回车确认、单选框与多选框选中等。
5.1. 输出文本
其实,在之前的大节中咱们有用过此操作。
send_keys()
from selenium import webdriverimport time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 定位搜寻框input = browser.find_element_by_class_name('s_ipt')# 输出pythoninput.send_keys('python')time.sleep(2)# 敞开浏览器browser.close()
5.2. 点击
同样,咱们也用过这个点击操作。
click()
from selenium import webdriverimport time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 选中新闻按钮click = browser.find_element_by_link_text('新闻')# 点击之click.click()time.sleep(2)# 敞开浏览器全副页面browser.quit()
5.3. 革除文本
既然有输出,这里也就有革除文本啦。
clear()
from selenium import webdriverimport time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 定位搜寻框input = browser.find_element_by_class_name('s_ipt')# 输出pythoninput.send_keys('python')time.sleep(2)# 革除pythoninput.clear()time.sleep(2)# 敞开浏览器browser.close()
5.4. 回车确认
比方,在搜寻框输出文本python
,而后回车就出查问操作后果的状况。
submit()
from selenium import webdriverimport time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 定位搜寻框input = browser.find_element_by_class_name('s_ipt')# 输出pythoninput.send_keys('python')time.sleep(2)# 回车查问input.submit()time.sleep(5)# 敞开浏览器browser.close()
5.5. 单选
单选比拟好操作,先定位须要单选的某个元素,而后点击一下即可。
5.6. 多选
多选如同也比拟容易,顺次定位须要抉择的元素,点击即可。
5.7. 下拉框
下拉框的操作绝对简单一些,须要用到Select
模块。
先导入该类
from selenium.webdriver.support.select import Select
在select
模块中有以下定位办法
'''1、三种抉择某一选项项的办法'''select_by_index() # 通过索引定位;留神:>index索引是从“0”开始。select_by_value() # 通过value值定位,va>lue标签的属性值。select_by_visible_text() # 通过文本值定位,即显>示在下拉框的值。'''2、三种返回options信息的办法'''voptions # 返回select元素所有>的optionsall_selected_options # 返回select元素中所>有已选中的选项first_selected_options # 返回select元素当选>中的第一个选项 '''3、四种勾销选中项的办法'''deselect_all # 勾销全副的已选择项deselect_by_index # 勾销已选中的索引项deselect_by_value # 勾销已选中的value值deselect_by_visible_text # 勾销已选中的文本值
咱们来进行演示一波,因为临时没找到适合的网页,我这边写了一个简略的网页本地测试(文件存为 帅哥.html)
<html><body><form><select name="帅哥"><option value="才哥">才哥</option><option value="小明" selected="">小明</option><option value="小华">小华</option><option value="草儿">小草</option></select></form></body></html>
而后,再演示下拉框的不同抉择的形式
from selenium import webdriverfrom selenium.webdriver.support.select import Selectimport timeurl = 'file:///C:/Users/Gdc/Desktop/帅哥.html'browser = webdriver.Chrome()browser.get(url)time.sleep(2)# 依据索引抉择Select(browser.find_element_by_name("帅哥")).select_by_index("2")time.sleep(2)# 依据value值抉择Select(browser.find_element_by_name("帅哥")).select_by_value("草儿")time.sleep(2)# 依据文本值抉择Select(browser.find_element_by_name("帅哥")).select_by_visible_text("才哥")time.sleep(2)# 敞开浏览器browser.close()
6. 多窗口切换
比方同一个页面的不同子页面的节点元素获取操作,不同选项卡之间的切换以及不同浏览器窗口之间的切换操作等等。
6.1. Frame切换
Selenium
关上一个页面之后,默认是在父页面进行操作,此时如果这个页面还有子页面,想要获取子页面的节点元素信息则须要切换到子页面进行擦走,这时候switch_to.frame()
就来了。如果想回到父页面,用switch_to.parent_frame()
即可。
6.2. 选项卡切换
咱们在拜访网页的时候会关上很多个页面,在Selenium
中提供了一些办法不便咱们对这些页面进行操作。
current_window_handle
:获取以后窗口的句柄。
window_handles
:返回以后浏览器的所有窗口的句柄。
switch_to_window()
:用于切换到对应的窗口。
from selenium import webdriverimport timebrowser = webdriver.Chrome()# 关上百度browser.get('http://www.baidu.com')# 新建一个选项卡browser.execute_script('window.open()')print(browser.window_handles)# 跳转到第二个选项卡并关上知乎browser.switch_to.window(browser.window_handles[1])browser.get('http://www.zhihu.com')# 回到第一个选项卡并关上淘宝(原来的百度页面改为了淘宝)time.sleep(2)browser.switch_to.window(browser.window_handles[0])browser.get('http://www.taobao.com')
7. 模仿鼠标操作
既然是模仿浏览器操作,天然也就须要能模仿鼠标的一些操作了,这里须要导入ActionChains
类。
from selenium.webdriver.common.action_chains import ActionChains
7.1. 左键
这个其实就是页面交互操作中的点击click()
操作。
7.2. 右键
context_click()
from selenium.webdriver.common.action_chains import ActionChainsfrom selenium import webdriverimport time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 定位到要右击的元素,这里选的新闻链接right_click = browser.find_element_by_link_text('新闻')# 执行鼠标右键操作ActionChains(browser).context_click(right_click).perform()time.sleep(2)# 敞开浏览器browser.close()
在上述操作中
ActionChains(browser)
:调用ActionChains()
类,并将浏览器驱动browser
作为参数传入
context_click(right_click)
:模仿鼠标双击,须要传入指定元素定位作为参数
perform()
:执行ActionChains()
中贮存的所有操作,能够看做是执行之前一系列的操作
7.3. 双击
double_click()
from selenium.webdriver.common.action_chains import ActionChainsfrom selenium import webdriverimport time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 定位到要双击的元素double_click = browser.find_element_by_css_selector('#bottom_layer > div > p:nth-child(8) > span')# 双击ActionChains(browser).double_click(double_click).perform()time.sleep(15)# 敞开浏览器browser.close()
7.4. 拖拽
drag_and_drop(source,target)
拖拽操作嘛,开始地位和完结地位须要被指定,这个罕用于滑块类验证码的操作之类。
咱们以菜鸟教程的一个案例来进行演示
https://www.runoob.com/try/tr...
from selenium.webdriver.common.action_chains import ActionChainsfrom selenium import webdriverimport time browser = webdriver.Chrome()url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'browser.get(url) time.sleep(2)browser.switch_to.frame('iframeResult')# 开始地位source = browser.find_element_by_css_selector("#draggable")# 完结地位target = browser.find_element_by_css_selector("#droppable")# 执行元素的拖放操作actions = ActionChains(browser)actions.drag_and_drop(source, target)actions.perform()# 拖拽time.sleep(15)# 敞开浏览器browser.close()
7.5. 悬停
move_to_element()
from selenium.webdriver.common.action_chains import ActionChainsfrom selenium import webdriverimport time browser = webdriver.Chrome()url = 'https://www.baidu.com'browser.get(url) time.sleep(2)# 定位悬停的地位move = browser.find_element_by_css_selector("#form > span.bg.s_ipt_wr.new-pmd.quickdelete-wrap > span.soutu-btn")# 悬停操作ActionChains(browser).move_to_element(move).perform()time.sleep(5)# 敞开浏览器browser.close()
8. 模仿键盘操作
selenium
中的Keys()
类提供了大部分的键盘操作方法,通过send_keys()
办法来模仿键盘上的按键。
引入Keys
类
from selenium.webdriver.common.keys import Keys
常见的键盘操作
send_keys(Keys.BACK_SPACE)
:删除键(BackSpace)
send_keys(Keys.SPACE)
:空格键(Space)
send_keys(Keys.TAB)
:制表键(TAB)
send_keys(Keys.ESCAPE)
:回退键(ESCAPE)
send_keys(Keys.ENTER)
:回车键(ENTER)
send_keys(Keys.CONTRL,'a')
:全选(Ctrl+A)
send_keys(Keys.CONTRL,'c')
:复制(Ctrl+C)
send_keys(Keys.CONTRL,'x')
:剪切(Ctrl+X)
send_keys(Keys.CONTRL,'v')
:粘贴(Ctrl+V)
send_keys(Keys.F1)
:键盘F1.....
send_keys(Keys.F12)
:键盘F12
实例操作演示:
定位须要操作的元素,而后操作即可!
from selenium.webdriver.common.keys import Keysfrom selenium import webdriverimport timebrowser = webdriver.Chrome()url = 'https://www.baidu.com'browser.get(url) time.sleep(2)# 定位搜寻框input = browser.find_element_by_class_name('s_ipt')# 输出pythoninput.send_keys('python')time.sleep(2)# 回车input.send_keys(Keys.ENTER)time.sleep(5)# 敞开浏览器browser.close()
9. 延时期待
如果遇到应用ajax
加载的网页,页面元素可能不是同时加载进去的,这个时候尝试在get
办法执行实现时获取网页源代码可能并非浏览器齐全加载实现的页面。所以,这种状况下须要设置延时期待肯定工夫,确保全副节点都加载进去。
三种形式能够来玩玩:强制期待、隐式期待和显式期待
9.1. 强制期待
就很简略了,间接time.sleep(n)
强制期待n秒,在执行get
办法之后执行。
9.2. 隐式期待
implicitly_wait()
设置等待时间,如果到工夫有元素节点没有加载进去,就会抛出异样。
from selenium import webdriverbrowser = webdriver.Chrome()# 隐式期待,等待时间10秒browser.implicitly_wait(10) browser.get('https://www.baidu.com')print(browser.current_url)print(browser.title)# 敞开浏览器browser.close()
9.3. 显式期待
设置一个等待时间和一个条件,在规定工夫内,每隔一段时间查看下条件是否成立,如果成立那么程序就继续执行,否则就抛出一个超时异样。
from selenium import webdriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import Byimport timebrowser = webdriver.Chrome()browser.get('https://www.baidu.com')# 设置等待时间10swait = WebDriverWait(browser, 10)# 设置判断条件:期待id='kw'的元素加载实现input = wait.until(EC.presence_of_element_located((By.ID, 'kw')))# 在关键词输出:关键词input.send_keys('Python')# 敞开浏览器time.sleep(2)browser.close()
WebDriverWait的参数阐明:
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
driver
: 浏览器驱动
timeout
: 超时工夫,期待的最长工夫(同时要思考隐性等待时间)
poll_frequency
: 每次检测的间隔时间,默认是0.5秒
ignored_exceptions
:超时后的异样信息,默认状况下抛出NoSuchElementException
异样until(method,message='')
method
: 在期待期间,每隔一段时间调用这个传入的办法,直到返回值不是False
message
: 如果超时,抛出TimeoutException
,将message
传入异样until_not(method,message='')
until_not
与until
相同,until
是当某元素呈现或什么条件成立则继续执行,until_not
是当某元素隐没或什么条件不成立则继续执行,参数也雷同。
其余期待条件
from selenium.webdriver.support import expected_conditions as EC# 判断题目是否和预期的统一title_is# 判断题目中是否蕴含预期的字符串title_contains# 判断指定元素是否加载进去presence_of_element_located# 判断所有元素是否加载实现presence_of_all_elements_located# 判断某个元素是否可见. 可见代表元素非暗藏,并且元素的宽和高都不等于0,传入参数是元组类型的locatorvisibility_of_element_located# 判断元素是否可见,传入参数是定位后的元素WebElementvisibility_of# 判断某个元素是否不可见,或是否不存在于DOM树invisibility_of_element_located# 判断元素的 text 是否蕴含预期字符串text_to_be_present_in_element# 判断元素的 value 是否蕴含预期字符串text_to_be_present_in_element_value#判断frame是否可切入,可传入locator元组或者间接传入定位形式:id、name、index或WebElementframe_to_be_available_and_switch_to_it#判断是否有alert呈现alert_is_present#判断元素是否可点击element_to_be_clickable# 判断元素是否被选中,个别用在下拉列表,传入WebElement对象element_to_be_selected# 判断元素是否被选中element_located_to_be_selected# 判断元素的选中状态是否和预期统一,传入参数:定位后的元素,相等返回True,否则返回Falseelement_selection_state_to_be# 判断元素的选中状态是否和预期统一,传入参数:元素的定位,相等返回True,否则返回Falseelement_located_selection_state_to_be#判断一个元素是否仍在DOM中,传入WebElement对象,能够判断页面是否刷新了staleness_of
10. 其余
补充一些
10.1. 运行JavaScript
还有一些操作,比方下拉进度条,模仿javaScript
,应用execute_script
办法来实现。
from selenium import webdriverbrowser = webdriver.Chrome()# 知乎发现页browser.get('https://www.zhihu.com/explore')browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')browser.execute_script('alert("To Bottom")')
10.2. Cookie
在selenium
应用过程中,还能够很不便对Cookie
进行获取、增加与删除等操作。
from selenium import webdriverbrowser = webdriver.Chrome()# 知乎发现页browser.get('https://www.zhihu.com/explore')# 获取cookieprint(f'Cookies的值:{browser.get_cookies()}')# 增加cookiebrowser.add_cookie({'name':'才哥', 'value':'帅哥'})print(f'增加后Cookies的值:{browser.get_cookies()}')# 删除cookiebrowser.delete_all_cookies()print(f'删除后Cookies的值:{browser.get_cookies()}')
输入:
Cookies的值:[{'domain': '.zhihu.com', 'httpOnly': False, 'name': 'Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49', 'path': '/', 'secure': False, 'value': '1640537860'}, {'domain': '.zhihu.com', ...]增加后Cookies的值:[{'domain': 'www.zhihu.com', 'httpOnly': False, 'name': '才哥', 'path': '/', 'secure': True, 'value': '帅哥'}, {'domain': '.zhihu.com', 'httpOnly': False, 'name': 'Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49', 'path': '/', 'secure': False, 'value': '1640537860'}, {'domain': '.zhihu.com',...]删除后Cookies的值:[]
10.3. 反屏蔽
发现美团间接给Selenium
给屏蔽了,不晓得怎么搞!!
以上就是本次全部内容,如果感觉有帮忙,还请点赞+在看呀!
GitHub 主页链接:
https://github.com/SeleniumHQ...
开源前哨
日常分享热门、乏味和实用的开源我的项目。参加保护 10万+ Star 的开源技术资源库,包含:Python、Java、C/C++、Go、JS、CSS、Node.js、PHP、.NET 等。