Как получить дескриптор всплывающего окна (WebdriverIO)

Я очень новичок в автоматизированном тестировании, и в настоящее время я полностью застрял со следующей проблемой:

У меня открыта веб-страница (первое окно). В том же тесте я вызываю .newWindow (второе окно) и делаю кое-что в этом окне. Последнее действие открывает новое всплывающее окно (всплывающее окно). Что мне нужно, так это установить фокус на всплывающем окне.

Согласно API WebdriverIO я могу использовать .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 много примеров, но я не нашел ничего, что подходило бы к моему языку. Пожалуйста, извините за глупость, я действительно очень новичок и буду признателен, если кто-нибудь сможет мне это объяснить.

Заранее большое спасибо!


person Community    schedule 16.11.2014    source источник
comment
Что такое client в вашем коде?   -  person Gobliins    schedule 06.09.2017


Ответы (2)


мы не используем 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!
person Dziamid    schedule 28.12.2014

Я заметил, что вы заявили: «Последнее действие открывает новое всплывающее окно (всплывающее окно). Мне нужно установить фокус на всплывающем окне».

У меня была эта проблема. Но новое окно открылось при нажатии на логин через facebook. Это вызвало проблему с поиском дескриптора для нового окна, потому что я не мог использовать .newWindow('http://localhost:9001/'). Ключи API и все виды добавляются в качестве параметров при использовании входа в социальную сеть. Так что у одного мало контроля

Чтобы справиться с этим, я зарегистрировал каждый идентификатор окна как открытый.

Первый фоновый шаг в моей функции - 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 вы можете затем проверить все идентификаторы открытых окон и отбросить тот, который соответствует 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')
  });

обратите внимание, что я добавляю учетные данные как переменную среды. Это хорошая идея, вы не хотите вносить свои личные учетные данные в базу кода. Очевидно, можно хорошо подумать, а можно - нет, кто знает.

Вы получили ответ на свой вопрос много лет назад, но я первым нашел этот пост, когда пытался найти решение, поэтому кажется разумным местом для размещения этого дополнения.

person xam    schedule 12.02.2017