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



我正在尝试使用 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文件并在屏幕上打印出用户名和密码。 第二个是硒测试,处理名称和密码的硬编码二维字符串数组(比如说三个用户,因为现在你还没有通过第一个用户)。 这两个程序都使用与您上面列出的程序相同的样式。

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

:)

相关内容

  • 没有找到相关文章

最新更新