2016-11-25 6 views
2

У меня есть следующий DOM:перебор дивы с именем того же класса

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

мне нужно перебрать все дивы в этом элементе формы, выполнять какое-то действие на каждый 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 divs, но действие выполняется на одном и том же элементе трижды трижды вместо отдельного элемента div.

PS: Я использую объект страницы с рубиновым и селеновым webdriver.

+0

Это правильный способ повторения элементов. Это поможет показать, что на самом деле делает «// выполнить действие». –

+0

Но проблема, с которой я здесь сталкиваюсь, заключается в том, что действие выполняется только для первого элемента, а не для всех трех элементов. Итак, цикл работает трижды, так как есть 3 divs, но действие выполняется на одном и том же элементе трижды трижды вместо отдельного элемента div. – Smriti

+0

Я добавил атрибут 'id' для каждого из разделов:« 1 »,« 2 »,« 3 ». Когда я запустил 'page.slideShowRow_elements.each {| e | p e.attribute ('id')} 'он правильно выводил« 1 »,« 2 »,« 3 ». Это доказывает, что итерация работает. Если код не выполняет то, что вы ожидаете, я бы предположил, что либо «// выполнить действие» делает что-то не так, либо реализация веб-приложения что-то делает. Вот почему я предлагаю поделиться тем, как вы выполняете действие. В этой заметке также поможет реальная страница, которая воспроизводит вашу проблему. –

ответ

0

Сценарий правильно итерации через slideShowRow_elements. Проблема заключается в том, как элементы расположены в каждом slideShowRow_element.

Для линии:

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 
+0

У меня есть сомнения здесь @ Justin. когда мы итерируем через .each, e имеет первый элемент строки div. Теперь, когда я указываю: e.text_field_element (: xpath => "// input [@ type = 'file']") без символа '.', Не следует просто извлекать входной файл из первого элемента. Почему это означает, что забрать из любого места на странице? (или сначала забрать сначала в этом случае). Разве для этого недостаточно петли? – Smriti

+0

Согласен, это не интуитивно. Однако именно так определяется/интерпретируется XPath. Начиная с '//' означает начать просмотр корня документа, где, как '.', начинает искать контекстный узел. В документации [XPath есть несколько хороших примеров] (https://www.w3.org/TR/xpath/#path-abbrev) - в частности «' // para »выбирает всех« para »потомков корня документа и, следовательно, выбирает все элементы 'para' в том же документе, что и контекстный узел. –

+0

Если вы применяете этот пример к исходному коду, это означает исходный код, 'e.text_field_element (: xpath =>" // input [@ type = 'file'] ")', на самом деле говорит, что найти первое поле файла элемент, который находится в том же _document_, что и строка слайд-шоу. Поскольку он ищет один в том же _document_, первое совпадение всегда совпадает с первым в первой строке. –

Смежные вопросы