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

Автоматизатор мобильных приложений
онлайн, начало 11 августа
Тестирование безопасности
онлайн, начало 11 августа
Тестирование мобильных приложений
онлайн, начало 11 августа
Автоматизация тестирования REST API на Python
онлайн, начало 11 августа
Фотография

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

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
  • 863 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 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 854 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 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


Selenium 2.0: стартовый уровень
онлайн
Программирование на Java для тестировщиков
онлайн
Автоматизация функционального тестирования
онлайн
Selenium WebDriver: полное руководство
онлайн




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

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

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

Яндекс.Метрика
Реклама на портале