【问题标题】:Dropdown Menu and switch to new Window in Selenium Webdriver not working in FirefoxSelenium Webdriver 中的下拉菜单和切换到新窗口在 Firefox 中不起作用
【发布时间】:2015-02-15 16:08:50
【问题描述】:

我正在尝试通过我在 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)”不起作用。新的弹出窗口打开并生成窗口句柄,但显示的错误是“无法找到窗口 {window Handle String}”。

如果它在其他浏览器中运行良好,我无法弄清楚为什么它无法通过窗口句柄定位窗口并在 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

【问题讨论】:

    标签: java javascript eclipse firefox selenium


    【解决方案1】:

    请在线查找我的答案:

    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;
                  }
            }
    

    【讨论】:

    • 谢谢 Subh....点击选择元素是 Firefox 出现问题的原因。在第二期中,我尝试了相同的 while 循环,但缺少一个中断。有时小错误很难被发现,整个程序就会卡住。
    • @DeepakDave : 确实如此.. 这就是为什么我们不断练习以避免他们.. 干杯.. :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 2016-08-22
    相关资源
    最近更新 更多