我正在尝试使用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)
答案 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循环,并在屏幕上打印出用户名和密码。第二个是硒测试,处理名称和密码的硬编码二维字符串数组(比如三个用户,因为现在你没有超过第一个)。这两个程序都使用与上面列出的程序相同的样式。
这样做可以让您更好地了解什么是真正的问题,以及一个较小的程序示例来调试或提出问题。一旦较小的程序运行,那么你可以修复到真正的程序。
:)