10分钟认识一下 Selenium 自动化工具

2021-10-23 13:30:00
admin
原创
8961

 Selenium 是什么?

Selenium 是一个 Web 自动化工具,能够模拟用户与浏览器交互,实现浏览器操作自动化。它主要的应用场景是 Web 应用的自动化测试领域,实现了从人工在浏览器中 “点点点”测试向自动化测试的进阶,可以说是测试人员必会的自动化工具。当然,Selenium 的作用远不止于此。

关于 WebDriver 

WebDriver 是 Selenium 的核心,那么 WebDriver 是干什么的呢?

Selenium 为多种程序语言提供了相应的 Selenium 库,例如 Python、Java、JS等。我们通过程序代码(例如 Python)告诉浏览器要做什么,然后浏览器收到指令后,进行相应自动化操作,并返回给程序所需的响应。这个过程中,浏览器是如何读懂程序的请求的,这就要用到 WebDriver 了。可以说,WebDriver 就像是一位负责程序与浏览器之间交互的翻译员。

即:Selenium库程序代码 <——> WebDriver <——> 浏览器

WebDriver 由浏览器厂商提供,例如 Chrome、火狐浏览器都有各自的 WebDriver 。

安装

通过前面介绍的 Selenium 自动化流程,我们知道了整个过程中所需的环境组件:Selenium 库、WebDriver、浏览器,当然还有一个编程语言(这里以 Python 为例介绍)。Python 与浏览器的安装这里就不介绍了,浏览器建议使用 Chrome 浏览器。

安装 Selenium 库

使用 pip 命令安装即可。

pip install selenium

安装 WebDriver

这里以 chrome 浏览器为例介绍。

在下面地址页面下载与你 chrome 浏览器版本相同或相近的 WebDriver 版本。

https://googlechromelabs.github.io/chrome-for-testing/

例如,我的chrome浏览器版本是 121.0.6167.160,所以只需下载目前最新的 ChromeDriver 版本即可。根据自己实际的操作系统,下载对应的包并解压,得到 WebDriver 文件。

将 WebDriver 文件放在某目录下,然后将该目录路径添加到系统环境变量中。这样做的好处是免去了在程序中指明 WebDrive 的存放路径。

例如 Linux 下:

export PATH="$PATH:/path/to/chromedriver"

WebDriver 对象常用的属性/方法

实例化浏览器的 WebDriver 对象

from selenium.webdriver import Chrome

cd = Chrome()

浏览器导航

cd.title 获取当前窗口页面的标题

cd.current_url 当前窗口页面的URL地址

cd.get()  打开目标网址链接

cd.back()  按浏览器的后退按钮

cd.forward()  按浏览器的前进按钮

cd.refresh()  刷新当前页面

浏览器窗口

浏览器每个标签窗口都有一个窗口句柄作为唯一的标识符。

cd.window_handles  当前浏览器所有窗口句柄组成的列表(用于切换窗口)

cd.current_window_handle  当前窗口的句柄

cd.switch_to.window(某窗口句柄)  通过窗口句柄切换窗口

cd.set_window_size(1024, 768)  设置窗口大小

cd.maximize_window()  最大化窗口

cd.close()  关闭窗口

cd.quit()  关闭浏览器

html内嵌iframe

cd.switch_to.frame() 切换到页面中的目标 iframe 页面。

cd.switch_to.default_content() 从iframe 页面切换回主html页面。

等待

cd.implicitly_wait(10)  页面最长等待时间(10s)

截屏

cd.save_screenshot('./image.png')  截屏并设置保存路径

执行脚本

cd.execute_script()  在当前窗口页面执行js脚本

定位元素

cd.find_element(s)_by_***()  定位元素,返回目标元素对象。例如:

cd.find_element_by_id(')  根据元素 id 属性值定位元素

cd.find_elements_by_class_name()  根据元素 class 属性值定位元素,返回复合条件的元素列表

cd.find_element_by_class_name()  根据元素 class 属性值定位元素,返回复合条件的第一个元素

cd.find_elements_by_tag_name()   根据 html 标签定位元素

如果你熟悉 CSS 的选择器,可以直接使用 CSS 选择器来定位元素:

cd.find_element_by_css_selector()

cd.find_elements_by_css_selector()

CSS 选择器相关知识这里不展开细述,HTML 和 CSS 乃至 JS 都是应用 Selenium 的前提必备技能。

注意:Selenium 升级到版本 4 以后, 上面这种 find_element_by* 方法就过时了,要改用下面方法:

from selenium.webdriver.common.by import By
# 初始化代码 ....
cd.find_element(By.ID, 'xxx')
cd.find_element(By.CLASS_NAME, 'xxx')
cd.find_elements(By.CLASS_NAME, 'xxx')
cd.find_element(By.TAG_NAME, 'xxx')
cd.find_elements(By.TAG_NAME, 'xxx')
cd.find_element(By.CSS_SELECTOR,'xxx')
cd.find_element(By.CSS_SELECTOR, CSS Selector参数)
cd.find_elements(By.CSS_SELECTOR, CSS Selector参数)

find_elements 返回的是找到的符合条件的所有元素, 放在一个 列表 中返回;

find_element 只会返回符合条件的第一个元素。

元素操作

定位到元素之后,我们的代码会返回元素对应的 WebElement对象,通过这个对象,我们就可以 操控 元素了。

  • 通过 text 属性 可以获取该元素**展示在界面上的** 文本内容;

  • 通过 send_keys 方法可以在对应的元素中输入字符串;

  • 通过 clear 方法可以清空对应元素中已有的字符串;

  • 通过 click 方法就可以点击该元素;

  • 通过 get_attribute 方法获取元素中指定属性的值。

对于input输入框元素,要获取里面的输入文本,用text属性是不行的,这时可以使用 element.get_attribute('value') 比如:

element = wd.find_element(By.ID, "input1")
print(element.get_attribute('value')) # 获取输入框中的文本

不仅 WebDriver对象有选择元素的方法, WebElement对象也有选择元素的方法。所以我们也可以通过WebElement对象来定位元素。

WebElement对象也可以调用 find_elements, find_element 之类的方法。

  • WebDriver 对象 选择元素的范围是整个 web页面;

  • WebElement 对象 选择元素的范围是该元素的内部。

弹窗按钮

界面中可能会出现让用户确认的交互操作:

cd.switch_to.alert.accept()  点击弹窗中的确认(OK)按钮

cd.switch_to.alert.dismiss()  点击弹窗中的取消按钮

cd..switch_to.alert.text  获取弹窗里的内容

示例演练

比如我们要让浏览器自动打开百度,Python 代码如下:

from selenium.webdriver import Chrome 
cd = Chrome()
cd.set_window_size(1500, 1000)
cd.implicitly_wait(10)
cd.get('https://www.baidu.com')

上面这个例子太简单了?那我们接下来再试试一个小示例:

就拿本文为例,我现在想把这篇文章自动发布到其他平台网站,这样我就不用手动发布了。比如,我现在要把本文发布到慕课网上去,整体的思路是:

  1. 先爬取本页面(这里我使用 requests);

  2. 解析本页面的文章内容(使用 BeautifulSoup);

  3. 将内容转换为 markdown 模式;

  4. 自动登录目标网站进行发布;

大体的 Python 代码如下:

#!/usr/bin/python3
import requests
import bs4
import time
# 使用requests 爬取本页面
url = 'https://www.xuecaijie.com/automated-testing/231.html'
response = requests.get(url)
# 使用 BeautifulSoup 解析出文章的标题和内容
soup = bs4.BeautifulSoup(response.text, "html.parser")
arttittle = soup.find("h1").text
element = soup.find(class_ = "article-content").prettify()
#使用 html2text 模块将 bs 过来的 HTML 文档转化为 Markdown 文档。
import html2text as ht
text_maker = ht.HTML2Text()
text = text_maker.handle(element)
# 接下来就是 selenium 的 showtime 了~
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 使用无头模式,无需打开浏览器
options = Options()
options.add_argument('--headless')                  
options.add_argument('--disable-gpu')               
options.add_argument("--window-size=1920,1080")     
options.add_argument("--no-first-run")              
options.add_argument("--no-default-browser-check")  
options.add_argument('log-level=3')                 
cd = webdriver.Chrome(options=options)
cd.implicitly_wait(10)
#通过selenium登录慕课网发布文章
cd.get('https://www.imooc.com/article/publish#')
phone = cd.find_element_by_css_selector('input[name="email"]')
phone.send_keys('[你的帐号]')
phone = cd.find_element_by_css_selector('input[name="password"]')
phone.send_keys('[你的密码]')
login = cd.find_element_by_css_selector('input[value="登录"]')
login.click()
time.sleep(3)
# 选择 markdown 编辑器
mkbutton = cd.find_element_by_css_selector('span[data-type="0"]')
mkbutton.click()
title = cd.find_element_by_id('article_title')
title.send_keys(arttittle)
content = cd.find_element_by_css_selector('.editor pre.editor__inner')
content.send_keys(text)
time.sleep(60)

结尾处我就不真发布了,大家参考了解一下整个过程即可。

最后编辑:admin 于 2024-02-15 19:19:37

关键字

版权声明

版权声明:本站原创文章,转载请注明作者和出处。

本站点采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议