乐趣区

关于ide:2-万字带你了解-Selenium-全攻略

以 下 文 章 来 源 于 可 以 叫 我 才 哥,作 者 道 才

明天带大家一起学 (复) 习模仿浏览器运行的库 Selenium,它是一个用于Web 应用程序测试的工具。Selenium测试间接运行在浏览器中,就像真正的用户在操作一样。反对的浏览器包含 IE(7, 8, 9, 10, 11),Mozilla FirefoxSafariGoogle ChromeOperaEdge等。

这里我将以 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 文件拖到 PythonScripts目录下。

注:当然也能够不这样做,然而在调用的时候指定 chromedriver.exe 绝对路径 亦可。

主动装置

主动装置须要用到第三方库webdriver_manager,先装置这个库,而后调用对应的办法即可。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from webdriver_manager.chrome import ChromeDriverManager

browser = 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.4664
Get LATEST chromedriver version for 96.0.4664 google-chrome
There is no [win32] chromedriver for browser  in cache
Trying to download new driver from https://chromedriver.storage.googleapis.com/96.0.4664.45/chromedriver_win32.zip
Driver 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.4664
Get LATEST driver version for 96.0.4664
Driver [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 webdriver
import time  

browser = webdriver.Chrome()

# 设置浏览器大小:全屏
browser.maximize_window()   
browser.get(r'https://www.baidu.com')  
time.sleep(2)

# 设置分辨率 500*500
browser.set_window_size(500,500)  
time.sleep(2)

# 设置分辨率 1000*800
browser.set_window_size(1000,800) 
time.sleep(2)

# 敞开浏览器
browser.close()

这里就不截图了,大家自行演示看成果哈~

1.4. 刷新页面

刷新页面是咱们在浏览器操作时很罕用的操作,这里 refresh() 办法能够用来进行浏览器页面刷新。

from selenium import webdriver
import 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 webdriver
import 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 webdriver

browser = 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&amp;_=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"..."

须要留神的是,这里的页面源码咱们就能够用 正则表达式 Bs4xpath 以及 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 webdriver
import time  

browser = webdriver.Chrome()

browser.get(r'https://www.baidu.com')  
time.sleep(2)

# 在搜寻框输出 python
browser.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 webdriver
import time  

browser = webdriver.Chrome()

browser.get(r'https://www.baidu.com')  
time.sleep(2)

# 在搜寻框输出 python
browser.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 webdriver
import time  

browser = webdriver.Chrome()

browser.get(r'https://www.baidu.com')  
time.sleep(2)

# 在搜寻框输出 python
browser.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 webdriver
import time  

browser = webdriver.Chrome()

browser.get(r'https://www.baidu.com')  
time.sleep(2)

# 在搜寻框输出 python
browser.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 webdriver
import 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 webdriver
import 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 定位

后面介绍的几种定位办法都是在现实状态下,有肯定应用范畴的,那就是:在以后页面中,每个元素都有一个 惟一 idnameclass 超链接文本 的属性,那么咱们就能够通过这个惟一的属性值来定位他们。

然而在理论工作中并非有这么美妙,那么这个时候咱们就只能通过 xpath 或者 css 来定位了。

find_element_by_xpath()

from selenium import webdriver
import time  

browser = webdriver.Chrome()

browser.get(r'https://www.baidu.com')  
time.sleep(2)

# 在搜寻框输出 python
browser.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 webdriver
import time  

browser = webdriver.Chrome()

browser.get(r'https://www.baidu.com')  
time.sleep(2)

# 在搜寻框输出 python
browser.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 webdriver
import 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&amp;tn=baidutop10&amp;fr=top1000&amp;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&amp;rsv_idx=2&amp;rsv_dl=fyb_n_homepage&amp;sa=fyb_n_homepage&amp;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 webdriver
import 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 webdriver
import 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 webdriver
import time  

browser = webdriver.Chrome()
browser.get(r'https://www.baidu.com')  
time.sleep(2)

# 定位搜寻框
input = browser.find_element_by_class_name('s_ipt')
# 输出 python
input.send_keys('python')
time.sleep(2)

# 敞开浏览器
browser.close()

5.2. 点击

同样,咱们也用过这个点击操作。

click()

from selenium import webdriver
import 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 webdriver
import time  

browser = webdriver.Chrome()
browser.get(r'https://www.baidu.com')  
time.sleep(2)

# 定位搜寻框
input = browser.find_element_by_class_name('s_ipt')
# 输出 python
input.send_keys('python')
time.sleep(2)
# 革除 python
input.clear()
time.sleep(2)

# 敞开浏览器
browser.close()

5.4. 回车确认

比方,在搜寻框输出文本python,而后回车就出查问操作后果的状况。

submit()

from selenium import webdriver
import time  

browser = webdriver.Chrome()
browser.get(r'https://www.baidu.com')  
time.sleep(2)

# 定位搜寻框
input = browser.find_element_by_class_name('s_ipt')
# 输出 python
input.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 元素所有 > 的 options
all_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 webdriver
from selenium.webdriver.support.select import Select
import time

url = '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 webdriver
import time

browser = 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 ActionChains
from selenium import webdriver
import 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 ActionChains
from selenium import webdriver
import 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 ActionChains
from selenium import webdriver
import 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 ActionChains
from selenium import webdriver
import 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 Keys
from selenium import webdriver
import time

browser = webdriver.Chrome()
url = 'https://www.baidu.com'
browser.get(url)  
time.sleep(2)

# 定位搜寻框
input = browser.find_element_by_class_name('s_ipt')
# 输出 python
input.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 webdriver

browser = 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 webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
# 设置等待时间 10s
wait = 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_notuntil 相同,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,传入参数是元组类型的 locator
visibility_of_element_located
# 判断元素是否可见,传入参数是定位后的元素 WebElement
visibility_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 或 WebElement
frame_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,否则返回 False
element_selection_state_to_be
# 判断元素的选中状态是否和预期统一,传入参数:元素的定位,相等返回 True,否则返回 False
element_located_selection_state_to_be

#判断一个元素是否仍在 DOM 中,传入 WebElement 对象,能够判断页面是否刷新了
staleness_of

10. 其余

补充一些

10.1. 运行 JavaScript

还有一些操作,比方下拉进度条,模仿 javaScript,应用execute_script 办法来实现。

from selenium import webdriver

browser = 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 webdriver

browser = webdriver.Chrome()
# 知乎发现页
browser.get('https://www.zhihu.com/explore')
# 获取 cookie
print(f'Cookies 的值:{browser.get_cookies()}')
# 增加 cookie
browser.add_cookie({'name':'才哥', 'value':'帅哥'})
print(f'增加后 Cookies 的值:{browser.get_cookies()}')
# 删除 cookie
browser.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 等。

退出移动版