我有以下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。
答案 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