1

我正在使用 WebdriverIO + devtools:puppeteer + cucumber + Firefox Nightly。

使用setValue() / addValue()时,我输入的第一个字母被输入地址栏中,而不是选定的元素。mse 或 chrome 浏览器不会出现相同测试的问题。

问题:

带有指向搜索栏的红色箭头的浏览器屏幕截图

在此之后,在函数超时之前什么都不会发生

INFO devtools: COMMAND navigateTo("https://google.com/")
INFO devtools: RESULT null
INFO devtools: COMMAND findElement("css selector", "input[type=text]")
INFO devtools: RESULT { 'element-6066-11e4-a52e-4f735466cecf': 'ELEMENT-1' }
INFO devtools: COMMAND elementClear("ELEMENT-1")
INFO devtools: RESULT null
INFO devtools: COMMAND elementSendKeys("ELEMENT-1", "hello world")

代码示例: 测试:

Scenario: Try google
        When I open "google.com"
        Then I type "hello world" into "input[type=text]"

脚步:

When('I open {string}', async function (URL) {
    await browser.url(`https://${URL}`);
});

Then('I type {string} into {string}', async function (input, selector) {
    await $(selector).setValue(input);
});

尽管在使用 setValue() 之前单击元素可以解决某些 URL,但这在某些情况下不起作用(例如,当从预登录页面重定向到预输入登录的登录页面时,我无法单击 +密码字段的 setValue)。

希望任何人都知道如何解决或解决所有情况。谢谢。

[更新]

@AnthumChris

由于我使用的是内置 puppeteer,因此默认情况下未定义页面而是我尝试了:

const puppeteerBrowser = await browser.getPuppeteer()
const pages = await puppeteerBrowser.pages()
const page = await pages[0]
await (await page.waitForSelector('input[type=text]')).type('hello')

它再次适用于 chrome 和 mse,但对于 ffox nightly 却失败了。

在浏览器请求的 URL (google.com) 中打开后,我收到了下一个错误:

Error in "21: Then I type "hello world" into "input[type=text]""
TypeError [ERR_INVALID_URL]: Invalid URL: http://localhost:localhost:64619`

[更新]

我已更改browserURL: 'http://localhost:${rdPort}' browserURL: 'http://${rdPort}'...\node_modules\webdriverio\build\commands\browser\getPuppeteer.js 文件,因此我至少可以连接到 puppeteer.pages 对象,但await (await page.waitForSelector('input[type=text]')).type('hello')操作仍然存在问题:

ProtocolError: Protocol error (DOM.resolveNode): Node with given id does not belong to the document resolveNode@chrome://remote/content/cdp/domains/content/DOM.jsm:245:15
execute@chrome://remote/content/cdp/domains/DomainCache.jsm:101:25
receiveMessage@chrome://remote/content/cdp/sessions/ContentProcessSession.jsm:84:45
4

1 回答 1

0

尝试等待<input>并直接输入:

await (await page.waitForSelector('input[type=text]')).type('hello')
于 2022-01-19T08:30:43.730 回答