【问题标题】:executing "commands" using selenium-webdriver in node javascript在节点 javascript 中使用 selenium-webdriver 执行“命令”
【发布时间】:2013-10-06 20:55:46
【问题描述】:

我有兴趣通过 javascript API 执行一些高级“命令” https://code.google.com/p/selenium/source/browse/javascript/webdriver/command.js

如果我从基本代码开始:

var browser = new webdriver
        .Builder()
        .usingServer(server.address())
        .withCapabilities(webdriver.Capabilities.phantomjs())
        .build();

我尝试执行的每种形式的“可能”语法都失败了。例如:

// does not work
console.log(webdriver.Command('getWindowSize'))
// does not work
console.log(browser.Command('getWindowSize'))

有人知道如何在 selenium javascript webdriver 中执行“获取窗口大小”或“设置窗口大小”吗?

【问题讨论】:

  • 我没有使用Command的东西,但是我们使用了ExecuteScript函数来执行JavaScript。如果我记得,它会返回 javascript 通常会返回的任何内容,因此只需执行一个返回窗口大小的 javascript 函数(我认为您可能必须单独执行宽度和高度或单独获取它们并将它们作为具有 2 个值的对象返回或东西。)
  • 谢谢皮特。 console.log(browser.ExecuteScript('window.height')); 在这种情况下似乎不起作用。 console.log(browser.executor_.execute('window.height'));你也没有样品吗?
  • Alex,我遇到了很多问题,类似于您遇到的问题。 Node.js 中的 Selenium-webdriver 是一个混乱。整个 Promise 系统似乎有点道理,但我还没有找到如何使用它的可靠的真实示例(除了简单的“hello world”内容之外)。最后一天我一直在尝试简单地获取元素的可见文本......(叹气)我想我将放弃 selenium-webdriver,并改用webdriver.io。看起来很有希望,并且似乎使用已经熟悉的链接语法来近似同步。

标签: javascript node.js selenium webdriver


【解决方案1】:

您可能正在寻找driver.executeScript

例子:

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

driver.executeScript('return 2').then(function(return_value) {
    console.log('returned ', return_value)
});

这会将 2 记录到控制台。

我也对此进行了测试:

driver.get('http://underscorejs.org/');

driver.executeScript('return _').then(function(return_value) {
    console.log('returned ', return_value)
});

...它正确列出了_上定义的所有方法,因此它似乎可以工作。

【讨论】:

【解决方案2】:

在我的 npm 包中有一个文件 node_modules/selenium-webdriver/test/execute_script_test.js,其中有很多使用 driver.executeScript 的示例(在文件的最后,他们将 execute 定义为 executeScript 的别名)。

【讨论】:

  • 虽然链接到外部资源很好,但答案应该是自包含的,并且外部资源不应该严格必需,而是附加内容(实际上,这答案甚至不包含上述链接,而只是提到“我的 npm 包”)。
  • 我无意回答这个问题。我觉得这已经完成了。我打算指出一个有用的补充资源,selenium-webdriver 的用户已经在他们安装的 npm 模块中拥有。
  • 我现在看到我可以,可能应该有,将此信息添加为评论而不是答案
【解决方案3】:

你需要 driver.executeScript()。您可以传递一个函数或一个字符串。

const _scraper = () => {
  return document.title;
}

const getPageTitle = async (url) => {
  await driver.get(url);
  const pageTitle = await driver.executeScript(_scraper);
  console.log(pageTitle);
}

您也可以将参数传递给函数。

const _scraper1 = (arg) => {
  return document.getElementsByTagName(arg);
}

const getTagData = async (url) => {
  await driver.get(url);
  const metas = await driver.executeScript(_scraper, 'meta');
  console.log(metas);
}

【讨论】:

    猜你喜欢
    • 2016-01-17
    • 2013-05-30
    • 2017-08-11
    • 2016-12-04
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    相关资源
    最近更新 更多