不清楚 driver.getWindowHandles() & driver.getWindowHandle()
Unclear about driver.getWindowHandles() & driver.getWindowHandle()
大家好,我正在学习 Selenium,我不太清楚以上两个函数是如何工作的:
问题陈述:
我有一个练习作业说:转到http://the-internet.herokuapp.com/
点击一个link>多个Windows一个Window打开>点击>>点击这里另一个Window打开>>从这个window抓取文本并打印 之后返回此 http://the-internet.herokuapp.com/windows 并打印文本。
Que1) 如果我使用 driver.getWindowHandle() 并为每个 window 打印它,它的值保持不变,所以此方法总是 returns parent window 或者它的工作方式不同。
Ques2) 当我使用 driver.getWindowHandles() 时,它是 returning 集合中的 2 个值。 driver.getWindowHandles() return parent window 也是如此。 (我不确定是否应该有 2 个或 3 个值,因为我有 3 个 URL,我认为该集合应该有 3 个)
问题 3) 有人可以分享使用多个 child window id 的最有效方法吗:
Set with iterator method
People also convert Set to Arraylist and then use get method. [which is a better way]
代码:
driver.get("http://the-internet.herokuapp.com/");
String p1=driver.getWindowHandle();
System.out.println(p1);
text1=driver.findElement(By.xpath("//a[@href='/windows']"));
text1.click();
WebElement
text2=driver.findElement(By.xpath("//a[@href='/windows/new']"));
text2.click();
Set<String> child=driver.getWindowHandles();
System.out.println(child.size());
ArrayList<String> children=new ArrayList<String>(child);
System.out.println(children);
driver.switchTo().window(children.get(1));
System.out.println(driver.findElement(By.xpath("//div[@class='example']/h3")).getText());
driver.close();
driver.switchTo().window(children.get(0));
System.out.println(driver.findElement(By.xpath("//div[@class='example']/h3")).getText());
driver.switchTo().window("");
System.out.println(driver.getCurrentUrl());
driver.close();
您可以在 documentation 中看到 getWindowHandle()
和 getWindowHandles()
方法之间的主要区别:
getWindowHandle()
: Return 此 window 的不透明句柄,可在此驱动程序实例中唯一标识它。
getWindowHandles()
: Return 一组 window 句柄,可用于通过将它们传递给 [=14] 来迭代此 WebDriver 实例的所有打开 windows =]
简单来说,driver.getWindowHandles()
存储同时打开的所有页面的句柄集,但 driver.getWindowHandle()
获取焦点所在网页的句柄。它获取活动浏览器的地址,它有一个 return 类型的字符串。
driver.get("http://the-internet.herokuapp.com/");
String p1=driver.getWindowHandle(); //Gets the newly opened and the only window handle
System.out.println("This is parent window handle " + p1);
text1=driver.findElement(By.xpath("//a[@href='/windows']"));
text1.click(); //Navigates, no new window opened. Handle remains the same
//WebElement 'Unnecessary code
text2=driver.findElement(By.xpath("//a[@href='/windows/new']"));
text2.click(); //opens second window/tab as per the settings. there are 2 window handles here for current driver instance
Set<String> child=driver.getWindowHandles(); //set of 2
System.out.println(child.size());
// ArrayList<String> children=new ArrayList<String>(child);' modifying this
String strSecondWindowHandle = "";
for(String str : s) // as set is not an ordered collection we need to loop through it to know which position holds which handle.
{
if(str.equalsIgnoreCase(p1) == false) //to check if the window handle is not equal to parent window handle
{
driver.switchTo().window(str) // this is how you switch to second window
strSecondWindowHandle = str;
break;
}
}
// System.out.println(children);
// driver.switchTo().window(children.get(1)); //not required
System.out.println(driver.findElement(By.xpath("//div[@class='example']/h3")).getText());
driver.close(); // now this will close the second window
driver.switchTo().window(p1); // switches to main window
System.out.println(driver.findElement(By.xpath("//div[@class='example']/h3")).getText());
// driver.switchTo().window(""); //not required as it is the same window
System.out.println(driver.getCurrentUrl());
driver.close(); //closes the main window
所以回答你的问题
Window 句柄由操作系统 (Windows) 自动唯一分配给每个新打开的 window
Q1 --> 除非您明确切换 windows,否则 window 句柄保持不变。切换是这里的关键。
Q2 --> 导航不会更改句柄。它不是特定于页面的,而是特定于 window 的。 getWindowHandles 将 return 当前 运行 WebDriver 实例打开的所有打开的浏览器 windows。已开放 windows 不包括在内。
Q3 --> 使用上面演示的for循环,你打开window,找到不是你父window句柄的ID,将其存储在变量中。对更多 windows.
重复此过程
大家好,我正在学习 Selenium,我不太清楚以上两个函数是如何工作的: 问题陈述:
我有一个练习作业说:转到http://the-internet.herokuapp.com/
点击一个link>多个Windows一个Window打开>点击>>点击这里另一个Window打开>>从这个window抓取文本并打印 之后返回此 http://the-internet.herokuapp.com/windows 并打印文本。
Que1) 如果我使用 driver.getWindowHandle() 并为每个 window 打印它,它的值保持不变,所以此方法总是 returns parent window 或者它的工作方式不同。
Ques2) 当我使用 driver.getWindowHandles() 时,它是 returning 集合中的 2 个值。 driver.getWindowHandles() return parent window 也是如此。 (我不确定是否应该有 2 个或 3 个值,因为我有 3 个 URL,我认为该集合应该有 3 个)
问题 3) 有人可以分享使用多个 child window id 的最有效方法吗:
Set with iterator method People also convert Set to Arraylist and then use get method. [which is a better way]
代码:
driver.get("http://the-internet.herokuapp.com/");
String p1=driver.getWindowHandle();
System.out.println(p1);
text1=driver.findElement(By.xpath("//a[@href='/windows']"));
text1.click();
WebElement
text2=driver.findElement(By.xpath("//a[@href='/windows/new']"));
text2.click();
Set<String> child=driver.getWindowHandles();
System.out.println(child.size());
ArrayList<String> children=new ArrayList<String>(child);
System.out.println(children);
driver.switchTo().window(children.get(1));
System.out.println(driver.findElement(By.xpath("//div[@class='example']/h3")).getText());
driver.close();
driver.switchTo().window(children.get(0));
System.out.println(driver.findElement(By.xpath("//div[@class='example']/h3")).getText());
driver.switchTo().window("");
System.out.println(driver.getCurrentUrl());
driver.close();
您可以在 documentation 中看到 getWindowHandle()
和 getWindowHandles()
方法之间的主要区别:
getWindowHandle()
: Return 此 window 的不透明句柄,可在此驱动程序实例中唯一标识它。
getWindowHandles()
: Return 一组 window 句柄,可用于通过将它们传递给 [=14] 来迭代此 WebDriver 实例的所有打开 windows =]
简单来说,driver.getWindowHandles()
存储同时打开的所有页面的句柄集,但 driver.getWindowHandle()
获取焦点所在网页的句柄。它获取活动浏览器的地址,它有一个 return 类型的字符串。
driver.get("http://the-internet.herokuapp.com/");
String p1=driver.getWindowHandle(); //Gets the newly opened and the only window handle
System.out.println("This is parent window handle " + p1);
text1=driver.findElement(By.xpath("//a[@href='/windows']"));
text1.click(); //Navigates, no new window opened. Handle remains the same
//WebElement 'Unnecessary code
text2=driver.findElement(By.xpath("//a[@href='/windows/new']"));
text2.click(); //opens second window/tab as per the settings. there are 2 window handles here for current driver instance
Set<String> child=driver.getWindowHandles(); //set of 2
System.out.println(child.size());
// ArrayList<String> children=new ArrayList<String>(child);' modifying this
String strSecondWindowHandle = "";
for(String str : s) // as set is not an ordered collection we need to loop through it to know which position holds which handle.
{
if(str.equalsIgnoreCase(p1) == false) //to check if the window handle is not equal to parent window handle
{
driver.switchTo().window(str) // this is how you switch to second window
strSecondWindowHandle = str;
break;
}
}
// System.out.println(children);
// driver.switchTo().window(children.get(1)); //not required
System.out.println(driver.findElement(By.xpath("//div[@class='example']/h3")).getText());
driver.close(); // now this will close the second window
driver.switchTo().window(p1); // switches to main window
System.out.println(driver.findElement(By.xpath("//div[@class='example']/h3")).getText());
// driver.switchTo().window(""); //not required as it is the same window
System.out.println(driver.getCurrentUrl());
driver.close(); //closes the main window
所以回答你的问题
Window 句柄由操作系统 (Windows) 自动唯一分配给每个新打开的 window
Q1 --> 除非您明确切换 windows,否则 window 句柄保持不变。切换是这里的关键。
Q2 --> 导航不会更改句柄。它不是特定于页面的,而是特定于 window 的。 getWindowHandles 将 return 当前 运行 WebDriver 实例打开的所有打开的浏览器 windows。已开放 windows 不包括在内。
Q3 --> 使用上面演示的for循环,你打开window,找到不是你父window句柄的ID,将其存储在变量中。对更多 windows.
重复此过程