底层原理(二)驱动与浏览器交互

1.首先下载chromedriver与selenium-server-standalone.jar
下载地址:
(1)chromedriver各版本下载地址:http://chromedriver.storage.googleapis.com/index.html
(2)selenium-server-standalone.jar各版本下载地址:https://github.com/adamhooper/selenium-server-standalone-jar/

我演示用的是chromedriver2.24与selenium-server-standalone-2.52.0.jar版本。如果chromedriver与selenium-server-standalone.jar版本不兼容的情况下,下面会提示。

2.启动selenium server服务
进入chromedriver与selenium-server-standalone-2.52.0.jar的目录下,执行java -Dwebdriver.chrome.driver="chromedriver.exe" -jar selenium-server-standalone-2.52.0.jar。
我是放在同一目录下的,如果不同目录则要指明路径。

(1)启动成功如下图


image.png

(2)如果chromedriver与selenium-server-standalone.jar版本不兼容的情况下,会提示使用selenium-server的版本,如下图


image.png

我特意用了3.5.3的jar包,报错了,提示我用52.0的,于是下载了2.52.0的jar成功启动。

3.启动成功后创建session

(1)在浏览器中输入http://localhost:4444/wd/hub/static/resource/hub.html 地址访问,打开如下图

image.png

(2)创建session,点击Create Session按钮,然后选择chrome创建,这时会启动一个浏览器窗口,并且生成一串session值,


image.png

image.png

(3)点击Load Script按钮,弹出对话框输入url地址,这时观察新的窗口会打开输入的url地址。

image.png

从这里就可以看出两点:
(1)打开浏览器的操作,会得到一个sessionid,并且打开一个新窗口;
(2)然后基于这个sessionid来判断在那个窗口输入url。

4.发送命令请求

(1)接下来就要看看webdriver的说明了,地址:https://www.w3.org/TR/webdriver/
(2)找到webdriver的接口地址,下面就演示几个接口,由于很多都没有例子,都要自己摸索。
(3)先看打开url的接口,如下图:

image.png

接下来就以postman这个工具来实现接口请求。
image.png

接口名为Go,在RobotFramework中也有个Go关键字,而Selenium+java中是用到Get方法,而实际上webDriver也是在2017才改了这个名字,之前都是叫Get。

其实这个接口就跟第三步第三点操作点击Load Script输入url打开是一样的,我们抓包看看地址就知道了,如下图:


image.png

(4)再来个放大浏览器的操作,如下图

image.png

image.png

(5)然后就开始查找元素啦,找到元素得到元素的id值


image.png

image.png

(6)通过elementid值来输入内容

image.png

image.png

浏览器中结果发现,数组中多个也是会输入在一起,这里有点不明白的是为什么要用数组来存值,API中也没说的太清楚。


image.png

5.总结

以java代码为例说明一下:

WebDriver driver = new ChromeDriver();

driver.get("http://www.baidu.com");

driver.findElement(By.xpth("//input[@id='kw']")).sendkeys("seleniumwebdriver");

上面三个步骤,根据上面的原理来解释一下。

(1)第一步:会先启动一个webdriver服务,并且访问http://localhost:4444/wd/hub/static/resource/hub.html创建session,然后webdriver带着sessionid去调用浏览器api新建了窗口

(2)第二步:driver这个对象就等同于sessionid,当执行第二步这行代码,实际是去请求webdriver的get接口,然后webdriver收到请求后,去调浏览器API输入url访问,因为有了sessionid,所以webdriver、浏览器知道是在那个窗口打开url。

(3)第三步:请求webdriver的find element接口,参数xpath、value值,拿到elementid,然后再去请求webdriver的element send keys接口,webdriver调用浏览器API输入值。看是一步,实际是有两次请求完成这步的,因为selenium-java.jar封装,所以明眼看不出来而已。

所以很明显了,实际是我们去请求webdriver,然后webdriver去调用浏览器,其他API我就不一一去试了,大家有空也可以自己玩玩,还是挺有意思的。
————————————————
版权声明:本文为CSDN博主「雨墨轩痕」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ouyanggengcheng/article/details/78028215

推荐阅读更多精彩内容

  • Selenium 官网Selenium WebDriver官网webdriver实用指南python版本 WebD...
    顾顾314阅读 41,777评论 0 34
  • 现状 好久好久没有更新博客了,应该有一个月了吧,这段时间内,好忙,公司的业务在上涨期,但是却把下面的一个小朋友砍掉...
    jb2阅读 672评论 0 1
  • Selenium是ThoughtWorks公司研发的一个强大的基于浏览器的开源自动化测试工具,它通常用来编写web...
    zhouhaifeng阅读 1,239评论 0 0
  • 概述 浏览器兼容性是目前前端项目迭代中常常遇到的问题. 每次迭代, 回归测试需要消耗大量人力进行手动操作, 去覆盖...
    严北阅读 2,984评论 0 9
  • Charles-MQ appium ,selenium ,webdriver 运行原理与机制 requests底层...
    爱吃草的猫_4551阅读 980评论 0 2
  • 就我个人而言,当我觉得烦闷的时候,都是脑子里有很多杂的念头一起涌出来的时候,而我又没有办法把这些念头排出脑袋,让...
    夏蓝XALO阅读 35评论 0 0
  • 1. 抽象类和接口的定义 抽象类 抽象类不能直接创建实例,是给子类继承的类 抽象类的子类如果不是抽象类,子类必须实...
    Master_Yang阅读 1,399评论 0 1
  • 4月22日 南京到绩溪 徽杭古道之行想来很久了,眼看着天热起来了,趁着4月的阳光还不是那么晒,约上乜以及治民,连同...
    书悦阅读 2,462评论 10 2
  • 文 | 晨妤儿 都市女郎 左手夹着香烟 一口吸一口吐气 烟雾空气里荡漾着寂寞 女人吸的是寂寞 吐的是空虚 后知后觉...
    晨妤儿阅读 148评论 0 0