当前位置: 首页 > 知识库问答 >
问题:

无法通过使用Puppeteer的选择器进行选择

卢磊
2023-03-14

我有一个问题是通过元素的选择器获取元素。

我纠结的一个页面是:http://html5.haxball.com/。我成功的是登录,但这是一种黑客,因为我使用的事实,我需要填写的字段已经被选中。

在输入nick并进入大堂后,我想点击‘创建房间’按钮。其选择器:body>div>div>div>div>div>div>div.buttons>button:nth-child(3)

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch({
    args: ['--no-sandbox'], headless: false, slowMo: 10
});
const page = await browser.newPage();
await page.goto('http://html5.haxball.com/index.html');
await page.keyboard.type(name);
await page.keyboard.press('Enter');
//at this point I am logged in.

let buttonSelector = 'body > div > div > div > div > div.buttons > button:nth-child(3)';

await page.waitForSelector('body > div > div');
await page.evaluate(() => {
    document.querySelector(buttonSelector).click();
});

browser.close();
})();

运行这样的代码后,我得到错误:

UnhandledPromiseRejectionWarning:错误:计算失败:TypeError:无法读取属性“Click”为null

我最初的方法是:await Page.Click(buttonSelector);而不是page.evaluate,但它也会失败。

最让我沮丧的是这样一个事实:当我在Chromium控制台中运行时:document.queryselector(buttonSelector).click();工作很好。

共有1个答案

师增
2023-03-14

需要注意的几件事:

>

  • 用于检索按钮的选择器比需要的复杂。尝试一些更简单的操作,例如:'button[data-hook=“create”]'.
  • 游戏在iframe中,因此您最好使用iframedocument对象调用document.QuerySelector而不是使用包含窗口的document

    传递给evaluate的函数是在与运行节点脚本的上下文不同的上下文中执行的。因此,必须将变量从节点脚本显式传递到窗口脚本,否则buttonselector将未定义:

    进行上述更改后,您的代码将输入您的姓名并成功点击“创建房间”:

    const puppeteer = require('puppeteer');
    
    (async () => {
    
        const browser = await puppeteer.launch({
            args: ['--no-sandbox'], headless: false, slowMo: 10
        });
    
        const page = await browser.newPage();
        await page.goto('http://html5.haxball.com/index.html');
        await page.keyboard.type('Chris');
        await page.keyboard.press('Enter');
        //at this point I am logged in.
    
        let buttonSelector = 'button[data-hook="create"]';
    
        await page.waitForSelector('body > div > div');
    
        await page.evaluate((buttonSelector) => {
    
            var frame = document.querySelector('iframe');
    
            var frameDocument = frame.contentDocument;
    
            frameDocument.querySelector(buttonSelector).click();
    
        }, buttonSelector);
    
        browser.close();
    
    })();
    

  •  类似资料:
    • 问题内容: 问题: 无法从CSS选择器特定元素中选择。需要验证注册用户是否可以成功更改其密码。我试过了类的不同属性来调用它。当尝试前两个示例时,结果是方法中的异常错误。最后的尝试将调用第一个类实例并重置密码字段(失败)。 尝试过: 目的: 我需要选择共享同一班级的项目。如下所示,该类是共享的。 问题答案: 编辑:因为选择器需要一个,或,但是它们本身都不是。 提供要匹配的类名,并从那里指定要选择的特

    • 如何用vscode选择多行? 在Visual Studio上,您可以按左alt键并选择多行,但它不适用于vscode。

    • 我无法在我的系统上选择Selenium IDE选项: 麦克高塞拉利昂 火狐 52 硒IDE 2.9.1(我知道它很旧,但(通常)它可以工作,我无法更改它! 选择选项具有以下值: 我需要选择值为15的最后一个选项NT* 所有这些命令似乎都不能正常工作: 问题是命令select只选择NT,而不是NT* 可行的方法是: 但是,我没有这个值,所以这个选项是不可能的。我需要用标签选择它。。。 有什么想法吗?

    • 问题内容: 如果我有以下HTML: 我如何将CSS选择器与Selenium一起使用来访问项目4(或实际上我想要的任何项目)? 问题答案: 您可以使用nth-child选择器: 实时示例:https://jsfiddle.net/7ow15mv2/1/ 但是不知道它是否可以与硒一起使用。 但是根据文档它应该。 当前,css选择器定位器支持所有css1,css2和css3选择器,但css3中的名称空间

    • 问题内容: 如何更新子查询中也存在的表?我必须分两个阶段进行吗?(创建一个临时表-将选定的数据放入其中,然后更新最终表) 我正在尝试使用每个CTN的网络标签更新invoiceLine表。 最终结果将是: invoiceLine 我有以下表格: invoiceLine ctn network 1234 null 2345 null 3456 null terminal ctn network 123

    • 我的资源中有两个POST方法和一个DELETE方法。他们有相同的道路。 我用@DefaultMethod注释了一个POST,所以当有人没有发送正确的Accept头时,将选择正确的方法。但这会导致当调用DELETE时,cxf选择POST而不是正确的DELETE方法。有什么解决办法吗? 断续器版本: 3.1.17