日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

selenium--driver.switchTo()

發布時間:2023/11/27 生活经验 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 selenium--driver.switchTo() 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在自動化測試中,會遇到多窗口、多iframe、多alert的情況。此時,會使用driver.switchTo()來解決。

下面時關于driver.switchTo()的詳細介紹:

1.多windows操作。

在頁面A上操作時,點擊某個元素之后,可能會打開新的窗口。如果需要操作新窗口上的元素,進必須跳轉到新的窗口上。

    @Testpublic void fTest() throws InterruptedException {//launchBrowser是自己封裝的方法 ,主要是為了啟動瀏覽器驅動,打開指定url,頁面加載的等待超時時間設置為3S
     //這里測試使用的是qq郵箱的登錄頁面
launchBrowser("https://mail.qq.com/cgi-bin/loginpage", 3);//定位并點擊“手機版”元素,打開手機版頁面,此時會打開新的窗口driver.findElement(By.partialLinkText("手機版")).click();Thread.sleep(3000);//獲取當前窗口句柄(此時是獲得https://mail.qq.com/cgi-bin/loginpage頁面的句柄)String currentHandle = driver.getWindowHandle();//獲得所有的窗口句柄,如果不是currentHandle,則進入Set<String> windowHandles = driver.getWindowHandles();for (String windowHandle : windowHandles) {if (!currentHandle.equals(windowHandle) ) {//進入到手機版頁面的窗口 driver.switchTo().window(windowHandle);}}//此時才能操作手機版頁面的元素driver.findElement(By.cssSelector("a[href='http://app.mail.qq.com/cgi-bin/appdownload?check=false&stype=1&subtype=8&fr=&url=ios&downloadclick=']")).click();;

      //如果想要操作qq郵箱登錄頁面的元素,此時需要退回到之前的窗口
      driver.switchTo().window(currentHandle);

         }

上面是通過switchTo()方法,進入新的頁面,并操作對應元素。

還有另為一種方式:

<a href="http://app.mail.qq.com/" target="_blank">手機版</a>

我們點擊鏈接之后,打開新的窗口,就是因為這個鏈接中有屬性?target="_blank"

所以,我們可以通過JQuery腳本來去除該元素的target的屬性。去除之后再點擊的時候,就不會打開新的瀏覽器窗口了。

這個qq郵箱的頁面http://app.mail.qq.com/,首次執行JQuery會失敗,第二次會成功。猜測可能是因為第一次執行之后,會觸發引入jQuery的操作。為了使代碼具有通用性,直接引入jQuery。

但是很多安全性高一些的網站,會限制引入的域名地址。會造成引入JQuery失敗。為了解決該問題,教大家一個萬能的方法:下載某頁面的JQuery源代碼,放到本地文件中。封裝讀取并執行JQuery的幫助類。

幫助類代碼:

package com.claire.jing.utils;import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;import org.openqa.selenium.JavascriptExecutor;public class ImportJQueryUtil {public static void importJQueryUtil(JavascriptExecutor jse) {StringBuffer buffer = new StringBuffer();FileInputStream inputStream = null;try {inputStream = new FileInputStream("F:\\開發資料\\jQuery源碼\\jquery-1.10.2.min.js");} catch (FileNotFoundException e) {// TODO Auto-generated catch block
            e.printStackTrace();}InputStreamReader reader = new InputStreamReader(inputStream);BufferedReader bufferedReader = new BufferedReader(reader);String temp=null;try {while ((temp = bufferedReader.readLine()) !=null) {buffer.append(temp);}} catch (IOException e) {// TODO Auto-generated catch block
            e.printStackTrace();}jse.executeScript(buffer.toString());}}

使用JQuery來刪除元素指定屬性

@Testpublic void fTest() throws InterruptedException {//方式2:使用JQuery來刪除target="_blank"//launchBrowser是自己封裝的方法 ,主要是為了啟動瀏覽器驅動,打開指定url,頁面加載的等待超時時間設置為3SlaunchBrowser("https://mail.qq.com/cgi-bin/loginpage", 20);//該js腳本判斷是否引入了JQueryString js = "return (typeof($)==\"undefined\")";boolean flag = (boolean)((JavascriptExecutor)driver).executeScript(js);//如果沒引入,則調用幫助類,執行JQuery源碼。//這里之所以不使用直接增加Script節點引入JQuery,是因為很多安全性高一些的網站,會限制引入的域名地址。會造成引入JQuery失敗if (flag) {ImportJQueryUtil.importJQueryUtil((JavascriptExecutor)driver);            }//這里可以判斷下,是否引入成功了//System.out.println((boolean)((JavascriptExecutor)driver).executeScript(js));//<a href="http://app.mail.qq.com/" target="_blank">手機版</a>//該a鏈接帶有屬性target="_blank"--擁有該屬性的鏈接,點擊后才會打開新的頁面。只要通過js來移除該屬性,點擊之后,就不會打開新的瀏覽器窗口了String jquery = "var com=$('a[href=\"http://app.mail.qq.com/\"]');"+ "com.removeAttr(\"target\");"+ "com[0].click();";((JavascriptExecutor)driver).executeScript(jquery);//觀察一下執行結果Thread.sleep(4000);quit();}

2.Iframe

有些頁面元素時包在IFrame中的,此時想要操作Iframe上的元素,必須先進入Iframe里面去。

?下面舉例多層iframe嵌套的情況:

    @Testpublic void fTest() throws InterruptedException {launchBrowser("http://XXX/index.html", 10);//為了不需要每次都登錄,可以設置添加cookie()driver.manage().deleteCookieNamed("JSESSIONID");driver.manage().addCookie(new Cookie("qqq", "BD04BA5FA2019D6C9DB28E25A5B14D85"));try {//為了cookie使用的久一些,可以設置cookie的有效期。//即使這里設置了cookie有效期,cookie也是有可能會無效的(一般情況下,會將sessionId存到cookie中)://第一:服務端的session是有有效期的,如果session過期了,那么這個cookie也就無效了。//第二,當服務端的內存報警時,就可能會清除session。這種情況下,你的cookie也會失效//第三,當服務端重啟之后,緩存和session都會清空的,你的cookie自然就失效了driver.manage().addCookie(new Cookie("JSESSIONID", "FB9F06DDF0D15C491EFAD6D444893F80","/lmcanon_web_auto",(new SimpleDateFormat("yyyy-MM-dd hh:m:ss")).parse("2018-12-12 12:12:12") ));} catch (ParseException e) {logger.error("日期轉換出錯");e.printStackTrace();}driver.get("http://XXX/index.html");logger.info("成功打開首頁");driver.findElement(By.cssSelector("i[class=\"Hui-iconfont menu_dropdown-arrow\"]")).click();logger.info("成功定位習題管理,并點擊");//定位習題管理子標簽,該標簽是需要點擊父標簽習題管理之后,才會可見的。//下面使用了ExpectedConditions中提供的visibilityOfElementLocated()來判斷該字標簽是否可見,可見之后才對其進行點擊操作WebDriverWait wait = new WebDriverWait(driver, 3);            wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("a[data-href=\"stem-list.html\"]"))).click();logger.info("成功定位子元素習題管理并點擊");//想要點擊“添加習題”按鈕,發現該按鈕在iframe中,必須先進入iframe才能定位并操作該元素WebElement IframeElement = waitElement(By.cssSelector("iframe[src='stem-list.html']"));driver.switchTo().frame(IframeElement);logger.info("成功進入第一層Iframe,并進入");driver.findElement(By.cssSelector("a[class=\"btn btn-primary radius\"]")).click();logger.info("成功定位第一層frame內的添加習題按鈕并點擊");//嵌套iframe情況,想要點擊添加習題彈窗上的元素,就必須進入第二層iframe//進入第二層Iframe//首先定位第二層iframe <iframe scrolling="auto" allowtransparency="true" id="layui-layer-iframe2" name="layui-layer-iframe2" οnlοad="this.className='';" class="" frameborder="0" src="./stemAndItem-add.html" style="height: 467px;"></iframe>WebElement iframe2 = driver.findElement(By.id("layui-layer-iframe2"));driver.switchTo().frame(iframe2);logger.info("成功進入第二層iframe");//定位第二層iframe的元素//<select class="select valid" name="subjectType" aria-required="true" aria-invalid="false"><option value="0">--請選擇--</option><option value="1">軟件測試基礎</option><option value="2">mysql數據庫</option><option value="3">linux</option><option value="4">java</option></select>WebElement subjectType = driver.findElement(By.cssSelector("select[name=\"subjectType\"]"));Select select = new Select(subjectType);select.selectByIndex(2);logger.info("成功定位第二層iframe內的題目領域元素,并選擇為mysql數據庫");//退出當前iframe-----注意:下面方法是退回到的top window 層
        driver.switchTo().defaultContent();logger.info("成功退回到first frame.");//操作topWindow上的元素,證明成功退回driver.findElement(By.cssSelector("i[class=\"Hui-iconfont menu_dropdown-arrow\"]")).click();logger.info("成功定位習題管理,并點擊");}

?

3.alert操作

其實現在前臺系統中的alert頁面越來越少了。因為它的體驗不是很好。但是在一些后臺系統中,還是會遇到alert操作。Alert彈窗分三種,Alert,prompt(需要輸入內容的彈窗),confirm


1. alert() 彈出個提示框 (確定)?
警告消息框 alert 方法有一個參數,即希望對用戶顯示的文本字符串。該字符串不是 HTML 格式。該消息框提供了一個“確定”按鈕讓用戶關閉該消息框,并且該消息框是模式對話框,也就是說,用戶必須先關閉該消息框然后才能繼續進行操作。

?

2. confirm() 彈出個確認框 (確定,取消)?
確認消息框 使用確認消息框可向用戶問一個“是-或-否”問題,并且用戶可以選擇單擊“確定”按鈕或者單擊“取消”按鈕。confirm 方法的返回值為 true 或 false。該消息框也是模式對話框:用戶必須在響應該對話框(單擊一個按鈕)將其關閉后,才能進行下一步操作。

?

3. prompt() 彈出個輸入框(確定,取消)。

如果用戶單擊提示框的取消按鈕,則返回 null。如果用戶單擊確認按鈕,則返回輸入字段當前顯示的文本。

在用戶點擊確定按鈕或取消按鈕把對話框關閉之前,它將阻止用戶對瀏覽器的所有輸入。在調用 prompt() 時,將暫停對 JavaScript 代碼的執行,在用戶作出響應之前,不會執行下一條語。

?

    @Testpublic void fTest() throws InterruptedException {launchBrowser("D:\\javascript\\Untitled-3.html", 10);WebDriverWait wait = new WebDriverWait(driver, 3);Alert alert2 = wait.until(ExpectedConditions.alertIsPresent());System.out.println(alert2.getText());//取消alert2.dismiss();//確定alert2.accept();//輸入內容alert2.sendKeys("hello");Thread.sleep(4000);        }

?

轉載于:https://www.cnblogs.com/clairejing/p/9499223.html

總結

以上是生活随笔為你收集整理的selenium--driver.switchTo()的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。