2016年1月25日星期一

Selenium's Find.getText vs execScript vs Phantom

抓一个动态网页文本内容下来,就这么一个简单的事儿,纵向对比了selenium的两种方法,又横向对比了Phantom。结论就是Phantom最快,Selenium得executeScript一次就可以做一堆事儿,比一次次FindElement再搞要快

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();
      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
    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();
      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
    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();
        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
    total time20 ms

 



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

没有评论:

发表评论