【问题标题】:await Async function with selenium Nodejs使用 selenium Nodejs 等待异步函数
【发布时间】:2021-08-27 19:29:01
【问题描述】:

我正在创建一个小程序,当您使用 selenium 在 google 上搜索内容时返回所有链接标题的名称

代码如下:

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

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

var search_query='tigers';

(async()=>{

await driver.get(`https://www.google.com/search?q=${search_query}`);

await driver.findElements(By.css('h3')).then((search_results)=>{ 
 for (var i = 0; i < search_results.length; i++)
  search_results[i].getText().then((text)=>{console.log(text);})
});

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

当你运行它时,输出如下:-

...Task Complete!
Tiger - Wikipedia
Top stories
Tigers (2014 film) - Wikipedia
Detroit Tigers (@tigers) · Twitter
Tiger | Species | WWF
Videos
Official Detroit Tigers Website | MLB.com
Tiger | WWF
Tiger - National Geographic Kids
Tiger guide: species facts, how they hunt and where to see in ...
Related searches
Images
Description

显然应该在整个功能完成后记录...Task Complete!

我不明白我做错了什么我使用了适当的await 关键字来保持代码流有序,是then() 中的错误吗?

【问题讨论】:

    标签: javascript node.js selenium selenium-webdriver


    【解决方案1】:

    由于您的 .then(()=&gt;...) 没有返回 Promise,所以开头的 await 关键字什么也不做。 Node 已经开始承诺获取 h3,获取它们的文本内容并记录它们,但是您放错位置的 await 并没有告诉 Node 等待所有这些完成。你会想await获取元素,然后同步循环遍历所有元素,awaiting文本,然后同步打印文本,最后同步打印"...Task Complete!"

    const { Builder, By, Key, until } = require('selenium-webdriver');
    
    const driver = new Builder().forBrowser("firefox").build();
    
    const search_query = 'tigers';
    
    (async () => {
        await driver.get(`https://www.google.com/search?q=${search_query}`);
    
        const h3Elements = await driver.findElements(By.css('h3'));
        for (const h3 of h3Elements) {
            const text = await h3.getText();
            console.log(text);
        }
    
        console.log('...Task Complete!')
    })();
    

    如果你想减少额外的变量,你可以这样做:

    const { Builder, By, Key, until } = require('selenium-webdriver');
    
    const driver = new Builder().forBrowser("firefox").build();
    
    const search_query = 'tigers';
    
    (async () => {
        await driver.get(`https://www.google.com/search?q=${search_query}`);
    
        const h3Elements = await driver.findElements(By.css('h3'));
        for (const h3 of h3Elements) {
            console.log(await h3.getText());
        }
    
        console.log('...Task Complete!')
    })();
    

    【讨论】:

    • 您发送的第一个代码有效,非常感谢!但是第二个减少的变量不起作用它在console.log(await h3.getText()); 行中显示SyntaxError: missing ) after argument list,也许问题是在(h3)=&gt; 不是异步函数时在控制台日志中使用await
    • @cakelover 我已经更新了减少变量版本的解决方案,请立即查看
    • 好吧,它在编译过程中没有显示任何错误,但它给出了与问题中所要求的相同的错误输出
    • 是的,因为这不是顶级await,所以它会引起问题。你可以用Promise.all.map 解决这个问题,但这只会让事情变得混乱。我更新了第二部分,它只是删除了一个不必要的变量 (text),因为它位于 await 的顶级上下文中
    猜你喜欢
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 2019-07-20
    • 2023-03-13
    • 2020-07-11
    相关资源
    最近更新 更多