Как проверить, существует ли псевдоэлемент через селен? - PullRequest
0 голосов
/ 29 апреля 2020

Мне нужно знать, можем ли мы найти существование псевдоэлемента, такого как :: after и :: before

Моя цель - просто вернуть true или false, если он присутствует.

Однако это нельзя сделать с помощью:

browser.driver.findElements(by.id('id')).size != 0

или

return !driver.findElements(by).isEmpty(); 

, поскольку они являются псевдоэлементами и не могут быть обнаружены с помощью локаторов CS или XPATH

Здесь мой HTML имеющий :: после

<div class="parent-class">
        <span class="child-class">Archive
        ::after
        </span>
        ::after
      </div>

Вот мой HTML без наличия :: после

<div class="parent-class">
        <span class="child-class">Archive
         ::after
        </span>
      </div>

Примечание. Мне нужно проверять только тег :: after в теге DIV, но не тег SPAN

1 Ответ

0 голосов
/ 29 апреля 2020

Да, псевдоэлементы не могут быть расположены путями или CSS локаторами. Однако, в качестве альтернативы, вы можете извлечь внутренний HTML родительского элемента и проверить, содержит ли он текст «:: after».

Есть два способа сделать это. Для приведенного выше сценария,

WebElement element = browser.driver.findElement(By.className('parent-class'))
String innerHTMLText = element.getAttribute('innerHTML');
if (innerHTMLText.contains("::after")){
   // Bingo !!
}

Или еще

WebElement element = browser.driver.findElement(By.className('parent-class'))
JavascriptExecutor js = (JavascriptExecutor)driver;
String innerHTMLText = js.executeScript("return arguments[0].innerHTML;", element);
if (innerHTMLText.contains("::after")){
   // Bingo !!
}

РЕДАКТИРОВАТЬ 1

Если вам нужно проверить, имеет ли только тег div псевдоэлемент, который вы может получить HTML тега span, получить HTML родительского тега, удалить внутренний тег HTML из тега span из HTML родительского тега. Проверьте.

String divHTMLText = browser.driver.findElement(By.className('parent-class')).getAttribute('innerHTML');
String spanHTMLText = browser.driver.findElement(By.className('child-class')).getAttribute('innerHTML');
// replace all the whitespaces first for good measure
divHTMLText = divHTMLText.replaceAll("\\s+","")
spanHTMLText = spanHTMLText.replaceAll("\\s+","")
// replace the child html from parent's html with empty. which leaves us with the parent html code.
String divOnlyHTML = divHTMLText.replace(spanHTMLText, "");

if (divOnlyHTML.contains("::after")){
   // Bingo !!
}
...