[跟着官方文档学Selenium][学习笔记][五][WebDriver的浏览器]

网友投稿 959 2022-05-29

从浏览器中获取当前页面的标题

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