【问题标题】:Get CSS selector string from WebElement in Selenium WebDriver - Java从 Selenium WebDriver 中的 WebElement 获取 CSS 选择器字符串 - Java
【发布时间】:2016-04-11 11:00:29
【问题描述】:

我有一个 WebElement,我只是想提取 CSS 选择器字符串。这是我调试代码时变量的值:

[[ChromeDriver: chrome on MAC (345345345n5435345b34)] -> css 选择器: div[class='alert alert-danger']]

我只需要访问 css 选择器:

div[class='alert alert-danger']]

我可以拆分字符串,但是有人知道 Selenium 提供的更有效的方法吗?我试过使用.getAttribute("class"),它返回“alert alert-danger”,但我需要整个选择器。

感谢您的阅读,任何帮助将不胜感激。

【问题讨论】:

    标签: java css selenium-webdriver


    【解决方案1】:

    您可以使用一段 Javascript 构建自己独特的 CSS 选择器。下面是一个 Java 示例:

    final String JS_BUILD_CSS_SELECTOR =
        "for(var e=arguments[0],n=[],i=function(e,n){if(!e||!n)return 0;f" +
        "or(var i=0,a=e.length;a>i;i++)if(-1==n.indexOf(e[i]))return 0;re" +
        "turn 1};e&&1==e.nodeType&&'HTML'!=e.nodeName;e=e.parentNode){if(" +
        "e.id){n.unshift('#'+e.id);break}for(var a=1,r=1,o=e.localName,l=" +
        "e.className&&e.className.trim().split(/[\\s,]+/g),t=e.previousSi" +
        "bling;t;t=t.previousSibling)10!=t.nodeType&&t.nodeName==e.nodeNa" +
        "me&&(i(l,t.className)&&(l=null),r=0,++a);for(var t=e.nextSibling" +
        ";t;t=t.nextSibling)t.nodeName==e.nodeName&&(i(l,t.className)&&(l" +
        "=null),r=0);n.unshift(r?o:o+(l?'.'+l.join('.'):':nth-child('+a+'" +
        ")'))}return n.join(' > ');";
    
    WebDriver driver = new FirefoxDriver();
    JavascriptExecutor js = (JavascriptExecutor)driver;
    driver.get("http://stackoverflow.com/questions");
    
    // get an element
    WebElement element = driver.findElement(By.cssSelector(".youarehere"));
    
    // build the Css selector for the targeted element
    String selector = (String)js.executeScript(JS_BUILD_CSS_SELECTOR, element);
    
    // display the result
    System.out.println("Unique Css selector: " + selector);
    

    【讨论】:

      【解决方案2】:

      一种简单的方法是使用regex。从您提供的给定字符串中,您可以使用以下正则表达式提取整个选择器:

      div.*
      

      Regex101

      有时您还有其他元素(并非总是 div),因此您可以创建一个将其作为参数的方法,因此您可以使用相同的方法,例如:ul.* 等。

      【讨论】:

      • 大家的建议都很棒。谢谢
      【解决方案3】:

      不,你不能再简单了。另外,请注意,您将获得的选择器不能保证唯一地定位有问题的元素。查看链接以获取更多见解 https://stackoverflow.com/a/19843175/6184852
      从最终获取元素的方式中找出选择器会更容易。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-28
        • 2012-09-02
        • 1970-01-01
        相关资源
        最近更新 更多