通过href选择具体的链接

通过href选择具体的链接

问题描述:

我正在为rspec编写一个集成测试,我想测试一下,点击一个链接转到正确的模型页面。更具体地说,我想在具有相同名称但不同基础URL的链接列表上进行测试。通过href选择具体的链接

从我迄今为止所了解的情况来看,您不能在click_link中使用css属性选择器,因为它只查找特定的文本或dom ID。相反,我试图使用webrat within方法,但是一旦我选择了链接,我该如何点击它?我链接的范围将工作中想通link.click,但它没有说的方法click是不确定的:

Failure/Error: link.click 
NoMethodError: 
    undefined method `click' for #<Webrat::Scope:0x0000010505ae00> 

这里是我的测试:

require 'spec_helper' 

describe "BrandLinks" do 
    before(:each) do 
    @base_title = "My App - " 

    @brand = Factory(:brand) 
    second = Factory(:brand) # <= Same name, different slug 
    third = Factory(:brand, :name => "Awesome USA Brand!!") 
    @brands = [@brand, second, third] 
    end 

    it "should show me the brand page when I click on a brand link" do 
    get '/brands' 
    within "a[href=#{brand_path(@brand)}]" do |link| 
     link.click 
    end 
    response.should be_success 
    response.should have_selector(
     "title", 
     :content => "#{@base_title}Brand - #{@brand.name}" 
    ) 
    end 
end 
+0

这里看起来很明显的答案是只需在页面中添加更多选择器,以便我可以选择链接的父节点。如果我现在要这样做,我只会在页面中添加选择器,以便通过这一个测试。我想避免这样做。 – 2011-05-24 13:39:01

+0

一位同事对我以前的评论有如下的评论:'[当]代码很容易测试时,这通常表明这个架构是连贯的和解耦的。纯粹为了可测试性,我肯定已经改变/重构了代码。例如,如果它确实使代码更加复杂,我肯定会更加谨慎,但是为html元素添加id并不会增加您的技术债务。如果它使代码更具可测性,我会说去做。如果元素足够重要,可以测试它是否存在,那么给它一个id或class可能就没有问题了。“要点 – 2011-05-24 21:14:20

+0

也就是说,我仍然想知道我所尝试的是否可能。 – 2011-05-24 21:15:02

你试过click_link_within?根据文档

Works like click_link, but only looks for the link text within a given selector

+0

这听起来像我将面临同样的问题。唯一的选择器是链接本身的href。我会试一试。 – 2011-05-24 12:45:36

+0

“Failure/Error:click_link_within”a [href ='#{brand_path(@brand)}']“失败,@ brand.name Webrat :: NotFoundError:无法找到带有文本或标题或ID的链接”Super品牌A“',因此它必须在该链接中寻找链接。 – 2011-05-24 12:49:29

+0

它应该与xpath一起工作,但显然在webrat中有一个错误。我不知道它是否已被修复,但是这里有一些信息和解决方法https://webrat.lighthouseapp.com/projects/10503-webrat/tickets/153-within-should-support-xpath – Dty 2011-05-24 15:58:17

首先,错误消息是.click方法未定义。改为尝试.click_link

您还需要链接的文字。也就是说,within定义了一个范围,click_link告诉它在该范围内点击哪个链接。

within "a[href=#{brand_path(@brand)}]" do |scope| # within a specific <a> tag 
    scope.click_link @brand # click on @brand text 
end 

click_link_within是内加click_link的快捷方式,所以这应该是与上述相同:

click_link_within "a[href=#{brand_path(@brand)}]", @brand 

我仍然在试图了解within选择是如何工作的自己(这是我如何发现了这个问题!)。下面是我到目前为止有:

的Webrat Session对象的within method需要selector的说法,它使用由选择传递给Scope.from_scope,这与@selector = selector创建一个新的会话推一个新的作用域到堆栈。到目前为止,我找不到selector的定义。这2009 blog post说选择器可以是一个CSS类型,类或ID,但它没有引用它的来源。