#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);
}
}