Вызов метода на объекте страницы не возвращает результат

У меня возникла проблема с использованием вызова метода объекта страницы для возврата объекта на странице.

Вот мой пример кода в test_log_in.rb

 ...
    class TestLogIn < Test::Unit::TestCase
    .....
      def test_failed_log_in
        @log_in_page= LogIn.new(@browser)
        @log_in_page.go_to_log_in

        @log_in_page.log_in("174773476","test","aaa111as")

        puts @log_in_page.error_message
        puts @log_in_page.get_error_message
      end

    end

Мой класс входа в систему определен ниже:

class LogIn
  include PageObject

  ...
  h3(:error_message, :class => 'no-margin white-text')

  ...

  def log_in (access_number, user_id, password)
    self.access_number = access_number
    self.user_id = user_id
    self.password = password
    log_me_in
    AccountSummary.new(@browser)
  end

 ....
 def get_error_message
    self.error_message
  end
  ....  
end

Почему следующие строки не возвращают вывод?

    puts @log_in_page.error_message
    puts @log_in_page.get_error_message

Не могли бы вы мне помочь?

Спасибо.


person nzsquall    schedule 20.10.2013    source источник
comment
Было бы полезно, если бы вы могли (1) предоставить достаточный код страницы (например, html), чтобы воспроизвести проблему, или ссылку на реальную тестируемую страницу, и (2) если бы вы могли упростить свой код до минимума, необходимого для воспроизведения проблемы ( например, метод разборки не имеет значения). Чем более прямой вопрос и легче нам его воспроизвести, тем легче дать ответ, не угадывая и не делая предположений.   -  person Justin Ko    schedule 21.10.2013
comment
Привет, Джастин, извини, я упростил пример. Пожалуйста, дайте мне знать, если это все еще не имеет смысла.   -  person nzsquall    schedule 21.10.2013
comment
Можете ли вы поделиться html сообщения об ошибке, включая стили? Учитывая, что вы не получаете текста (что, как я предполагаю, вы имеете в виду под отсутствием вывода), это, вероятно, означает, что текст элемента не виден (возможно, проблема со временем или проблема со стилем).   -  person Justin Ko    schedule 21.10.2013
comment
eric-lin.net/files/, сообщение об ошибке, которое я пытаюсь найти: На странице было 3 ошибки. Большое спасибо!   -  person nzsquall    schedule 22.10.2013


Ответы (1)


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

Когда элемент объекта страницы (или watir) возвращает свой текст, он включает только видимый текст. Поэтому, если сообщение об ошибке еще не видно, вы не получите текста.

Попробуйте подождать, чтобы убедиться, что элемент виден пользователю:

def get_error_message
  error_message_element.when_present.text
end

when_present будет ждать до 5 секунд, пока элемент станет видимым для пользователя, а затем вернет текст.

Обновление – несколько h3:

Похоже, что реальная проблема заключается в том, что существует несколько элементов h3, которые имеют этот класс. Watir всегда возвращает первое совпадение, которое в данном случае является заголовком ошибки cookie. Учитывая, что он не отображается, вы получаете пустой текст.

Решением было бы уменьшить область поиска, чтобы первый h3 был тем, который вам нужен. Это можно сделать, только просмотрев список сообщений об ошибках. Я бы определил объект страницы следующим образом. Обратите внимание, что вам не нужно указывать класс элемента h3, так как это единственный элемент h3 в списке.

class LogIn
  include PageObject

  div(:error_message_list, :id => 'errorMessageList')
  h3(:error_message){ error_message_list_element.h3_element }
end

Затем он найдет правильный элемент h3:

browser = Watir::Browser.new
browser.goto 'https://www.bnz.co.nz/ib4b/app/login'
browser.button(:text => 'Login').click

page = LogIn.new(browser)
page.error_message
#=> "There were 3 errors on the page."
person Justin Ko    schedule 21.10.2013
comment
Привет Джастин. Я изменил его, и он все равно работал с ошибкой ======================================== ===================================== Ошибка: test_failed_log_in(TestLogIn) Watir::Wait:: TimeoutError: истекло время ожидания через 5 секунд, ожидание появления {:class=›no-margin white-text, :tag_name=›h3} - person nzsquall; 23.10.2013
comment
В своем вопросе вы сказали, что не возвращает результат, а здесь вы говорите, что все еще работает с ошибкой. Не могли бы вы уточнить, видели ли вы в своем исходном вопросе ошибку или текст вообще отсутствовал? - person Justin Ko; 23.10.2013
comment
Раньше, когда метод был определен как get_error_message self.error_message end, он не возвращал никаких результатов. Когда это значение def get_error_message error_message_element.when_present.text end, оно запускается с ошибкой, потому что не может дождаться появления этого элемента error_message_element через 5 секунд, по какой-то причине он вообще не может найти этот элемент. - person nzsquall; 23.10.2013
comment
В конце метода log_in он вызывает AccountSummary.new(@browser), будет ли это причиной? Я попытался удалить эту строку, и она все еще не работает. - person nzsquall; 23.10.2013
comment
Я нашел страницу, которую, как мне кажется, вы тестируете. Проблема в том, что существует несколько совпадающих элементов h3. Я обновил ответ, чтобы решить эту проблему. - person Justin Ko; 23.10.2013