【问题标题】:Selecting elements with same class name on the page在页面上选择具有相同类名的元素
【发布时间】:2014-05-20 00:06:17
【问题描述】:

我正在尝试在整个页面中查找分配给它们的相同类的元素。 我尝试使用

browser.find_element(css:first-child,".formProperty.fpMandatory.fpUpdateable .off .collapsedView.Uncompleted .fpColValue .textFieldValueSelector.valueSelector  .integer").send_keys"1000"

但是,它无法说明语法错误 SyntaxError: (irb):87: syntax error, unexpected ')', expecting =>

页面上有 6 个元素分配了相同的类,我需要选择这些元素并将值发送给它们。

<div class="body">
<div class="content">
<div class="view">
<div class="formPropertyBoxDefs">
<div id="tile379" class="formProperty fpCompleted fpMandatory " ktype="formProperty">
<div id="tile381" class="formProperty fpMandatory fpUpdateable " ktype="formProperty">
<div id="tile381_selector" class="on" fbtype="selector">
<div id="collapsedtile381" class="collapsedView Uncompleted" style="display:block; cursor:default;">
<div id="tile381_collapsed_statusFlyer" class="fpColStatus">
<div class="fpColTitle">
<div class="fpColValue">
<!-- CssName applied only on expanded mode -->
<div id="tile382" class="textFieldValueSelector valueSelector">
<div onmousedown="valueSelectorOnEnter('tile381', $('tile382_input'), 'focus')">
<input id="tile382_input" class="integer" type="text" onchange="setValueSelectorDirty('cpe111');" selector="selector" value=""/>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="tile383" class="formProperty fpMandatory fpUpdateable " ktype="formProperty">
<div id="tile385" class="formProperty fpCompleted fpMandatory " ktype="formProperty">

这是我试图通过类选择器选择的上述元素。 因此,我在 IRB 中运行它,不需要等待,它不在 iframe 中,正如我们在上面的代码块中看到的那样。

我们将不胜感激。

谢谢!

阿布舍克尔

【问题讨论】:

  • 从 HTML 中并不完全清楚。每个div 是自包含的,还是每个后续div 包含在另一个中?即这是&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;...&lt;div&gt;&lt;/div&gt; 还是&lt;div&gt;&lt;div&gt;&lt;div&gt;...&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;

标签: ruby selenium scripting automation webdriver


【解决方案1】:

:first-child 应该是选择器的一部分:

browser.find_element(:css,".formProperty.fpMandatory.fpUpdateable .off .collapsedView.Uncompleted .fpColValue .textFieldValueSelector.valueSelector  .integer:first-child").send_keys"1000"

要选择每个元素,您可以使用:nth-child(n),其中n 是您要与之交互的项目的计数:

browser.find_element(:css,".formProperty.fpMandatory.fpUpdateable .off .collapsedView.Uncompleted .fpColValue .textFieldValueSelector.valueSelector  .integer:nth-child(1)").send_keys"1000"
browser.find_element(:css,".formProperty.fpMandatory.fpUpdateable .off .collapsedView.Uncompleted .fpColValue .textFieldValueSelector.valueSelector  .integer:nth-child(2)").send_keys"200"

注意::nth-child(n) 不适用于 IE 7 或 IE 8。

希望最后一次编辑:

我认为您需要在这种情况下使用 find_elements()

elements = browser.find_elements(:css,".formProperty.fpMandatory.fpUpdateable .off .collapsedView.Uncompleted .fpColValue .textFieldValueSelector.valueSelector  .integer")

elements[0].send_keys"1000"
elements[1].send_keys"200"

编辑解释:nth-child(n)在这种情况下的失败:

因此,您编辑的原始 HTML 如下所示:

<div id="tile381" class="formProperty fpMandatory fpUpdateable " ktype="formProperty"></div>
<div id="tile383" class="formProperty fpMandatory fpUpdateable " ktype="formProperty"></div>
<div id="tile385" class="formProperty fpCompleted fpMandatory " ktype="formProperty"></div>
<div id="tile387" class="formProperty fpMandatory fpUpdateable " ktype="formProperty"></div>
<div id="tile389" class="formProperty fpMandatory " ktype="formProperty"></div>
<div id="tile391" class="formProperty fpCompleted fpMandatory " ktype="formProperty"></div>
<div id="tile393" class="formProperty fpCompleted fpMandatory " ktype="formProperty"></div>
<div id="tile395" class="formProperty fpMandatory fpUpdateable " ktype="formProperty"></div>
<div id="tile397" class="formProperty fpMandatory " ktype="formProperty"></div>
<div id="tile399" class="formProperty fpMandatory " ktype="formProperty"></div>

当我测试:nth-child(2) 时,它在这个特定的 HTML 上工作。当我尝试nth-child(3) 时,它不起作用。

如果您的 HTML 看起来像这样:

<div id="tile381" class="formProperty fpMandatory fpUpdateable " ktype="formProperty"></div>
<div id="tile383" class="formProperty fpMandatory fpUpdateable " ktype="formProperty"></div>
<div id="tile387" class="formProperty fpMandatory fpUpdateable " ktype="formProperty"></div>
<div id="tile395" class="formProperty fpMandatory fpUpdateable " ktype="formProperty"></div>

那么:nth-child(n) 将适用于它应该匹配的所有四种情况。

鉴于您的 HTML 结构,find_elements 是正确的方法。

【讨论】:

  • 我们应该为第二个、第三个、第四个等元素指定什么命令.. 我刚试过browser.find_element(:css,".formProperty.fpMandatory.fpUpdateable .off .collapsedView.Uncompleted .fpColValue .textFieldValueSelector.valueSelector .integer:second-child").send_keys"200" 但它会抛出 ctor .integer:second-child 的语法错误 .integer:second-child is invalid or not产生一个 WebElement。发生以下错误:InvalidSelectorError:指定了无效或非法的选择器
  • 我尝试了第二种方法,它对第一个元素 (1) 工作得非常好,但无法检测到第二个元素。我再次确定元素是否被相同的类包围,是的。有什么问题?
  • @user007 不看 HTML 很难说。猜测可能是以下情况之一:第二个元素不可见,它在框架或 iframe 内,第二个元素在 Selenium 开始与页面交互后显示,需要等待。
  • 我已经编辑了我的问题以包含相同类中存在的元素块。它不在 iframe 中并且正在手动运行,因此不需要等待。
  • @user007 再编辑一次,希望这能解决您的其他问题。
猜你喜欢
  • 2015-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多