Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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 无法从下拉菜单项中单击元素_Ruby_Selenium_Cucumber_Bdd_Watir Webdriver - Fatal编程技术网

Ruby 无法从下拉菜单项中单击元素

Ruby 无法从下拉菜单项中单击元素,ruby,selenium,cucumber,bdd,watir-webdriver,Ruby,Selenium,Cucumber,Bdd,Watir Webdriver,我想执行以下步骤: 在输入区域中键入一些元素变量名-“username” 下拉式建议打开。[声明:username=user2] 检查下拉列表中是否存在“用户名”元素;如果是,则单击该元素并完成 <span class="main-dropdown"> <div class="tt"> <span class="all-suggestions"> <div class="suggestion"> <p&

我想执行以下步骤:

在输入区域中键入一些元素变量名-“username” 下拉式建议打开。[声明:username=user2] 检查下拉列表中是否存在“用户名”元素;如果是,则单击该元素并完成

<span class="main-dropdown">
  <div class="tt">
    <span class="all-suggestions">
      <div class="suggestion">
        <p>user1</p>
      </div>
      <div class="suggestion">
        <p>user2</p>
      </div>
      <div class="suggestion">
        <p>user3</p>
      </div>
    </span>
  </div>
</span>
我尝试过以下方法:

@browser.div:class,suggestion.p:text,username.wait\u @browser.div:class,suggestion.p:text,username.click @browser.span:class,所有建议。div:class,建议。p:text,username.wait\u @browser.span:class,所有建议。div:class,建议。p:text,username。单击 @browser.span:class,主下拉列表。div:class,建议。p:text,username.wait\u @browser.span:class,主下拉列表。div:class,建议。p:text,username。单击 问题:“user2”显示在下拉列表中,但无法从下拉列表中单击该元素


任何帮助都将不胜感激。

问题在于元素的路径指定过度。Watir单独处理每个元素方法,返回每个调用的第一个匹配项。它不考虑链式方法

例如,考虑不工作的第一个代码:

@browser.div(:class,"suggestion").p(:text,username).click
实际上他说:

在带有类建议的页面上找到第一个div。 在该div中,找到第一个带有文本username的p。 这意味着Watir只能找到user1段落

嵌套元素调用时,您只希望包含所有元素的相同祖先的元素。例如,以下任何一项都有效:

# Using the only matching div.suggestion
@browser.div(:class => 'suggestion', :text => username).p.click

# Only using the common ancestor span.all-suggestions
@browser.span(:class,"all-suggestions").p(:text,username).click
如果确实希望保留所有嵌套,则需要使用XPath:

@browser.p(:xpath => "//div[@class='suggestion']/p[text()='#{username}']").click

谢谢你,贾斯汀!。我可以通过使用唯一匹配的div.suggestion@browser.div:class=>'suggestion',:text=>username.p.click来实现这一点,但仅使用公共祖先span.all-suggestions不起作用。@browser.span:class,all-suggestions.p:text,username.click仅在页面上有一个span:class,all-suggestions时有效。这是因为瓦蒂尔只返回第一个匹配项。明白了。谢谢Justin.hey@Justin..您将如何在页面对象模型中实现上述相同的示例?我试过这样的方法:一个div定位器是:div:autoSuggestList,:xpath=>//div[contains@class,然后是autoSuggestList元素。段落元素:text=>/user1/如果我想检查文本“user1”,但这将始终检查autoSuggestList元素中的第一个元素。我们如何在class=tt建议中查找所有标记,然后从中检查是否存在某些特定文本?正确。由于需要在运行时指定值username,因此不能使用访问器方法,因为它们生成的方法不接受参数。