Java中的Selenium错误:指针操作

时间:2017-05-14 16:18:43

标签: java selenium mousehover invalidargumentexception

在尝试在Java中执行Selenium的以下代码时,我收到此错误“指针操作的缺少或无效的类型参数”。

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

    driver.findElement(By.xpath(".//*[@class='_3Ji-EC']/li[8]/a")).click();

    WebElement elem = driver.findElement(By.className("_2zrpKA"));
    elem.sendKeys("ABC");

    WebElement elem2 = driver.findElement(By.xpath(".//*[@class='_2zrpKA 
    _3v41xv']"));
    elem2.sendKeys("XYZ");

    driver.findElement(By.xpath(".//*[@class='_2AkmmA _1LctnI 
    _7UHT_c']")).click();

    System.out.println("Success");

    //driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    Thread.sleep(5000);
    WebElement elem3 = driver.findElement(By.xpath(".//*[@class='_3Ji-
    EC']/li[7]/a"));
    System.out.println("success");
    Actions action = new Actions(driver);
    action.moveToElement(elem3).build().perform();
    driver.findElement(By.xpath(".//*[@class='_1u5ANM']/li[9]/a")).click();
}

我尝试使用Selenium 3.4.0和Firefox 51.x,52.x,53.x以及最新的geckodriver 16.1和16.0。 当我使用Firefox 53.x时,我收到错误“预期[对象未定义]未定义为字符串”否则每次我收到错误“指针操作的缺失或无效类型参数”。

在上面的代码中,我能够第二次打印“成功”而没有任何问题,但之后我收到了错误。

1 个答案:

答案 0 :(得分:0)

以下是您的问题的解决方案:

  1. Selenium 3.4.0一起使用geckodriver v0.16.1& Mozilla Firefox 53.x您需要在代码中指定geckodriver的绝对路径:

    System.setProperty("webdriver.gecko.driver", "C:\\your_directory\\geckodriver.exe");
    
  2. 你的xpath似乎很容易受我影响。您可能希望构建更独特的逻辑xpath。要点击Log In按钮,您可以执行以下操作:

    driver.findElement(By.xpath("//div[@class='AsXM8z']/ul/li/a[@class='_2k0gmP'][text()='Log In']")).click();
    
  3. 我建议你不要只依赖于类,添加更多属性。 Enter Email字段的xpath可以是:

    WebElement elem = driver.findElement(By.xpath("//input[@class='_2zrpKA']"));
    
  4. Enter Password的xpath不是唯一的,您可能希望将其更改为:

     WebElement elem2 = driver.findElement(By.xpath("//input[@class='_2zrpKA _3v41xv']"));
    
  5. Login按钮的xpath必须是唯一的,如下所示:

    driver.findElement(By.xpath("//button[@class='_2AkmmA _1LctnI _7UHT_c']")).click();
    
  6. 避免使用Thread.sleep(5000);而是使用ImplicitlyWaitExplicitWait

  7. 点击用户名的xpath再次易受攻击,您可能希望将其更改为:

    WebElement elem3 = driver.findElement(By.xpath("//div[@class='AsXM8z']/ul/li/a[@class='_1AHrFc _2k0gmP']"));
    
  8. 点击Log Out按钮的xpath再次易受攻击,您可能希望将其更改为:

    driver.findElement(By.xpath("//div[@class='_1H5F__']/div/ul/li/ul/li/a[@class='_2k0gmP'][text()='Log Out']")).click();
    
  9. 这是您自己的工作代码块,有一些简单的调整;

    System.setProperty("webdriver.gecko.driver", "C:\\your_directory\\geckodriver.exe");
    
    WebDriver driver = new FirefoxDriver();
    driver.get("https://www.flipkart.com/");
    
    driver.findElement(By.xpath("//div[@class='AsXM8z']/ul/li/a[@class='_2k0gmP'][text()='Log In']")).click();
    
    //Email
    WebElement elem = driver.findElement(By.xpath("//input[@class='_2zrpKA']"));
    elem.sendKeys("emailid@domain.com");
    
    //Password
    WebElement elem2 = driver.findElement(By.xpath("//input[@class='_2zrpKA _3v41xv']"));
    elem2.sendKeys("pass_word");
    
    //Login Button
    driver.findElement(By.xpath("//button[@class='_2AkmmA _1LctnI _7UHT_c']")).click();
    
    System.out.println("Success");
    
    //driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    Thread.sleep(5000);
    
    //Click on Name
    WebElement elem3 = driver.findElement(By.xpath("//div[@class='AsXM8z']/ul/li/a[@class='_1AHrFc _2k0gmP']"));
    System.out.println("success");
    Actions action = new Actions(driver);
    action.moveToElement(elem3).build().perform();
    driver.findElement(By.xpath("//div[@class='_1H5F__']/div/ul/li/ul/li/a[@class='_2k0gmP'][text()='Log Out']")).click();
    
  10. 如果这回答你的问题,请告诉我。