【发布时间】:2016-11-25 14:23:35
【问题描述】:
我有以下 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 的页面对象。
【问题讨论】:
-
这是遍历元素的正确方法。这将有助于显示“//执行操作”实际上在做什么。
-
但我在这里面临的问题是该操作仅对第一个元素执行,而不是对所有 3 个元素执行。因此循环运行三次,因为有 3 个 div,但该操作是在同一个第一个 div 元素上执行三次而不是单个 div 元素。
-
我为每个 div 添加了一个
id属性,分别是“1”、“2”、“3”。当我运行page.slideShowRow_elements.each { |e| p e.attribute('id') }时,它正确输出了“1”、“2”、“3”。这证明迭代确实有效。如果代码没有按照您的预期执行,我猜想//perform action做错了什么,或者 Web 应用程序的实现正在做某事。这就是为什么我建议分享您如何执行该操作。在这一点上,重现您的问题的实际页面也会有所帮助。 -
这可能是一个动态问题,需要等待,但如果没有其余相关代码,则很难判断。
-
您要执行的操作是什么?
标签: ruby selenium-webdriver cucumber bdd page-object-gem