Установка таймаутов для поиска в Selenium и Java

#selenium #xpath

#selenium #xpath

Вопрос:

У меня есть HTML, подобный этому

 <tr>
  <td>
    <label>...</label>
  </td>
  <td>
    <input>...</input>
  </td>
  <td>
  </td>
</tr>
<tr>
  <td>
  </td>
  <td>
  </td>
  <td>
    <a>  ...</a>
  </td>
</tr>
  

Вы получаете картину. Несколько (в данном случае 3) строк, каждая строка содержит tds (в данном случае 67), и только НЕКОТОРЫЕ из tds имеют подэлементы.

Мне нужно перейти от строки к строке и посмотреть на каждый td. Если вложенного элемента нет, то я получаю текст из td. Если есть и это ввод, то, если есть только 1 ввод, я получаю его значение. Если два ввода, я получаю значение, где type=»скрытый».

Я нахожу свои строки с

  driver.findElements(By.xpath("blahblahblah//tr");
  

Я просматриваю каждую строку и нахожу tds, подобные

  row.findElements(By.xpath("td"));
  

Это не проблема. Но затем я просматриваю tds, чтобы найти элементы:

  td.findElements(By.xpath("*")) 
  

(пожалуйста, обратите внимание, что это нормально, поскольку это не так // *)
Таким образом, если в td есть подэлементы, он сразу возвращается. Но если нет, то он ждет до истечения времени ожидания.

Я выполнил

  driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
  

и даже

  driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
  

Ни то, ни другое не сработало, как я ожидаю, в работает только для

  driver.findelements(By.xpath)).
  

Итак, есть ли способ установить этот тайм-аут для поиска элементов? У этих tds нет идентификаторов
или что-нибудь еще, или я мог бы просто сделать

  driver.findElements(By.xpath(xpath with id   "//*")); 
  

и тайм-аут, вероятно, сработал бы.

Есть ли какой-либо способ с помощью элемента получить определенный xpath, если у него нет идентификатора, имени или бла-бла-бла?

Итак, два вопроса: 1: Как вы устанавливаете время ожидания элемента, 2: если у вас есть элемент, как вы можете получить xpath для него

Комментарии:

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

Ответ №1:

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

     String value;
    int rows = driver.findElements(By.xpath("//table//tr")).size();
    int columns = driver.findElements(By.xpath("//table//tr[1]/td")).size();
    for(int row = 1; row <rows 1;   row) {
        for (int col =1; col<columns 1; col  ) {
            //now check if there are any children with input hidden
            if (driver.findElements(By.xpath("//table//tr["  row  "]/td["  col  "]/input[@type='hidden']")).size()>0) {
                value = driver.findElement(By.xpath("//table//tr["  row  "]/td["  col  "]/input[@type='hidden']")).getAttribute("value");
            }
            //now check if there are any children with input without hidden
            else if ((driver.findElements(By.xpath("//table//tr["  row  "]/td["  col  "]/input")).size()>0)) {
                value = driver.findElement(By.xpath("//table//tr["  row  "]/td["  col  "]/input")).getAttribute("value"); 

            }
            //just get text as there are no children input
            else {
                value = driver.findElement(By.xpath("//table//tr["  row  "]/td["  col  "]")).getText();
            }
            System.out.println("Row:"   row   " Col:"   col   " value:"   value);
            }
    }