开发者

How can I control a browser ( ala Selenium ) with node.js?

开发者 https://www.devze.com 2023-03-02 14:04 出处:网络
I\'ve heard of soda, but it seems like it requires you t开发者_如何学Pythono signup and there\'s a limit on the # of minutes ( free acct / 200 minutes ).

I've heard of soda, but it seems like it requires you t开发者_如何学Pythono signup and there's a limit on the # of minutes ( free acct / 200 minutes ).

Does anyone know if there's some alternative way to control a browser, or more specifically invoke JS on a web page?


https://github.com/LearnBoost/soda/raw/master/examples/google.js

/**
 * Module dependencies.
 */

var soda = require('../')
  , assert = require('assert');

var browser = soda.createClient({
    host: 'localhost'
  , port: 4444
  , url: 'http://www.google.com'
  , browser: 'firefox'
});

browser.on('command', function(cmd, args){
  console.log(' \x1b[33m%s\x1b[0m: %s', cmd, args.join(', '));
});

browser
  .chain
  .session()
  .open('/')
  .type('q', 'Hello World')
  .clickAndWait('btnG')
  .getTitle(function(title){
    assert.ok(~title.indexOf('Hello World'), 'Title did not include the query');
  })
  .clickAndWait('link=Advanced search')
  .waitForPageToLoad(2000)
  .assertText('css=#gen-query', 'Hello World')
  .assertAttribute('as_q@value', 'Hello World')
  .testComplete()
  .end(function(err){
    if (err) throw err;
    console.log('done');
  });


Zombie.js might work for you. It is headless and seems really cool.


There are actually now Selenium bindings for JavaScript that work with Node.js.

Here are some basic steps to get started:

  1. 1 Install Node.js, you can find the download here.
  2. Make sure you have the latest Chrome driver and put it in your path.
  3. Use npm install selenium-webdriver to get the module added to your project.
  4. Write a test, for example:

var webdriver = require('selenium-webdriver');

var driver = new webdriver.Builder().
   withCapabilities(webdriver.Capabilities.chrome()).
   build();

driver.get('http://www.google.com');
driver.findElement(webdriver.By.name('q')).sendKeys('simple programmer');
driver.findElement(webdriver.By.name('btnG')).click();
driver.quit();</code>

I cover how to do this with some screenshots and how to use Mocha as a test driver in my blog post here.


Here's a pure node.js wrapper around the java API for selenium's webdriver:

https://npmjs.org/package/webdriver-sync

Here's an example:

var webdriverModule = require("webdriver-sync");
var driver = new webdriverModule.ChromeDriver;
var By = webdriverModule.By;
var element = driver.findElement(By.name("q"));
element.sendKeys("Cheese!");
element.submit();
element = driver.findElement(By.name("q"));
assert.equal(element.getAttribute('value'), "Cheese!");

Save that in a .js file and run it with node.

The module is a pure wrapper, so things like sleep or synchronous calls are entirely possible. Here's the current interface of the module:

module.exports={
   ChromeDriver:ChromeDriver,
   FirefoxDriver:FirefoxDriver,
   HtmlUnitDriver:HtmlUnitDriver,
   By:new By(),
   ExpectedConditions:new ExpectedConditions(),
   WebDriverWait:WebDriverWait,
   Credentials:UserAndPassword,
   Cookie:Cookie,
   TimeUnits:TimeUnits,
   /**
    * @param {number} amount in mills to sleep for.
    */
   sleep:function(amount){
      java.callStaticMethodSync(
         "java.lang.Thread",
         "sleep",
         new Long(amount)
      );
   }
};

You can see an integration test that tests the full capabilities here:

https://github.com/jsdevel/webdriver-sync/blob/master/test/integrations/SmokeIT.js


wd is "A node.js javascript client for webdriver/selenium 2"

0

精彩评论

暂无评论...
验证码 换一张
取 消