首页 > 解决方案 > selenium 中的函数,一旦出现就返回所需的元素

问题描述

我正在尝试
根据这个答案创建一个使用 selenium 进行谷歌搜索的程序,到目前为止代码看起来像这样

const { Builder, By, Key, until } = require('selenium-webdriver');

const driver = new Builder().forBrowser("firefox").build();

(async () => {
    await driver.get(`https://www.google.com`);

     var el = await driver.findElement(By.name('q'));
     await driver.wait(until.elementIsVisible(el),1000);
     await el.sendKeys('selenium');

     var el = await driver.findElement(By.name(`btnK`));
     await driver.wait(until.elementIsVisible(el),1000);
     await el.click();

    console.log('...Task Complete!')
})();

但写作

var el = await driver.findElement(By.something('...'));
     await driver.wait(until.elementIsVisible(el),1000);
     await el.do_something();

每次都变得困难,所以我尝试制作这样的功能:

const { Builder, By, Key, until } = require('selenium-webdriver');

const driver = new Builder().forBrowser("firefox").build();

async function whenElement(by_identity,timeout=1000){
  var el = await driver.findElement(by_identity);
  await driver.wait(until.elementIsVisible(el),timeout);
  return el;
}

(async () => {
    await driver.get(`https://www.google.com`);

     await whenElement(By.name('q')).sendKeys('selenium');

     await whenElement(By.name('btnK')).click();

    console.log('...Task Complete!')
})();

但它给出了这个错误:

UnhandledPromiseRejectionWarning: TypeError: whenElement(...).sendKeys 不是函数

我的目标是减少变量的数量并使其尽可能简单,
那么我到底做错了什么?

标签: javascriptnode.jsseleniumselenium-webdriver

解决方案


承诺似乎有错误。您只能在 Promise 返回的实际元素上调用函数,而不是 Promise 本身。您必须首先等待等待元素whenElement解析的promise,然后您才能使用元素并等待返回的promisesendKeys解析。

const el = await whenElement(By.name('q'));
await el.sendKeys('selenium');

或者

await (await whenElement(By.name('q'))).sendKeys('selenium');

或者

await whenElement(By.name('q')).then(el => el.sendKeys('selenium'));

推荐阅读