我正在尝试使用 Java 在 Selenium 中读取包含多个"用户名"和"密码"的 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: Element is not 当前可见,因此可能不会与命令持续时间交互 或超时:23 毫秒 构建信息: 版本:"2.52.0",修订版: '4c2593c', 时间: '2016-02-11 19:03:33' 系统信息: 主机: "本地主机", 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 Capabilities [{platform=LINUX, acceptSslCerts=true, javascriptEnabled=true, cssSelectorsEnabled=true, databaseEnabled=true, browserName=firefox, handlesAlerts=true, nativeEvents=false, webStorageEnabled=true, 可旋转=假, 位置上下文启用=真, applicationCacheEnabled=true, takesScreenshot=true, version=43.0}] at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 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: Element is not 当前可见,因此可能不会与生成信息交互: 版本: '2.52.0', 修订版: '4C2593C', 时间: '2016-02-11 19:03:33' 系统信息:主机:"本地主机",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(file:///tmp/anonymous8352270443321158650webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:10045) 在。DelayedCommand.prototype.checkPreconditions_(file:///tmp/anonymous8352270443321158650webdriver 配置文件/扩展/fxdriver@googlecode.com/组件/命令处理器.js:12597) 在。DelayedCommand.prototype.executeInternal_/h(file:///tmp/anonymous8352270443321158650webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:12614) 在。DelayedCommand.prototype.executeInternal_(file:///tmp/anonymous8352270443321158650webdriver 配置文件/扩展/fxdriver@googlecode.com/组件/命令处理器.js:12619) 在。DelayedCommand.prototype.execute/<(file:///tmp/anonymous8352270443321158650webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:12561)
您在while
循环中调用driver.close();
,这会关闭浏览器。关闭浏览器时,您无法与元素交互。将其移至测试完成后。
作为旁注,如果您想在与元素交互之前确保元素可见,请使用显式等待
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);
}
我的朋友试试这个:
-
将与硒驱动程序相关的所有代码放在 While 中。这包括驱动程序对象的声明。
while ((nextLine = reader.readNext())!= null){ WebDriver driver = new FirefoxDriver(); String appUrl = "https://accounts.google.com"; driver.get(appUrl); driver.manage().window().maximize(); driver.Close();}
让我知道?
我喜欢盖伊和pjcalvo的答案,但我首先建议的是简化问题。 对我来说,问题是我不知道这是硒还是opencsv问题(或两者兼而有之)。
在这种情况下,我要做的是采用您的原始程序并将其分解为两个测试程序。 第一个是一段时间循环浏览csv文件并在屏幕上打印出用户名和密码。 第二个是硒测试,处理名称和密码的硬编码二维字符串数组(比如说三个用户,因为现在你还没有通过第一个用户)。 这两个程序都使用与您上面列出的程序相同的样式。
这样做可以让您更好地了解真正的问题是什么,以及一个较小的程序示例来调试或提出问题。 运行较小的程序后,您可以对实际程序进行修复。
:)