Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 黄瓜Xpath选择器_Ruby On Rails_Xpath_Cucumber - Fatal编程技术网

Ruby on rails 黄瓜Xpath选择器

Ruby on rails 黄瓜Xpath选择器,ruby-on-rails,xpath,cucumber,Ruby On Rails,Xpath,Cucumber,我在试图用cucumber测试的页面上有以下HTML <div class='try_options'> <ul> <li> <div> <img alt="" src="/images/main_page1.jpg" /> <div class='right_section'> <p> Feature 1

我在试图用cucumber测试的页面上有以下HTML

<div class='try_options'>
  <ul>
    <li>
      <div>
        <img alt="" src="/images/main_page1.jpg" />
        <div class='right_section'>

          <p>
            Feature 1
          </p>
          <a class='suggest_btn' href='url1'>Try Now</a>
        </div>
      </div>
    </li>
    <li>
      <div>
        <img alt="" src="/images/main_page2.jpg" />
        <div class='right_section'>

          <p>
            Feature 2
          </p>
          <a class='suggest_btn' href='url2'>Try Now</a>
        </div>
      </div>
    </li>
    <li>
      <div>
        <img alt="" src="/images/main_page3.jpg" />
        <div class='right_section'>

          <p>
            Feature 3
          </p>
          <a class='suggest_btn' href='url3'>Try Now</a>
        </div>
      </div>
    </li>
    <li>
      <div>
        <img alt="" src="/images/main_page4.jpg" />
        <div class='right_section'>

          <p>
            Feature 4
          </p>
          <a class='suggest_btn' href='url4'>Try Now</a>
        </div>
      </div>
    </li>
  </ul>
</div>
基本上,有一些功能,每个功能都有一个Try Now链接。我想测试一下,点击链接是否可以进入相应功能的页面


我发现了一个simalar步骤实现,但XPATH有一些问题。任何帮助都将不胜感激。

如果您的xpath基于您提供的链接,那么它可能会得到一组元素。因此,它得到的不仅仅是一个链接,而是一组链接。尝试只获取一个链接,就像集合中的第一个链接一样,并使用它。

如果您的xpath基于您提供的链接,那么它可能获得一个元素集合。因此,它得到的不仅仅是一个链接,而是一组链接。尝试只获取其中一个链接,就像集合中的第一个链接一样,并使用它。

当我以前做过类似的事情时,我使用XPath来定位“identifier”元素-在您的例子中,包含例如“Feature 1”的p标记,然后在DOM中找到一个公共父元素li,然后再次向下查找我要查找的兄弟姐妹,例如,与p关联的链接。这可能适用于您:

def find_link_for_feature(feature_name)
    find(:xpath, "//p[contains(.,'#{feature_name}')]/ancestor::li/descendant::a")
end

find_link_for_feature('Feature 1').click
您可能需要添加额外的筛选,以便根据您的情况,它只查找与suggest_btn类的链接

然而,正如我在对这个问题的评论中提到的,我更喜欢修改标记,以便它实际上是可测试的,而不必跳转到像这样的圈套!我认为这种XPath是我无法修改标记时的最后手段。

编辑:

考虑到您关于如何在父元素的范围内执行其他操作的评论,我更倾向于执行以下操作,这将为您提供更大的灵活性,并稍微简化难看的XPath:

def find_section_for_feature(feature_name)
    find(:xpath, "//p[contains(.,'#{feature_name}')]/ancestor::li")
end

within find_section_for_feature('Feature 1') do
    click_link 'Try Now'
    # Anything else you want to do
and

当我以前做过类似的事情时,我使用XPath来定位“identifier”元素——在您的例子中是包含例如“Feature 1”的p标记,然后沿着DOM走到这里的一个公共父级li,然后再次向下找到我要查找的任何兄弟,例如与p关联的链接。这可能适用于您:

def find_link_for_feature(feature_name)
    find(:xpath, "//p[contains(.,'#{feature_name}')]/ancestor::li/descendant::a")
end

find_link_for_feature('Feature 1').click
您可能需要添加额外的筛选,以便根据您的情况,它只查找与suggest_btn类的链接

然而,正如我在对这个问题的评论中提到的,我更喜欢修改标记,以便它实际上是可测试的,而不必跳转到像这样的圈套!我认为这种XPath是我无法修改标记时的最后手段。

编辑:

考虑到您关于如何在父元素的范围内执行其他操作的评论,我更倾向于执行以下操作,这将为您提供更大的灵活性,并稍微简化难看的XPath:

def find_section_for_feature(feature_name)
    find(:xpath, "//p[contains(.,'#{feature_name}')]/ancestor::li")
end

within find_section_for_feature('Feature 1') do
    click_link 'Try Now'
    # Anything else you want to do
and

可以修改HTML使其更具语义吗?e、 g.向包含特征名称的每个li添加类或ID?使用XPath当然可以做到这一点——我最近已经做了,并将为您挖掘出来——但它并不漂亮!可以修改HTML使其更具语义吗?e、 g.向包含特征名称的每个li添加类或ID?使用XPath当然可以做到这一点——我最近已经做了,并将为您挖掘出来——但它并不漂亮!谢谢成功了。不幸的是,我数了一下html,我所能做的就是编写步骤:另一个问题,假设我想在文本和链接的父级范围内做一些其他的事情,知道如何选择相关的父级吗?我想你可以通过剥离XPath的子级部分并将其传递给一个内部块来获取整个父级,类似于:xpath,//p[contains.,“{feature_name}]/祖先::li{Do things in here}很抱歉把它拖到这里,但是为了使它更通用,我可以用任何方式释放对li的绑定吗?您可以通过将xpath的末尾更改为祖先::div来定位“right_section”div[contains@class,“右部分”],但是它不包含图像,所以你无法与之交互。您还可以通过使用祖先::div在li中立即找到div[not@class]我认为,它将找到没有class属性的最近的父div。这两个我都没试过,谢谢!成功了。不幸的是,我数了一下html,我所能做的就是编写步骤:另一个问题,假设我想在文本和链接的父级范围内做一些其他的事情,知道如何选择相关的父级吗?我想你可以通过剥离XPath的子级部分并将其传递给一个内部块来获取整个父级,类似于:xpath,//p[contains.,{feature_name}]/祖先::li{Do things in here}很抱歉把它拖到这里,但是为了使它更通用,我可以通过任何方式释放对li的绑定吗?您可以通过更改 祖先的XPath::div[contains@class,但它不包含图像,因此您无法与该图像交互。您还可以通过使用祖先::div在li中立即找到div[not@class]我认为,它将找到没有class属性的最近的父div。这两个我都没试过,所以。。。