迭代具有相同类名的div

时间:2016-11-25 14:23:36

标签: ruby selenium-webdriver cucumber bdd page-object-gem

我有以下DOM:

<form id="slideshow">
  <div class="slideshow-item">
  <div class="slideshow-item">
  <div class="slideshow-item">
</form>

我需要迭代这个表单元素中的所有div,对每个div执行一些操作,然后在完成所有div之后出现。

我将我的定位器定义为:

divs(:slideShowRow, :xpath => "//div[@class='slideshow-item']")

并尝试迭代为:

slideShowRow_elements.each do |e|
  uploadSlideShowImage = e.text_field_element(:xpath => "//input[@type='file']")
  execute_script("$(arguments[0]).show();", uploadSlideShowImage)
  uploadSlideShowImage.send_keys("//path/to/image_file")
  textSlideShowRow = e.text_field_element(:xpath => "//input[@placeholder='Overlay Text']")
  textSlideShowRow.send_keys("row_number_x")
end

问题:

我在这里遇到的问题是,操作仅在第一个元素上执行,而不是在所有3个元素上执行。

所以循环运行了三次,因为有3个div但是动作是在同一个第一个div元素上执行而不是单个div元素。

PS:我正在使用带Ruby和selenium webdriver的Page Object。

1 个答案:

答案 0 :(得分:0)

脚本正在迭代slideShowRow_elements。问题实际上是每个slideShowRow_element中元素的位置。

对于这一行:

e.text_field_element(:xpath => "//input[@type='file']")

XPath表达式实际上是在页面上找到文件字段元素 where 。结果,第一行中的那个将始终被抓取。需要告诉XPath表达式只在当前行中找到文件字段。这是通过使用句点

启动XPath表达式来完成的
e.text_field_element(:xpath => ".//input[@type='file']")

需要对所使用的两个XPath表达式进行此更改:

slideShowRow_elements.each do |e|
  uploadSlideShowImage = e.text_field_element(:xpath => ".//input[@type='file']")
  execute_script("$(arguments[0]).show();", uploadSlideShowImage) 
  uploadSlideShowImage.send_keys("//path/to/image_file")
  textSlideShowRow = e.text_field_element(:xpath => ".//input[@placeholder='Overlay Text']")
  textSlideShowRow.send_keys("row_number_x")
end

请注意,对于uploadSlideShowImage,您还可以通过不使用XPath来避免此问题:

uploadSlideShowImage = e.file_field_element