2017-07-05 14 views
0

以下は、新しいページへのリンクをクリックした後に新しいウィンドウが開かれていることを確認するために、ウィンドウハンドルを使用している場所のコードです。上記のコードは、それが以下のエラー失敗していますで動作していないがWindowsハンドルSelelniumを使用したエラー

package pages; 

import java.io.IOException; 
import org.openqa.selenium.By; 
import org.testng.Assert; 
import org.testng.annotations.AfterMethod; 
import org.testng.annotations.Test; 

import appSetup_Maven.test.BaseClass; 

public class HelpCenter extends BaseClass { 

    @Test 
    public void Kb() throws IOException { 
     Login(); 
     driver.findElement(By.xpath(".//*[@id='wrapper']/div[1]/div[2]/div/div/ul/li[3]/a")).click(); 

     Object[] handle = driver.getWindowHandles().toArray(); 

     driver.findElement(By.xpath(".//*[@id='wrapper']/div[1]/div[2]/div/div/ul/li[3]/ul/li[4]/a")).click(); 
     driver.switchTo().window((String) handle[0]); 
     String URL = driver.getCurrentUrl(); 
     System.out.println(URL); 
     Assert.assertEquals(URL, "https://preprod.xyz.com/home"); 
     driver.switchTo().window((String) handle[1]); 
     driver.getTitle(); 
     Assert.assertEquals(URL, "https://kb.xyz.com/"); 
    } 

} 

- テストエンジニアとして

java.lang.ArrayIndexOutOfBoundsException: 1 
    at pages.HelpCenter.Kb(HelpCenter.java:25) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:108) 
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:661) 
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:869) 
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1193) 
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:126) 
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109) 
    at org.testng.TestRunner.privateRun(TestRunner.java:744) 
    at org.testng.TestRunner.run(TestRunner.java:602) 
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:380) 
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:375) 
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340) 
    at org.testng.SuiteRunner.run(SuiteRunner.java:289) 
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1301) 
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1226) 
    at org.testng.TestNG.runSuites(TestNG.java:1144) 
    at org.testng.TestNG.run(TestNG.java:1115) 
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132) 
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:230) 
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:76) 

答えて

0

を、私の最初のポイントは、エラーの意味を知ることと、それを引き起こしています。 IDEが提供するトレースバックを使用して簡単にデバッグすることができます。ドキュメントを参照し、失敗した理由をロジックに適用してください。

あなたのコードが表示されたら、例外はArrayIndexOutOfBoundsExceptionとなります。 Oracleからドキュメントあたりのように、これは彼らがおよそArrayIndexOutOfBoundsException

配列が不正なインデックスを使ってアクセスされたことを示すためにスローさ言うことです。インデックスは負または配列のサイズ以上です。

そして、その後、あなたのトレースバック、提案し、これはあなたが作成した配列が要素を持っていないコード

 driver.switchTo().window((String) handle[1]); 

のこの作品に示したラインで25

 at pages.HelpCenter.Kb(HelpCenter.java:25) 

ですインデックス1にあるため、このエラーがスローされます。

の理由が挙げられる -

  1. あなたはwebdriverをウィンドウを認識するのに十分な時間を与えていません。ウィンドウに切り替える前に、web要素をクリックした後にWaitを追加することをお勧めします。

  2. Objectアレイを使用してウィンドウを取得します。あなたはオブジェクトの配列を取得して、これをStringに変換し直していますか?何故ですか?オブジェクトに変換する必要がない限り、私はあなたがオブジェクトの配列を必要とは思わない。ウィンドウハンドル自体には単にStringを使用できます。コードを単純化してみてください。

あなたはここに

 String parentWindowHandler = driver.getWindowHandle(); 
     String subWindowHandler = null; 

     Set<String> handles = driver.getWindowHandles(); 
     Iterator<String> iterator = handles.iterator(); 
     while (iterator.hasNext()) 
    { 
     subWindowHandler = iterator.next(); 
     driver.switchTo().window(subWindowHandler); 

     System.out.println(subWindowHandler); 
     } 


     driver.switchTo().window(parentWindowHandler); 

のようなものを使用することができますIndexOutOfBoundsExceptionに優れた記事です。

+0

ソリューションと洞察に感謝します。 –

関連する問題