Julia87
(Julia87)
July 10, 2012, 12:21pm
#1
И сново о локаторах.... Как быть в ситуации,когда есть таблица с данными о пользователях. Нужно для определенного пользователя изменить данные. Для этого мне необходимо в столбце с именами найти именно нужное имя и нажать на него. Проблема в том, что локаторы для всех имен пользователей одинаковы и нету ни id ни name.Как задать чтоб нашло именно по имени?
Локатор на элемент в таблице (имя пользователя)-такой локатор имеют все элементы таблицы в столбце “Имя пользователя”
verifyElementPresent
css=tr.a2 > td
Локатор на таблицу
verifyTable
css=table.display-table.15.0
username
Локатор на элемент в столбце, который рядом (роль)
verifyElementPresent
xpath=(//td[@onclick="location.href='/we_webengine_test/Administrator /UserDetails?userName=username&userId=08d41a1c-fe50-417e- af47-82b9f55d14e6'"])[2]
То что записывается при нажатии на имя пользователя
clickAndWait
css=tr.a2 > td
Taras
(Taras)
July 10, 2012, 1:03pm
#2
парсер писать нужно, если явного локатора нету, нужно innerHtml юзать, или css - локатор, Xpath итд
Vol
(Vol)
July 10, 2012, 1:08pm
#3
Пользуюсь xPath , ниже маленький пример:
//td/a[@id='username'|text()='Vasia']
Julia87
(Julia87)
July 10, 2012, 1:15pm
#4
да я иногда тоже пользуюсь))))а здесь не могу понять как прописать, что не напишу-оно выдает ошибку что invalid((( можно на моем примере привести путь?спасибо
Vitalik
(Vitalik)
July 10, 2012, 1:41pm
#5
Стоит пользоваться Firefinder для того чтобы проверять xpaths, а также - Firebug и XPath Checker (все AddOns в Firefox)
съэкономишь тучу времени. xpath-ами вообше можно чудеса творить
скинь кусок HTML, мож придумаю тебе какое нибудь решение....
syelanin
(syelanin)
July 10, 2012, 1:44pm
#6
Юля, попробуйте искать имя во всех строках нужного столбца.
Например, пусть линки с именем находятся во 2-м столбце таблицы с id="tableID", тогда
List<WebElement> linkList = driver.findElements(By.xpath("//table[@id='tableID']/tbody/tr/td[2]/a")); // List<WebElement> linkList = driver.findElements(By.cssSelector("table#tableID tbody tr td:nth-child(2) a")); for (int i = 0; i < linkList.size(); i++) { WebElement linkElement = linkList.get(i); if ( linkElement.getText().equalsIgnoreCase("TargetName") ) { WebElement link = driver.findElement(By.xpath("//table[@id='tableID']/tbody/tr[" + (i+1) + "]/td[2]/a")); //WebElement link = driver.findElement(By.cssSelector("table#tableID tbody tr:nth-child(" + (i+1) + ") td:nth-child(2) a")); link.click(); } }
Если таблица без id, можно использовать индекс и для нее, например известно что она 3 по счету тогда xpath = //table[3]/tbody/tr/td[2]/a
Vitalik
(Vitalik)
July 10, 2012, 1:54pm
#7
ребята, вы чему тут девушку учите? начинаете с итераций, потом рекурсии и там глядишь - курить и водку пить научите. если решение этой задачи занимает больше 3-х строк - то это решение неверно. а такие за извращения как "//table[@id='tableID']/tbody/tr/td[2]/a" вообще нужно наказывать ссылкой в серверную на 2 часа (прости syelanin, ничего личного)
Julia87
(Julia87)
July 10, 2012, 1:55pm
#8
<tr onmousemove="className='a2'" onmouseout="className='a1'" class="a1"> <td onclick="location.href='/we_webengine_test/Administrator/UserDetails?userName=username&userId=08d41a1c-fe50-417e-af47-82b9f55d14e6'"> username </td> <td onclick="location.href='/we_webengine_test/Administrator/UserDetails?userName=username&userId=08d41a1c-fe50-417e-af47-82b9f55d14e6'"> Examiner </td> <td onclick="location.href='/we_webengine_test/Administrator/UserDetails?userName=username&userId=08d41a1c-fe50-417e-af47-82b9f55d14e6'"> Inactive </td> <td onclick="location.href='/we_webengine_test/Administrator/UserDetails?userName=username&userId=08d41a1c-fe50-417e-af47-82b9f55d14e6'"> </td> <td onclick="location.href='/we_webengine_test/Administrator/UserDetails?userName=username&userId=08d41a1c-fe50-417e-af47-82b9f55d14e6'"> aaa </td> <td onclick="location.href='/we_webengine_test/Administrator/UserDetails?userName=username&userId=08d41a1c-fe50-417e-af47-82b9f55d14e6'"> email@email </td> <td onclick="location.href='/we_webengine_test/Administrator/UserDetails?userName=username&userId=08d41a1c-fe50-417e-af47-82b9f55d14e6'"> </td> <td onclick="location.href='/we_webengine_test/Administrator/UserDetails?userName=username&userId=08d41a1c-fe50-417e-af47-82b9f55d14e6'"> 7/9/2012 1:29:18 PM </td> <td> <input type="button" title="Delete account" value="Delete user" onclick="return confirm('Are you sure you want to delete user?')? submitForm('08d41a1c-fe50-417e-af47-82b9f55d14e6') : false;"> </td> </tr>
Julia87
(Julia87)
July 10, 2012, 1:56pm
#9
спасибо всем за желание помочь)
Vitalik
(Vitalik)
July 10, 2012, 2:02pm
#10
как на счет такой фишки:
...
driver.findElement(By.xpath("//td[text()='username']")).click()
если click() будет глючить, поробуй вместо него SendKeys(Keys.ENTER)....
Julia87
(Julia87)
July 10, 2012, 2:14pm
#11
самая большая проблема в том что я только начала работу в Selenium IDE, и до уровня selenium driver еще не доросла(((
syelanin
(syelanin)
July 10, 2012, 2:16pm
#12
сорри, не понял что просто Selenium.
да, тогда просто
click //td['username']
Taras
(Taras)
July 10, 2012, 2:39pm
#14
да не нужно таких сложніх хпасов, потом фиг разберешся, или одна строка в таблице дополнительная и все к черту))
попробуйте универсальней методы, или попроще Xpath
syelanin
(syelanin)
July 10, 2012, 2:43pm
#15
Почему извращения? ) Я общее решение написал. Пусть не 3 строчки, зато конкретное )
Виталик, согласись что не все можно написать в 3 строчки )
Julia87
(Julia87)
July 11, 2012, 5:37am
#16
Taras, какой Xpath попроще или что за универсальные методы?)
Vitalii
(Vitalii)
July 11, 2012, 6:13am
#17
А почему не кликнуть по тексту с именем того самого пользователя?
К примеру найти в таблице уникальный идентификатор юзера - почту, и кликнуть по второй ячейке в строке
//tr[td[contains(text(), '${mail}')]]/td[2]
polusok
(Mykhailo Poliarush)
July 11, 2012, 6:25am
#18
Юля вам сначала надо посмотреть видео
Julia87
(Julia87)
July 11, 2012, 6:59am
#19
пока разработчики все сломали-поэтому возможности проверить предложенные варианты нет) обязательно посмотрю видео,спасибо всем за помощь)
Taras
(Taras)
July 11, 2012, 7:49am
#20
"//table[@id='tableID']/tbody/tr/td[2]/a"
такое не используйте ни в коем случае ))