很久很久没有更新博客了,应该有一个月了吧,这段时间内,好忙,公司的业务在上涨期,可是却把下面的一个小朋友砍掉了(换组),因此不少打杂的时候都让jb去作了,基本上天天活着跟咸鱼同样~css
虽然是咸鱼,可是仍是要学习,最近在返璞归真,作了那么多年的测试狗,仍是要学习点理论知识,毕竟得有些料才能吹的更愉快;html
这段时间基本上都是在学习测试相关的书籍,测试工做,理论知识等,也看到不一样的测试书籍,感受不少都不好强人意,每本书都总以为有所欠缺,若是有机会,挺想本身撸一本的,哈哈哈;java
本篇做为阅读篇的第一篇,主要来介绍下selenium,介绍的缘由是,最近有些项目是web端的,随着项目的稳定,后面会考虑自动化,而PC的自动化,基本上都是用selenium,那就来围观吧~node
以前看coder-pig文章时有大体了解,很早以前也听过selenium,可是仍是想系统看一遍,据说虫师的这本书还能够,所以就来学习学习下~python
虽然这部书叫selenium,可是有大体三分之二的内容是测试跟Python相关的内容,所以会优先介绍selenium相关内容,最后会贴一些本身以为有点用的信息;linux
说明,本篇内容是基于coder-pig的原文进行补充及介绍,算是一个整理;git
本书全名:Selenium 2 自动化测试实战,基于Python语言 做者:虫师 出版社:电子工业出版社 版次:2016年1月第1版github
Selenium是一个自动化测试框架,经过他,能够编写代码让浏览器:web
Selenium是不支持浏览器功能的,须要和第三方的浏览器一块儿搭配使用,支持下述浏览器,你须要把对应的浏览器驱动下载到Python的对应路径下:面试
直接利用pip命令进行安装,命令以下:
pip install selenium
复制代码
接着下载浏览器驱动,大部分用的Chrome浏览器,就以此为例,其余浏览器可自行搜索相关文档,打开Chrome浏览器键入:
chrome://version
复制代码
便可查看Chrome浏览器版本的相关信息,主要是关注版本号:
Google Chrome 68.0.3440.106 (正式版本) (32 位) (cohort: Stable)
修订版本 1c32c539ce0065a41cb79da7bfcd2c71af1afe62-refs/branch-heads/3440@{#794}
操做系统 Windows
JavaScript V8 6.8.275.26
Flash 30.0.0.154 C:\Users\jb\AppData\Local\Google\Chrome\User Data\
PepperFlash\30.0.0.154\pepflashplayer.dll
用户代理 Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/68.0.3440.106 Safari/537.36
命令行 "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
--flag-switches-begin --flag-switches-end
可执行文件路径 C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
我的资料路径 C:\Users\jb\AppData\Local\Google\Chrome\User Data\Default
复制代码
这里看到,大版本号是68,接下来到下面的这个网站查看对应的驱动版本号:
https://chromedriver.storage.googleapis.com/2.41/notes.txt
复制代码
能够看到以下的版本号信息。
----------ChromeDriver v2.41 (2018-07-27)----------
Supports Chrome v67-69
Resolved issue 2458: Chromedriver fails to start with whitelisted-ips option [[Pri-1]]
Resolved issue 2379: Returned capabilities should include remote debugging port [[Pri-2]]
Resolved issue 1005: driver.manage().window().getSize() is not implemented on Android [[Pri-2]]
Resolved issue 2474: desktop launcher error messages are not readable by users [[Pri-]]
Resolved issue 2496: Fail fast when not able to start binary [[Pri-]]
Resolved issue 1990: Close Window return value does not conform with spec [[Pri-]]
复制代码
ok,那就是下载2.4.1这个版本驱动,连接:
https://chromedriver.storage.googleapis.com/index.html?path=2.41/
复制代码
打开后能够看到所示的页面,选择对应的系统下载便可。
下载完成后,把zip文件解压下,解压后的chromedriver.exe拷贝到Python的Scripts目录下,另外这里不用纠结win32,在64位的浏览器上也是能够正常使用的!Mac的话把解压后的文件拷贝到usr/local/bin目录下 ,Ubuntu的话则拷贝到usr/bin目录下。
接下来,来个小demo吧:
# coding = utf-8
# 为了防止乱码问题,以及方便的在程序中添加中文注释,把编码统一成 UTF-8。
from selenium import webdriver
# 导入 selenium 的 webdriver 包,只有导入 webdriver 包咱们才能使用 webdriver API 进行自动化脚本的开发。
browser = webdriver.Chrome()
#把webdriver的Chrome对象赋值给变量driver;
#只有得到了浏览器对象后,才能够启动浏览器,打开网址,操做页面元素,Chrome浏览器驱动默认已经在Selenium WebDriver包里了,能够直接调用;
#要先安装相关的浏览器驱动
browser.get("http://www.baidu.com")
#得到浏览器对象后,经过 get()方法,能够向浏览器发送网址。
html_text = browser.page_source
# 得到页面代码
browser.quit()
#退出并关闭窗口
复制代码
执行这段代码后,会自动调起Chrome浏览器,并访问百度,能够看到浏览器顶部有下面的提示。
而且控制台会输出HTML的代码,和Chrome的Elements页面结构彻底一致。 那就能够用selenium这么玩了;
不过,在实践以前,再继续介绍下selenium其余方法吧;
另外,若是把element改成elements会定位全部符合条件的元素,返回一个List,好比:
find_elements_by_class_name
复制代码
Selenium定位到结点位置会返回一个WebElement类型的对象,能够调用下述方法来提取须要的信息。
element.get_attribute()
element.text
element.tag_name
element.id
# 设置浏览器宽480,高800显示
driver.set_window_size(480,800):
# 全屏显示
driver.maximize_window()
复制代码
在页面操做过程当中有时候点击某个连接会弹出新的窗口,这时候须要切换到新打开的窗口上进行操做;
# 经过window_handles来遍历
for handle in driver.window_handles:
driver.switch_to_window(handle)
# 切换窗口
driver.switch_to.window("窗口名")
# 或经过window_handles来遍历
for handle in driver.window_handles:
driver.switch_to_window(handle)
# 前进
driver.forward()
# 后退
driver.back()
复制代码
driver.refresh()
复制代码
# clear()用于清除文本输入框中的内容
driver.find_element_by_id("idinput").clear()
# send_keys()用于模拟键盘向输入框里输入内容
driver.find_element_by_id("idinput").send_keys("username")
# click()用于进行点击操做
driver.find_element_by_id("loginbtn").click()
复制代码
# 经过定位搜索框并经过submit()提交搜索框的内容,达到点击搜索按钮的效果
driver.find_element_by_id("query").submit()
复制代码
有时须要在页面上模拟鼠标操做,好比:单击,双击,右键,按住,拖拽等,能够导入ActionChains类:selenium.webdriver.common.action_chains.ActionChains,使用ActionChains(driver).XXX调用对应节点的行为。
send_key()虽然能够模拟键盘输入,但除此以外,还须要输入其余按键,好比空格,这时候就须要用到Keys(); 对应类:selenium.webdriver.common.keys.Keys,使用send_keys(Keys.XX)输入对应的内容便可;
# 获取当前网页的标题
driver.title
# 获取当前网页的url
driver.current_url
复制代码
如今的网页愈来愈多采用了 Ajax技术,这样程序便不能肯定什么时候某个元素彻底加载出来了。
若是实际页面等待时间过长致使某个dom元素还没出来,可是你的代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。
为了不这种元素定位困难并且会提升产生ElementNotVisibleException的几率。
因此Selenium 提供了两种等待方式,一种是隐式等待,一种是显式等待。
from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverWait 库,负责循环等待
from selenium.webdriver.support.ui import WebDriverWait
# expected_conditions 类,负责条件出发
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.PhantomJS()
driver.get("http://www.xxxxx.com/loading")
try:
# 每隔10秒查找页面元素 id="myDynamicElement",直到出现则返回
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
复制代码
若是不写参数,程序默认会0.5s调用一次来查看元素是否已经生成,若是原本元素就是存在的,那么会当即返回。
下面是一些内置的等待条件,你能够直接调用这些条件,而不用本身写某些等待条件了。
等待条件 | 描述 |
---|---|
title_is | 标题是内容 |
title_contains | 标题包含某内容 |
presence_of_element_located | 结点加载出来,传入定位元组 |
visibility_of_element_located | 结点课件,传入定位元组 |
visibility_of | 可见,传入结点对象 |
presence_of_all_elements_located | 全部结点加载出来 |
text_to_be_present_in_element | 某个结点文本包含某文字 |
text_to_be_present_in_element_value | 某个结点值包含某文字 |
frame_to_be_available_and_switch_to_it | 加载并切换 |
invisibility_of_element_located | 结点不可见 |
element_to_be_clickable | 节点可点击 |
staleness_of | 判断结点是否仍在DOM,经常使用于判断页面是否已刷新 |
element_to_be_selected | 结点可选择,传入结点对象 |
element_located_to_be_selected | 结点可选择,传入定位元组 |
element_selection_state_to_be | 传入结点对象和状态,相等返回True,不然返回False |
element_located_selection_state_to_be | 传入定位元组和状态,相等返回True,不然返回False |
alert_is_present | 是否出现警告 |
from selenium import webdriver
driver = webdriver.PhantomJS()
driver.implicitly_wait(10) # seconds
driver.get("http://www.xxxxx.com/loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")
若是不设置,就默认等待时间为0
复制代码
有时候但愿脚本执行到某个位置作固定时间的休眠,这时候就须要用到sleep(),这个sleep方法是由Python的time模块提供,所以使用以前须要from time import sleep;
# 休眠X秒
sleep(X)
复制代码
在web应用中常常会遇到frame/iframe表单嵌套页面的应用,webdriver只能在一个页面上对元素识别与定位,对于frame/iframe没法直接定位;
这时候就须要经过switch_to.frame()方法将当前定位的主体切换为frame/iframe内嵌的的页面中;
# 切换到iframe(id = "XX")
driver.switch_to.frame("XX")
复制代码
切换后就能正常操做元素了;
switch_to.frame()默承认以直接获取表单的id或name属性,但若是iframe没有可用的id和name属性呢?
# 先经过xpath定位到iframe
xf = driver.find_element_by_xpath("//*[@class="XX"]")
# 再将定位对象传给switch_to.frame()方法
driver.switch_to.frame(xf)
复制代码
对应类:selenium.webdriver.common.alert.Alert,用得很少,若是你触发了某个事件,弹出了对话框,能够调用这个方法得到对话框:alert = driver.switch_to_alert(),而后alert对象能够调用下述方法:
通常网页上传文件,都是有一个浏览按钮,选择文件点击上传便可,可是对应作自动化测试来讲,在选择文件那个过程是很是麻烦的;
其实,作过相似功能的同窗会发现,浏览按钮其实就是input标签实现的上传功能,能够看到是一个输入框,竟然如此,就能够用send_keys()来模拟;
driver.find_element_by_name("file").send_keys("C:\\jb.txt")
复制代码
运行设置文件下载路径;
options = webdriver.ChromeOptions()
prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': os.getcwd()}
options.add_experimental_option('prefs', prefs)
driver = webdriver.Chrome(chrome_options=options)
driver.get("http://pypi.Python.org/pypi/selenium")driver.find_element_by_partial_link_text("selenium-3.11.0-py2.py3-none-any").click()
复制代码
driver.save_screenshot("截图.png")
# 截取当前窗口,并指定截图图片的保存位置
dirver.get_screenshot_as_file("C:\\jb\\jb.jpg")
复制代码
有些站点须要登陆后才能访问,用Selenium模拟登陆后获取Cookie,
而后供爬虫使用的场景很是常见,Selenium提供了获取,增长,删除Cookies的函数,代码示例以下:
# 获取全部Cookies
browser.get_cookies()
# 获取name对应的cookie信息
browser.get_cookie(name)
# 增长Cookies,是字典对象,必需要有name 和value
browers.add_cookie({xxx})
driver.add_cookie({"name":"jb","value":"jbtest"})
# 若是须要遍历,则以下:
for cookie in driver.get_cookies():
print("%s -> %s " % (cookie["name"],cookie["value"]))
# 删除全部Cookies
browser.delete_cookies()
# 删除Cookie信息,name是要删除的cookie的名称,optionsString是该cookie的选项,目前支持的选项包括“路径”和“域”
browser.delete_cookie(name,optionsString)
复制代码
实践:
from selenium import webdriver
browser = webdriver.Chrome()
url = "https://www.baidu.com/"
browser.get(url)
# 经过js新打开一个窗口
newwindow='window.open("https://www.baidu.com");'
# 删除原来的cookie
browser.delete_all_cookies()
# 携带cookie打开
browser.add_cookie({'name':'ABC','value':'DEF'})
# 经过js新打开一个窗口
browser.execute_script(newwindow)
input("查看效果")
browser.quit()
复制代码
这里仍是须要说下,add_cookie方法接受一个字典,字典中包含name,value,path,domain,secure,expiry,
正确的写cookie格式:
cookie = {
# "domain": ".58.com", #Firefox浏览器不能写domain,若是写了会报错,谷歌须要写不然也是报错,这里就是一个坑。其余浏览器没测试不知道状况。
'name': name,
'value': value,
"expires": "",
'path': '/',
'httpOnly': False,
'HostOnly': False,
'Secure': False,
}
name:cookie的名称
value:cookie对应的值,动态生成的
domain:服务器域名
expiry:Cookie有效终止日期
path:Path属性定义了Web服务器上哪些路径下的页面可获取服务器设置的Cookie
httpOnly:防脚本攻击
secure:在Cookie中标记该变量,代表只有当浏览器和Web Server之间的通讯协议为加密认证协议时
复制代码
为何要构形成这样子,其实咱们看下浏览器保存的cookie格式就明白了。下图就是谷歌浏览器的cookie 的截图。
代码应该这么写:
这里有个问题,cookie要key:value的格式,是很是麻烦的,尤为是像豆瓣那样很是很是长的cookie,再手动一个一个改格式,这个工做量还不如从新用selenium写一个登录操做;
fiddler转包的cookie格式是这样的:
一个一个改会崩溃的;因此遇到cookie很长的状况,还不如写一个登录脚本保存吧~
虽然webdriver提供浏览器的前进和后退,可是并不提供滚动浏览器的操做,所以来借助JS来控制浏览器的滚动条;
driver.execute_script(js语句)
复制代码
好比滚动到底部的代码示例以下:
js = document.body.scrollTop=10000
driver.execute_script(js)
复制代码
又如设置浏览器窗口的滚动条位置:
js = "window.scrollTo(100,450)"
driver.excute_script(js)
复制代码
向文本框输入文本信息:
text = "jbtest"
js = "var sum=document.getElementById("id"); sum.value='"+text+ " ';"
driver.excute_script(js)
复制代码
HTML5定义了一个新的元素video,指定了一个标准的方式来嵌入电影片断;
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("http://videojs.com/")
video = driver.find_element_by_xpath("body/Setion[1]/div/video")
# 返回播放文件地址
url = driver.execute_script("return arguments[0].currentSrc;",video)
# 播放视频
driver.execute_script("return arguments[0].play()",video)
# 暂停视频
driver.execute_script("arguments[0].pause()",video)
复制代码
JS函数有个内置的对象叫作arguments; arguments对象包含了函数调用的参数数组,[0]表示取对象的第一个值;
在介绍Headless以前,必须介绍下PhantomJS,
PhantomJS是没有界面的浏览器,特色:
会把网站加载到内存并执行页面上的JavaScript,由于不会展现图形界面,因此运行起来比完整的浏览器要高效
而上面的例子,每次执行后,都会打开浏览器,很麻烦,这么看,PhantomJs是刚需啊;
但这里不打算介绍PhantomJs,由于18年4月份,维护者宣布退出PhantomJs,意味着这个项目再也不维护了;而同时,Chrome和FireFox也开始 提供Headless模式(无需调起浏览器),因此,后面的phantomjs小伙伴会迁移到这两个浏览器上;
注意:Windows Chrome须要60以上的版本才支持 Headless模式,linux,unix系统须要 chrome浏览器 >= 59
启用Headless模式也很简单,以上面打开百度的代码举例,代码以下:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_option = Options()
chrome_option.add_argument("--headless")
chrome_option.add_argument("--disable-gpu")
browser = webdriver.Chrome(chrome_options=chrome_option) # 调用本地的Chrome浏览器
browser.get('http://www.baidu.com') # 请求页面,会打开一个浏览器窗口
html_text = browser.page_source # 得到页面代码
browser.quit() # 关闭浏览器
print(html_text)
复制代码
就是多了设置chrome_option这几步,执行后,就不会再弹出浏览器了,是否是很方便??
from selenium import webdriver
# 进入浏览器设置
options = webdriver.ChromeOptions()
# 设置中文
options.add_argument('lang=zh_CN.UTF-8')
# 更换头部
options.add_argument('user-agent="Mozilla/5.0 (iPod; U; CPU iPhone OS 2_1 like Mac OS X; ja-jp) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5F137 Safari/525.20"')
browser = webdriver.Chrome(chrome_options=options)
url = "https://httpbin.org/get?show_env=1"
browser.get(url)
browser.quit()
复制代码
舒适提示:遇到JS加载的问题,建议先尝试破解JS,不行再用selenium,selenium属于无脑类型,并且效率比较差,假如你有1W个网站,都跑一趟,估计要一天了;
大部分selenium相关的操做都介绍完了,先留个印象,那接下来,让咱们看看怎么用selenium来获取豆瓣验证码captcha这个属性吧;
"Cookie":"your cookie" #这里须要输入你本身的cookie信息,若是遇到转义字符,转
义字符前面加\便可
复制代码
Selenium主要用于Web应用程序的自动化测试;
特色:
Selenium有两个版本:Selenium 1.0 和Selenium 2.0; Selenium不是由单独一个工具构成的,而是由一些插件、类库组成,每一个部分都有起特色和应用场景;
Selenium 1.0家谱:
Selenium IDE是嵌入到Firefox浏览器中的一个插件,实现简单的浏览器操做的录制与回放功能;
官方给出它自身做用的定位:
快速地建立bug重现脚本,在测试人员测试过程当中,发现bug以后能够经过IDE将重现的步骤录制下来,以帮助开发人员
更容易的重现bug;
复制代码
那就能够理解,IDE的重点在于录制,避免不会写代码的同窗,并且每次写xpath也会很烦;
在线安装 经过 firefox 浏览器访问 selenium;
在 selenium IED 下载介绍部分,点击版本号连接;
firefox 浏览器将自动识别须要下载的 selenium IED 插件,,点击 Install Now 按钮,安装 selenium IED 插件。
安装完成后重启 firefox 浏览器,经过菜单栏“Tools(工具)”---> selneium IDE 能够打开,或经过 Ctrl+Alt+S 快捷键打开。
可是实际,上面的url,试了半天都访问不了,另外还有,若是非Firefox浏览器是否是就用不了IDE?
插件安装 非也,还有个插件安装的方法,此方法来自小敏同窗亲测可行,Python2.7版本,Firefox40.0版本;
1)python2.7 mac/Linux自带,不用装; Windows须要手动安装,要装的小伙伴自行百度,so easy ~
2)selenium 因为selenium IDE在新版本firefox上并不支持,没有录制功能写起来仍是挺费神的,建议保守的都选择旧版本。
若是已经安装了selenium3,须要先卸载;
查看selenium版本命令:
pip show selenium
卸载selenium命令:
pip uninstall selenium
复制代码
selenium用命令行pip install selenium==2.53.6安装时,因为被墙了,选择下载安装包自行安装,步骤以下:
3)下载安装firefox 40.0版本
4)下载selenium_ide-2.9.1-fx.xpi,拖到firefox里面安装好后,firefox右上角多出selenium IDE插件入口
5)下载firebug-2.0.16-fx.xpi,拖到firefox里面安装好后,firefox右上角多出firebug插件入口
至此,环境安装完成。
6)录制自动化脚本 点击firefox右上角selenium IDE插件图标,进入selenium IDE主界面;
7)优化脚本 上步中最后导出的脚本,只包含了操做,没有包含断言结果判断,也缺乏容错,想要持续集成自动生成结果,还须要本身按需补充。
是一种自动的测试辅助功能,Grid经过利用现有的计算机基础设施,能加快Web-App的功能测试;
利用Grid能够很方便地实如今多台机器上和异构环境中运行测试用例;
听上去会一脸懵逼,简单说,Selenium Grid能够解决重复执行测试和多浏览器兼容测试的亮点,而且是使用分布式执行测试;
那分布式是什么概念?简单的说就是老大收到任务,分发给手下去干;
经过Selenium Grid的能够控制多台机器多个浏览器执行测试用例,分布式上执行的环境在Selenium Grid中称为node节点。
举例说明一下,好比用例上万,一台机器执行所有测试用例耗时5个小时,而若是须要覆盖主流浏览器好比Chrome、Firefox,加起来就是10个小时;
最笨的办法就是另外拿台机器,而后部署环境,把测试用例分开去执行而后合并结果便可。
而Selenium也想到了这点,因此有了Selenium Grid的出现,它就是解决分布式执行测试的痛点。
Selenium Grid实际它是基于Selenium RC的,而所谓的分布式结构就是由一个hub节点和若干个node代理节点组成。
Hub用来管理各个代理节点的注册信息和状态信息,而且接受远程客户端代码的请求调用,而后把请求的命令转发给代理节点来执行。
下面结合环境部署来理解Hub与node节点的关系。
1)下载selenium-server-standalone-2.53.1.jar
2)启动hub
使用快捷键WIN+R打开运行对话框,输入cmd肯定,进入命令窗口
进入selenium-server-standalone-2.53.1.jar包的位置,如E:\selenium;
启动hub,命令以下:
java -jar selenium-server-standalone-2.53.1.jar -role hub -maxSession 10 -port 4444
复制代码
参数 | 解释 |
---|---|
role hub | 启动运行hub |
port | 设置端口号,hub的默认端口是4444,这里使用的是默认的端口,固然能够本身配置 |
maxSession | 最大会话请求,这个参数主要要用并发执行测试用例,默认是1,建议设置10及以上 |
浏览器打开地址:http://localhost:4444/grid/console,出现以下图表示hub启动成功。
启动hub后,就须要运行节点啦,最少都要有一个node节点,否则hub就成空头司令了;而node节点能够与hub在同一台机器上运行,演示一个node节点与hub同机,另外一个node节点启动了一台虚拟机。
名称 | IP |
---|---|
hub机 | 192.168.0.245 |
node1机 | 192.168.0.245 |
node2机 | 192.168.0.183 |
3)启动node节点1
node1节点,配置firefox浏览器,运行下面命令:
java -jar selenium-server-standalone-2.53.1.jar -role node -port 5555 -hub http://192.168.0.245:4444/grid/register -maxSession 5 -browser browserName=firefox,seleniumProtocol=WebDriver,maxInstances=5 ,platform=WINDOWS,version=45.0.2
复制代码
没有报错则再次刷新一下http://localhost:4444/grid/console的访问会发现node节点已经显示,表示启动成功;
参数 | 解释 |
---|---|
role node | 启动运行node节点 |
port 555 | 指定node节点端口 |
hub http://192.168.0.245:4444/grid/register | hub机地址 |
maxSession 5 | node节点最大会话请求 |
browser browserName=firefox,seleniumProtocol=WebDriver, maxInstances=5,platform=WINDOWS,version=45.0.2 | 这个就是设置浏览器的参数啦 |
browserName表示浏览器名字,maxInstances表示最大实例,能够理解为最多可运行的浏览器数,不能大于前面maxSession的值,不然可能会出错;platform表示操做系统;version表示浏览器版本。
复制代码
4)启动node节点2
node2节点,在目录放了chromedriver.exe文件,这里要提示一下,这个chromedriver.exe文件前面说过下载地址了,主要是版本须要与系统中安装的chrome浏览器匹配;
java -jar selenium-server-standalone-2.53.1.jar -role node -port 6666 -hub http://192.168.0.245:4444/grid/register -Dwebdriver.chrome.driver=chromedriver.exe -maxSession 5 -browser browserName=chrome,seleniumProtocol=WebDriver,maxInstances=5,platform=WINDOWS
复制代码
没有报错则再次刷新一下http://localhost:4444/grid/console的访问会发现node节点已经显示,表示启动成功;
若是使用的chromedriver.exe与selenium-server-standalone-2.53.1版本或者浏览器chrome版本不匹配都会报错提示,具体缘由须要具体解决。
参数 | 解释 |
---|---|
Dwebdriver.chrome.driver=chromedriver.exe | 浏览器插件,若是是其余浏览器就写对应的名字 |
如firefox: -Dwebdriver.firefox.driver=geckodriver.exe
注意多了这个参数注意是chromedriver.exe须要指定,而对于Webdriver2是支持geckodriver因此不须要指定geckodriver,但前提是firefox浏览器版本不能大于46,因此看到node节点1使用的是45版本的浏览器。
复制代码
当实例化Hub远程时,会根据配置去匹配Hub上注册的node代理节点,匹配成功后转发给代理节点,这时候代理节点会生成sessionid启动浏览器,而后响应给Hub说一切准备就绪,Hub也会把这个sessionid响应给客户端,接下来的客户端的代码发来的请求都会被Hub转发给这个代理节点来执行。这里实际上整个流程与Selenium1.0的原理是同样的,只是多了Hub这一层。
DesiredCapabilities capability = new DesiredCapabilities();
capability.setBrowserName("chrome");
capability.setPlatform(Platform.WINDOWS);
try {
WebDriver driver = new RemoteWebDriver(new URL("http://192.168.0.245:4444/wd/hub"), capability);
driver.get("http://www.baidu.com");
driver.quit();
} catch (MalformedURLException e) {
e.printStackTrace();
}
复制代码
根据上面代码会发现node节点2执行,若是把setBrowserName()方法里面的传参改了firefox就会在node节点1执行。表示Selenium Grid环境搭建完成。
另外客户端还能够直接使用node节点运行代码,这样的方式就与selenium1.0如出一辙啦,看下面代码:
DesiredCapabilities capability = new DesiredCapabilities();
capability.setBrowserName("chrome");
capability.setPlatform(Platform.WINDOWS);
try {
WebDriver driver = new RemoteWebDriver(new URL("http://192.168.0.183:6666/wd/hub"), capability);
driver.get("http://www.baidu.com");
driver.quit();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
复制代码
要注意实例化driver对象时填写的服务地址是node节点的地址,这样就会直接去节点运行;还有一个注意的就是DesiredCapabilities配置,必定要设置该节点运行参数正确的浏览器、浏览器版本、系统,若是参数不对都会出现报错。
Selenium RC(Remote Control)是Selenium家族的核心部分; 支持多种不一样语言编写的自动化测试脚本,经过Selenium RC的服务器做为代理服务器去访问应用,从而达到测试目的;
selenium RC 分为 Client Libraries 和 Selenium Server; Client Libraries 库主要主要用于编写测试脚本,用来控制 selenium Server 的库。 Selenium Server 负责控制浏览器行为;
总的来讲,Selenium Server 主要包括 3 个部分: Launcher、Http Proxy、Core。
其中 Selenium Core 是被 Selenium Server 嵌入到浏览器页面中的。 其实 Selenium Core 就是一堆 JS 函数的集合,就是经过这些 JS 函数,咱们才能够实现用程序对浏览器进行操做。
Launcher 用于启动浏览器,把 selnium Core 加载到浏览器页面当中,并把浏览器的代理设置为 Selenium Server 的Http Proxy。
Selenium 2.0 是把 WebDriver 加入到了这个家族中; 简单用公式表示为:
selenium 2.0 = selenium 1.0 + WebDriver
在 selenium 2.0 中主推的是 WebDriver ,WebDriver 是 selenium RC 的替代品; 那么 selenium RC 与 webdriver 主要有什么区别呢?
Selenium RC 在浏览器中运行 JavaScript 应用,使用浏览器内置的 JavaScript 翻译器来翻译和执行 selenium 命令)。
WebDriver 经过原生浏览器支持或者浏览器扩展直接控制浏览器。
WebDriver 针对各个浏览器而开发,取代了嵌入到被测 Web 应用中的 JavaScript。与浏览器的紧密集成支持建立更高级的测试,避免了JavaScript 安全模型致使的限制。
除了来自浏览器厂商的支持,WebDriver 还利用操做系统级的调用模拟用户输入。
复制代码
WebDriver是按照Server-Client的设计模式设计的;
Server端就是Remote Server,能够是任意的浏览器; 当咱们的脚本启动浏览器后,该浏览器就是Remote Server,职责就是等待Client发送请求并作出响应;
Client端简单理解就是测试代码; 脚本的行为是以http请求的方式发送给被测试的浏览器,浏览器接受请求,执行相应操做,并在response中返回执行状态,返回等信息;
WebDriver的工做流程:
断断续续的看了这本书好久好久,仍是由于本身懒;
看完这本书,对selenium的api至少留个印象,最重要的仍是找控件的8种方式,通常若是Jb去面试,也会问这个问题,固然也会有selenium的原理以及2.0跟1.0的区别,不事后面几点只是作简单了解,不作任何评价;
可别忘记了,selenium对因而能够获取JS加载后的页面内容,若是想爬一个网页,并且内容是JS加载的,若是不想研究JS,就用selenium吧,贼好用的玩意;
立个flag,以前太忙了,致使一个月没更新博客,感受人都废了,所以立一个,一周更新一篇的flag,看能坚持多久吧~
最后,贴这个这本书电子版的连接:
https://pan.baidu.com/s/1b8T6Iq?errno=0&errmsg=Auth%20Login%20Sucess&&bduss=&ssnerror=0&traceid=
复制代码
这里说明下,电子版跟实体书仍是有点不同,若是只是用来查api,看这篇文章或者看电子书就行了,主要的内容没什么变化;
谢谢你们~