如何遍历一系列链接并检查每个链接指向的页面上的信息?

时间:2019-07-02 19:23:48

标签: ruby capybara

我有一个页面,列出了我公司的职位空缺。我想使用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 :(得分:0)

您可能要使用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

答案 1 :(得分:0)

您已经意识到这里的问题是,当您返回上一页时,这些元素是陈旧的。根据您愿意接受的限制,有多种方法可以解决此问题。您遇到的更大的问题是,您正在Cucumber中进行此操作,而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

答案 2 :(得分:0)

托马斯·沃波尔(Thomas Walpole)的回答使我足够接近,可以找出答案。最终的结果如下:

    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岁,所以这对我来说不是问题。测试完成后,当浏览器关闭时,它们全部关闭。