Selenium's Find.getText vs execScript vs Phantom

selenium-webdriver

先启动chromedriver

$ chromedriver 
Starting ChromeDriver 2.19.346063 (38b35413bd4a486d436a9749e090454bc9ff6708) on port 9515
Only local connections are allowed.
  • 先试试看标准方法findElement(body).getText(),执行100次。因为是异步的,所以得等最后一个结果出来了再算时间。

    var webdriver = require('selenium-webdriver');
    
    var driver = new webdriver.Builder().usingServer('http://localhost:9515').forBrowser('chrome').build();
    
    driver.get('http://r.gnavi.co.jp/k4993ww30000/').then(function() {
      var ts = Date.now();
      console.log(new Date(ts));
      for(var i = 0; i < 100; i++) {
        driver.findElement(webdriver.By.tagName('body')).getText().then(function(text){
          --i == 0 && console.log('total time: ' + (Date.now() - ts) + ' ms');
        });
      }
    });
    
    driver.quit();

    运行,结果很慢,平均一次需要271毫秒:

    $ node test.js
    Mon Jan 25 2016 18:06:11 GMT+0900 (JST)
    total time: 27143 ms

    这可能findElement,getText每次都要和chromedriver往返通信造成的。

  • 再试试看executeScript('return document.body.innerText')

    var webdriver = require('selenium-webdriver');
    
    var driver = new webdriver.Builder().usingServer('http://localhost:9515').forBrowser('chrome').build();
    
    driver.get('http://r.gnavi.co.jp/k4993ww30000/').then(function() {
      var ts = Date.now();
      console.log(new Date(ts));
      for(var i = 0; i < 100; i++) {
        driver.executeScript('return document.body.innerText').then(function(text){
          --i == 0 && console.log('total time: ' + (Date.now() - ts) + ' ms');
        });
      }
    });
    
    driver.quit();

    运行,结果快多了,平均一次只要7.7毫秒:

    $ node test.js
    Mon Jan 25 2016 18:07:13 GMT+0900 (JST)
    total time:: 770 ms


PhantomJS

  • 他的evaluate是同步执行的,所以在100次循环后直接打印出时间差。

    var page = require('webpage').create();
    page.open('http://r.gnavi.co.jp/k4993ww30000/', function(status) {
      console.log("Status: " + status);
      if(status === "success") {
        var ts = Date.now();
        console.log(new Date(ts));
        for(var i = 0; i < 100; i++) {
          var t = page.evaluate(function() {
            return document.body.innerText;
          });
        }
        console.log('total time: ' + (Date.now() - ts) + ' ms')
      }
      phantom.exit();
    });

    运行,结果平均一次只要0.2毫秒:

    $ phantomjs ~/tmp/phantomjs_test/a.js 
    Status: success
    Mon Jan 25 2016 18:29:08 GMT+0900 (JST)
    total time: 20 ms


结论:Phantom最快,Selenium得executeScript一次就可以做一堆事儿,比一次次FindElement在搞要快。

你可能感兴趣的:(webdriver,phantom,Selelium)