Как я могу перебрать массив ссылок и проверить информацию на странице, на которую ссылается каждая из них? - PullRequest
0 голосов
/ 02 июля 2019

У меня есть страница со списком вакансий в моей компании. Я хочу использовать тесты Capybara, чтобы нажимать на каждую из ссылок и определять, содержит ли целевая страница определенный контент.

У меня есть шаг ниже. Следующий шаг в процессе проверяет содержимое на новой странице.

When("I click on each job title") do
  page.all('.job-box').each do |item|
    within(item) do
        find('a').click
    end
  end
end

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

Очевидно, мне нужен способ работы с несколькими страницами, прежде чем перейти к следующему этапу итерации, но я не нашел документации, которая решает эту проблему.

Ответы [ 3 ]

0 голосов
/ 02 июля 2019

Как вы уже поняли, проблема в том, что элементы устарели, когда вы вернетесь на предыдущую страницу. В зависимости от того, какие ограничения вы готовы принять, есть несколько способов справиться с этим. Большая проблема, с которой вы столкнулись, заключается в том, что вы делаете это в Cucumber, который на самом деле не имеет поддержки определения объема / циклов в своей тестовой структуре. Если вы хотите, чтобы это работало только в определенном браузере / платформе, вы можете использовать соответствующие ключевые модификаторы по щелчку, чтобы браузер открывал новую вкладку для каждой записи вакансии, а затем ваш следующий шаг мог бы пройти через проверку всех открытых вкладок. те

When("I click on each job title") do
  page.all('.job-box').each do |item|
    item.find('a').click(:alt, :cmd) # alt,cmd click in Chrome MacOS opens in new tab
  end
end

Но на самом деле вам будет лучше делать что-то вроде

When("I click on each job title and verify info") do
  page.all('.job-box').each do |item|
    window = page.window_opened_by do
      item.find('a').click(:alt, :cmd)
    end
    page.within_window(window) do
      # verify whatever needs to be verified
    end
    window.close
  end
end
0 голосов
/ 03 июля 2019

Ответ Томаса Уолпола подобрал меня достаточно близко, чтобы понять это.Вот что получилось:

    When("I click on each job title and verify info") do
      page.all('.job-box').each do |item|
        new_window = window_opened_by do
          url = item.find('a')[:href]
          within_window open_new_window do
            visit url
          end
        end
        page.within_window(new_window) do
            # do stuff
        end
      end
    end

Он не закрывает каждую новую вкладку после проверки, что может быть проблемой, если вы работаете с большим количеством ссылок.У меня только около 15, так что это не проблема для меня.Все они закрываются, когда браузер закрывается после завершения теста.

0 голосов
/ 02 июля 2019

Возможно, вы захотите использовать page.go_back (или page.driver.go_back в зависимости от используемого драйвера).Как то так:

When("I click on each job title") do
  page.all('.job-box').each do |item|
    within(item) do
        find('a').click
        # do stuff
    end
    # roll back (granting you went but one click away)
    page.go_back
  end
end
...