使用 Windows 句柄 Selenium 时出错
Error using Windows Handle Selelnium
下面是我使用 windows 句柄来验证 url 新 window 在单击 link 进入新页面后打开的代码.
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)
作为一名测试工程师,我的第一点是了解错误的含义和原因。使用 IDE 提供的回溯可以很容易地调试它。您应该参考文档,然后尝试应用失败的逻辑。
现在,如果我看到你的代码,它就会出现异常 ArrayIndexOutOfBoundsException
。根据 Oracle 的文档,这就是他们对 ArrayIndexOutOfBoundsException
的看法
Thrown to indicate that an array has been accessed with an illegal index. The index is either negative or greater than or equal to the size of the array.
然后你的回溯表明,这是在第 25 行
at pages.HelpCenter.Kb(HelpCenter.java:25)
表示这段代码
driver.switchTo().window((String) handle[1]);
您创建的数组在索引 1 处没有元素,因此会引发此错误。
原因可能包括-
您没有给 WebDriver 足够的时间来识别 window。我建议您在单击网络元素后添加一个 Wait
,然后再切换到 window.
使用 Object
数组获取 windows。您正在获取一个对象数组,然后将其转换回字符串?这是为什么?除非需要转换为对象,否则我认为您不需要对象数组。您可以简单地使用 String
作为 window 句柄本身。尝试简化您的代码。
你可以使用像
这样的东西
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);
IndexOutOfBoundsExceptionpost[=]。
下面是我使用 windows 句柄来验证 url 新 window 在单击 link 进入新页面后打开的代码.
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)
作为一名测试工程师,我的第一点是了解错误的含义和原因。使用 IDE 提供的回溯可以很容易地调试它。您应该参考文档,然后尝试应用失败的逻辑。
现在,如果我看到你的代码,它就会出现异常 ArrayIndexOutOfBoundsException
。根据 Oracle 的文档,这就是他们对 ArrayIndexOutOfBoundsException
Thrown to indicate that an array has been accessed with an illegal index. The index is either negative or greater than or equal to the size of the array.
然后你的回溯表明,这是在第 25 行
at pages.HelpCenter.Kb(HelpCenter.java:25)
表示这段代码
driver.switchTo().window((String) handle[1]);
您创建的数组在索引 1 处没有元素,因此会引发此错误。
原因可能包括-
您没有给 WebDriver 足够的时间来识别 window。我建议您在单击网络元素后添加一个
Wait
,然后再切换到 window.使用
Object
数组获取 windows。您正在获取一个对象数组,然后将其转换回字符串?这是为什么?除非需要转换为对象,否则我认为您不需要对象数组。您可以简单地使用String
作为 window 句柄本身。尝试简化您的代码。
你可以使用像
这样的东西 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);
IndexOutOfBoundsExceptionpost[=]。