2017-01-18 13 views
3

У меня есть таблица, данные которой изменяются в соответствии с тем, что добавлено и удалено. В таблице есть несколько столбцов Имя, Кол-во, Тип, Статус. Все, что у меня есть, - это текст имени со мной, мне нужно найти поле статуса этой строки, у которого есть это имя.Невозможно захватить элемент в динамической таблице, где у нас есть только текст тега td

Проблема заключается в том, что теги html имеют одинаковые имена классов, и я попытался захватить родительский и родной все, что не удалось. Пожалуйста, найдите HTML структуру таблицы ниже:

<table> 
    <thead> </thead> 
    <tbody> 
    <tr> 
     <td class = "c1"> 
     <a class = txtclass> text1 </a> 
     </td> 
     <td class = "c1"> Qty </td> 
     <td class = "c2"> type </td> 
     <td class = "c3"> 
     <div id = "1" class = "status1"> /div> 
     </td> 
    </tr> 
    <tr> 
     <td class = "c1"> 
      <a> text2 </a> 
     </td> 
     <td class = "c1"> Qty </td> 
     <td class = "c2"> type </td> 
     <td class = "c3"> 
      <div id = "2" class = "status2"> /div> 
     </td> 
    </tr> 
    </tbody> 
    </table> 

Так что все у меня есть со мной это text2 и мне нужно, чтобы получить со статусом этой строки.

Как я могу продолжить. Я пробовал

List<WebElement> ele = driver.findElements(By.xpath("//*[@class =  'txtClass'][contains(text(),'text')]")); 
     for(WebElement el1:ele) 
     { 
      WebElement parent = el1.findElement(By.xpath("..")); 
      WebElement child1= parent.findElement(By.xpath("//td[4]/div")); 
     System.out.println(child1.getAttribute("class")); 
     } 

Это дает мне имя класса статуса первой строки в таблице. же я попытался с

WebElement child = el1.findElement(By.xpath("//following-sibling::td[4]/div[1]")); 

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

Пожалуйста, помогите, я застрял здесь надолго, дайте мне знать, если вам нужны какие-либо другие детали.

ответ

1

Вы пытаетесь с помощью -

el1.findElements(By.xpath("//following-sibling::td[4]/div[1]")); 

Это соответствие всех элементов настоящего с форматом td[4]/div[1] в вашей странице и получением первого матча.

Необходимо использовать следующие xpath для захвата status настоящего под div на основе вашего текста.

driver.findElement(By.xpath(".//tr/td[contains(.,'text1')]/following-sibling::td[3]/div")).getAttribute("class"); 

Если ваше требование, чтобы извлечь все состояния попробовать следующие код-

List<WebElement> allElements = driver.findElements(By.xpath(".//tr/td[contains(.,'text2')]/following-sibling::td[3]/div")); 
for(WebElement element:allElements) 
{ 
    String status = element.getAttribute("class"); 
    System.out.println(status); 
} 
+0

Извините, @Narendra это не работает.Я получаю все имена классов следующего брата всех строк. а не тот, который имеет текст1. Мне не нужен весь статус всех строк. Только те строки, которые имеют имя как text2. –

+0

@pragyadasgupta, я обновил ответ plz. Если ваше требование получить весь статус, связанный с определенным текстом. – NarendraR

+0

Спасибо, что второй запрос работал для меня, когда я положил td [3] третий список 's' sibling allElements = driver.findElements (By.xpath (".// tr/td [содержит (., 'Text2') ]/следующий-родственный :: тд [3]/дел ")); –

0

Я думаю, что этот подход подходит для вас:

Получить все элементы DIV статус containt атрибута:

List<WebElement> listChildStatus = driver.findElements(By.xpath(".//tr[.//a[contains(.,'text')]]//div")); 

Ge т конкретных DIV элементы статуса containt атрибут:

WebElement childStatus = driver.findElement(By.xpath(".//tr[.//a[contains(.,'{TEXT}')]]//div")); 

{TEXT} = текстовое значение, которое у вас есть

0

Вам нужно найти элемент с текстом, перейдите на один уровень вверх, а затем получить родственный со статусом

WebElement statusElement = driver.findElement(By.xpath(".//td[a[contains(text(),'text2')]]/following-sibling::td[3]/div")); 
String status = statusElement.getAttribute("class"); // will be status2 

Если вы не хотите, чтобы ретранслировать на индекс вы можете использовать last(), чтобы найти последний Sibling

WebElement statusElement = driver.findElement(By.xpath(".//td[a[contains(text(),'text2')]]/following-sibling::td[last()]/div")); 
+0

Спасибо, последний() также будет работать для меня. Всегда лучше избегать индекса. –