4

我对自动化测试非常陌生,目前我完全陷入了以下问题:

我打开了一个网页(第一个窗口) 在同一个测试中,我调用了一个 .newWindow(第二个窗口)并在那个窗口中做一些事情。最后一个动作打开新的弹出窗口(弹出窗口)。我需要的是将焦点设置在弹出窗口上。

根据 WebdriverIO API,我可以使用 .switchTab http://webdriver.io/api/window/switchTab.html 但是为了能够切换到弹出窗口,我必须指明句柄,但我不明白如何获取弹出窗口的句柄:(

那是我的一段代码:

//this is the part where I have already second window open
it('should open email letter', function(done) {
client
.pause(2000)
.clickAndWait('[title="Password restore"]', 4000)
.clickAndWait('[title="Restore password"]', 7000) //this is the part where popup window opens
.pause(2000)
.windowHandles(function(err,res){
 console.log(res, handles)
 }) // I have got three handles but i dont know how to use them now
 .........

java中有很多例子,但我没有找到任何适合我的语言的东西。请原谅我的愚蠢,我真的是一个非常初学者,如果有人可以向我解释,我将不胜感激。

提前非常感谢!

4

2 回答 2

3

我们不是getCurrentTabId用来记住当前打开的窗口的句柄吗?

例如:

var main, popup; //your window handles

client
  .getCurrentTabId(function (err, handle) {
     main = handle;
  })
  .newWindow('http://localhost:9001/') //you are on popup window
  .getCurrentTabId(function (err, handle) {
     popup = handle;
  })
  .switchTab(main) //you are back to main window
  .switchTab(popup) //you are on popup again
  .close(popup) //extra bonus!
于 2014-12-28T14:33:53.083 回答
1

我注意到您说“最后一个操作打开了新的弹出窗口(弹出窗口)。我需要的是将焦点设置在弹出窗口上。”

我有这个问题。但是当点击用 facebook 登录时,新窗口被打开了。这导致在查找新窗口句柄时出现问题,因为我无法使用.newWindow('http://localhost:9001/'). 使用社交登录时,API 密钥和所有类型都作为参数添加。所以一个人几乎没有控制权

为了处理这个问题,我将每个窗口 ID 注册为打开的。

我的功能中的第一个背景步骤是Given I open the url "/a.html"

windowID在该步骤中,您可以使用 let将空数组设置为变量let windowID = []

所以我的步骤文件看起来像这样

const url = 'http://localhost:8080'
let windowID = []

this.Given(/^I open the url "([^"]*)"$/, (path) => {
  browser
    .url(url + path)
    console.log(`# Navigating to ${url + path}`)
    expect(browser.getUrl()).toEqual(url + path)
    windowID.main = browser.getTabIds()
  });

在单击 Facebook 按钮后的步骤中,您可以检查所有打开的窗口 ID 并删除匹配的windowID.main

this.When(/^I authenticate with facebook$/, function (arg1) {
    // log the ID of the main window
    console.log('Main Window ID' + windowID.main)

    browser
      .pause(2000)
      .getTabIds().forEach(function (value) {
        if (value === windowID.main) {
          // we do not need to do anything with windowID.main as it's already set
          return
        }
        // if the value does not match windowID.main then we know its the new facebook login window 
        windowID.facebook = value
      })

    // log both of these
    console.log('Main Window ID: ' + windowID.main)
    console.log('Facebook Window ID: ' + windowID.facebook)

    // Do the login
    browser
      .switchTab(windowID.facebook)
      .setValue('input[name="email"]', process.env.FACEBOOK_EMAIL)
      .setValue('input[name="pass"]', process.env.FACEBOOK_PASSWORD)
      .submitForm('form')
  });

请注意,我将凭据添加为环境变量。这是一个好主意,您不想将您的个人凭据提交到代码库。一个人可能会想得很清楚,但你可能不会,谁知道呢。

几年前你的问题得到了回答,但我在尝试找到解决方案时首先发现了这篇文章,所以它似乎是一个明智的地方添加这个添加。

于 2017-02-12T11:30:11.960 回答