java - Selenium Webdriver 中的下拉菜单和切换到新窗口在 Firefox 中不起作用

标签 java javascript eclipse firefox selenium

我正在尝试通过我的开发人员登录 www.salesforce.com 来自动化一些网页,即案例创建、帐户和联系人创建。我使用 Mozilla Firefox 34.0.5 以及 Eclipse Luna 和 Java 通过 Selenium WebDriver 实现自动化。我还使用 JExcel API 从硬盘中的 Excel 文件读取数据。系统规范为Windows7 Ultimate 32位。

我的自动化代码在 Google Chrome 中运行良好,但在 Firefox 中,网页上的某些字段(例如下拉菜单框、弹出窗口和将控件切换到新的弹出窗口)不起作用。我还没有找到解决这个问题的方法。我无法理解 selenium 命令失败的原因:“selectByVisibleText(String)”。

  1. 显示下拉菜单列表,指定的选项也突出显示,但随后单击/选择操作被中止并选择默认值。

  2. 对于弹出窗口,selenium 命令:“driver.switchTo().window(windowhandle)”不起作用。新的弹出窗口打开并生成窗口句柄,但显示的错误是“无法定位窗口 {窗口句柄字符串}”。

我不明白为什么它无法通过窗口句柄定位窗口并在 Firefox 中切换到它(如果它在其他浏览器中工作正常)? ??

下面是我的完整代码

public class PoiExcelCase {

    WebDriver driver;
    FileInputStream fis;
    HSSFWorkbook wb;
    HSSFSheet sh;

    @BeforeTest
    public void login() throws BiffException, IOException
    {
        driver = new FirefoxDriver();
        //System.setProperty("webdriver.chrome.driver", "D:/chromedriver_win32/chromedriver.exe");
        //driver = new ChromeDriver();

        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
        fis = new FileInputStream(new File("D:/Salesforce.xls"));
        wb = new HSSFWorkbook(fis);
        sh = wb.getSheet("Sheet1");
        driver.navigate().to("http://www.salesforce.com/in/?ir=1");
        driver.findElement(By.xpath(".//*[@id='button-login']")).click();
        driver.findElement(By.xpath(".//*[@id='username']")).sendKeys(sh.getRow(1).getCell(0).getStringCellValue());
        driver.findElement(By.xpath(".//*[@id='password']")).sendKeys(sh.getRow(1).getCell(1).getStringCellValue());
        driver.findElement(By.xpath(".//*[@id='Login']")).click();
    }

    @Test
    public void caseSF() throws InterruptedException 
    {
          driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
          sh = wb.getSheet("Sheet4");
          WebElement we;
          String str;
          we = driver.findElement(By.xpath(".//*[@id='tsidLabel']"));

          if(we.getText().equals("Sales")==false)
          {
            we.click();
            driver.findElement(By.xpath(".//*[@id='tsid-menuItems']/a[text()='Sales']")).click();
          }

            driver.findElement(By.xpath(".//*[@id='Case_Tab']/a")).click();
            driver.findElement(By.name("new")).click();
            driver.findElement(By.xpath(".//*[@id='cas3_lkwgt']/img")).click();
            Thread.sleep(10000);
            String mainwindow = driver.getWindowHandle();

            Set<String> winhandles = driver.getWindowHandles();
            System.out.println(winhandles.size());
            for(String st : winhandles)
            {
                System.out.println(st);
                driver.switchTo().window(st);
                Thread.sleep(5000);
                System.out.println(driver.getTitle());
            }
            /*
            Set<String> s = driver.getWindowHandles();
            Iterator<String> ite = s.iterator();
            while(ite.hasNext())
            {
                String popup = ite.next();
                if(!popup.equalsIgnoreCase(mainwindow))
                    driver.switchTo().window(popup);
            }
            */
            try
            {
                driver.switchTo().frame("resultsFrame");
                driver.findElement(By.linkText("Suresh Verma")).click();
                driver.switchTo().window(mainwindow);
                Thread.sleep(5000);
                str = driver.findElement(By.xpath(".//*[@id='cas4']")).getAttribute("value");
                System.out.println(str);
                try
                {
                    Assert.assertEquals(str, sh.getRow(2).getCell(2).getStringCellValue());
                }
                catch(Throwable e)
                {
                    System.out.println("Incorrect Account Name");
                }
            }
            catch(Exception e)
            {
                System.out.println("I am in catch block");
                driver.close();
                driver.switchTo().window(mainwindow);
                driver.findElement(By.xpath(".//*[@id='cas3']")).sendKeys(sh.getRow(2).getCell(1).getStringCellValue());
                driver.findElement(By.xpath(".//*[@id='cas4']")).sendKeys(sh.getRow(2).getCell(2).getStringCellValue());
            }

            we = driver.findElement(By.xpath(".//*[@id='cas5']"));
            we.click();
            Select se;
            se = new Select(we);
            se.selectByVisibleText(sh.getRow(2).getCell(3).getStringCellValue());

            we = driver.findElement(By.xpath(".//*[@id='cas6']"));
            se = new Select(we);
            we.click();
            se.selectByVisibleText(sh.getRow(2).getCell(4).getStringCellValue());

            we = driver.findElement(By.xpath(".//*[@id='cas7']"));
            se = new Select(we);
            we.click();
            se.selectByVisibleText(sh.getRow(2).getCell(5).getStringCellValue());

            we = driver.findElement(By.xpath(".//*[@id='cas8']"));
            se = new Select(we);
            we.click();
            se.selectByVisibleText(sh.getRow(2).getCell(6).getStringCellValue());

            we = driver.findElement(By.xpath(".//*[@id='cas11']"));
            se = new Select(we);
            we.click();
            se.selectByVisibleText(sh.getRow(2).getCell(7).getStringCellValue());

            we = driver.findElement(By.xpath(".//*[@id='00N9000000Ctc7c']"));
            se = new Select(we);
            we.click();
            se.selectByVisibleText(sh.getRow(2).getCell(8).getStringCellValue());

            we = driver.findElement(By.xpath(".//*[@id='00N9000000Ctc7b']"));
            se = new Select(we);
            we.click();
            se.selectByVisibleText(sh.getRow(2).getCell(9).getStringCellValue());

            driver.findElement(By.xpath(".//*[@id='00N9000000Ctc7a']")).sendKeys(sh.getRow(2).getCell(10).getStringCellValue());

            we = driver.findElement(By.xpath(".//*[@id='00N9000000Ctc7d']"));
            se = new Select(we);
            we.click();
            se.selectByVisibleText(sh.getRow(2).getCell(11).getStringCellValue());

            driver.findElement(By.xpath(".//*[@id='cas14']")).sendKeys(sh.getRow(2).getCell(12).getStringCellValue());
            driver.findElement(By.xpath(".//*[@id='cas15']")).sendKeys(sh.getRow(2).getCell(13).getStringCellValue());
            driver.findElement(By.xpath(".//*[@id='cas16']")).sendKeys(sh.getRow(2).getCell(14).getStringCellValue());

            if(sh.getRow(2).getCell(15).getStringCellValue().equalsIgnoreCase("Yes"))
                driver.findElement(By.xpath(".//*[@id='cas21']")).click();
            if(sh.getRow(2).getCell(16).getStringCellValue().equalsIgnoreCase("Yes"))
                driver.findElement(By.xpath(".//*[@id='cas22']")).click();

            driver.findElement(By.xpath(".//*[@id='bottomButtonRow']/input[1]")).click();
            Thread.sleep(3000);
            driver.findElement(By.xpath(".//span[text()='Details']")).click();

            Point pt = driver.findElement(By.xpath(".//*[@id='bodyTable']/tbody/tr/td/div/div[3]")).getLocation();
            ((JavascriptExecutor)driver).executeScript("window.scrollBy(0,"+pt.getY()+");");
            Thread.sleep(10000);

            driver.findElement(By.xpath(".//*[@id='topButtonRow']/input[4]")).click();

            Alert alert = driver.switchTo().alert();
            alert.accept();

            //driver.findElement(By.xpath(".//input[@name='cancel']")).click();

    }

    @AfterTest
    public void logout() throws InterruptedException 
    {
        driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
        driver.findElement(By.xpath(".//span[@id='userNavLabel']")).click();
        driver.findElement(By.xpath(".//a[text()='Logout']")).click();
        Thread.sleep(3000);
        driver.close();
    }

}

在 Firefox 中执行时显示的输出如下:

[TestNG] Running:
  C:\Users\psit\AppData\Local\Temp\testng-eclipse--1537148127\testng-customsuite.xml

2
{2cba4b8b-1677-425e-8d8c-a153c500d5a4}
Case Edit: New Case ~ salesforce.com - Developer Edition
{07c35b20-263d-4a1a-9e4e-c6a4be6e1162}
FAILED: caseSF
org.openqa.selenium.NoSuchWindowException: Unable to locate window "{07c35b20-263d-4a1a-9e4e-c6a4be6e1162}"
Command duration or timeout: 2.08 seconds
Build info: version: '2.44.0', revision: '76d78cf', time: '2014-10-23 20:03:00'
System info: host: 'USER2', ip: '192.168.1.102', os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.8.0_25'
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities [{applicationCacheEnabled=true, rotatable=false, handlesAlerts=true, databaseEnabled=true, version=34.0.5, platform=WINDOWS, nativeEvents=false, acceptSslCerts=true, webStorageEnabled=true, locationContextEnabled=true, browserName=firefox, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true}]
Session ID: 5e1ead01-1d29-4c4a-9821-729b1768547e
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:204)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:156)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:599)
    at org.openqa.selenium.remote.RemoteWebDriver$RemoteTargetLocator.window(RemoteWebDriver.java:882)
    at apache_poi.PoiExcelCase.caseSF(PoiExcelCase.java:79)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
    at org.testng.TestRunner.privateRun(TestRunner.java:767)
    at org.testng.TestRunner.run(TestRunner.java:617)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
    at org.testng.SuiteRunner.run(SuiteRunner.java:240)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
    at org.testng.TestNG.run(TestNG.java:1057)
    at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)
Caused by: org.openqa.selenium.NoSuchWindowException: Unable to locate window "{07c35b20-263d-4a1a-9e4e-c6a4be6e1162}"
Build info: version: '2.44.0', revision: '76d78cf', time: '2014-10-23 20:03:00'
System info: host: 'USER2', ip: '192.168.1.102', os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.8.0_25'
Driver info: driver.version: unknown
    at <anonymous class>.nsCommandProcessor.prototype.switchToWindow(file:///C:/Users/psit/AppData/Local/Temp/anonymous5017770494986140267webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:11725:19)
    at <anonymous class>.nsCommandProcessor.prototype.switchToWindow/<(file:///C:/Users/psit/AppData/Local/Temp/anonymous5017770494986140267webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:11729:9)


===============================================
    Default test
    Tests run: 1, Failures: 1, Skips: 0
===============================================


===============================================
Default suite
Total tests run: 1, Failures: 1, Skips: 0
===============================================

[TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@1192d32: 142 ms
[TestNG] Time taken by org.testng.reporters.XMLReporter@ed3ef1: 16 ms
[TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 15 ms
[TestNG] Time taken by org.testng.reporters.jq.Main@d17bee: 63 ms
[TestNG] Time taken by org.testng.reporters.EmailableReporter2@3534aa: 15 ms
[TestNG] Time taken by org.testng.reporters.JUnitReportReporter@16432db: 16 ms

最佳答案

请内联查找我的答案:

1 - 显示下拉菜单列表,指定的选项也突出显示,但随后单击/选择操作中止并选择默认值。

您先单击了下拉列表,然后尝试选择该项目,但您不需要执行此操作。只需创建 "Select class" 对象并使用 selectByVisibleText("text to be selected") 即可实现如下所示的效果(>只是从您的代码中摘录并根据需要进行修改)

        we = driver.findElement(By.xpath(".//*[@id='cas7']"));
        se = new Select(we);
        se.selectByVisibleText(sh.getRow(2).getCell(5).getStringCellValue());

2 - 对于弹出窗口,selenium 命令:“driver.switchTo().window(windowhandle)”不起作用。新的弹出窗口打开并生成窗口句柄,但显示的错误是“无法定位窗口 {window Handle String}”。

首先获取主窗口句柄,然后单击带来新窗口句柄的元素,并使用以下代码切换到新窗口(我刚刚修改了代码摘录)

        String mainwindow = driver.getWindowHandle();        
        driver.findElement(By.xpath(".//*[@id='cas3_lkwgt']/img")).click();//Assuming clicking on this element brings out the new window

        Set<String> s = driver.getWindowHandles(); 
        Iterator<String> ite = s.iterator(); 
        while(ite.hasNext()) 
        { 
            String popup = ite.next(); 
            if(!popup.equalsIgnoreCase(mainwindow)){ 
                driver.switchTo().window(popup); 
                break;
              }
        }

关于java - Selenium Webdriver 中的下拉菜单和切换到新窗口在 Firefox 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27520024/

相关文章:

javascript - 如何制作一个我可以包含在我的 backbone.js 项目中的配置文件

java - Swing 灯箱效果

java - 导航菜单项 "badge"垂直对齐

java - Cassandra 的节俭运输异常(exception)

Java ogg vorbis 编码

java - 面向 Java 开发人员的 eclipse IDE 上的 JSP

javascript - Shiny 如何阻止用户访问选项卡?

javascript - JqG​​rid 复选框通过功能启用/禁用

java - 导入 javax.annotation.* 无法在 Eclipse 的 Java 10 编译器中解析

android - 如何将文本从一个 Activity 发送到另一个 Activity ?