Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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 在具有相同类名的div中迭代_Ruby_Selenium Webdriver_Cucumber_Bdd_Page Object Gem - Fatal编程技术网

Ruby 在具有相同类名的div中迭代

Ruby 在具有相同类名的div中迭代,ruby,selenium-webdriver,cucumber,bdd,page-object-gem,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> 并尝试迭代为: slideShowRow_elements.each do |e| uploadSlideShowImage = e.text_field_element

我有以下DOM:

<form id="slideshow">
  <div class="slideshow-item">
  <div class="slideshow-item">
  <div class="slideshow-item">
</form>
并尝试迭代为:

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对象。

脚本正在正确地迭代
slideShowRow\u元素。问题实际上在于元素在每个
幻灯片行\u元素中的位置

对于线路:

e.text_field_element(:xpath => "//input[@type='file']")
XPath表达式实际上表示在页面的任何位置查找文件字段元素。因此,第一行中的一个将始终被抓取。需要告知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

这是迭代元素的正确方法。这将有助于显示“//执行操作”实际上在做什么。但我在这里面临的问题是,操作仅在第一个元素上执行,而不是在所有3个元素上执行。因此,循环运行了三次,因为有3个div,但操作是在同一个第一个div元素上执行三次,而不是在单个div元素上执行。我为每个div添加了一个
id
属性“1”、“2”、“3”。当我运行
page.slideShowRow_elements.each{e | pe.attribute('id')}
时,它正确地输出了“1”、“2”、“3”。这证明了迭代确实有效。如果代码没有达到您期望的效果,我猜要么是
//perform action
做错了什么,要么是web应用程序的实现做错了什么。这就是为什么我建议分享你是如何执行动作的。在这一点上,一个重现你的问题的实际页面也会有所帮助。这可能是一个需要等待的动态问题,但如果没有其他相关代码,很难判断。你试图执行的操作是什么?我在这里有一个疑问@Justin。当我们通过.each进行迭代时,e有第一个div行元素。现在,当我指定:e.text_field_元素(:xpath=>“//input[@type='file']”)而不使用“.”时,它不应该只从第一个元素获取文件输入吗。为什么这意味着从页面上的任何位置拾取?(在这种情况下,请始终首先拾取)。循环还不够吗?我同意,这不是直观的。然而,这正是XPath的定义/解释方式。从
/
开始意味着开始查看文档根目录,其中
表示从上下文节点开始查看。具体来说,“
//para
选择文档根的所有
para
子体,从而选择与上下文节点相同文档中的所有
para
元素”。如果将该示例应用于原始代码,则表示原始代码,
e.text\u field\u元素(:xpath=>“//input[@type='file'])
,实际上是说查找与幻灯片放映行位于同一文档中的第一个文件字段元素。因为它在同一个文档中寻找一个匹配项,所以第一个匹配项始终是第一行中的匹配项。
uploadSlideShowImage = e.file_field_element