Selenium基本命令和操作

Hi3559AV100制作ext4文件系统和烧录emmc 1、首先生成所需文件系统,见本博客<Hi3559AV100文件系统制作cramfs>。 2、使用工具生成EXT4文件系统 ./make_ext4fs -s -l 96M rootfs_hi3559av100.ext4 ./rootfs 3、烧录文件系统 mw.b 0x82000000 ff 0x12C00000;tftp 0x82000000 STM_... 阅读详情

今天带大家一起学(复)习模拟浏览器运行的库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.googleapis.com/index.html

最后进行环境变量配置,也就是将对应的ChromeDriver的可执行文件chromedriver.exe文件拖到Python的Scripts目录下。

注:当然也可以不这样做,但是在调用的时候指定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"..."

需要注意的是,这里的页面源码我们就可以用正则表达式、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 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定位

前面介绍的几种定位方法都是在理想状态下,有一定使用范围的,那就是:在当前页面中,每个元素都有一个唯一的id或name或class或超链接文本的属性,那么我们就可以通过这个唯一的属性值来定位他们。

但是在实际工作中并非有这么美好,那么这个时候我们就只能通过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()

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值定位,value标签的属性值。
select_by_visible_text()    # 通过文本值定位,即显示在下拉框的值。

'''2、三种返回options信息的方法'''

options                     # 返回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/try.php?filename=jqueryui-api-droppable

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_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,传入参数是元组类型的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给屏蔽了,不知道怎么搞!!

以上就是本次全部内容,如果觉得有帮助,还请点赞+在看呀!

后续我们将演示Selenium在爬虫以及web自动化方面的一些实战案例,敬请期待!

腾讯WeKnora开源了!手把手教你用Docker+Ollama本地部署多模态知识库(附避坑指南) 本文详细介绍了腾讯开源的多模态知识库工具WeKnora的本地部署方法,通过Docker和Ollama实现完全离线运行。文章包含环境准备、核心组件配置、Ollama模型集成、系统启动验证及高级性能调优等实战内容,特别适合需要构建私有化知识库的中小团队和个人开发者。 阅读详情

相关推荐

STM32H743内存告急?手把手教你用CubeMX+FMC外扩32MB SDRAM(W9825G6KH-6)

本文详细介绍了如何在STM32H743上使用CubeMX和FMC外扩32MB SDRAM(W9825G6KH-6),解决内存不足问题。从硬件选型、CubeMX配置到初始化代码实现,提供完整的配置教程和性能优化技巧,帮助开发者高效扩展内存,适用于图形界面和复杂算法处理。

weixin_30568591的博客 492

selenium基础命令

selenium基础命令

qq_45569406的博客 1025

伪傻瓜式安装sql server2008【附带安装包】

安装各式各样的软件无疑是学习过程中…较…为烦躁的一部分 木有醋 但还是开始吧 为什么这是伪呢? 因为刚开始天真无邪的我真的是傻瓜式安装(迷之自信),结果就B了(打开配置管理器的瞬间….一片空白) BaiduCloud分享 红领巾在何方?? Link链接:https://pan.baidu.com/s/1NZCxP0Y27dBPrgHoRWLDyQ...

EuniBoom的博客 6万+

selenium史上非常全非常全面的常用命令【持续更新】

元素的定位以及操作 id name class name link text partial link text tag name css selector xpath 通过元素的ID定位元素:findElement(By.id(“ele”)); 通过元素的名称定位元素:findElement(By.name(“ele”)); 通过元素的html中的位置定位元素:findElement(By.xpath(“ele”)); 通过元素的标签名称定位元素:findElement(By.tagName(“ele”)

qq_15247647的博客 4026

哨兵一号burst数据的下载和处理

在Sentinel - 1数据处理领域,其基本流程起始于从(ASF)下载原始压缩文件。这些文件规模颇为可观,常规大小约4GB,而部分数据的原文件甚至已攀升至7GB,对存储空间提出了严苛要求。从影像构成来看,每景Sentinel - 1影像由三个干涉宽幅(IW)模式子带组成,每个IW一般包含9个脉冲串(burst)。然而,在实际研究中,我们所关注的研究区域往往仅占据其中寥寥几个burst。

kangkangluoluo的博客 1964

薛定谔 | 先导化合物优化与相互作用可视化

当获得针对某个靶点的先导分子后,想要在此基础上进行化学结构修饰。为了提升化学改造的成功率可以采用本教程方法进行结构虚拟改造/优化。每用薛定谔处理一个新任务,第一步必须创建新的project以方便日后管理。选项卡中修改工作路径(可以方便地找到输出文件)

药研猿的博客 2143

Python网络爬虫之Selenium详解

Python网络爬虫之Selenium详解,包含:Selenium是什么、怎么用、语法讲解以及实例说明

全栈行动派的博客 1349

Python与CAD系列基础篇(二)创建点和直线并修改样式

①通过pyautocad连接AutoCAD进行处理②通过ezdxf处理dxf格式文件。创建和编辑点和直线的方法,并演示如何修改它们的样式、颜色和线型。

weixin_43894929的博客 3036

selenium学习总结之常用命令篇

1.     Open(url) url可以是相对的,也可以是绝对的 如绝对的url:open(http://www.taobao.com/) 相对的url:open("/search?q=’aa’"); 2.     Click(locator) click可以单击一个链接,按钮或者单选框复选框等。 Click系列的有:click、clickAt、clickAndWait、click

Vonpanda的专栏 1896

华为OD机试双机位C卷-FLASH坏块监测系统(Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【FLASH坏块监测系统】,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - FLASH坏块监测系统。

qq_45776114的博客 1928

使用Microsoft Print to PDF进行编程:创建PDF文件的简单方法

Microsoft Print to PDF是一种内置于Windows操作系统中的功能,它允许我们通过打印操作将任何可打印的内容保存为PDF文件。然后,我们使用Microsoft Print to PDF打印机进行打印操作,并将输出文件保存为指定的PDF文件。使用Microsoft Print to PDF功能是一种方便且简单的方法来创建PDF文件,无论是在个人使用还是在企业开发中,它都可以提供良好的支持和灵活性。请注意,如果你使用的是其他编程语言,你可以根据相应的打印机接口或库来实现类似的功能。

TechSavant的博客 1634

selenium所有基础命令

from selenium import webdriver driver = webdriver.Chrome() #获取浏览器驱动 driver = webdriver.Firefox() #获取火狐浏览器 先要配置驱动 driver = webdriver.Ie() #获取Ie浏览器 print( driver.name ) #chrome 浏览器的名字 driver.maximize_window() #最大化窗口 driver.minimize_window() #最小

auyah的博客 643

学Simulink——基于Simulink的输入-输出线性化精确转矩控制

本文详细介绍了基于Simulink的永磁同步电机(PMSM)输入-输出线性化(IOL)精确转矩控制方法。针对传统解耦控制在非线性转矩特性下的局限性,提出通过精确反馈线性化实现转矩指令与实际转矩的严格线性关系。文章系统阐述了IOL原理、PMSM控制器推导过程,并提供了完整的Simulink建模步骤,包括电机模型搭建、IOL控制器实现和闭环系统构建。通过仿真对比验证了IOL方法在转矩跟踪精度、动态响应和参数鲁棒性方面的显著优势,最后讨论了工程实现要点和扩展应用方向。该方法为高性能伺服系统开发提供了有效解决方案。

amy_mhd的博客 59

selenium学习笔记——selenium IDE脚本和命令

Selenese    selenium IDE的command命令也被成为selenese。selenese命令最多有两个参数,一个是target,一个是value。根据命令类型的不通,Selenese命令可以没有参数,也可以只有一个参数或者两个参数。    selenese命令的3种类型如下所示:命令类型 含义 Actions (动作) 类型 此类命令直接和页面元素进行交互。 例如,“...

vikeyyyy的博客 5990

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

selenium关于断言的使用

基本介绍: Selenium工具专门为WEB应用程序编写的一个验收测试工具。 Selenium的核心:browser bot,是用JAVASCRIPT编写的。 Selenium工具有4种:Selenium IDE, Selenium Control, Selenium Core 这儿我们主要总结了Selenium-IDE工具 Selenium-IDE只限于firefox浏览器中使用。

u012189659的专栏 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

selenium-03-常用操作

基本介绍: Selenium工具专门为WEB应用程序编写的一个验收测试工具。 Selenium的核心:browser bot,是用JavaScript编写的。 Selenium工具有4种:Selenium IDE, Selenium Control, Selenium Core 这儿我们主要总结了Selenium-IDE工具 Selenium-IDE只限于firefox浏览器中使...

weixin_30679823的博客 92

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

selenium java pause_Selenium 使用方法小结

基本介绍:Selenium工具专门为WEB应用程序编写的一个验收测试工具。Selenium的核心:browser bot,是用JAVASCRIPT编写的。Selenium工具有4种:Selenium IDE, Selenium Control, Selenium Core这儿我们主要总结了Selenium-IDE工具Selenium-IDE只限于firefox浏览器中使用。Selenium命令分成...

weixin_36463040的博客 365

Selenium IDE 使用方法小结

基本介绍: Selenium工具专门为WEB应用程序编写的一个验收测试工具。 Selenium的核心:browser bot,是用JAVASCRIPT编写的。 Selenium工具有4种:Selenium IDE, Selenium Control, Selenium Core 这儿我们主要总结了Selenium-IDE工具 Selenium-IDE只限于firefox浏览器中使用。 Selen

qq_26182553的博客 2602

[Selenium] 基本使用

1. Selenium基础1.1 Selenium简介Selenium是一系列基于Web的自动化测试工具,它提供了一系列测试函数,用于支持Web自动化测试,它们能够通过多种方式定位界面元素,并将预期结果与系统实际表现进行比较。Selenium具有以下几个特性:1) 可对多浏览器进行测试,如IE、Firefox、Safari、Chrome、手机浏览器等。2) 支持多种语言,如J...

weixin_34087307的博客 141

Selenium的使用方法

基本介绍: Selenium工具专门为WEB应用程序编写的一个验收测试工具。 Selenium的核心:browser bot,是用JAVASCRIPT编写的。 Selenium工具有4种:Selenium IDE, Selenium Control, Selenium Core 这儿我们主要总结了Selenium-IDE工具 Selenium-IDE只限于firefox浏览器中使用。

yy_yz的博客 518

菜鸟学自动化测试(三)----selenium 命令

关于,selenium 命令这一部分,为了便于像我一样的菜鸟理解,我采用通过例子讲命令的方式。边学边总结吧!相互学习。

apex_eixl的博客 777

Selenium 使用方法小结

基本介绍: Selenium工具专门为WEB应用程序编写的一个验收测试工具。 Selenium的核心:browser bot,是用JAVASCRIPT编写的。 Selenium工具有4种:Selenium IDE, Selenium Control, Selenium Core 这儿我们主要总结了Selenium-IDE工具 Selenium-IDE只限于firefox...

weixin_30594001的博客 75

Selenium IDE 基础入门

原帖地址:http://www.cnblogs.com/fnng/archive/2011/10/23/2222157.html 对于,我们做测试的新手来说,自动化测试一直是一个比较高级的领域,当然是相对于手工测试来说。最近,对自动化测试产生了兴趣。不,具体点应该是对selenium工具产生了兴趣。为什么不是QTP呢,之前,QTP也有学习,后来还买了本《QTP自动化测试进阶指南》

madrabbit1987的博客 479

Selenium 中文API

Selenium 中文API 概念 Selenium通过命令进行驱动。Selenium可归纳为三种“风格”:动作、辅助和断言。每一个命令调用就是下表中的一行。 命令 目标 值 动作(Actions)命令一般用于操作应用程序的状态。它们通过如”点击链接”和”选择选项”的方式进行工作。如果一个动作执行失败,或是有错误,当前的测试将会停止执行。 许多动...

移动开发记录 140
上一篇: 探究functools模块wraps装饰器的用途
下一篇: Python 多线程之 threading 模块
唐僧不爱八戒
博客等级 码龄9年 158粉丝 84原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值