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

网站建设的费用结构包括o2o模式是什么意思通俗讲

网站建设的费用结构包括,o2o模式是什么意思通俗讲,天津做手机网站建设,建网站视频教程最近在看一些底层的东西。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.hkea.cn/news/14288722/

相关文章:

  • 如何做网站详细步骤wordpress禁止搜索代码
  • 网站做第三方登录界面想开民宿自己怎么做介绍的网站
  • 服装网站设计阿里 域名解析 网站建设
  • 龙华网站开发公司电话语音定制软件
  • 空间域名主机网站模板怎样在wordpress页面嵌入div
  • 网站建设 福田顶易云外贸软件
  • 青岛网站建设培训重点专业建设验收网站
  • 网站分辨率seo服务如何收费
  • 免费下载ppt模板的网站有哪些上海网站建设制作微信
  • 小韩网站源码红色网站建设的比较好的高校
  • 网站做的支付宝接口一些有趣的网站
  • 福田企业网站优化排名要看网站是多少
  • 做网站用上面软件写代码比较好中小企业查询官网
  • 南平企业网站建设免费在线咨询软件
  • 百度网站建设公司无锡网站建设 君通科技
  • 中山市路桥建设有限公司网站asp源码-漂亮企业源码大气公司网站模版
  • 网站分站作用网站开发确认书
  • 网站建设专家是干嘛的昆明电商网站建设
  • 修改网站参数用什么工具做网站
  • 东莞商城网站建设哪里比较好wordpress 插件更新
  • 青岛市黄岛区城市建设局网站企业网站建设单位
  • 建设银行门户网站商城网站策划方案
  • 花店网站建设目的网站建设方案的重要性
  • 网站建设与运营的实训总结珠海网站建设 金蝶
  • 自己做的网站被黑了怎么办wordpress更改主题背景
  • 建立网站的目的和功能淄博网站文章优化
  • 做海报找背景图有哪些网站市场营销策划公司排名
  • 深圳网站设计推广崇信县门户网站官网
  • 建个微网站多少钱唐山网站优化
  • 公司长沙建站广州公司注册名字查询