`
yanzilee9292
  • 浏览: 528295 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

selenium webdriver杂记

阅读更多

1 简述
通过研究selenium-webdriver的源码,笔者发现其实webdriver的实现原理并不高深莫测无法揣度。在这里以webdriver ruby binding的firefox-webdriver实现为例,简单介绍一下webdriver的工作原理。

当测试脚本启动firefox的时候,selenium-webdriver 会首先在新线程中启动firefox浏览器。如果测试脚本指定了firefox的profile,那么就以该profile启动,否则的话就新启1个profile,并启动firefox;

firefox一般是以-no-remote的方法启动,启动后selenium-webdriver会将firefox绑定到特定的端口,绑定完成后该firefox实例便作为webdriver的remote server存在;

客户端(也就是测试脚本)创建1个session,在该session中通过http请求向remote server发送restful的请求,remote server解析请求,完成相应操作并返回response;

客户端接受response,并分析其返回值以决定是转到第3步还是结束脚本

http://17test.info/?p=280


2 selenium需要改进的地方
1 不能够直接使用已经打开的浏览器, 即使是用selenium打开的也不行

2 js弹出窗, 不支持IE
driver.switch_to.alert.accpect会被阻塞, 然后报runtime error


3 同时打开多个TAB, 多个实例, 多个浏览器?




3 笔记

通过 driver = Selenium::WebDriver.for :firefox 获取到的driver, 根据不同的浏览器, 
@return [Driver]
    #
    # @see Selenium::WebDriver::Remote::Bridge
    # @see Selenium::WebDriver::Firefox::Bridge
    # @see Selenium::WebDriver::IE::Bridge
    # @see Selenium::WebDriver::Chrome::Bridge
    # @see Selenium::WebDriver::Android::Bridge
    # @see Selenium::WebDriver::IPhone::Bridge
    # @see Selenium::WebDriver::Opera::Bridge
    #


irb(main):009:0> driver.capabilities
=> #<Selenium::WebDriver::Remote::Capabilities:0xae5c40 @capabilities={:browser_name=>"firefox", :version=>"10.0.2", :pl
atform=>:winnt, :javascript_enabled=>true, :css_selectors_enabled=>true, :takes_screenshot=>true, :native_events=>false,
 :rotatable=>nil, :firefox_profile=>nil, :proxy=>nil, "handlesAlerts"=>true}>


需要注意的是 for返回的数据类型是Driver, 有一个实例变量@bridge, 很多公用的方法定义在remote::Bridge中, 特殊的方法定义在Firefox::Bridge中。由于firefox的bridge为私有变量, 不能这样用: driver.bridge


重命名的方法有 first all script --> find_element find_elements execute_script




最终调用的是remote/bridge.rb中的raw_execute方法:  加上一个puts语句 可以调试

irb(main):002:0> s=Selenium::WebDriver.for :firefox
post
session
{:desiredCapabilities=>#<Selenium::WebDriver::Remote::Capabilities:0xf606a8 @capabilities={:browser_name=>"firefox", :ve
rsion=>"", :platform=>:any, :javascript_enabled=>true, :css_selectors_enabled=>true, :takes_screenshot=>true, :native_ev
ents=>true, :rotatable=>false, :firefox_profile=>nil, :proxy=>nil}>}
=> #<Selenium::WebDriver::Driver:0x..f9f8da084 browser=:firefox>
irb(main):003:0> s.get 'http://baidu.com'
post
session/76252388-68ae-4145-ab92-049f47e7aa4d/url
{:url=>"http://baidu.com"}
=> ""



irb(main):009:0> a= s.find_element :id=>'q'
post
session/76252388-68ae-4145-ab92-049f47e7aa4d/element
{:using=>"id", :value=>"q"}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics