线程“main”中的异常org.openqa.selenium.ElementNotVisibleException:元素当前不可见,因此可能无法与

时间:2016-03-02 11:39:19

标签: java csv selenium login opencsv

我正在尝试使用selenium中的java读取包含多个“用户名”和“密码”的CSV文件。但是当我执行代码时,我只能在CSV文件中执行第一个用户的登录和注销功能。之后,它在控制台中显示以下错误: 我的实际要求是使用这些用户名和密码中的每一个读取csv文件中的所有数据(用户名和密码)以及登录和注销。

*Exception in thread "main" org.openqa.selenium.ElementNotVisibleException: Element is not currently visible and so may not be interacted with*

Following is my entire code: 


package NewCsvPkg;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;

//csv reader imports
import java.io.FileReader;
import java.util.Iterator;
import java.util.List;
//import au.com.bytecode.opencsv.CSVReader;
import com.opencsv.CSVReader;
public class NewCsvClass {

  public static void main(String[] args) throws Exception  {

      WebDriver driver = new FirefoxDriver();    
         String appUrl = "https://accounts.google.com";
         driver.get(appUrl);
         driver.manage().window().maximize(); 


     //csv reader aswathy -start
     CSVReader reader = new CSVReader(new FileReader("/home/user/Documents/UrmilaDocs/CSV PAck/testCSV.csv"));
        String [] nextLine;

        while ((nextLine = reader.readNext())!= null){


        String user_name = nextLine[0];
        String pass_word = nextLine[1];


            System.out.println("Username: " + user_name);
            System.out.println("Password: " + pass_word);

            //start


            WebElement username = driver.findElement(By.xpath(".//*[@id='Email']"));
             username.clear();
            username.sendKeys(user_name);
             driver.findElement(By.xpath(".//*[@id='next']")).click();

             Thread.sleep(5000);
             //try
             try{
            WebElement password = driver.findElement(By.xpath(".//*[@id='Passwd']"));
              password.clear();
              password.sendKeys( pass_word);
              driver.findElement(By.xpath(".//*[@id='signIn']")).click();
        Thread.sleep(8000);
        System.out.println("Login Success");

        //click on 'Google Apps' icon 
        driver.findElement(By.xpath(".//*[@id='gbwa']/div[1]/a")).click();
        Thread.sleep(10000);

        //Click on 'Gmail' icon to navigate to inbox page
        driver.findElement(By.xpath(".//*[@id='gb23']/span[1]")).click();
        Thread.sleep(10000);

        //Click on user name first letter circle icon
        driver.findElement(By.xpath(".//*[@id='gb']/div[1]/div[1]/div[2]/div[4]/div[1]/a/span")).click();
        Thread.sleep(3000);

        //click on 'Signout' button
        driver.findElement(By.xpath(".//*[@id='gb_71']")).click();
        Thread.sleep(5000);
        System.out.println("Logout Success");
             }// try closed

             //catch exception
             catch(Exception e)
             {
                 System.out.println("Login failed!");  
             }// catch closed
//           //closing driver & firefox
             driver.close();
            //end



        }//while end

     //csv reader end
        System.exit(0);       //closing firefox  


  } 
  }
  

执行时,显示以下异常:用户名:   testuser01.zyx密码:testuser0123登录成功注销成功   用户名:testuser07密码:user0123线程“main”中的异常   org.openqa.selenium.ElementNotVisibleException:元素不是   目前可见,因此可能无法与命令持续时间进行交互   或超时:23毫秒构建信息:版本:'2.52.0',修订版:   '4c2593c',时间:'2016-02-11 19:03:33'系统信息:host:'localhost',   ip:'127.0.0.1',os.name:'Linux',os.arch:'i386',os.version:   '3.2.0-37-generic-pae',java.version:'1.7.0_95'会话ID:   52ade752-04da-4a5e-baf5-5bcdf98a2434驱动程序信息:   org.openqa.selenium.firefox.FirefoxDriver功能   [{platform = LINUX,acceptSslCerts = true,javascriptEnabled = true,   cssSelectorsEnabled = true,databaseEnabled = true,browserName = firefox,   handlesAlerts = true,nativeEvents = false,webStorageEnabled = true,   rotating = false,locationContextEnabled = true,   applicationCacheEnabled = true,takeScreenshot = true,version = 43.0}] at   sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)     在   sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)     在   sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)     at java.lang.reflect.Constructor.newInstance(Constructor.java:526)     在   org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206)     在   org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)     在   org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:678)     在   org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:327)     在   org.openqa.selenium.remote.RemoteWebElement.clear(RemoteWebElement.java:140)     at NewCsvPkg.NewCsvClass.main(NewCsvClass.java:54)引起:   org.openqa.selenium.ElementNotVisibleException:元素不是   目前可见,因此可能无法与构建信息进行交互:   版本:'2.52.0',修订版:'4c2593c',时间:'2016-02-11 19:03:33'   系统信息:主机:'localhost',ip:'127.0.0.1',os.name:'Linux',   os.arch:'i386',os.version:'3.2.0-37-generic-pae',java.version:   '1.7.0_95'驱动程序信息:driver.version:未知.fxdriver.preconditions.visible(文件:///tmp/anonymous8352270443321158650webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:10045)     at .DelayedCommand.prototype.checkPreconditions_(file:///tmp/anonymous8352270443321158650webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:12597)     at .DelayedCommand.prototype.executeInternal_ / h(file:///tmp/anonymous8352270443321158650webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:12614)     at .DelayedCommand.prototype.executeInternal_(file:///tmp/anonymous8352270443321158650webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:12619)     在.DelayedCommand.prototype.execute /<(file:///tmp/anonymous8352270443321158650webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:12561)

3 个答案:

答案 0 :(得分:1)

您正在driver.close();循环内调用while,这会关闭浏览器。当浏览器关闭时,您无法与元素进行交互。在测试完成后将其移至。

作为旁注,如果要确保元素在与之交互之前可见,请使用显式等待

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement username = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("Email")));
username.sendKeys(user_name);

这将等待最多10秒钟才能看到该元素。 wait.until也会返回它正在等待的元素。

  

使用示例

WebDriverWait wait = new WebDriverWait(driver, 10); // initialize wait object

while ((nextLine = reader.readNext())!= null) {

    // locate and write to user name
    WebElement username = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("Email")));
    username.clear();
    username.sendKeys(user_name);

    // locate and write to password
    WebElement password = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("Passwd")));
    password.clear();
    password.sendKeys(user_name);
}

答案 1 :(得分:0)

我的朋友试试这个:

  • 将所有与selenium驱动程序相关的代码放入While中。这包括你对Driver对象的声明。

    while ((nextLine = reader.readNext())!= null){        
    WebDriver driver = new FirefoxDriver();    
             String appUrl = "https://accounts.google.com";
             driver.get(appUrl);
             driver.manage().window().maximize();   
    driver.Close();}
    

请告诉我?

答案 2 :(得分:0)

我喜欢Guy和pjcalvo的答案,但我首先建议的是简化问题。对我来说,问题是我不知道这是一个selenium还是opencsv问题(或两者兼而有之)。

在这种情况下,我要做的是将原始程序分解为两个测试程序。第一个是通过csv文件的while循环,并在屏幕上打印出用户名和密码。第二个是硒测试,处理名称和密码的硬编码二维字符串数组(比如三个用户,因为现在你没有超过第一个)。这两个程序都使用与上面列出的程序相同的样式。

这样做可以让您更好地了解什么是真正的问题,以及一个较小的程序示例来调试或提出问题。一旦较小的程序运行,那么你可以修复到真正的程序。

:)