CSS Locator with contains()使用Selenium WebDriver的InvalidSelectorException

时间:2015-05-02 07:28:02

标签: java selenium selenium-webdriver css-selectors

我正在学习 Selenium Webdriver 并尝试编写一个简单的测试脚本。

目的是获取 Gmail 页面上的About Google链接,以便练习 CSS定位器

以下是代码:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;

public class GoogleSearch {

    public static void main(String[] args) {            
        WebDriver driver = new FirefoxDriver();         
        driver.get("https://www.gmail.com");

        WebElement aboutGoogle = driver.findElement(By.cssSelector("a:contains('About Google')"));          

        driver.close();
        driver.quit();          
    }    
}

我得到以下提到的例外:

Exception in thread "main" org.openqa.selenium.InvalidSelectorException: The given selector a:contains('About Google') is either invalid or does not result in a WebElement. The following error occurred:
InvalidSelectorError: An invalid or illegal selector was specified
Command duration or timeout: 356 milliseconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/invalid_selector_exception.html
Build info: version: '2.45.0', revision: '32a636c', time: '2015-03-05 22:01:35'
System info: host: 'XXXXX', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '3.13.0-49-generic', java.version: '1.7.0_79'
*** Element info: {Using=css selector, value=a:contains('Need')}
Session ID: 0f1869f8-c59a-4f61-b1c7-b34ada42573f
Driver info: org.openqa.selenium.firefox.FirefoxDriver

我已经检查过并且能够使用相同的定位器在Selenium IDE中找到该元素。

我在某处读到findElement()方法正在返回一个DOM节点,而代码正在等待一个WebElement对象。

如果是这种情况那么,是否有解决方法/转换?

有什么建议吗?

2 个答案:

答案 0 :(得分:16)

主要问题在于这一行:

  

driver.findElement(By.cssSelector(" a:contains('关于Google')"));

css并未为Selenium WD维持contains() - See here

要使用contains(),您必须使用Xpath

使用 Xpath ,您的定位器将是:

  

// a [包含(text(),'关于Google')]

对于驱动程序,它将如下:

  

driver.findElement(By.xpath(" // a [contains(text(),' About Google')]"));

要查找与Selenium的链接,您可以使用:

  

driver.findElement(By.linkText("您的链接名称在这里"));

CSS 选择器的限制与 Xpath 相比:

  • 你不能使用css选择器的父元素(Xpath有xpath轴)
  • 您不能使用contains(它只是xpath权限)。

<强> 顺便说一句
要从页面处理 Xpath 定位器,您可以使用Firefox浏览器的扩展程序:

答案 1 :(得分:0)

正如Exception明确指出这里的问题是你的Css选择器无效。 &#39;您正在尝试根据About Google锚点标记获取非有效的css选择器&#39;。它更像是一个jQuery选择器。

您可以根据href属性的值使用选择器,如下所示,它可以正常工作。

 #footer-list a[href*='about']

并像

一样使用它
WebElement aboutGoogle = driver.findElement(By.cssSelector("#footer-list a[href*='about']"));