javascript - 如何使用 wdio 处理弹出窗口?

标签 javascript selenium webdriver webdriver-io

我正在尝试通过 webdriverio 处理 facebook 身份验证对话框弹出窗口。问题是我似乎无法针对 facebook 注册的电子邮件/密码字段。

这是我的代码:

it('redirects after signup', () => {
    browser.url('/');

    const mainTab = browser.getCurrentTabId();
    browser.waitForExist('[data-test="facebook-login-button"]');
    browser.click('[data-test="facebook-login-button"]');

    // fb login form
    browser.waitForExist('#email');
    browser.setValue('#email', this.fbAccount.email);
    browser.setValue('#pass', this.fbAccount.password);
    browser.click('input[type="submit"]');

    // fb login authorization
    browser.waitForExist('button[type="submit"]');
    browser.click('button[type="submit"]');

    browser.switchTab(mainTab);
    browser.waitForExist('[data-test="intro-title"]');
});

我还尝试通过执行以下操作等到选项卡打开

browser.waitUntil(() => browser.getUrl().indexOf('facebook.com') > -1);

另一个尝试是更明确地将标签切换到 facebook 标签

browser.switchTab(   
 browser.windowHandles().value[browser.windowHandles().value.length]
);

所有这些变体只会导致 browser.waitForExist('#email'); 失败(即超时并且在 30 秒后找不到电子邮件输入)。话虽这么说,弹出窗口确实打开了,而且确实是聚焦的。即使我手动尝试聚焦 wdio、webdriver 或 selenium 也找不到有问题的元素。

这种事情应该如何运作?我究竟做错了什么?是否有使此类测试成功的建议?

最佳答案

要完成这项工作,您实际上需要找到正确的窗口句柄。您不能保证第一个或最后一个就是您需要的那个。不过,您至少可以希望包含窗口句柄的数量。

我在fb登录表单填写代码前添加了如下代码:

// wait for popup
browser.waitUntil(() => browser.windowHandles().value.length > 1);
const popupWindow = browser.windowHandles().value.filter((handle) => handle !== mainTab)[0];
browser.switchTab(popupWindow);

这使我能够保证在继续之前处理正确的 windowHandle 焦点。我尝试总是选择第一个或最后一个窗口句柄,但这对我来说从来没有成功过。

注意:在 WDIO 5 中,您需要使用 getWindowHandle

关于javascript - 如何使用 wdio 处理弹出窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48999640/

相关文章:

javascript - 包含外部 html 表数据

java - 识别复选框组中的第 n 个复选框

java - Web 驱动程序单击 ShadowDOM 中的元素返回错误 "{"消息“:"unknown error: Cannot read property ' defaultView' of undefined”

angularjs - Protractor (WebDriverJS)无法切换到窗口。 nameOrHandle 未定义

java - 丢弃循环中的一些类值 - 避免使用第二个元素

javascript - 使用 match 将正则表达式解析为局部变量

javascript - AngularJS + Fullcalendar 发送错误TypeError : Cannot read property '__id' of undefined

java - 单击提交按钮时,用户不会导航到 Selenium Webdriver 中的下一页

c# - 等待 selenium 中的特定 URL

javascript - 将日期时间转换为正确的日期时间格式 dd-MMM-yyyy HH :MM in dojo