Python + Selenium(二十七)Selenium 原理

如果要精通一门工具,一定要了解其原理。

在早期的 Selenium RC 加载浏览器后,它将JavaScript代码注入浏览器,通过 JavaScript 代码在浏览器中驱动自动化运行。

Selenium WebDriver 使用每个浏览器的内置的自动化支持来直接驱动浏览器。这些自动化的支持来源于浏览器厂商,更原生更稳定。

这些对浏览器的驱动来源于浏览器厂商遵循 WebDriver 中的 WP(WebDriver wire protocol)协议。通过 WebDriver 实现对遵循 WP 协议的浏览器驱动的远程调用。

形象的来说,也就是浏览器的驱动是一个服务(接口服务),通过 HTTP 协议可访问这些接口。访问不同的接口可以实现不同的功能。



在这个过程中,Python 解释器就相当于客户端,WebDriver 会先将你写的操作代码(如 find_element, click等)封装成 HTTP 请求发送给浏览器驱动生成的远程服务,再由浏览器驱动将请求内容转化为浏览器内置的自动化命令来具体对浏览器实现操作。

我们可以打开 DEBUG 日志,查看每句代码做了什么。

打开你的 IDLE,输入以下代码用以开启 DEBUG 日志信息:

>>> import logging
>>> logging.basicConfig(level=logging.DEBUG)

然后再输入:

>>> from selenium import webdriver
>>> driver = webdriver.Chrome()
>>> driver.get('http://baidu.com')
>>> driver.find_element_by_id('kw').send_keys('测试')

是不是每句代码下面都会显示很多日志信息,我们先看webdriver.Chrome()这一句做了什么:

>>> driver = webdriver.Chrome()
DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:6591/session {"capabilities": {"firstMatch": [{}], "alwaysMatch": {"browserName": "chrome", "platformName": "any", "goog:chromeOptions": {"extensions": [], "args": []}}}, "desiredCapabilities": {"browserName": "chrome", "version": "", "platform": "ANY", "goog:chromeOptions": {"extensions": [], "args": []}}}
DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): 127.0.0.1:6591
DEBUG:urllib3.connectionpool:http://127.0.0.1:6591 "POST /session HTTP/1.1" 200 680
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request

向远程服务器 http://127.0.0.1:6591/session(其实就是浏览器驱动监听的端口)发起了一个创建会话的请求,后面大括号中的内容是一系列配置信息。
通过 urllib3 请求库,建立了一个 HTTP 连接。

再看看第二句 get() 方法又干了什么:

>>> driver.get('http://baidu.com')
DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:6591/session/7abcfa599b992583320cb5aa98dd31aa/url {"url": "http://baidu.com"}
DEBUG:urllib3.connectionpool:http://127.0.0.1:6591"POST /session/7abcfa599b992583320cb5aa98dd31aa/url HTTP/1.1" 200 14
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request

通过 urllib3 请求库发起了一个 POST 请求,请求接口为 /session/bd1b818ff33e54bba080e2424705f7fd/url ,接口信息中包含了前面创建的会话信息。
/url 接口告诉浏览器需要访问一个 url 地址。

接下来看看我们最常见的find_element()

>>> driver.find_element_by_id('kw').send_keys('测试')
DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:6591/session/7abcfa599b992583320cb5aa98dd31aa/element {"using": "css selector", "value": "[id=\"kw\"]"}
DEBUG:urllib3.connectionpool:http://127.0.0.1:6591 "POST /session/7abcfa599b992583320cb5aa98dd31aa/element HTTP/1.1" 200 88
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request
DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:6591/session/7abcfa599b992583320cb5aa98dd31aa/element/f076eafe-f301-4790-bc0a-a0c38503d770/value {"text": "\u6d4b\u8bd5", "value": ["\u6d4b", "\u8bd5"], "id": "f076eafe-f301-4790-bc0a-a0c38503d770"}
DEBUG:urllib3.connectionpool:http://127.0.0.1:6591 "POST /session/7abcfa599b992583320cb5aa98dd31aa/element/f076eafe-f301-4790-bc0a-a0c38503d770/value HTTP/1.1" 200 14
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request

这一句,我们先 find_element(),再 send_keys() ,所以实际上是发送了两个请求:
第一个请求是查找元素:

  • POST /element {"using": "css selector", "value": "[id="kw"]"} 向 /element 接口发送了一个请求,通过 json 格式的数据告诉浏览器,使用的定位方式是css selector,定位的值是[id=\"kw\"]

第二个请求是发送文本:

  • POST /element/f076...770/value {"text": "\u6d4b\u8bd5", "value": ["\u6d4b", "\u8bd5"], "id": "f076...d770"} 同样以 json 格式的数据向找到的元素的value接口发送两个 Unicode 字符。

你甚至可以通过 Postman 来模拟这些元素操作过程:



如果你有耐心,可以遵照 WP 协议自己写一套工具😀。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335