08 selenium操作浏览器原理解析+演示

636 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

「selenium实战专栏」将记录selenium实战(Python版)过程,以及各类问题的解决方案。

大致规划如下:

  • 利用Element UI组件库联系对各种元素的操作
  • 利用一个真实网站进行部分页面UI自动化实战

使用版本如下:

  • Python 3.10.6
  • selenium 4.0.5

前面已经介绍了很多selenium的基本操作,本章主要是带大家了解下selenium操作浏览器的原理,知己知彼,百战不殆。

《01 selenium环境搭建》中就已经说到,selenium运行的原理就是通过chromedriver操作浏览器(Chrome浏览器为例,其他浏览器也是如此),那究竟是如何完成的呢,本章就给大家揭开它的神秘面纱。

ChromeDriver是什么

《ChromeDriver官网》可以看到对chromedirver的介绍。

大致翻译过来就是:

WebDriver是用于通过浏览器对WEB应用进行自动化测试的开源工具。它提供了一系列操作浏览器的能力,比如WEB页面的导航、用户输入,js脚本执行等等。ChromeDriver是满足W3C标准WebDriver的针对Chrome浏览器的具体实现,GeckoDriver是针对Firefox浏览器的具体实现,以此类推。

然后这一系列操作浏览器的能力,都是通过HTTP接口形式进行提供的,即可以通过这些接口达到操作浏览器的目的,这也是selenium操作WebDriver的底层原理。

ChromeDriver原理

首先不通过selenium,直接调用WebDriver提供的接口来操作浏览器来演示ChromeDriver的原理。

  • 首先找到电脑本地上的ChromeDriver可执行文件,直接命令行启动(以Mac举例)

根据日志可以看到已经成功启动ChromeDriver服务,监听端口为9515。(Only local connections are allowed.,因为Chrome Driver服务默认是仅支持本地进行访问的,如果要远程访问,就需要进行其他的配置,后面进行介绍。)

  • 然后通过Postman访问如下链接http://127.0.0.1:9515/session

执行后就回打开一个空的浏览器,并且在postman可以看到请求是成功的,从响应信息中可以看到浏览器的各种信息,其中最重要的就是sessionId。在打开的浏览器中想要进行后续的操作,都是通过这个sessionId去指定的。

  • 默认情况下ChromeDriver服务是不会输出详细的日志信息的,但是为了知道ChromeDriver究竟做了哪些操作,我们可以通过命令./chromedriver --verbose --log-path=chromedriver.log输出具体的日志信息到文件中。(--verbose参数是用来输出具体的日志信息的,但是全部输出到控制台查看不方便,所以通过--log-path=参数将日志输出到具体的日志文件中。)

  • 通过命令再次启动ChromeDriver服务后,再次通过postman发起请求,打开chromedriver.log文件就可以查看详细的日志信息了,比如启动浏览器等。

  • 通过http://127.0.0.1:9515/session获取到sessionId后,通过请求http://127.0.0.1:9515/{sessionId}/url完成在已经打开的浏览器中访问具体的url。

请求成功后,可以看到打开的浏览器已经请求对应URL。

  • 接着还可以通过http://127.0.0.1:9515/session/{sessionId}/elements请求定位元素。

到这里就演示了如何通过ChromeDriver操作浏览器的基本操作,如果想尝试其他更多的请求,可以在W3C WebDriver官网了解更多W3C WebDriver协议。

selenium原理

上面已经通过postman完成了简单的自动化操作,selenium就是将这些手动的操作进行封装,提供了更简单的方式供使用,还是拿上面操作浏览器访问Element UI官网来举例。

  • 首先通过driver = webdriver.Remote("http://127.0.0.1:9515")设置远程webdriver服务地址
  • 通过logging.basicConfig(level=logging.DEBUG) 设置项目打印的日志级别,用于打印selenium源码中的日志。 完整代码如下:
import logging

from selenium import webdriver

logging.basicConfig(level=logging.DEBUG)  # 打印源码中的日志

driver = webdriver.Remote("http://127.0.0.1:9515")

driver.get("https://element-plus.gitee.io/zh-CN/component/form.html")
  • 启动脚本,可以看到成功打开浏览器,并且访问了对应的网址。同时控制台输出了对应的日志。日志中可以看到与我们在postman中发起的请求是一样的。

  • 接下来,将手动启动的ChromeDriver服务关掉,selenium代码中集那个请求远程chromedriver服务改为指定chromedriver地址。
service = Service(executable_path='/Users/huyanping/Softwares/chromedriver')
driver = webdriver.Chrome(service=service)

执行脚本后查看控制台日志,可以看到与之前请求远程chromedriver服务步骤一致,只是端口不是默认的9515

  • selenium启动ChromeDriver并没有输出日志,这里给源码增加了一行注释,用于输出servive启动时的具体执行命令(不了解源码的伙伴不要轻易修改,避免引起其他问题导致项目无法启动)

  • 再次执行脚本,查看控制台日志,可以看到执行的命令就是启动了指定的chromedriver,并且指定了端口。

以上就是selenium如何通过ChromeDriver操作浏览器的原理,了解原理后,大家可以尝试在远程服务器上启动一个chromedriver服务,通过--allowed-ips=客户端IP地址参数指定可以请求的IP地址,然后将请求中的IP地址从127.0.0.1更改为远程服务器的IP地址,这样就可以请求到远程服务器上的chromedriver服务,进而操作远程服务器上安装的Chrome浏览器了。