【问题标题】:How to check if a pseudo element exists or not through selenium如何通过硒检查伪元素是否存在
【发布时间】:2020-08-13 07:32:38
【问题描述】:

我想知道我们是否可以找到像 ::after 和 ::before 这样的伪元素的存在

我的目标只是返回 true 或 false(如果存在)。

但是不能使用:

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

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

因为它们是伪元素,无法通过任何 CS 或 XPATH 定位器定位

这是我的 HTML 有 ::after

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

这是我的 HTML 没有 ::after

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

注意:我只需要验证 DIV 标记中的 ::after 而不是 SPAN 标记

【问题讨论】:

    标签: java selenium selenium-webdriver css-selectors selenium-chromedriver


    【解决方案1】:

    是的,伪元素不能通过路径或 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 标签具有伪元素,您可以获取 span 标签的 HTML,获取父标签的 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 !!
    }
    

    【讨论】:

    • 如果 HTML 看起来像这样
      "Archive" ::after ::after div> 现在,我需要检查 ::after 仅用于 div 而不是 span
    • 你确定 String divHTMLText = browser.driver.findElement(By.className('parent-class')).getAttribute('innerHTML');沿着 ::after 获取整个内部 HTML。我猜不是,因为当我尝试在控制台上打印它时,它打印时没有伪元素。打印时控制台中没有 ::after
    • 我提供了两种获取 HTML 代码的方法。你试过第二个选项吗?使用 JavascriptExecutor?
    • 这行不通! element.getAttribute('innerHTML') 返回的字符串不包含之前或之后。 js.executeScript("return arguments[0].innerHTML;", element); 返回对象,而不是字符串!
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签