Как проверить, присутствует ли один элемент внутри другого элемента в selenium webdriver с java?

<td class="width-90px">
    <h5 class="width-90px text-ellipsis align-center margin-top-bottom-5">
            <i class="fa fa-check font-14 " aria-hidden="true"></i>
    </h5>
</td>

В приведенном выше html class="width-90px" - это один элемент, под этим элементом присутствует другой элемент class="fa fa-check font-14 ", как мы можем задать условие для проверки наличия второго элемента внутри первого элемента?

2
0
1 867
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы можете использовать XPath с соответствующим предикатом:

//td[@class="width-90px" and .//i[@class="fa fa-check font-14 "]]

У xpath есть свои плюсы и минусы: плюсы меньше необходимости в логике поиска драйвера; минусы: он потерпит неудачу в обоих случаях, и вам придется дважды проверить, что произошло 1) первый элемент отсутствует 2) второй элемент отсутствует

Vladimir Efimov 26.10.2018 11:36

@VladimirEfimov, 1) Если предок отсутствует, нет необходимости проверять потомка, 2) Если потомка нет, то условие не выполнено. В любом случае, вопрос слишком широкий, в нем нет попыток кода, поэтому точная цель и проблема не совсем ясны.

Andersson 26.10.2018 11:44

Сначала вам нужно найти элемент с классом «width-90px», а внутри него вы можете проверить элемент с классом «fa fa-check font-14», как показано ниже:

WebElement first = driver.findElement(By.className("width-90px"));

WebElement second  = first.findElement(By.className("fa fa-check font-14 "));

Второй оператор в коде вызовет исключение, если его нет внутри первого элемента.

second.isDisplayed (); не будет проверять, присутствует ли второй элемент внутри первого элемента, он просто проверяет, присутствует ли элемент на странице. @Mitul Lakhani

Ash 26.10.2018 08:29

@Ash Да, я упоминал, что в последнем утверждении в моем ответе он проверяет, отображается ли элемент или нет. Если элемент отсутствует, вторая строка кода с исключением исключения. Так что этот код будет полезен

Mitul Lakhani 26.10.2018 08:31

Привет, @MitulLakhani. Ваш ответ, скорее всего, будет новой версией ответа Андерссона без оптимизации и без улучшений.

Ashish Kamble 26.10.2018 09:16

@MitulLakhani, обратите внимание, что вы не можете передать имя составного класса в By.className, поэтому ваш код приведет к исключению

Andersson 26.10.2018 09:25

@Andersson любые локаторы (которые подходят тестеру) могут использоваться вместо имени класса, но тот же подход будет работать

Mitul Lakhani 26.10.2018 10:37

@AshishKamble Это не новая версия одного и того же ответа .. Это другой подход к достижению того же

Mitul Lakhani 26.10.2018 10:38

@MitulLakhani, да, можно использовать любой, но вы выбрали тот, который не работает

Andersson 26.10.2018 10:44

@MitulLakhani другой подход, который приведет к исключению. Вы действительно поняли, что такое By.className ("") и [@ class = ""] ??? Как бы то ни было, пожалуйста, измените свой ответ, чтобы внести свой вклад, это моя любезная просьба.

Ashish Kamble 26.10.2018 10:53

@MitulLakhani, isDisplayed должен проверять если элемент отображается, но не если элемент присутствует, так что в любом случае ваш подход неверен

Andersson 26.10.2018 11:52
Ответ принят как подходящий
WebElement first = driver.findElement(By.xpath(".//*[@class='width-90px']"));

first.findElement(By.xpath(".//*[@class='fa fa-check font-14 ']")).isDisplayed();

работает нормально, если второй элемент отсутствует внутри первого элемента, его ошибка бросания.

@Ash, также обратите внимание, что ваш ответ на самом деле не соответствует вашему вопросу. Согласно документации, isDisplayed() должен проверить «Этот элемент отображается или нет? Этот метод позволяет избежать проблемы, связанной с анализом атрибута style» элемента »., в то время как вы хотите "... чтобы проверить наличие второго элемента внутри первого элемента". Элемент может находиться внутри другого элемента, но быть скрытым, поэтому ваш подход не удастся

Andersson 26.10.2018 11:49

Если ваша единственная цель - проверить, что элемент с атрибут как class="fa fa-check font-14 " присутствует под элементом с атрибут как class="width-90px", вы можете построить Стратегия поиска на основе простого отношения Предок и Потомок и использовать любое из следующих решений:

  • XPath:

    //td[@class="width-90px"]//i[@class='fa fa-check font-14']
      ^ -> Ancestor            ^ -> Descendant
    
  • CssSelector:

    td.width-90px i.fa.fa-check.font-14
    ^ ->Ancestor  ^ ->Descendant
    

Примечание. Используйте блок try-catch{} для проверки присутствие элемента на основе отношения Предок-Потомок.

Вы можете добиться этого с помощью Xpath Axes:

WebElement element = driver.findElement.(By.xpath("//td[@class='width- 
                     90px']/following-sibling::h5/i[@class='fa fa-check font-14']));
if(element != null)
   //element is inside first 
else
   //element is not the child of first

Другие вопросы по теме