10分钟认识一下 Selenium 自动化工具
- 2021-10-23 13:30:00
- admin 原创
- 8880
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')
上面这个例子太简单了?那我们接下来再试试一个小示例:
就拿本文为例,我现在想把这篇文章自动发布到其他平台网站,这样我就不用手动发布了。比如,我现在要把本文发布到慕课网上去,整体的思路是:
先爬取本页面(这里我使用 requests);
解析本页面的文章内容(使用 BeautifulSoup);
将内容转换为 markdown 模式;
自动登录目标网站进行发布;
大体的 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)
结尾处我就不真发布了,大家参考了解一下整个过程即可。
版权声明:本站原创文章,转载请注明作者和出处。