selenium-webdriver 關於測試新打開頁面報錯解決辦法

先看一下,從selenium IDE 導出的測試代碼

package com.test;

import static org.junit.Assert.fail;

import java.util.concurrent.TimeUnit;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;

public class JustForCSDN {
  private WebDriver driver;
  private String baseUrl;
  private StringBuffer verificationErrors = new StringBuffer();

  @Before
  public void setUp() throws Exception {
    driver = new FirefoxDriver();
    baseUrl = "http://www.yourSite.com/";
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
  }

  @Test
  public void testJustForCSDN() throws Exception {
    driver.get(baseUrl + "/");
    driver.findElement(By.id("user_name")).clear();
    driver.findElement(By.id("user_name")).sendKeys("test");
    driver.findElement(By.cssSelector("div.loginbtn")).click();
    driver.findElement(By.id("password")).clear();
    driver.findElement(By.id("password")).sendKeys("test");
    driver.findElement(By.id("myBuild_list")).click();
    driver.findElement(By.xpath("//div[@onclick='add_build()']")).click();
    // ERROR: Caught exception [ERROR: Unsupported command [waitForPopUp |  | 30000]]
    driver.findElement(By.id("xmjl")).clear();
        driver.findElement(By.id("xmjl")).sendKeys("RindyRRRRR");
        driver.findElement(By.id("abb")).clear();
        driver.findElement(By.id("abb")).sendKeys("RRRR");
        new Select(driver.findElement(By.id("area")))
                .selectByVisibleText("閘北區");
        driver.findElement(By.id("detail_address")).clear();
        driver.findElement(By.id("detail_address")).sendKeys("xxxx");
  }

  @After
  public void tearDown() throws Exception {
    driver.quit();
    String verificationErrorString = verificationErrors.toString();
    if (!"".equals(verificationErrorString)) {
      fail(verificationErrorString);
    }
  }


}

中間有段被註釋了的error :

**// ERROR: Caught exception [ERROR: Unsupported command [waitForPopUp |  | 30000]]**

我以爲是這個新打開的頁面加載的時間太慢了,selenium 執行太快,所以檢測不到這個頁面上的一些元素,所以每次運行junit 都會報錯

org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"id","selector":"user_name"}
Command duration or timeout: 30.57 seconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '2.52.0', revision: '4c2593cfc3689a7fcd7be52549167e5ccc93ad28', time: '2016-02-11 11:22:43'
System info: host: 'RindyPC', ip: '10.0.1.122', os.name: 'Windows 8', os.arch: 'x86', os.version: '6.2', java.version: '1.7.0_13'
*** Element info: {Using=id, value=user_name}
Session ID: 54bb886b-39a5-4b54-8131-90b7719ac284
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities [{platform=WINDOWS, acceptSslCerts=true, javascriptEnabled=true, cssSelectorsEnabled=true, databaseEnabled=true, browserName=firefox, handlesAlerts=true, nativeEvents=false, webStorageEnabled=true, rotatable=false, locationContextEnabled=true, applicationCacheEnabled=true, takesScreenshot=true, version=39.0.3}]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:678)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:363)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementById(RemoteWebDriver.java:413)
    at org.openqa.selenium.By$ById.findElement(By.java:218)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:355)
    at com.dev.fangxinjia.JustForCSDN.testJustForCSDN(JustForCSDN.java:30)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"id","selector":"user_name"}
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '2.52.0', revision: '4c2593cfc3689a7fcd7be52549167e5ccc93ad28', time: '2016-02-11 11:22:43'
System info: host: 'RindyPC', ip: '10.0.1.122', os.name: 'Windows 8', os.arch: 'x86', os.version: '6.2', java.version: '1.7.0_13'
Driver info: driver.version: unknown
    at <anonymous class>.FirefoxDriver.prototype.findElementInternal_(file:///C:/Users/Rindy/AppData/Local/Temp/anonymous7502933304520874302webdriver-profile/extensions/[email protected]/components/driver-component.js:10723)
    at <anonymous class>.fxdriver.Timer.prototype.setTimeout/<.notify(file:///C:/Users/Rindy/AppData/Local/Temp/anonymous7502933304520874302webdriver-profile/extensions/[email protected]/components/driver-component.js:623)

一大段報錯,弄得人都煩了。
然後各種根據trace去百度解決方案,加上各種看selenium- webdriver的文檔,之前就是看了一點小知識就開始照着網上一些前輩寫的例子練習,沒有仔細看過,沒想到測試網站的時候,就各種報錯了,還是要拿着文檔好好看啊。修改後的代碼如下:

package com.test;

import static org.junit.Assert.fail;

import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;

public class JustForCSDN {
  private WebDriver driver;
  private String baseUrl;
  private StringBuffer verificationErrors = new StringBuffer();

  @Before
  public void setUp() throws Exception {
    driver = new FirefoxDriver();
    baseUrl = "http://www.yourSite.com/";
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
  }

  @Test
  public void testJustForCSDN() throws Exception {
    driver.get(baseUrl + "/");
    driver.findElement(By.id("user_name")).clear();
    driver.findElement(By.id("user_name")).sendKeys("test");
    driver.findElement(By.cssSelector("div.loginbtn")).click();
    driver.findElement(By.id("password")).clear();
    driver.findElement(By.id("password")).sendKeys("test");
    driver.findElement(By.id("myBuild_list")).click();
    driver.findElement(By.xpath("//div[@onclick='add_build()']")).click();
    // ERROR: Caught exception [ERROR: Unsupported command [waitForPopUp |  | 30000]]
    String currentWindow = driver.getWindowHandle();// 獲取當前窗口句柄
    Set<String> handles = driver.getWindowHandles();// 獲取所有窗口句柄
    Iterator<String> it = handles.iterator();
    while (it.hasNext()) {
        if (currentWindow == it.next()) {
            continue;
        }
        driver = driver.switchTo().window(it.next());// 切換到新窗口

        //添加工地
        driver.findElement(By.id("xmjl")).clear();
        driver.findElement(By.id("xmjl")).sendKeys("RindyRRRRR");
        driver.findElement(By.id("abb")).clear();
        driver.findElement(By.id("abb")).sendKeys("RRRR");
        new Select(driver.findElement(By.id("area")))
                .selectByVisibleText("閘北區");
        driver.findElement(By.id("detail_address")).clear();
        driver.findElement(By.id("detail_address")).sendKeys("xxxx");
    }
    //driver.switchTo().window(currentWindow);//回到原來頁面
  }

  @After
  public void tearDown() throws Exception {
    driver.quit();
    String verificationErrorString = verificationErrors.toString();
    if (!"".equals(verificationErrorString)) {
      fail(verificationErrorString);
    }
  }


}

這裏放上前輩的解釋:

**在上面的代碼裏,使用 windowhandle 方法來獲取當前瀏覽器窗口的句柄,使用了
windowhandles 方法獲取所有彈出的瀏覽器窗口的句柄,然後通過排除當前句柄的
方法來得到新開窗口的句柄。
在獲取新彈出窗口的句柄後,使用 switchto.window(newwindow_handle)方法,將新
窗口的句柄作爲參數傳入既可捕獲到新窗口了。**

好了,如果你也遇到這個問題,趕緊去試試解決辦法吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章