Метод элемента ожидания PageObject не работает

Я работаю над автоматизацией тестирования с помощью огурца, selenium-webdriver и драгоценного камня page-object. Когда я пытаюсь запустить простой тестовый огурец, я получаю следующую ошибку:

  Scenario: Going to billing                # features/test.feature:10
    When I click 'Платные услуги'           # features/step_definitions/test_steps.rb:13
      Unable to locate element: {"method":"link text","selector":"Платные услуги"} (Selenium::WebDriver::Error::NoSuchElementError)
      [remote server] file:///tmp/webdriver-profile20130412-21410-z4p1ez/extensions/[email protected]/components/driver_component.js:8405:in `FirefoxDriver.prototype.findElementInternal_'
      [remote server] file:///tmp/webdriver-profile20130412-21410-z4p1ez/extensions/[email protected]/components/driver_component.js:8414:in `FirefoxDriver.prototype.findElement'
      [remote server] file:///tmp/webdriver-profile20130412-21410-z4p1ez/extensions/[email protected]/components/command_processor.js:10421:in `DelayedCommand.prototype.executeInternal_/h'
      [remote server] file:///tmp/webdriver-profile20130412-21410-z4p1ez/extensions/[email protected]/components/command_processor.js:10426:in `DelayedCommand.prototype.executeInternal_'
      [remote server] file:///tmp/webdriver-profile20130412-21410-z4p1ez/extensions/[email protected]/components/command_processor.js:10366:in `DelayedCommand.prototype.execute/<'
      ./features/pages/job_main_page.rb:38:in `go_to_billing'
      ./features/step_definitions/test_steps.rb:14:in `/^I click 'Платные услуги'$/'
      features/test.feature:11:in `When I click 'Платные услуги''

Вот характеристика огурца:

Scenario: Going to billing
    When I click 'Платные услуги'
    Then I should see "Коммерческие услуги"

Определение шага, на котором падает тест:

When(/^I go to billing$/) do
    @job_myroom_billing = @job_myroom.billing_element.when_visible.go_to_billing
end

И объект страницы:

class BasePage
    include PageObject
    include RSpec::Matchers
end

class JobMyroom < BasePage 
    link :billing, link: 'Платные услуги'

    def go_to_billing
        billing
        JobMyroomBilling.new @browser
    end
end

class JobMyroomBilling < JobMyroom    
     #some code
end

Что случилось? Водитель не ждет присутствия элемента


person mef_    schedule 12.04.2013    source источник
comment
Очевидно, вы открываете новый браузер, верно?   -  person e1che    schedule 12.04.2013
comment
Он никогда не ждет появления элемента. Мы использовали следующее решение: есть элемент, который загружается последним —> добавьте дополнительное «ожидание элемента» перед запуском тестового кода. Существуют специальные методы ожидания появления элемента.   -  person User    schedule 12.04.2013
comment
e1che, да, я использую перед do, after do методы в hooks.rb: @browser = Selenium::WebDriver.for :firefox и @browser.close   -  person mef_    schedule 12.04.2013
comment
Пользователь, почему он никогда не ждет элемент?   -  person mef_    schedule 12.04.2013


Ответы (3)


Я думаю, что Шег дает здесь несколько хороших советов, хотя я бы сделал это немного по-другому:

wait_until do
  billing_element.visible?
end 

Еще одна очень похожая вещь, которую вы можете сделать, это заменить код в вашем методе следующим:

def go_to_billing
  billing_element.when_present.click
  JobMyroomBilling.new @browser
end

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

Еще я могу предложить использовать в качестве драйвера watir-webdriver вместо selenium-webdriver. watir-webdriver построен поверх selenium-webdriver, но, похоже, гораздо лучше справляется с ожиданием фактической загрузки элементов в DOM. Если ваша ссылка добавляется динамически с использованием Ajax, вам придется написать некоторый код, чтобы дождаться ее появления, прежде чем взаимодействовать с ней. Единственное, что вам нужно сделать, чтобы использовать другой драгоценный камень, это изменить код в вашем блоке Before на этот:

Before do
  @browser = Watir::Browser.new :firefox
end

Еще один указатель, который я хотел бы вам дать, заключается в том, чтобы один объект страницы не возвращал экземпляр следующего объекта страницы. Я ем свои собственные слова здесь, потому что несколько лет назад я делал это именно так, но со временем я обнаружил, что это хрупкий подход. Вместо этого я бы использовал PageObject::PageFactory для управления созданием правильных страниц, и когда у вас есть шаг, который является общим шагом, вы можете просто использовать переменную экземпляра @current_page.

Последнее, что я вам дам, это удалить утверждения из вашего объекта страницы. Я бы хотел, чтобы объект страницы просто предоставлял абстракцию и выполнял всю проверку в определениях шагов. Это гораздо более четкое разделение задач, которое со временем облегчит поддержку ваших тестов.

person Cheezy    schedule 13.04.2013
comment
Спасибо! Мне помогают методы when_present и click. PageObject::PageFactory — я просто использую эту штуку, и мои определения шагов выглядят намного чище. - person mef_; 15.04.2013

либо вы можете использовать метод сна из java с помощью try catch. или неявное ожидание веб-драйвера селена. Webdriver никогда не ждет отображения элемента... в основном вам нужна задержка.

person buddy    schedule 12.04.2013

Метод объекта страницы when_visible предназначен для ожидания завершения загрузки событий Ajax, как указано здесь https://github.com/cheezy/page-object/wiki/Ajax-Calls.

Если веб-драйвер пытается щелкнуть элемент ссылки до того, как он полностью отобразится, и не связан с Ajax, подождите, пока элемент сначала не отобразится с помощью веб-драйвера. Например:

wait.until { driver.find_element(:link_text => "Платные услуги").displayed? }
@job_myroom.go_to_billing

Вы можете (настоятельно рекомендуется) неявно сделать это со всеми элементами, вызвав следующее сразу после создания экземпляра веб-драйвера:

driver.manage.timeouts.implicit_wait = 3

Кроме того, во многих случаях я обнаружил, что поиск ссылок с помощью href работает намного лучше, чем link_text. Возможно, это может решить ваши проблемы с синхронизацией элементов.

person sheg    schedule 13.04.2013