IllegalLocatorException - Selenium Web Driver

时间:2015-02-16 16:18:39

标签: selenium selenium-webdriver automation

好的我正在Selenium Web Driver中编写一个简单的代码。它的作用是:

  1. 打开网址Google.com
  2. 在搜索栏中输入“abc”
  3. 单击图像选项卡
  4. 我使用的是Windows 8 - 64位和Visual Studio 2013.浏览器是Firefox。

    这是我写的代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    using OpenQA.Selenium;
    using OpenQA.Selenium.Firefox;
    using OpenQA.Selenium.IE;
    
    namespace WebDriverDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
                IWebDriver driver = new FirefoxDriver();
                driver.Url = "http://google.com";
    
                var searchBox = driver.FindElement(By.Id("gbqfq"));
                searchBox.SendKeys("abc");
    
                driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromMinutes(1));
    
                var images = driver.FindElements(By.ClassName("q qs"))[0];
                images.Click();
    
            }
        }
    }
    

    但是我在代码的第二行得到了一个例外。这是一个例外:

    enter image description here

    这是Inspect Element结果:

    enter image description here

3 个答案:

答案 0 :(得分:3)

异常消息准确告诉您问题所在。使用By.ClassName时,不能使用多个或“复合”类名。单个类名称不能包含空格。如果要使用多个类名,请使用By.CssSelector

答案 1 :(得分:1)

而且,问题是复合类。目前selenium不支持此功能。另一方面,您可以使用cssSelector来避免此问题。

.q.qs

在每个课程之前注意.,并查看与此问题相关的答案here

根据OP的更新完成代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.IE;

namespace WebDriverDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            IWebDriver driver = new FirefoxDriver();
            driver.Url = "http://google.com";

            var searchBox = driver.FindElement(By.Id("gbqfq"));
            searchBox.SendKeys("abc");
            //The following line is missing that is mandatory.
            driver.FindElement(By.Name("btnG")).Click();

            driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromMinutes(1));

            var images = driver.FindElements(By.CssSelector(".q.qs"))[0];
            images.Click();

        }
    }
}

答案 2 :(得分:0)

使用CSSSelector:

 var images = driver.findElement(By.cssSelector(".q.qs"));
 images.Click();

使用LinkText:

 var images = driver.findElement(By.linkText("Images"));
 images.Click();

使用Xpath:

  var images = driver.findElement(By.xpath(".//*[@class='q qs' and .='Images']"));
  images.Click();