Перейти к содержимому

Фотография

Как найти элемент в таблице

webdriver xpath

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 20

#1 marinel

marinel

    Новый участник

  • Members
  • Pip
  • 51 сообщений


Отправлено 29 сентября 2015 - 11:01

Добрый день, 

подскажите, пожалуйста.

Есть таблица, в которую добавляются страны после создания для них документа в системе.

в какой номер ячейки добавится заранее не известно, однако нужно проверить, что страна существует и в соседней ячейке находится название созданного документа.

 

<table>

<tr><td>Country</td><td>dokument</td></tr>

<tr><td>....</td><td>....</td></tr>

<tr><td>....</td><td>....</td></tr>

.......

<tr><td>Russia</td><td>Dokument R</td></tr>

.......

<tr><td>....</td><td>....</td></tr>

<tr><td>....</td><td>....</td></tr>

 

Заранее спасибо

 

 

 

Добавлю еще то, что документ имеет разные состояния (создан, отклонен, подтвержден) это состояние отображено в названии класса для ячейки таблицы.

Еще надо проверить и состояние документа


  • 0

#2 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 29 сентября 2015 - 11:09

xpath

//table//td[contains(text(),'Название страны')]//..//td[contains(text(),'Документ')]

  • 1

#3 Tishka

Tishka

    Постоянный участник

  • Members
  • PipPipPip
  • 211 сообщений
  • ФИО:Ахрамеев Антон

Отправлено 29 сентября 2015 - 11:12

xpath для страны 

//table//*[contains(text(), 'Russia')]

Это если не будет дублирования названия страны

Или так, с помощью объединения можно узнать справа стоящий документ

//table//*[contains(text(), 'Russia')] | //table//*[contains(text(), 'Dokument R')]

  • 0

#4 vkazar

vkazar

    Активный участник

  • Members
  • PipPip
  • 128 сообщений
  • ФИО:Виктор
  • Город:Москва

Отправлено 29 сентября 2015 - 12:14

xpath

//table//td[contains(text(),'Название страны')]//..//td[contains(text(),'Документ')]

 
 //table в таком случае избыточно, т.к. //td будет снова с начала документа искать ;)

xpath для страны 

//table//*[contains(text(), 'Russia')]
Это если не будет дублирования названия страны
Или так, с помощью объединения можно узнать справа стоящий документ
//table//*[contains(text(), 'Russia')] | //table//*[contains(text(), 'Dokument R')]

//table вообще тут вредно, т.к. //*[contains(text(), 'Russia')] найдёт ВСЕ элементы, текст которых содержит Russia.
 
хотя обе ремарки неактуальны, если страница простая, но в целом xPath построен некорректно, вы уж извините...
у <table> есть уникальный идентификатор?
 
xPath, предложенный Олегом после небольшой доработки:
1. //table/tr/td[contains(text(),'Название страны')]/../td[contains(text(),'Документ')]
2. //table/descendant::*/td[contains(text(),'Название страны')]/../td[contains(text(),'Документ')]
Выбирайте любой понравившийся :)
Но мне второй вариант больше нравится. Если, например, в table потом добавят ещё и tbody - не надо будет переделывать xPath
Вообще, нашёл классный ресурс по xPath: http://zvon.org/xxl/...ial/Output_rus/
  • 1

Тестировщик должен быть умнее программиста... ну, по крайней мере, хитрее. ©


#5 vmaximv

vmaximv

    Опытный участник

  • Members
  • PipPipPipPip
  • 350 сообщений

Отправлено 29 сентября 2015 - 13:00

xpath

//table//td[contains(text(),'Название страны')]//..//td[contains(text(),'Документ')]

 //table в таком случае избыточно, т.к. //td будет снова с начала документа искать ;)

Садитесь - два.
  • 0

#6 vkazar

vkazar

    Активный участник

  • Members
  • PipPip
  • 128 сообщений
  • ФИО:Виктор
  • Город:Москва

Отправлено 29 сентября 2015 - 13:14

Садитесь - два.

А теперь с аргументами, пояснениями и обоснованиями :)
  • 0

Тестировщик должен быть умнее программиста... ну, по крайней мере, хитрее. ©


#7 vmaximv

vmaximv

    Опытный участник

  • Members
  • PipPipPipPip
  • 350 сообщений

Отправлено 29 сентября 2015 - 13:18

http://www.w3.org/TR...th/#path-abbrev


div//para is short for div/descendant-or-self::node()/child::para and so will select all para descendants of div children.

Теперь упростите ваш второй вариант с учетом этого.


  • 0

#8 vkazar

vkazar

    Активный участник

  • Members
  • PipPip
  • 128 сообщений
  • ФИО:Виктор
  • Город:Москва

Отправлено 29 сентября 2015 - 13:20

http://www.w3.org/TR...th/#path-abbrev

div//para is short for div/descendant-or-self::node()/child::para and so will select all para descendants of div children.

Теперь упростите ваш второй вариант с учетом этого.

Однако) у меня такое не прокатило. Пошёл курить свои xPath'ы)
  • 0

Тестировщик должен быть умнее программиста... ну, по крайней мере, хитрее. ©


#9 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 29 сентября 2015 - 13:21

 

Садитесь - два.

А теперь с аргументами, пояснениями и обоснованиями :)

 

 

Ну td будет не сначала докумета искать, а вложенные в table.


  • 0

#10 vkazar

vkazar

    Активный участник

  • Members
  • PipPip
  • 128 сообщений
  • ФИО:Виктор
  • Город:Москва

Отправлено 29 сентября 2015 - 13:23

Садитесь - два.

А теперь с аргументами, пояснениями и обоснованиями :)

 
Ну td будет не сначала докумета искать, а вложенные в table.

Каюсь, был неправ, у меня другая ситуация)
в голове каша :(
  • 0

Тестировщик должен быть умнее программиста... ну, по крайней мере, хитрее. ©


#11 marinel

marinel

    Новый участник

  • Members
  • Pip
  • 51 сообщений


Отправлено 29 сентября 2015 - 14:36

Может ли проверка в итоге выглядеть 

 

assertTrue("//table//*[contains(text(), 'Russia')] | //table//*[contains(text(), 'Training')]");   ?


  • 0

#12 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 29 сентября 2015 - 14:41

Может ли проверка в итоге выглядеть 

 

assertTrue("//table//*[contains(text(), 'Russia')] | //table//*[contains(text(), 'Training')]");   ?

нет.

Ты можешь просто проверить селениумом что элемент с таким xpath существует и отображается

driver.find_element_by_xpath("//table//td[contains(text(),'Название страны')]//..//td[contains(text(),'Документ')]").is_displayed()

  • 0

#13 elvis

elvis

    Постоянный участник

  • Members
  • PipPipPip
  • 189 сообщений
  • Город:Tallinn


Отправлено 30 сентября 2015 - 08:15

http://www.w3.org/TR...th/#path-abbrev


div//para is short for div/descendant-or-self::node()/child::para and so will select all para descendants of div children.

Теперь упростите ваш второй вариант с учетом этого.

Как ни странно у меня так не работает. // ищет почему-то по всем таблицам на странице - заменил везде где можно на descendant - работает как надо.


  • 0

#14 mazik7

mazik7

    Новый участник

  • Members
  • Pip
  • 63 сообщений
  • ФИО:Мазик
  • Город:Красноярск

Отправлено 30 сентября 2015 - 08:45

Привет.
Я подумал что первую задачку можно решить так(C#):


//Метод для определения существования элемента
public static bool IsElementPresent(IWebDriver driver, By by)
        {
            WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
            try
            {
                wait.Until(ExpectedConditions.ElementExists(by));
                wait.IgnoreExceptionTypes(typeof(NoSuchElementException));
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }
//-------------------------Тестируемый кусок-------------------------
string expCountryName = "Russia";
string expDocName = "Doc";
//Проверка существования строки с именем expCountryName
By countryTr = By.XPath(string.Format("//tr[td[contains(text, '{0}')]]", expCountryName));
By docTd = By.XPath(string.Format("//tr[td[contains(text, '{0}')]]/td[2][contains(text(), {1})]", expCountryName, expDocName));
//Если элемент существует, проверить существование документа
if(IsElementPresent(driver, countryTr))
    {
    if(IsElementPresent(driver, docTd))
        throw new Exception("DocName "+ expDocName +" tr does not exist");
    }
else
    throw new Exception("CountryName "+ expCountryName +" tr does not exist");

Вторую задачку я не понял так что не взялся за нее (С состояниями).


  • 0

:smile:


#15 vmaximv

vmaximv

    Опытный участник

  • Members
  • PipPipPipPip
  • 350 сообщений

Отправлено 30 сентября 2015 - 08:53

Как ни странно у меня так не работает. // ищет почему-то по всем таблицам на странице - заменил везде где можно на descendant - работает как надо.

Давайте пруф.
  • 0

#16 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 30 сентября 2015 - 12:57

Я бы попробовала "//table//td[contains(text(), 'Russia')]/following-sibling::td[contains(text(),'Документ')]".


  • 0

#17 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 01 октября 2015 - 06:38

Локаторы, в которых используется текст -- достаточно неприятная в употреблении штука. Надо бороться с лишними пробелами, кавычками, скобками, которые могут встретиться в этом тексте.

 

Но можно получать элементы при помощи более простых локаторов и проверять их текст.

Кроме того, это гораздо нагляднее:

public boolean isCountryPresentAndHasDocument(String country, String document) {
  List<WebElement> rows = driver.findElements(By.cssSelector("table tr"));
  for (WebElement row : rows) {
    List<WebElement> cells = row.findElements(By.tagName("td"));
    if (cells.get(0).getText().equals(country)) {
       // country found, check the document
       return cells.get(1).getText().equals(document);
    }
  }
  return false; // country not found
}

и далее

assertTrue(isCountryPresentAndHasDocument("Russia", "Dokument R"));

Ну и конечно можно там не только название документа, но и его состояние проверять.


  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#18 vmaximv

vmaximv

    Опытный участник

  • Members
  • PipPipPipPip
  • 350 сообщений

Отправлено 01 октября 2015 - 08:53

Но можно получать элементы при помощи более простых локаторов и проверять их текст.
Кроме того, это гораздо нагляднее:

и гораздо медленнее...
  • 0

#19 elvis

elvis

    Постоянный участник

  • Members
  • PipPipPip
  • 189 сообщений
  • Город:Tallinn


Отправлено 01 октября 2015 - 10:00

 

Как ни странно у меня так не работает. // ищет почему-то по всем таблицам на странице - заменил везде где можно на descendant - работает как надо.

Давайте пруф.

 

Может и ошибаюсь, помню что была связана с этим проблема. А вообще в xpath, про который говорилось, а именно 

//table//td[contains(text(),'Название страны')]//..//td[contains(text(),'Документ')] 

не определена уникально таблица table, поэтому действительно //td будет делать поиск по всем таблицам на странице - правильно vkazar написал.


  • 0

#20 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 01 октября 2015 - 11:18

не определена уникально таблица table, поэтому действительно //td будет делать поиск по всем таблицам на странице - правильно vkazar написал.

 

 

xpath составлен в соответствии с представленным кодом, а не с учетом того, что может быть ... что то ... где то ... Человек уже его сам допилит как ему нужно будет


  • 0



Темы с аналогичным тегами webdriver, xpath

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных