关于selenium:Selenium帮助你轻松实现浏览器多窗口操作
<article class=“article fmt article-content”><p></p><h3>多窗口解决</h3><h3>简介</h3><p>元素有属性,浏览器的窗口其实也有属性的,浏览器窗口的属性用句柄(handle)来辨认。</p><p>每个窗口都有一个惟一的窗口句柄,该句柄在窗口创立时由操作系统调配,窗口句柄通常在窗口的生命周期内放弃不变,但在某些状况下,例如窗口敞开后,句柄可能被销毁,并且操作系统能够在当前将雷同的句柄调配给其余窗口。</p><p>当浏览器关上一个窗口时,如果要在新的窗口操作就须要句柄切换。</p><h3>获取以后窗口的窗口句柄</h3><p>如果你关上了一个新的标签页或窗口,Selenium 容许应用窗口句柄来解决它,每个窗口都有一个惟一的标识符,能够应用<code>current_window_handle</code>办法取得以后窗口的窗口句柄:</p><p><strong>Python 实现</strong></p><pre><code class=“python”>def test_current_window_handle(): driver = webdriver.Chrome() driver.get(“https://vip.ceshiren.com/#/ui_study/frame") # 存储窗口的 ID original_window = driver.current_window_handle print(original_window) # 查看没有关上其余的窗口 assert len(driver.window_handles) == 1</code></pre><p><strong>Java 实现</strong></p><pre><code class=“java”>WebDriverdriver=newChromeDriver();driver.get(“https://ceshiren.com”);//获取以后浏览器权柄Stringoriginal_window=driver.getWindowHandle();System.out.println(original_window);Thread.sleep(2000);// 查看没有关上其余的窗口assertdriver.getWindowHandles().size()==1;driver.close();//敞开浏览器过程driver.quit();</code></pre><p><strong>打印出的 window_handle:</strong></p><pre><code class=“python”>7762778B33FADD8682327EACA2F80119</code></pre><h3>获取所有窗口的窗口句柄</h3><p>当有多个窗口时,能够用 <code>window_handles</code> 获取所有窗口的窗口句柄。</p><p><strong>Python 实现</strong></p><pre><code class=“python”>def test_window_handles(): driver = webdriver.Chrome() driver.get(“https://vip.ceshiren.com/#/ui_study/frame") # 关上一个新的窗口 driver.find_element(By.XPATH,’//[text()=“关上新窗口”]’).click() # 获取所有窗口句柄 original_window = driver.window_handles print(original_window) # 检查一下,只关上了两个窗口 assert len(original_window) == 2</code></pre><p><strong>Java 实现</strong></p><pre><code class=“python”>WebDriverdriver=newChromeDriver();driver.get(“https://ceshiren.com”);//获取以后浏览器权柄Stringoriginal_window=driver.getWindowHandle();System.out.println(original_window);//关上一个新的窗口driver.get(“https://vip.ceshiren.com/#/ui_study/frame")Thread.sleep(2000);// 查看是否关上了两个窗口assertdriver.getWindowHandles().size()==2;driver.close();//敞开浏览器过程driver.quit();</code></pre><p><strong>打印出的 window_handles:</strong></p><pre><code class=“python”>[‘019339C5C2952823653FFED6A90996B0’,‘5ED0721936240AD5FBDEA01B9F79EA61’]</code></pre><h3>切换窗口或标签页</h3><p>在进行 Web 自动化测试过程中,会遇到关上新窗口或新标签页的状况,但 WebDriver 不晓得操作系统认为哪个窗口是流动的。要应用新窗口,须要先切换到新窗口。通过打印 window_handles 能够看出,它是一个列表。</p><p>如果只有两个选项卡或窗口被关上,并且你晓得从哪个窗口开始,则你能够遍历 WebDriver,通过排除法能够看到两个窗口或选项卡,而后通过 <code>switch_to.window() </code>切换到你须要的窗口或选项卡。</p><p></p><p>从下面源代码中的阐明能够看出,<code>switch_to.window()</code> 须要提供一个 <code>window_name</code>,能够是 name 也能够是 <code>window_handle</code>。</p><p><strong>Python 实现</strong></p><pre><code class=“python”>def test_handle(): # 启动驱动程序 driver = webdriver.Chrome() # 关上网址 driver.get(“https://vip.ceshiren.com/#/ui_study/frame") # 设置期待 wait = WebDriverWait(driver, 10) # 存储原始窗口的 ID original_window = driver.current_window_handle print(original_window) # 查看没有关上其余的窗口 assert len(driver.window_handles) == 1 # 单击在新窗口中关上的链接 driver.find_element(By.XPATH, “//[text()=‘关上新窗口’]”).click() # 循环遍历所有窗口句柄 for window_handle in driver.window_handles: # 查看以后窗口句柄是否等于 original_window,如果不等于,阐明找到了新的窗口 if window_handle != original_window: # 切换到新的窗口 driver.switch_to.window(window_handle) # 这里能够执行新窗口中的操作 print(driver.current_window_handle) # 此时有两个关上的窗口 assert len(driver.window_handles) == 2</code></pre><p><strong>Java 实现</strong></p><pre><code class=“java”>WebDriverdriver=newChromeDriver();driver.get(“https://vip.ceshiren.com/#/ui_study/frame");// 存储原始窗口的IDStringoriginalWindow=driver.getWindowHandle();System.out.println(“Original window handle: “+originalWindow);// 查看没有关上其余的窗口assertdriver.getWindowHandles().size()==1:“Expected only one window”;// 单击在新窗口中关上的链接driver.findElement(By.xpath(”//*[text()=‘关上新窗口’]”)).click();// 循环遍历所有窗口句柄Set<String>windowHandles=driver.getWindowHandles();for(StringwindowHandle:windowHandles){// 查看以后窗口句柄是否等于 original_window,如果不等于,阐明找到了新的窗口if(!windowHandle.equals(originalWindow)){// 切换到新的窗口driver.switchTo().window(windowHandle);// 这里能够执行新窗口中的操作}}System.out.println(driver.getWindowHandle());// 此时有两个关上的窗口assertdriver.getWindowHandles().size()==2:“Expected two windows”;driver.quit();</code></pre><p>当然也能够通过<code>driver.switch_to.window(driver.window_handles[-1])</code>来实现句柄的切换。</p><h3>创立新窗口或新标签并切换</h3><p>创立一个新窗口或新标签页,屏幕焦点将汇集在新窗口或标签页上,不须要切换到窗口或标签页。如果除了新窗口之外,还关上了两个以上的窗口或标签页,就能够通过遍历 WebDriver 看到两个窗口或选项卡,并切换到非原始窗口。</p><p><strong>Python 实现</strong></p><pre><code class=“python”>def test_new_handle(): driver = webdriver.Chrome() driver.get(“https://vip.ceshiren.com/#/ui_study/frame") sleep(2) # 关上新标签页并切换到新标签页 driver.switch_to.new_window(’tab’) sleep(2) # 关上一个新窗口并切换到新窗口 driver.switch_to.new_window(‘window’) sleep(2)</code></pre><p><strong>Java 实现</strong></p><pre><code class=“java”>WebDriverdriver=newChromeDriver();driver.get(“https://vip.ceshiren.com/#/ui_study/frame");// 关上新标签页并切换到新标签页driver.switchTo().newWindow(WindowType.valueOf(“tab”));try{TimeUnit.SECONDS.sleep(2);}catch(InterruptedExceptione){e.printStackTrace();}// 关上一个新窗口并切换到新窗口driver.switchTo().newWindow(WindowType.valueOf(“window”));try{TimeUnit.SECONDS.sleep(2);}catch(InterruptedExceptione){e.printStackTrace();}driver.quit();</code></pre><h3>总结</h3><p>每关上了一个新的标签页或窗口,Selenium 容许应用窗口句柄来解决它,每个窗口都有一个惟一的标识符,通过不同的句柄能够操纵不同的页面窗口。</p><p>获取更多软件测试技术材料/面试题解析,请点击!</p><p></p></article> ...