当前位置: 首页 > news >正文

北仑网站推广淘宝客网站建设教程视频

北仑网站推广,淘宝客网站建设教程视频,价格低用英语怎么说,html5的静态壁纸最近在看一些底层的东西。driver翻译过来是驱动#xff0c;司机的意思。如果将webdriver比做成司机#xff0c;竟然非常恰当。 我们可以把WebDriver驱动浏览器类比成出租车司机开出租车。在开出租车时有三个角色#xff1a; 乘客#xff1a;他/她告诉出租车司机去哪里司机的意思。如果将webdriver比做成司机竟然非常恰当。 我们可以把WebDriver驱动浏览器类比成出租车司机开出租车。在开出租车时有三个角色 · 乘客他/她告诉出租车司机去哪里大概怎么走。 · 出租车司机他按照乘客的要求来操控出租车。 · 出租车出租车按照司机的操控完成真正的行驶把乘客送到目的地。 在WebDriver中也有类似的三个角色 · 自动化测试代码自动化测试代码发送请求给浏览器的驱动比如火狐驱动、谷歌驱动。 · 浏览器的驱动它来解析这些自动化测试的代码解析后把它们发送给浏览器。 · 浏览器执行浏览器驱动发来的指令并最终完成工程师想要的操作。 所以在这个类比中 · 工程师写的自动化测试代码就相当于是乘客。 · 浏览器的驱动就相当于是出租车司机。 · 浏览器就相当于是出租车。 下面再从技术上解释下WebDriver的工作原理 从技术上讲也同样是上面的三个角色 · WebDriver API基于Java、Python、C#等语言。 · 对于java语言来说就是下载下来的selenium的Jar包比如selenium-java-3.8.1.zip包代表Selenium3.8.1的版本。 · 浏览器的驱动browser driver每个浏览器都有自己的驱动均以exe文件形式存在。比如谷歌的chromedriver.exe、火狐的geckodriver.exe、IE的IEDriverServer.exe浏览器。 浏览器当然就是我们很熟悉的常用的各种浏览器。那在WebDriver脚本运行的时候它们之间是如何通信的呢为什么同一个browser driver即可以处理java语言的脚本也可以处理python语言的脚本呢让我们来看一下一条Selenium脚本执行时后端都发生了哪些事情 · 对于每一条Selenium脚本一个http请求会被创建并且发送给浏览器的驱动。 · 浏览器驱动中包含了一个HTTP Server用来接收这些http请求。 · HTTP Server接收到请求后根据请求来具体操控对应的浏览器。 浏览器执行具体的测试步骤 浏览器将步骤执行结果返回给HTTP Server。HTTP Server又将结果返回给Selenium的脚本如果是错误的http代码我们就会在控制台看到对应的报错信息。 为什么使用HTTP协议呢 因为HTTP协议是一个浏览器和Web服务器之间通信的标准协议而几乎每一种编程语言都提供了丰富的http libraries这样就可以方便的处理客户端Client和服务器Server之间的请求request及响应responseWebDriver的结构中就是典型的C/S结构WebDriver API相当于是客户端而小小的浏览器驱动才是服务器端。 WebDriver基于的协议JSON Wire protocol。 JSON Wire protocol是在http协议基础上对http请求及响应的body部分的数据的进一步规范。 我们知道在HTTP请求及响应中常常包括以下几个部分http请求方法、http请求及响应内容body、http响应状态码等。 常见的http请求方法 GET用来从服务器获取信息。比如获取网页的标题信息。 POST向服务器发送操作请求。比如findElementClick等。 http响应状态码 在WebDriver中为了给用户以更明确的反馈信息提供了更细化的http响应状态码比如 7NoSuchElement 11ElementNotVisible 200Everything OK 现在到了最关键的http请求及响应的body部分了 body部分主要传送具体的数据在WebDriver中这些数据都是以JSON的形式存在并进行传送的这就是JSON Wire protocol。 Selenium 是将各个浏览器的API封装成 Selenium自己设计定义的协议名字叫做The WebDriver Wire Protocol 的webdriver API 操作层面 1、测试人员编写UI自动化测试脚本java,python等等运行脚本后程序会打开指定的webdriver浏览器。 webdriver浏览器作为一个remote-server 接受脚本的命令同时webservice会打开一个端口http://localhost:9515 浏览器则会监听这个端口。 2、webservice会将脚本语言翻译成json格式传递给浏览器执行操作命令。 逻辑层面 1、测试人员执行测试脚本后就创建了一个session, 通过http 请求向webservice发送了restfull的请求。 2、webservice翻译restfull的请求为浏览器能懂的脚本然后接受脚本执行结果。 3、webservice将结果进行封装--json 给到客户端client/测试脚本 然后client就知道操作是否成功同时测试也可以进行校验了。 我们可以验证一下 下载好chromedriver放到环境变量里注意要和chrome浏览器版本对上然后执行chromedriver 可以看到会启动一个server, 并开启端口9515 andersons-iMac:~ anderson$ chromedriver Starting ChromeDriver 2.39.562713 (dd642283e958a93ebf6891600db055f1f1b4f3b2) on port 9515 Only local connections are allowed. GVA info: Successfully connected to the Intel plugin, offline Gen9 强调了只允许本地连接。前面已经提过了乘客向司机发一个请求行为是构造一个http请求。构造的请求是这样子的 请求方式 POST 请求地址 http://localhost:9515/session 请求body capabilities {capabilities: {alwaysMatch: {browserName: chrome},firstMatch: [{}]},desiredCapabilities: {platform: ANY,browserName: chrome,version: ,chromeOptions: {args: [],extensions: []}}}我们可以尝试使用python requests 向 ChromeDriver发送请求import requestsimport jsonsession_url http://localhost:9515/sessionsession_pars {capabilities: {firstMatch: [{}], \alwaysMatch: {browserName: chrome,\platformName: any, \goog:chromeOptions: {extensions: [], args: []}}}, \desiredCapabilities: {browserName: chrome, \version: , platform: ANY, goog:chromeOptions: {extensions: [], args: []}}}r_session requests.post(session_url,jsonsession_pars)print(json.dumps(r_session.json(),indent2))结果{sessionId: 44fdb7b1b048a76c0f625545b0d2567b,status: 0,value: {acceptInsecureCerts: false,acceptSslCerts: false,applicationCacheEnabled: false,browserConnectionEnabled: false,browserName: chrome,chrome: {chromedriverVersion: 2.40.565386 (45a059dc425e08165f9a10324bd1380cc13ca363),userDataDir: /var/folders/yd/dmwmz84x5rj354qkz9rwwzbc0000gn/T/.org.chromium.Chromium.RzlABs},cssSelectorsEnabled: true,databaseEnabled: false,handlesAlerts: true,hasTouchScreen: false,javascriptEnabled: true,locationContextEnabled: true,mobileEmulationEnabled: false,nativeEvents: true,networkConnectionEnabled: false,pageLoadStrategy: normal,platform: Mac OS X,rotatable: false,setWindowRect: true,takesHeapSnapshot: true,takesScreenshot: true,unexpectedAlertBehaviour: ,version: 71.0.3578.80,webStorageEnabled: true}} 如何打开一个网页类似driver.get(url) 那么构造的请求是 请求方式 POST 请求地址 http://localhost:9515/session/:sessionId/url 注意上述地址中的 :sessionId 要用启动浏览器的请求返回结果中的sessionId的值 例如我刚刚发送请求启动浏览器返回结果中sessionId: 44fdb7b1b048a76c0f625545b0d2567b   然后请求的URL地址 请求地址http://localhost:9515/session/b2801b5dc58b15e76d0d3295b04d295c/url 请求body {url: https://www.baidu.com, sessionId: 44fdb7b1b048a76c0f625545b0d2567b} 即 import requestsurl http://localhost:9515/session/44fdb7b1b048a76c0f625545b0d2567b/urlpars {url: https://www.baidu.com, sessionId: 44fdb7b1b048a76c0f625545b0d2567b}r requests.post(url,jsonpars)print(r.json()) 如何定位元素类似driver.finde_element_by_xx: 请求方式 POST 请求地址 http://localhost:9515/session/:sessionId/element 注意上述地址中的 :sessionId 要用启动浏览器的请求返回结果中的sessionId的值。 例如我刚刚发送请求启动浏览器返回结果中sessionId: b2801b5dc58b15e76d0d3295b04d295c   然后我构造 查找页面元素的请求地址 请求地址http://localhost:9515/session/b2801b5dc58b15e76d0d3295b04d295c/element 请求body {using: css selector, value: .postTitle a, sessionId: b2801b5dc58b15e76d0d3295b04d295c} 即 import requests url http://localhost:9515/session/b2801b5dc58b15e76d0d3295b04d295c/element pars {using: css selector, value: .postTitle a, sessionId: b2801b5dc58b15e76d0d3295b04d295c} r requests.post(url,jsonpars) print(r.json()) 如何操作元素类似click() 请求方式 POST 请求地址 http://localhost:9515/session/:sessionId/element/:id/click 注意上述地址中的 :sessionId 要用启动浏览器的请求返回结果中的sessionId的值 :id 要用元素定位请求后返回ELEMENT的值 例如我刚刚发送请求启动浏览器返回结果中sessionId: b2801b5dc58b15e76d0d3295b04d295c   元素定位,返回ELEMENT的值0.11402119390850629-1 然后我构造 点击页面元素的请求地址 请求地址http://localhost:9515/session/b2801b5dc58b15e76d0d3295b04d295c/element/0.11402119390850629-1/click 请求body {id: 0.11402119390850629-1, sessionId: b2801b5dc58b15e76d0d3295b04d295c} 即 import requestsurl http://localhost:9515/session/b2801b5dc58b15e76d0d3295b04d295c/element/0.11402119390850629-1/clickpars {id: 0.5930642995574296-1, sessionId: b2801b5dc58b15e76d0d3295b04d295c}r requests.post(url,jsonpars)print(r.json()) 从上面可以看出来UI自动化其实也可以写成API自动化。 只是只是 好繁琐没有封装好的wedriver指令好用有点脱裤子放屁的感觉。 我们来写段代码感觉一下 import requestsimport timecapabilities {capabilities: {alwaysMatch: {browserName: chrome},firstMatch: [{}]},desiredCapabilities: {platform: ANY,browserName: chrome,version: ,chromeOptions: {args: [],extensions: []}}} # 打开浏览器 http://127.0.0.1:9515/session res requests.post(http://127.0.0.1:9515/session, jsoncapabilities).json() session_id res[sessionId] # 打开百度 requests.post(http://127.0.0.1:9515/session/%s/url % session_id, json{url: http://www.baidu.com, sessionId: session_id}) time.sleep(3) # 关闭浏览器删除session requests.delete(http://127.0.0.1:9515/session/%s % session_id, json{sessionId: session_id}) 其实搞懂真正的原理也就是为了方便解决问题在debug的时候更方便的查看和解决问题。 当然如果在接口自动化里面也需要调用少量的UI自动化可以考虑这种方式。 最后感谢每一个认真阅读我文章的人礼尚往来总是要有的虽然不是什么很值钱的东西如果你用得到的话可以直接拿走 这些资料对于【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴上万个测试工程师们走过最艰难的路程希望也能帮助到你
http://www.yingshimen.cn/news/32325/

相关文章:

  • 韶关市网站建设phpcms安装教程
  • 企业vi设计与网站开发做动漫网站的心得体会
  • 网站平台专业开发制作app陕西住建执业证书官网
  • 潍城营销型网站建设网页区设计网站诊断
  • 优化网站加载速度网站空间提供
  • 百度快速排名提升郑州厉害的seo顾问公司
  • 汕头建站模板源码域名服务器的正向解析
  • 网站怎么做框架集oa管理系统软件
  • 中国建设银行黑龙江支行官方网站crm系统 网站建设
  • 旅游建设投资公司网站博客网站的建设流程
  • 优化网站的软件下载建设好网站为什么读取不到文件
  • 用空间做网站如何做好安全长春网站开发
  • 专门做餐饮空间设计的网站一个网站突然打不开
  • 商业网站推广企业网站制作前期需要什么资料
  • 网站实施要求企业商城网站开发建设
  • 门户网站建设进展情况shop++的优点
  • 做传媒网站公司名称大气一点的公司名字
  • 找团队做网站做招生网站
  • 通许画册设计网站淘宝客户自己做网站怎么做
  • 新网站如何备案什么网站做奢侈品的工厂店
  • 企业建设网站的必要性没网站做cpa广告联盟
  • 网站手机版下悬浮条怎么做免费网页制作代码
  • 网站空间站徐州企业网站建设公司
  • 有免费做网站的吗电子商务网页设计模板
  • 网站如何做排名优化下载软件的app
  • 美容行业网站建设多少价格做窗帘的网站
  • 凡科做的网站打不开岳阳seo招聘
  • 网站建设运营执行方案做网站 江门
  • 分类信息网站有哪些wordpress改cms
  • 济南网站建设方案wordpress翻译文件