最近学web自动化时用到selenium库,感觉很神奇,遂琢磨了一下,写了点心得。

当我们输入以下三行代码并执行时,会发现新打开了一个浏览器窗口并访问了百度首页,然而这是怎么做到的呢?

 from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')

首先我们来看一下selenium库的结构:

很显然,selenium就是一个软件包,里面有两个一级子包,common和webdriver。导入webdriver后,webdriver.Chrome()中的Chrome又是什么呢?

原来是来自二级子包chrome下的webdriver模块里的WebDriver类,所以driver=webdriver.Chrome()中的driver是一个WebDriver类的实例化对象。我们来看看这个类:

这个类是干嘛的呢?原来它是控制谷歌浏览器驱动去驱动浏览器的,但是仔细一找,也没看到它里面有get方法呀,哦,它继承自RemoteWebDriver类,也就是二级子包remote下的webdriver模块里的WebDriver类,呵呵,这还真是个高频词汇啊!get方法应该就在这里面,去找一下:

果然,get调用上面的execute方法,传参,发现execute又调用了command_executor.execute方法:

继续查看,发现command_executor.execute方法是remote_connection.py这个模块里面的RemoteConnection类下面的,

看这个类注释,连接到远程浏览器驱动服务,很显然,浏览器驱动是服务端,selenium是客户端。在下面找到execute方法:

给远程服务端发命令command,又将命令传给下面的_request方法,发送HTTP请求给远程服务端,即浏览器驱动,这里出现了大家熟悉的请求方法get或者post,请求url,请求体,再往上看command:

原来发的是post请求,这里使用的是WebDriver wire protocol协议,即JsonWireProtocol,body部分是这个协议规定的JSON格式的字符串。

总的来说,过程还是很复杂的,至少对于我来说。

补充:对于每一条Selenium脚本,一个http请求会被创建并且发送给浏览器的驱动,浏览器驱动中包含了一个HTTP Server,用来接收这些http请求,HTTP Server接收到请求后根据请求来具体操控对应的浏览器,浏览器执行具体的测试步骤,浏览器将步骤执行结果返回给HTTP Server,HTTP Server又将结果返回给Selenium的脚本,如果是错误的http代码我们就会在控制台看到对应的报错信息。

最新文章

  1. JSON.stringify////////////////////////////////zzzzzzzzzzzzzz
  2. Linux手动释放内存
  3. Java设计模式--模板方法模式
  4. 【Python】调用WPS V9 API,实现PPT转PDF
  5. javascript类型系统——Number数字类型
  6. 关于如何使用Navicat(11.1.13) for MySQL如何创建存储过程
  7. Python绘图和数值工具:matplotlib 和 numpy下载与使用
  8. 三种情形容易引起Azure虚拟机重新启动
  9. 九度OJ 1085 求root(N, k) -- 二分求幂及快速幂取模
  10. supervisor进程管理
  11. Ajax Post提交事例及SpringMVC注解@RequestMapping取不到参数值解决办法
  12. Zookeeper,Kafka,Spark关系
  13. pl/sql的介绍
  14. Redis从入门到精通:初级篇
  15. ASP.NET 4.0验证请求 System.Web.HttpRequestValidationException: A potentially dangerous Request.F
  16. Feign源码解析系列-核心初始化
  17. extjs 解决使用store.sync()方法更新item有时不触发后台action的问题
  18. 利用lnmp一键安装的php环境忘记mysql,root用户密码解决方法
  19. Java语言支持的3种变量类型
  20. Python 爬虫实例(8)—— 爬取 动态页面

热门文章

  1. ARTS-S mac终端ftp命令行上传下载文件
  2. Everspin非易失性MRAM切换技术
  3. 小白学 Python 爬虫(21):解析库 Beautiful Soup(上)
  4. mysql过期修改
  5. 聊一聊 Vue 中 watch 对象中的回调函数为什么不能是箭头函数?
  6. 关于EXIT和BADI增强的查找
  7. AI: Web: 1 Vulnhub Walkthrough
  8. iOS核心动画高级技巧 - 6
  9. Bash脚本编程之数组
  10. https的原理