gpt4 book ai didi

node.js - 扩展 selenium webdriver js

转载 作者:搜寻专家 更新时间:2023-10-31 22:24:26 25 4
gpt4 key购买 nike

前言

我正在尝试为 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;

然后我只包含我的扩展网络驱动程序,而不是官方的:

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);

我正在尝试通过将其注入(inject)该对象来添加一个新对象:

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 的简单脚本(注意我使用的是全局变量)。

有没有办法在我的函数中访问“当前驱动程序”?与顶部的方法不同,这不是原型(prototype)方法,因此我无权访问 this

我不知道那些 factory_ 是如何工作的;我只是猜测我可以直接注入(inject)一个函数。

最佳答案

设置一个继承自 webdriver.WebDriver 的自定义构造函数。在构造函数中,您可以访问 this 对象,您可以使用该对象添加自定义定位器

var util = require('util');
var webdriver = require('selenium-webdriver');
var WebDriver = webdriver.WebDriver
var fs = require('fs');
var resumer = require('resumer');


function CustomDriver() {
WebDriver.call(this);
// append your strategy here using the "this" object
this...
}

util.inherits(WebDriver, CustomDriver);

CustomDriver.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;
});
});
};

CustomerDriver.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 = CustomDriver

关于node.js - 扩展 selenium webdriver js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18747300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com