Вопрос:
Мой HTML-код выглядит следующим образом:
<html> <body> <div> </div> <div> <table> <tbody id=a> <tr> <td> <div> <span> some Text </span> </div> </td> </tr> <tr> <td> <div> <span> some Text2 </span> </div> </td> </tr> <tr> <td> <div> <span> some Text3 </span> </div> </td> </tr> </tbody> </table> </div> </body>
Я пытаюсь выбрать каждый из элементов span по их тексту. Я могу выбрать tbody по id. Я пробовал это:
tbody.FindElement(By.XPath(String.Format(«.//span[contains(text(), {0}))]», &var))); (var = somex0020Text)
но это всегда возвращает первый элемент <span> в моей таблице.
Я также пробовал:
tbody.FindElements(By.XPath(String.Format(«.//span[contains(text(), {0}))]», &var)));
который возвратил список, содержащий каждый элемент <span> в моей таблице, и я не знаю, почему.
Я также не понимаю, почему
tbody.FindElement(By.XPath(String.Format(«.//span[text() = {0})]», &var)));
бросает элемент Element not found Exception, когда метод contains возвращает элемент <span> с одним и тем же текстом.
Ответ №1
Я попробовал использовать xpath как:
.//span[contains(text(),’some Text’)]
он выбирает все 3 диапазона.
поэтому к этому я обращаюсь к родительскому элементу.
для 1-го .//tbody[@id=’a’]//tr[1]//span[contains(text(),’some Text’)]: .//tbody[@id=’a’]//tr[1]//span[contains(text(),’some Text’)] span[ .//tbody[@id=’a’]//tr[1]//span[contains(text(),’some Text’)]
для 2-го: .//tbody[@id=’a’]//tr[2]//span[contains(text(),’some Text’)] 2] .//tbody[@id=’a’]//tr[2]//span[contains(text(),’some Text’)]
для 3-го: .//tbody[@id=’a’]//tr[3]//span[contains(text(),’some Text’)] 3] .//tbody[@id=’a’]//tr[3]//span[contains(text(),’some Text’)]
через это я могу выбрать каждый элемент span отдельно.
Ответ №2
Вы можете использовать jQuery для получения всех элементов span в “Таблице”.
Пример:
var items = $(‘table div span’); items.each(function (x) { alert(items[x].innerHTML); }); Ответ №3
tbody.FindElement(By.XPath(String.Format(“.//span [содержит (текст(), {0}))]”, & var)));
(var = somex0020Text)но это всегда возвращает первый элемент в моей таблице.
Это ожидаемое поведение в Селене. Как я вижу, есть 3 элемента с одинаковым xpath, как указано в вашем коде, в этом случае Selenium возвращает первый элемент.
tbody.FindElements(By.XPath(String.Format(“.//span [содержит (текст(), {0}))]”, & var)));
который возвратил список, содержащий каждый элемент в моей таблице, и я не знаю, почему.
Это также ожидаемое поведение в Selenium. FindElements вернет все элементы с одинаковым xpath.
Поэтому измените значение var на some Text2 или some Text3 чтобы найти другие два элемента.
Следующий xpath будет работать для some Text2:
.//span[contains(text(), ‘some Text2’))] Ответ №4
Попробуйте с этим Xpath $ x (“//tr//span [содержит (., ‘Some Text’)]”)