我有一个页面,列出了我公司的职位空缺。我想使用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
单击第一个链接后,浏览器将转到另一个页面。那时,我想检查该页面上的内容,然后返回上一步检查下一个链接。实际发生的是代码单击第一个链接,然后尝试单击第二个链接。由于第一个链接将其发送到另一个页面,因此第二个链接不再存在,因此它返回陈旧的元素错误。
很显然,在继续进行下一步之前,我需要一种处理多个页面的方法,但是我还没有找到解决该问题的任何文档。
答案 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岁,所以这对我来说不是问题。测试完成后,当浏览器关闭时,它们全部关闭。