我如何遍历一系列链接并检查每个链接所指向的页面上的信息?
How can I iterate through an array of links and check information on the page to which each refers?
我有一个页面列出了我公司的职位空缺。我想使用 Capybara 测试来单击每个 link 并确定目标页面是否包含某些内容。
我有下面的步骤。该过程的下一步检查新页面上的内容。
When("I click on each job title") do
page.all('.job-box').each do |item|
within(item) do
find('a').click
end
end
end
单击第一个 link 后,浏览器将转到另一个页面。那时,我想检查那个页面上的内容,然后return到上一步检查下一步link。实际发生的是代码单击第一个 link,然后尝试单击第二个 link。由于第一个 link 将它发送到另一个页面,第二个 link 不再存在,因此它 return 是一个过时的元素错误。
显然,在继续迭代的下一步之前,我需要一种方法来处理多个页面,但我还没有找到解决该问题的任何文档。
您可能想使用 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
如您所知,这里的问题是当您 return 翻到上一页时,元素已经过时。根据您愿意接受的限制,有多种方法可以解决这个问题。您遇到的更大问题是您在 Cucumber 中执行此操作,它在其测试结构中确实不支持 scoping/looping 。如果您希望此功能仅适用于特定 browser/platform,您可以在点击时使用相应的键修饰符让浏览器为每个职位条目打开一个新选项卡,然后您的下一步可以 运行通过所有打开的选项卡检查那些
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
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 个,所以这对我来说不是问题。测试完成后浏览器关闭时它们都关闭了。
我有一个页面列出了我公司的职位空缺。我想使用 Capybara 测试来单击每个 link 并确定目标页面是否包含某些内容。
我有下面的步骤。该过程的下一步检查新页面上的内容。
When("I click on each job title") do
page.all('.job-box').each do |item|
within(item) do
find('a').click
end
end
end
单击第一个 link 后,浏览器将转到另一个页面。那时,我想检查那个页面上的内容,然后return到上一步检查下一步link。实际发生的是代码单击第一个 link,然后尝试单击第二个 link。由于第一个 link 将它发送到另一个页面,第二个 link 不再存在,因此它 return 是一个过时的元素错误。
显然,在继续迭代的下一步之前,我需要一种方法来处理多个页面,但我还没有找到解决该问题的任何文档。
您可能想使用 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
如您所知,这里的问题是当您 return 翻到上一页时,元素已经过时。根据您愿意接受的限制,有多种方法可以解决这个问题。您遇到的更大问题是您在 Cucumber 中执行此操作,它在其测试结构中确实不支持 scoping/looping 。如果您希望此功能仅适用于特定 browser/platform,您可以在点击时使用相应的键修饰符让浏览器为每个职位条目打开一个新选项卡,然后您的下一步可以 运行通过所有打开的选项卡检查那些
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
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 个,所以这对我来说不是问题。测试完成后浏览器关闭时它们都关闭了。