前言
我正在尝试为selenium-webdriver编写一些扩展,如下所示:
var webdriver = require('selenium-webdriver');
var fs = require('fs');
var resumer = require('resumer');
webdriver.WebDriver.prototype.saveScreenshot = function(filename) {
return this.takeScreenshot().then(function(data) {
fs.writeFile(filename, data.replace(/^data:image\/png;base64,/,''), 'base64', function(err) {
if(err) throw err;
});
});
};
webdriver.WebDriver.prototype.streamScreenshot = function() {
var stream = resumer();
this.takeScreenshot().then(function(data) {
stream.queue(new Buffer(data.replace(/^data:image\/png;base64,/,''), 'base64')).end();
});
return stream;
};
module.exports = webdriver;
然后我只需包含我的扩展webdriver,而不是官方的webdriver:
var webdriver = require('./webdriver.ext');
我认为这是在Node JS中扩展内容的适当方式。
问题
我遇到的问题是添加自定义定位策略。这些策略在源代码中如下所示:
/**
* Factory methods for the supported locator strategies.
* @type {Object.<function(string):!webdriver.Locator>}
*/
webdriver.Locator.Strategy = {
'className': webdriver.Locator.factory_('class name'),
'class name': webdriver.Locator.factory_('class name'),
'css': webdriver.Locator.factory_('css selector'),
'id': webdriver.Locator.factory_('id'),
'js': webdriver.Locator.factory_('js'),
'linkText': webdriver.Locator.factory_('link text'),
'link text': webdriver.Locator.factory_('link text'),
'name': webdriver.Locator.factory_('name'),
'partialLinkText': webdriver.Locator.factory_('partial link text'),
'partial link text': webdriver.Locator.factory_('partial link text'),
'tagName': webdriver.Locator.factory_('tag name'),
'tag name': webdriver.Locator.factory_('tag name'),
'xpath': webdriver.Locator.factory_('xpath')
};
goog.exportSymbol('By', webdriver.Locator.Strategy);
我正在尝试通过将其注入到该对象中来添加一个新的对象:
webdriver.By.sizzle = function(selector) {
driver.executeScript("return typeof Sizzle==='undefined'").then(function(noSizzle) {
if(noSizzle) driver.executeScript(fs.readFileSync('sizzle.min.js', {encoding: 'utf8'}));
});
return new webdriver.By.js("return Sizzle("+JSON.stringify(selector)+")[0]");
};
这对于定义了driver
的简单脚本实际上运行良好(请注意,我正在使用全局变量)。
有没有一种方法可以在我的函数内部访问"当前driver"?与顶部的方法不同,这不是原型方法,因此我无法访问this
。
我不知道那些factory_
是如何工作的;我只是猜测我可以直接注入一个函数。