Как инвертировать выделение в Selenium IDE? - PullRequest
1 голос
/ 12 марта 2012

Чтобы проверить, что веб-форма сохраняет выбранные элементы при сбое отправки, я бы хотел инвертировать выделение элемента с множественным выбором (не зная заранее, что это был за выбор), сохранить это выделение, clickAndWait the submit и assert, что выбор остается неизменным. select не поддерживает значение типа xpath=//option[(not(@selected))], так есть ли какой-нибудь простой способ сделать это? Моей первой идеей было бы сделать что-то вроде этого:

addSelection | element | *
removeSelection | element | @selected
storeSelected | element | selectedElements

К сожалению, все команды *select* работают только с одним элементом и не поддерживают XPath, так что это не так просто.

Ответы [ 2 ]

1 голос
/ 15 марта 2012

Не знаю, имел ли ты в виду именно это, но:

в веб-форме, размещенной на сайте: http://www.poradnik -webmastera.com / kursy / html / formularze.php

у меня этот код работал:

addSelection | xpath=(//select[@name='jezyk'])[4] | label=Polski
addSelection | xpath=(//select[@name='jezyk'])[4] | label=Niemiecki
storeSelectedLabels | xpath=(//select[@name='jezyk'])[4] | selected
//clicking SUBMIT button
verifySelectedLabels | xpath=(//select[@name='jezyk'])[4] | ${selected}

Если предположить, что все addSelections являются случайными, storeSelectedLabels сохранит все выбранные элементы, затем выполнит мнимое действие, нажав кнопку подтверждения, а затем подтвердит (или подтвердит) выборку.

0 голосов
/ 16 марта 2012

Нет, это не так. Я не понял твою точку зрения, извини.

В любом случае, если я захочу инвертировать выделение элемента с множественным выбором, я сделаю это следующим образом (в отношении этого выпадающего списка из 3 элементов на странице, которую я предоставил ранее):

storeSelectedIndexes | xpath=(//select[@name='jezyk'])[4] | selected
removeAllSelections | xpath=(//select[@name='jezyk'])[4]
store | ${selected} | selected2
store | javascript{storedVars['selected2'].split(',').length} | selectedNo
store | 999 | selectedIndexNo0
store | 999 | selectedIndexNo1
store | 999 | selectedIndexNo2
store | -1 | loop1
while | ${loop1} < (${selectedNo} - 1)
store | javascript{storedVars.loop1++}
store | javascript{storedVars['selected2'].split(',')[storedVars['loop1']]} | selectedIndexNo${loop1}
endWhile | 
store | -1 | loop2
while | ${loop2} < 2
store | javascript{storedVars.loop2++}
gotoIf | ${loop2} == ${selectedIndexNo0} || ${loop2} == ${selectedIndexNo1} || ${loop2} == ${selectedIndexNo2} | dontSelect
addSelection | xpath=(//select[@name='jezyk'])[4] | index=${loop2}
label | dontSelect
endWhile | 

Полагаю, это не самый простой способ, но работает.

Подходит для трех элементов с несколькими вариантами выбора.

Первый цикл (while - endWhile) извлекает выбранные индексы, а второй цикл выбирает все элементы, кроме выбранных ранее.


Хорошо, я сделал несколько изменений, и эту версию скрипта можно использовать с элементами любого размера (если первая метка имеет индекс = 0). Все, что вам нужно сделать, это ввести id или xpath для проверенной мультиформы в первую команду и указать количество всех меток в элементе либо через storeXpathCount, либо просто указав их количество. И добавьте больше / меньше условий к команде "gotoIf" в зависимости от размера мультиформ.

2-я версия скрипта:

//store | put here id or xpath of your dropdown | elementID
store | xpath=(//select[@name='jezyk'])[4] | elementID
storeSelectedIndexes | ${elementID} | selected
removeAllSelections | ${elementID}
store | ${selected} | selected2
store | javascript{storedVars['selected2'].split(',').length} | selectedNo
//use custom xpath or explicitly type number of labels using simple "store" command instead of "storeXpathCount"
storeXpathCount | //div[@id='content']/div/div[2]/div[31]/div/select/option | elementSize
store | -1 | loop0
while | ${loop0} < ${elementSize}
store | javascript{storedVars.loop0++}
store | 999 | selectedIndexNo${loop0}
endWhile | 
store | -1 | loop1
while | ${loop1} < (${selectedNo} - 1)
store | javascript{storedVars.loop1++}
store | javascript{storedVars['selected2'].split(',')[storedVars['loop1']]} | selectedIndexNo${loop1}
endWhile | 
store | -1 | loop2
while | ${loop2} < (${elementSize} - 1)
store | javascript{storedVars.loop2++}
//depending on size of your multiform element you have to add more conditions to below "gotoIf" command. At the moment it's good for three elements (labels)
gotoIf | ${loop2} == ${selectedIndexNo0} || ${loop2} == ${selectedIndexNo1} || ${loop2} == ${selectedIndexNo2} | dontSelect
addSelection | ${elementID} | index=${loop2}
label | dontSelect
endWhile | 
...