Ruby on rails 3.2 watir:从URL获取参数[:id]

Ruby on rails 3.2 watir:从URL获取参数[:id],ruby-on-rails-3.2,integration-testing,watir,watir-webdriver,automated-tests,Ruby On Rails 3.2,Integration Testing,Watir,Watir Webdriver,Automated Tests,我正在使用watir测试我的rails3webapplication,它运行良好 我的问题是,我当前的页面url是localhot:3000/sites/535/ecosystem/new。现在: 我想从页面注销并重新登录 然后,我将进入仪表板页面,在那里我将显示站点列表 我想点击最后创建的站点名称,这样,我就可以将我重定向回我离开该研究的相同状态,即localhost:3000/sites/535/economy/new 但我的问题是我使用datatable来显示站点,它使用sitenam

我正在使用watir测试我的rails3webapplication,它运行良好

我的问题是,我当前的页面url是
localhot:3000/sites/535/ecosystem/new
。现在:

  • 我想从页面注销并重新登录
  • 然后,我将进入仪表板页面,在那里我将显示站点列表
  • 我想点击最后创建的站点名称,这样,我就可以将我重定向回我离开该研究的相同状态,即
    localhost:3000/sites/535/economy/new
但我的问题是我使用datatable来显示站点,它使用sitename对站点列表进行排序

这个问题的一个解决方案是,如果我可以从
localhost:3000/sites/535/economy/new
获取
@id=params[:id]
,那么我可以:

@browser.goto "localhost:3000/sites/#{@id}"
这是仪表板页面中“我的站点”链接的url

如何从watir或watir webdriver中的当前URL获取
参数[:id]

谢谢

我已经用ruby logic解决了这个问题,但仍在等待一些好的逻辑

解决方案

url = @browser.url
#> ["localhost:3000/sites/535/ecosystem/new"]

uri = url.split("/sites/")
#> ["localhost:3000", "535/ecosystem/new"]

uri = uri[1].split("/ecosystem/new")[0]
#> "535"
我现在可以访问当前url中的
id
535
。但仍在等待一些好的逻辑来解决这个问题

谢谢

我已经用ruby logic解决了这个问题,但仍在等待一些好的逻辑

解决方案

url = @browser.url
#> ["localhost:3000/sites/535/ecosystem/new"]

uri = url.split("/sites/")
#> ["localhost:3000", "535/ecosystem/new"]

uri = uri[1].split("/ecosystem/new")[0]
#> "535"
我现在可以访问当前url中的
id
535
。但仍在等待一些好的逻辑来解决这个问题


谢谢

不,您不能在那里使用Rails帮助程序作为
参数[:id]
,因为它对Watir没有意义

然而,有两种可能的方法来解决这个问题

第一种可能的方法是像您一样解析URL:

@browser.url.scan(%r{/(\d+)/}).flatten[0] # => "535"
另一种方法是使用Rails模型本身。假设您知道要查找的站点的名称(如果不知道,那么您是如何找到url的?),那么您可以直接从数据库中获取该名称:

Site.where(name: "my site").first.id # => "535"
您还可以通过将Rails url帮助程序包含到测试代码(未测试代码)中来使用它们:


这样,您就不必将URL硬编码到测试中。

不,您不能将Rails帮助程序作为
params[:id]
使用,因为它对Watir没有意义

然而,有两种可能的方法来解决这个问题

第一种可能的方法是像您一样解析URL:

@browser.url.scan(%r{/(\d+)/}).flatten[0] # => "535"
另一种方法是使用Rails模型本身。假设您知道要查找的站点的名称(如果不知道,那么您是如何找到url的?),那么您可以直接从数据库中获取该名称:

Site.where(name: "my site").first.id # => "535"
您还可以通过将Rails url帮助程序包含到测试代码(未测试代码)中来使用它们:

这样,您就不必将URL硬编码到测试中。

使用RegEx 不确定这对你来说是否足够“好的逻辑”,但无论如何,这是另一种更直接的方式

在URL上使用正则表达式捕获
站点/
/economy
之间的
id
值:

@browser.url.match(/(?!sites\/)([0-9]*)(?=\/生态系统)/).captures.first
#=> "535"
如果您不熟悉正则表达式,那么这看起来比实际情况更复杂。它基本上只是查找
站点/
/economy
,然后“捕获”中间任意数量的数字(介于0和9之间)

您可以在此处直观地使用RegEx模式:

使用RegEx 不确定这对你来说是否足够“好的逻辑”,但无论如何,这是另一种更直接的方式

在URL上使用正则表达式捕获
站点/
/economy
之间的
id
值:

@browser.url.match(/(?!sites\/)([0-9]*)(?=\/生态系统)/).captures.first
#=> "535"
如果您不熟悉正则表达式,那么这看起来比实际情况更复杂。它基本上只是查找
站点/
/economy
,然后“捕获”中间任意数量的数字(介于0和9之间)


您可以在这里直观地使用RegEx模式:

那么您的意思是535是站点的id?是的,您是对的。我想获取
535
并将这个id存储在某个变量中,这样我就可以使用它了。你是说535是站点的id吗?是的,你是对的。我想获取
535
并将这个id存储在某个变量中,这样我就可以使用它了。您认为什么是“良好的逻辑”?你的意思是除了解析字符串之外的其他东西吗?我的意思是,我们可以像
params[:id]
那样直接访问它吗。上述解决方案对我来说很有效。我仍然在想,是否有一种方法可以像我们在rails中使用
params[:id]
一样处理它。你认为什么是“好的逻辑”?你的意思是除了解析字符串之外的其他东西吗?我的意思是,我们可以像
params[:id]
那样直接访问它吗。上述解决方案对我来说很有效。我仍然在想,是否有一种方法可以像我们在rails中使用
params[:id]
一样处理它。