嗨,我正在学习Selenium&我不太清楚上面两个函数是如何工作的:问题陈述:
我有一个练习作业:转到http://the-internet.herokuapp.com/
单击链接>多个窗口一个窗口打开>单击>>单击此处另一个窗口打开>>从该窗口获取文本并打印,然后返回http://the-internet.herokuapp.com/Windows并打印文本。
流程:http://the-internet.herokuapp.com/>>>http://the-internet.herokuapp.com/windows>>>http://the-internet.herokuapp.com/windows/new
Que1)如果我使用Driver.getWindowHandle()并为每个窗口打印它,它的值保持不变,那么这个方法是否总是返回父窗口,或者它的工作方式不同。
Ques2)当我使用driver.getWindoWhandles()时,它会返回集合中的2个值。driver.getWindoWhandles()是否也会返回父窗口。(我不确定应该有2个还是3个值,因为我有3个URL,我认为集合应该有3个)
Ques3)有人能分享使用多个子窗口ID的最有效方法吗:
使用迭代器方法Set人们还将Set转换为Arraylist然后使用get方法。[哪种方式更好]
代码:
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();
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
为了回答你的问题
窗口句柄由操作系统(Windows)自动且唯一地分配给每个新打开的窗口
Q1-->除非您明确地切换窗口,否则窗口句柄将保持不变。切换是这里的关键。
Q2-->导航不会改变句柄。它不是特定于页面的,而是特定于窗口的。getWindowHandles将返回当前正在运行的WebDriver实例打开的所有打开的浏览器窗口。已经打开的窗口不包括在内。
Q3-->使用上面演示的for循环,打开窗口,找到不是父窗口句柄的ID,并将其存储在一个变量中。对更多窗口重复此过程。
我有一个badtokenexception的报告,尽管我尝试了任何事情,但我无法复制它,对我来说也不清楚它是如何发生的。 BadTokenException(@Android.view.viewrootimpl:setView:575)通过(@Android.view.WindowmanagerGlobal:AddView:272)完整跟踪:Android.view.Windowmanager$B
我只是在尝试学习如何将基于intellij构建的java应用程序打包并安装到PC上。 我使用“C:\ProgramFiles(x86)\OpenJava\openjdk-15.0.2\U windows-x64\U bin\jdk-15.0.2”在intellij中构建了hello world,并在开发环境中运行。 如果我理解Launch4j,我可以在JRE选项卡中指定捆绑的JRE,这样我就不依赖
我已经开始做一个JavaFX项目,并且我已经按照这个问题中的设置说明进行了操作:IntelliJ无法使用VSCode识别JavaFX11和OpenJDK11。我用的是苹果笔记本电脑。 到了最后一部分,我要用settings.json和launch.json设置东西。我尽可能严格地按照说明操作,但错误:
我试图理解spark 3中的新特性:动态分区修剪。 看看这个测试: https://github.com/apache/spark/blob/master/sql/core/src/test/scala/org/apache/spark/sql/DynamicPartitionPruningSuite.scala#L257 我不明白为什么它是动态的并且要经典的修剪? 谢谢
当我尝试重新绘制透明窗口并在其上绘制矩形时,之前的矩形将保留。目标是通过单击并移动鼠标在屏幕上选择一个区域。如果你移动鼠标一会儿,它会看起来像这样 通过去除透明度,效果很好。 我尝试了在Stack Overflow上找到的关于这个主题的所有内容,但我无法让它在Windows和Linux上运行。 谢谢:)