文章目录
- Selenium简介
- 选择界面元素
- 自动化实例
Selenium简介
Selenium 是一套 Web网站的程序自动化操作 解决方案.
通过Selenium我们可以写出自动化程序, 像人一样在浏览器里操作Web界面. 比如点击界面按钮, 在文本框中输入文字等操作.
而且还能从Web界面获取信息. 比如获取火车、汽车票务信息, 招聘网站职位信息, 财经网站股票价格信息等等, 然后用程序进行分析处理.
Selenium的自动化原理是这样的:
从上图可以看出:
我们写的自动化程序需要调用Selenium客户端库.
我们程序的自动化请求都是通过这个库里面的编程接口发送给浏览器的.
比如我们要模拟用户点击界面按钮, 自动化程序里面就应该调用客户端库相应的函数, 就会发送点击元素的请求给下方的浏览器驱动. 然后, 浏览器驱动再转发这个请求给浏览器.
这个自动化程序发送给浏览器驱动的请求是HTTP请求.
客户端库从哪里来的? 是Selenium组织提供的.
Selenium组织提供了多种编程语言的Selenium客户端库, 包括 Java, Python, JavaScript 等, 方便不同编程语言的开发者使用.
我们只需要安装好客户端库, 调用这些库, 就可以发出自动化请求给浏览器了.
浏览器驱动也是一个独立的程序, 是由浏览器厂商提供的, 不同的浏览器需要不同的浏览器驱动程序. 比如Chrome浏览器和火狐浏览器有各自不同的驱动程序.
浏览器驱动接收到我们的自动化程序发送的界面操作请求后, 会转发请求给浏览器, 让浏览器去执行对应的自动化操作.
浏览器执行完操作后, 会将自动化执行的结果返回给浏览器驱动, 浏览器驱动再通过HTTP响应的消息返回给我们的自动化程序的客户端库.(如上图是双向关系)
自动化程序的客户端库接收到响应后, 将结果转化为数据对象返回给我们的代码.
我们的程序就可以知道这次自动化操作的结果如何了.
总结一下, Selenium自动化执行流程如下 (注意理解):
自动化程序调用Selenium客户端库函数 (比如点击按钮元素)客户端库会发送Selenium命令给浏览器的驱动程序浏览器驱动程序接收到命令后, 驱动浏览器去执行命令浏览器执行命令浏览器驱动程序获取到命令执行的结果, 返回给我们的自动化程序自动化程序对返回的结果进行处理
选择界面元素
对于百度搜索页面, 如果我们想自动化输入 CSDN, 怎么做呢?
这就是在网页中, 操作界面元素.
web界面自动化, 要操控元素, 首先需要选择界面元素, 或者说定位界面元素.
就是先告诉浏览器, 你要操作 哪个 界面元素, 让它找到你要操作的界面元素.
我们必须要让浏览器先找到元素, 然后才能操作元素.
对于 Web自动化来说, 就是要告诉浏览器, 你要操作的界面元素是什么.
那么, 怎么告诉浏览器呢?
方法就是:
告诉浏览器, 你要操作的这个 web 元素的特征.
就是告诉浏览器, 这个元素它有什么与众不同的地方, 可以让浏览器一下子找到它.
元素的特征怎么查看?
可以使用浏览器的 开发者工具栏 帮我们查看、选择 web 元素.
OK, 我们使用Chrome浏览器访问百度, 按F12后, 点击下图的 Elements 标签, 即可查看页面对应的HTML元素.
然后, 再点击最左边的图标, 如下所示:
之后, 鼠标在界面上点击哪个元素, 就可以查看 该元素对应的HTML标签了.
比如, 前面图的高亮处, 就是百度搜索输入框 对应的input元素.
还有一种方法就是直接右键百度搜索输入框 选择检查, 也可以显示出来对应的HTML标签.
自动化实例
点击教学实例网站, 访问教学网站.
页面上有个输入股票名称的输入框, 使用鼠标右键菜单 查看该 input元素, 会发现有一个属性叫id:
我们可以把 id 想象成元素的编号, 是用来在HTML中标记该元素的.
根据规范, 如果元素中有 id 属性, 这个 id 值必须是当前HTML中唯一的.
所以如果元素有 id, 根据 id 选择元素是最简单高效的方式.
这里股票名称的输入框 元素的 id 值是 kw.
下面的代码, 可以自动化在浏览器中访问我们的股票搜索网站, 并且在输入框中搜索 通讯:
fromseleniumimportwebdriverfromselenium.webdriver.common.byimportBy# 创建 WebDriver 对象wd=webdriver.Chrome()# 调用 WebDriver 对象的 get方法 可以让浏览器打开指定网址wd.get('https://www.byhy.net/cdn2/files/selenium/stock1.html')# 根据id选择元素,返回的就是该元素对应的 WebElement对象element=wd.find_element(By.ID,'kw')# 通过该 WebElement对象,就可以对页面元素进行操作了# 比如输入字符串到 这个 输入框里element.send_keys('通讯\n')执行结果如下:
其中:
wd=webdriver.Chrome()
wd 赋值的是 WebDriver 类型的对象, 我们可以通过这个对象来 操控 浏览器, 比如打开网址、选择界面元素等.
对于这块需要注意的是, 如果选择手动下载 Chrome 浏览器驱动, 并且没有将 chromedriver.exe 放到环境变量 PATH 指定的其中一个目录里面, 那么就需要代码里面指定浏览器驱动路径,如下:
fromseleniumimportwebdriver# 指定驱动路径fromselenium.webdriver.chrome.serviceimportService wd=webdriver.Chrome(service=Service(r"d:\tools\chromedriver.exe"))wd.get('https://www.baidu.com')input('按回车退出')手动下载 Chrome 浏览器驱动有个弊端,就是当浏览器自动升级时,可能现有的驱动和其不匹配,需要重新手动下载.
否则,selenium manager还会尝试下载对应版本的新的驱动,如果下载不成功,自动化就会失败. 所以推荐还是采用自动下载 浏览器驱动的方式.
OK, 接着之前的代码讲解:
wd.find_element(By.ID,'kw')这行代码使用了 WebDriver 对象的方法 find_element().
这行代码运行时, 就会发起一个请求通过 浏览器驱动 转发给浏览器, 告诉它, 需要选择一个 id 值为 kw 的元素.
浏览器找到 id 值为 kw 的元素后, 将结果通过 浏览器驱动 返回给 自动化程序, 所以 find_element() 方法会 返回一个 WebElement 类型的对象.
这个 WebElement 对象可以看成是对应 页面元素 的遥控器.
我们通过这个 WebElement 对象, 就可以 操控 对应的界面元素.
比如:
- 调用这个对象的
send_keys()方法就可以在对应的元素中输入字符串- 调用这个对象的
click()方法就可以点击该元素.
注意哦, 如果根据传入的 id值 找不到这样的元素, find_element() 方法就会抛出 selenium.common.exceptions.NoSuchElementException 异常.
特别说明:
Selenium 升级到版本4以后, 下面这种 find_element_by* 方法都作为过期不赞成的写法.
# 初始化代码 ....wd.find_element_by_id('username').send_keys('byhy')wd.find_element_by_class_name('password').send_keys('sdfsdf')wd.find_element_by_tag_name('input').send_keys('sdfsdf')wd.find_element_by_css_selector('button[type=submit]').click()上面的代码运行会有警告, 所以现在都要写成下面这种格式:
fromselenium.webdriver.common.byimportBy# 初始化代码 ....wd.find_element(By.ID,'username').send_keys('byhy')wd.find_element(By.CLASS_NAME,'password').send_keys('sdfsdf')wd.find_element(By.TAG_NAME,'input').send_keys('sdfsdf')wd.find_element(By.CSS_SELECTOR,'button[type=submit]').click()