[跟著官方文檔學Selenium][學習筆記][五][WebDriver的瀏覽器]

      網友投稿 1130 2022-05-29

      [跟著官方文檔學Selenium][學習筆記][五][WebDriver的瀏覽器]

      從瀏覽器中獲取當前頁面的標題

      import org.openqa.selenium.WebDriver; import org.openqa.selenium.edge.EdgeDriver; import org.openqa.selenium.remote.RemoteWebDriver; public class getInformation { public static void main(String[] args) { WebDriver webDriver = new EdgeDriver(); webDriver.get("https://www.baidu.com/"); String title = webDriver.getTitle(); System.out.println(title);//百度一下,你就知道 } }

      從瀏覽器的地址欄讀取當前的 URL

      import org.openqa.selenium.WebDriver; import org.openqa.selenium.edge.EdgeDriver; import org.openqa.selenium.remote.RemoteWebDriver; public class getInformation { public static void main(String[] args) { WebDriver webDriver = new EdgeDriver(); webDriver.get("https://www.baidu.com/"); String currentUrl = webDriver.getCurrentUrl(); System.out.println(currentUrl);//https://www.baidu.com/ } }

      導航

      打開網站

      啟動瀏覽器后要做的第一件事就是打開網站,代碼示例如下:

      import org.openqa.selenium.WebDriver; import org.openqa.selenium.edge.EdgeDriver; public class openWebsite { public static void main(String[] args) { WebDriver webDriver = new EdgeDriver(); //簡便方法 webDriver.get("https://selenium.dev"); //更長方法 webDriver.navigate().to("https://selenium.dev"); } }

      后退

      按下瀏覽器的后退按鈕

      import org.openqa.selenium.WebDriver; import org.openqa.selenium.edge.EdgeDriver; public class browserBack { public static void main(String[] args) { WebDriver webDriver = new EdgeDriver(); webDriver.get("https://selenium.dev"); System.out.println("打開了Selenium主頁"); webDriver.get("https://www.baidu.com/"); System.out.println("打開了百度主頁"); webDriver.navigate().back(); System.out.println("回退到Selenium主頁"); webDriver.quit(); } }

      前進

      按下瀏覽器的前進按鈕

      import org.openqa.selenium.WebDriver; import org.openqa.selenium.edge.EdgeDriver; public class browserForward { public static void main(String[] args) { WebDriver webDriver = new EdgeDriver(); webDriver.get("https://www.baidu.com/"); System.out.println("打開了百度主頁"); webDriver.get("https://cn.bing.com"); System.out.println("打開了必應主頁"); webDriver.navigate().back(); System.out.println("回退到百度主頁"); webDriver.navigate().forward();; System.out.println("前進到必應主頁"); webDriver.quit(); } }

      刷新

      刷新當前頁面

      import org.openqa.selenium.WebDriver; import org.openqa.selenium.edge.EdgeDriver; public class browserRefresh { public static void main(String[] args) { WebDriver webDriver = new EdgeDriver(); webDriver.get("http://www.baidu.com/"); System.out.println("打開了百度主頁"); webDriver.navigate().refresh(); System.out.println("刷新了百度主頁"); webDriver.quit(); } }

      警告框

      WebDriver提供了一個API,用于處理JavaScript提供的三種類型的原生彈窗消息。這些彈窗由瀏覽器提供限定的樣式。

      注意:新手笨方法,寫一條代碼就運行一次Selenium測一條。

      Alerts警告框

      其中最基本的稱為警告框,它顯示一條自定義的消息,以及一個用于關閉警告的按鈕,在大多數瀏覽器中標記為"確定"(OK)。在大多數瀏覽器中,也可以通過按"關閉"(Close)按鈕將其關閉,但始終和"確定"按鈕具有相同功能。

      WebDriver可以從彈窗獲取文本并接受或關閉這些警告。

      Alerts See an example alert

      import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.edge.EdgeDriver; import org.openqa.selenium.support.ui.ExpectedCondition; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.Wait; import org.openqa.selenium.support.ui.WebDriverWait; public class alertsDemo1 { public static void main(String[] args) { WebDriver webDriver = new EdgeDriver(); //打開本地的html文件要采用絕對路徑 webDriver.get("XXX\\alertsDemo1.html"); //打開html文件后點擊鏈接觸發警告 webDriver.findElement(By.linkText("See an example alert")).click(); //等待警告框顯示并將它存入一個變量 Alert alert = new WebDriverWait(webDriver, Duration.ofSeconds(5)).until(ExpectedConditions.alertIsPresent()); //將警告文本存入變量 String text = alert.getText(); //按下確定按鈕 alert.accept(); //控制臺輸出信息 System.out.println("警告框內容為:"+text);//警告框內容為:Sample alert System.out.println("完成操作");//完成操作 webDriver.quit(); } }

      Confirm確認框

      確認框類似于警告框,不同之處在于用戶還可以選擇取消消息。

      Confirm See a sample confirm

      import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.edge.EdgeDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; public class alertsDemo2 { public static void main(String[] args) { WebDriver webDriver = new EdgeDriver(); //打開本地的html文件要采用絕對路徑 webDriver.get("XXX\\alertsDemo2.html"); //打開html文件后點擊鏈接觸發警告 webDriver.findElement(By.linkText("See a sample confirm")).click(); //等待警告框顯示 new WebDriverWait(webDriver, Duration.ofSeconds(5)).until(ExpectedConditions.alertIsPresent()); //將警告存入變量 Alert alert = webDriver.switchTo().alert(); //將警告保存以便復用 String text = alert.getText(); //按下取消按鈕 alert.dismiss(); //控制臺輸出信息 System.out.println("警告框內容為:" + text);//警告框內容為:Sample alert System.out.println("完成操作");//完成操作 webDriver.quit(); } }

      Prompt提示框

      提示框與確認框類似,不同之處在于它們還包括文本輸入。與處理表單元素類似,可以使用WebDriver的sendKeys來填寫響應。這將完全替換占位符文本。按下取消按鈕不會提交任何文本。

      Confirm See a sample prompt

      import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.edge.EdgeDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import java.time.Duration; public class alertsDemo3 { public static void main(String[] args) { WebDriver webDriver = new EdgeDriver(); //打開本地的html文件要采用絕對路徑 webDriver.get("XXX\\alertsDemo3.html"); //打開html文件后點擊鏈接觸發警告 webDriver.findElement(By.linkText("See a sample prompt")).click(); //等待警告框顯示并保存它到一個變量 Alert alert = new WebDriverWait(webDriver, Duration.ofSeconds(5)).until(ExpectedConditions.alertIsPresent()); //輸入信息 alert.sendKeys("Selenium"); //按下確定按鈕 alert.accept(); //控制臺輸出信息 System.out.println("完成操作");//完成操作 webDriver.quit(); } }

      Cookies

      Cookie是從網站發送并存儲在計算機中的一小段數據。Cookies主要用于識別用戶并加載存儲的信息。

      WebDriver API提供了一種使用內置的方法與Cookie進行交互。

      添加Cookie

      這個方法常常用于將cookie添加到當前訪問的上下文中。添加Cookie僅接受一組已定義的可序列化JSON對象。

      首先,你需要位于有效Cookie的域上。如果你在開始與網站進行交互之前嘗試預設cookie,并且你的首頁很大或需要一段時間才能加載完畢,則可以選擇在網站上找到一個較小的頁面(通常404頁很小,例如 http://example.com/some404page)

      import org.openqa.selenium.Cookie; import org.openqa.selenium.WebDriver; import org.openqa.selenium.edge.EdgeDriver; public class addCookie { public static void main(String[] args) { WebDriver webDriver = new EdgeDriver(); try { webDriver.get("http://www.example.com"); //添加到cookie到瀏覽器上下文 webDriver.manage().addCookie(new Cookie("key", "value")); } finally { webDriver.quit(); } } }

      獲取命名的Cookie

      這個方法返回與cookie名稱匹配的序列化cookie數據中所有關聯的cookie

      import org.openqa.selenium.Cookie; import org.openqa.selenium.WebDriver; import org.openqa.selenium.edge.EdgeDriver; public class getCookieNamed { public static void main(String[] args) { WebDriver webDriver = new EdgeDriver(); try { webDriver.get("http://www.example.com"); webDriver.manage().addCookie(new Cookie("foo", "bar")); //獲取名字為foo的cookie信息 Cookie cookie = webDriver.manage().getCookieNamed("foo"); System.out.println(cookie);//foo=bar; path=/; domain=www.example.com } finally { webDriver.quit(); } } }

      獲取全部Cookies

      此方法會針對當前訪問上下文返回"成功的序列化cookie數據"。如果瀏覽器不再可用,則返回錯誤。

      import org.openqa.selenium.Cookie; import org.openqa.selenium.WebDriver; import org.openqa.selenium.edge.EdgeDriver; import java.util.Set; public class getAllCookies { public static void main(String[] args) { WebDriver webDriver = new EdgeDriver(); try { webDriver.get("http://www.example.com"); //加入cookies webDriver.manage().addCookie(new Cookie("test1", "cookie1")); webDriver.manage().addCookie(new Cookie("test2", "cookie2")); //獲取所有cookies Set cookies = webDriver.manage().getCookies(); System.out.println(cookies); } finally { webDriver.quit(); } } }

      刪除Cookie

      此方法刪除與提供的cookie名稱匹配的cookie數據

      import org.openqa.selenium.Cookie; import org.openqa.selenium.WebDriver; import org.openqa.selenium.edge.EdgeDriver; public class deleteCookie { public static void main(String[] args) { WebDriver webDriver = new EdgeDriver(); try { webDriver.get("http://www.example.com"); webDriver.manage().addCookie(new Cookie("test1", "cookie1")); Cookie cookie = new Cookie("test2", "cookie2"); webDriver.manage().addCookie(cookie); //刪除名為test1的cookie webDriver.manage().deleteCookieNamed("test1"); /* * Selenium Java綁定也提供了一種通過傳遞當前瀏覽上下文的cookie對象來刪除cookie的方法 * */ webDriver.manage().deleteCookie(cookie); } finally { webDriver.quit(); } } }

      刪除所有Cookies

      此方法刪除當前訪問上下文的所有cookie

      import org.openqa.selenium.Cookie; import org.openqa.selenium.WebDriver; import org.openqa.selenium.edge.EdgeDriver; public class deleteAllCookies { public static void main(String[] args) { WebDriver webDriver = new EdgeDriver(); try { webDriver.get("http://www.example.com"); webDriver.manage().addCookie(new Cookie("test1", "cookie1")); webDriver.manage().addCookie(new Cookie("test2", "cookie2")); //刪除所有cookie webDriver.manage().deleteAllCookies(); } finally { webDriver.quit(); } } }

      Same-Site Cookie屬性

      此屬性允許用戶引導瀏覽器控制cookie,是否與第三方站點發起的請求一起發送。引入其是為了防止CSRF(跨站請求偽造)攻擊。

      Same-Site Cookie屬性接受Strict和Lax兩種參數作為指令。

      Strict:

      當sameSite屬性設置為Strict,cookie不會與來自第三方網站的請求一起發送。

      Lax:

      當你將cookie sameSite屬性設置為Lax,cookie將與第三方網站發起的GET請求一起發送。

      注意:到目前為止,這個功能在Chrome(80+版本),Firefox(79+版本)中提供,并適用于Selenium 4及更高版本。

      import org.openqa.selenium.Cookie; import org.openqa.selenium.WebDriver; import org.openqa.selenium.edge.EdgeDriver; public class cookieTest { public static void main(String[] args) { WebDriver webDriver = new EdgeDriver(); try { webDriver.get("http://www.example.com"); Cookie cookie=new Cookie.Builder("key","value").sameSite("Strict").build(); Cookie cookie1 = new Cookie.Builder("key", "value").sameSite("Lax").build(); webDriver.manage().addCookie(cookie); webDriver.manage().addCookie(cookie1); System.out.println(cookie.getSameSite());//Strict System.out.println(cookie1.getSameSite());//Lax } finally { webDriver.quit(); } } }

      Frames

      框架是一種現在已被棄用的方法,用于從同一域中的多個文檔構建站點布局。除非你使用的是 HTML5之前的webapp,內嵌框架允許插入來自完全不同領域的文檔,并且仍然經常使用。

      如果您需要使用框架或iframe,WebDriver允許您以相同的方式使用它們。考慮 iframe 中的一個按鈕。 如果我們使用瀏覽器開發工具檢查元素,我們可能會看到以下內容:

      frames

      如果不是iframe,可以使用如下方式點擊按鈕:

      driver.fineElement(By.tagName("button")).click();

      但是,如果iframe之外沒有按鈕,那么可能會得到一個no such element的錯誤。這是因為Selenium只知道頂層文檔中的元素。為了與按鈕進行交互,我們首先需要切換到框架,這與切換窗口類似。WebDriver提供了三種切換方法。

      使用WebElement

      使用 WebElement 進行切換是最靈活的選擇。您可以使用首選的選擇器找到框架并切換到它。

      frames