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

举报
John2021 发表于 2022/04/02 06:25:14 2022/04/02
【摘要】 从浏览器中获取当前页面的标题import org.openqa.selenium.WebDriver;import org.openqa.selenium.edge.EdgeDriver;import org.openqa.selenium.remote.RemoteWebDriver;public class getInformation{ public static void ma...

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

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可以从弹窗获取文本并接受或关闭这些警告。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Alerts</title>
</head>
<body>
<a onclick='window.alert("Sample alert")'>See an example alert</a>
</body>
</html>
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确认框

确认框类似于警告框,不同之处在于用户还可以选择取消消息。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Confirm</title>
</head>
<body>
<a onclick='window.confirm("Sample confirm")'>See a sample confirm</a>
</body>
</html>
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提示框

提示框与确认框类似,不同之处在于它们还包括文本输入。与处理表单元素类似,可以使用WebDriversendKeys来填写响应。这将完全替换占位符文本。按下取消按钮不会提交任何文本。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Confirm</title>
</head>
<body>
<a onclick='window.prompt("Sample prompt")'>See a sample prompt</a>
</body>
</html>
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<Cookie> 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 中的一个按钮。 如果我们使用浏览器开发工具检查元素,我们可能会看到以下内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>frames</title>
</head>
<body>
<div id="modal">
    <iframe id="buttonframe" name="myframe">
        <button>Click here</button>
    </iframe>
</div>
</body>
</html>

如果不是iframe,可以使用如下方式点击按钮:

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

但是,如果iframe之外没有按钮,那么可能会得到一个no such element的错误。这是因为Selenium只知道顶层文档中的元素。为了与按钮进行交互,我们首先需要切换到框架,这与切换窗口类似。WebDriver提供了三种切换方法。

使用WebElement

使用 WebElement 进行切换是最灵活的选择。您可以使用首选的选择器找到框架并切换到它。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>frames</title>
</head>
<body>
<div id="modal">
    <iframe id="buttonframe" name="myframe" src="https://seleniumhq.github.io">
        <button>Click here</button>
    </iframe>
</div>
</body>
</html>
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.edge.EdgeDriver;
import org.w3c.dom.Text;

public class framesTest
{
    public static void main(String[] args)
    {
        WebDriver webDriver = new EdgeDriver();
        webDriver.get("XXX\\framesTest.html");

        //WebElement element = webDriver.findElement(By.tagName("button"));//找不到

        //存储网页元素
        WebElement iframe = webDriver.findElement(By.cssSelector("#modal>iframe"));
        //切换到frame
        webDriver.switchTo().frame(iframe);
        //点击按钮
        webDriver.findElement(By.tagName("button")).click();
    }
}

使用name或id

如果frame或iframe具有id或name属性,可以使用该属性。如果名称或id在页面上不是唯一的,那么将切换到找到的第一个。

// 使用 ID
driver.switchTo().frame("buttonframe");

// 或者使用 name 代替
driver.switchTo().frame("myframe");

// 现在可以点击按钮
driver.findElement(By.tagName("button")).click();

使用索引

还可以使用frame的索引,例如可以使用JavaScript中的window.frames进行查询

//切换到第2个框架
driver.switchTo().frame(1);

离开框架

离开iframe或者frameset,切换回默认内容

//回到顶层
driver.switchTo().defaultContent();

窗口

窗口和标签页

WebDriver没有区分窗口和标签页。如果打开了一个新标签页或窗口,Selenium将允许你使用窗口句柄来处理它。每个窗口都有一个唯一的标识符,该标识符在单个会话中保持持久性。可以使用driver.getWindowHandle();获得当前窗口的句柄

切换窗口或标签页

单击在<a href="https://seleniumhq.github.io" target="_blank">新窗口中打开链接,则屏幕会聚焦在新窗口或新标签上,但WebDriver不知道操作系统认为哪个窗口是活动的。要使用新窗口,需要切换到它。如果只有两个选项卡或窗口被打开,并且你知道从哪个窗口开始,则你可以遍历WebDriver,通过排除法可以看到两个窗口或选项卡,然后切换到你需要的窗口或选项卡。
Selenium 4提供了一个新的API,NewWindow,它创建一个新的选项卡或窗口并自动切换到它。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>switch</title>
</head>
<body>
<a href="https://seleniumhq.github.io" target="_blank">new window</a>
</body>
</html>
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.FluentWait;
import org.openqa.selenium.support.ui.Wait;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.time.Duration;

public class switchWindow
{
    public static void main(String[] args)
    {
        WebDriver webDriver = new EdgeDriver();
        webDriver.get("XXX\\switchWindow.html");

        //存储原始窗口的ID
        String originalWindow = webDriver.getWindowHandle();
        //检查一下有没有打开其他窗口
        assert webDriver.getWindowHandles().size() == 1;
        //点击在新窗口中打开的链接
        webDriver.findElement(By.linkText("new window")).click();
        //等待新窗口或标签页
        Wait<WebDriver> wait = new FluentWait<WebDriver>(webDriver);
        wait.until(ExpectedConditions.numberOfWindowsToBe(2));
        //循环执行,直到找到一个新的窗口句柄
        for (String windowHandle : webDriver.getWindowHandles())
        {
            if (!originalWindow.contentEquals(windowHandle))
            {
                webDriver.switchTo().window(windowHandle);
                break;
            }
        }
        //等待新标签完成加载内容
        Boolean seleniumTitle = wait.until(ExpectedConditions.titleIs("Selenium"));
        if (seleniumTitle)
        {
            System.out.println("找到标题");
        }
        else
        {
            System.out.println("没有找到标题");
        }
    }
}

创建新窗口或新标签页并且切换

创建一个新窗口或标签页,屏幕焦点将聚焦在新窗口或标签上。你不需要切换到新窗口或标签。如果除了新窗口之外,你打开了两个以上的窗口或标签页,可以通过遍历WebDriver看到两个窗口或选项卡,并切换到非原始窗口。
注意:该特性适用于Selenium 4及其后续版本。

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WindowType;
import org.openqa.selenium.edge.EdgeDriver;

public class switchNewWindow
{
    public static void main(String[] args)
    {
        WebDriver webDriver = new EdgeDriver();
        webDriver.get("https://www.baidu.com");
        //打开新标签页并切换到新标签页
        //webDriver.switchTo().newWindow(WindowType.TAB);
        //打开一个新窗口并切换到新窗口
        webDriver.switchTo().newWindow(WindowType.WINDOW);
    }
}

关闭窗口或标签页

当你完成了一个窗口或标签页的工作时,并且它不是浏览器中最后一个打开的窗口或标签页时,应该关闭它并切换回你之前使用的窗口。以上一节代码示例为例,将把前一个窗口句柄存储在一个变量中。如果在关闭一个窗口后忘记切换到另一个窗口句柄,WebDriver将在当前关闭的页面上执行,并触发一个No Such Window Exception无此窗口异常。必须切换回有效的窗口句柄才能继续执行。

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WindowType;
import org.openqa.selenium.edge.EdgeDriver;

public class closeWindow
{
    public static void main(String[] args)
    {
        /*
         * 切换标签页
         * */
        /*WebDriver webDriver = new EdgeDriver();
        webDriver.get("https://www.baidu.com");
        //存储原始窗口的ID
        String originalWindow = webDriver.getWindowHandle();
        //打开新标签页
        webDriver.switchTo().newWindow(WindowType.TAB);
        webDriver.get("https://www.baidu.com");
        //关闭标签页
        webDriver.close();
        //切回之前的标签页
        webDriver.switchTo().window(originalWindow);*/

        /*
         * 切换窗口
         * */
        WebDriver webDriver = new EdgeDriver();
        webDriver.get("https://www.baidu.com");
        //存储原始窗口的ID
        String originalWindow = webDriver.getWindowHandle();
        //打开新窗口
        webDriver.switchTo().newWindow(WindowType.WINDOW);
        webDriver.get("https://www.baidu.com");
        //关闭窗口
        webDriver.close();
        //切回之前的窗口
        webDriver.switchTo().window(originalWindow);
    }
}

在会话结束时退出浏览器

当你完成了浏览器会话,应该调用quit退出,而不是close关闭,driver.quit();

  • 退出将会:
    • 关闭所有与WebDriver会话相关的窗口和选项卡
    • 结束浏览器进程
    • 结束后台驱动进程
    • 通知Selenium Grid浏览器不再使用,以便可以由另一个会话使用它(如果你正在使用Selenium Grid)

调用quit()失败将留下额外的后台进程和端口运行在机器上,这可能在以后导致一些问题。
有的测试框架提供了一些方法和注释,可以在测试结束时放入teardown()方法中。

@AfterAll
public static void tearDown()
{
    driver.quit();
}

如果不在测试上下文中运行WebDriver,可以考虑使用try/finally,这是大多数语言都提供的,这样一个异常处理仍然可以清理WebDriver会话。

try
{
    //WebDriver代码
}
finally
{
    driver.quit();
}

Python的WebDriver现在支持Python上下文管理器,当使用with关键字时,可以在执行结束时自动退出驱动程序。

with webdriver.Edge() as driver:
    # WebDriver代码
#在此缩进位置后WebDriver自动退出

窗口管理

屏幕分辨率会影响web应用程序的呈现方式,因为WebDriver提供了移动和调整浏览器窗口大小的机制。

获取窗口大小

获取浏览器窗口的大小(以像素为单位)

import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.edge.EdgeDriver;

public class getWindowSize
{
    public static void main(String[] args)
    {
        WebDriver webDriver = new EdgeDriver();
        //分别获取每个尺寸
//        int width = webDriver.manage().window().getSize().getWidth();
//        int height = webDriver.manage().window().getSize().getHeight();
//        System.out.println("宽为:" + width);//宽为:945
//        System.out.println("高为:" + height);//高为:1020

        //或者存储尺寸并在以后查询它们
        Dimension size = webDriver.manage().window().getSize();
        int width1 = size.getWidth();
        int height1 = size.getHeight();
        System.out.println("宽为:" + width1);//宽为:945
        System.out.println("高为:" + height1);//高为:1020
    }
}

设置窗口大小

恢复窗口并设置窗口大小

import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.edge.EdgeDriver;

public class setWindowSize
{
    public static void main(String[] args)
    {
        WebDriver webDriver = new EdgeDriver();
        webDriver.manage().window().setSize(new Dimension(1024, 768));
    }
}

得到窗口位置

获取浏览器窗口左上角的坐标

import org.openqa.selenium.Point;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.edge.EdgeDriver;

public class getWindowLocation
{
    public static void main(String[] args)
    {
        //分别获取每个尺寸
        WebDriver webDriver = new EdgeDriver();
        int x = webDriver.manage().window().getPosition().getX();
        int y = webDriver.manage().window().getPosition().getY();
        System.out.println("x = " + x);
        System.out.println("y = " + y);

        //或者存储尺寸并在以后查询它们
        Point position = webDriver.manage().window().getPosition();
        int x1 = position.getX();
        int y1 = position.getY();
        System.out.println("x = " + x);
        System.out.println("y = " + y);
    }
}

设置窗口位置

将窗口移动到指定位置

import org.openqa.selenium.Point;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.edge.EdgeDriver;

public class moveWindow
{
    public static void main(String[] args)
    {
        WebDriver webDriver = new EdgeDriver();
        //将窗口移动到主显示器的左上角
        webDriver.manage().window().setPosition(new Point(0,0));
    }
}

最大化窗口

扩大窗口,对于大多数操作系统,窗口将填满屏幕,而不会阻挡操作系统自己的菜单和工具栏

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.edge.EdgeDriver;

public class maxWindow
{
    public static void main(String[] args)
    {
        WebDriver webDriver = new EdgeDriver();
        webDriver.manage().window().maximize();
    }
}

最小化窗口

最小化当前浏览上下文的窗口,这种命令的精确行为将作用于各个特定的窗口管理器。
最下化窗口通常将窗口隐藏在系统托盘中。注意:此功能用于Selenium 4以及更高版本。

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.edge.EdgeDriver;

public class minWindow
{
    public static void main(String[] args)
    {
        WebDriver webDriver = new EdgeDriver();
        webDriver.manage().window().minimize();
    }
}

全屏窗口

填充整个屏幕,类似于在大多数浏览器中按下F11

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.edge.EdgeDriver;

public class fullScreenWindow
{
    public static void main(String[] args)
    {
        WebDriver webDriver = new EdgeDriver();
        webDriver.manage().window().fullscreen();
    }
}

屏幕截图

用于捕获当前浏览上下文的屏幕截图。WebDriver的屏幕截图返回以Base64格式编码的屏幕截图。

import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.edge.EdgeDriver;

import java.io.File;
import java.io.IOException;

public class SeleniumTakeScreenshot
{
    public static void main(String[] args) throws IOException
    {
        WebDriver webDriver = new EdgeDriver();
        webDriver.get("http://www.example.com");
        File scrFile = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);
        /*
        * 需要导包
        * <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.11.0</version>
            </dependency>
        * */
        FileUtils.copyFile(scrFile, new File("./image.png"));
        webDriver.quit();
    }
}

img1

元素屏幕截图

用于捕获当前浏览上下文的元素的屏幕截图。WebDriver屏幕截图以Base64格式编码的屏幕截图。

import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.edge.EdgeDriver;

import java.io.File;
import java.io.IOException;

public class SeleniumelementTakeScreenshot
{
    public static void main(String[] args) throws IOException
    {
        WebDriver webDriver = new EdgeDriver();
        webDriver.get("http://www.example.com");
        WebElement element = webDriver.findElement(By.cssSelector("h1"));
        File scrFile = element.getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(scrFile, new File("./image.png"));
        webDriver.quit();
    }
}

img2

执行脚本

在当前frame或者窗口的上下文中,执行JavaScript代码片段

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JavaScript</title>
</head>
<body>
<button name="btnLogin">登陆还是登录</button>
</body>
</html>
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.edge.EdgeDriver;

public class SeleniumJavaScript
{
    public static void main(String[] args)
    {
        //实例化WebDriver并指定驱动为Edge浏览器
        WebDriver webDriver = new EdgeDriver();
        //打开页面
        webDriver.get("XXX\\SeleniumJavaScript.html");
        //创建JavaScriptExecutor
        JavascriptExecutor js = (JavascriptExecutor) webDriver;
        //Button元素
        WebElement button = webDriver.findElement(By.name("btnLogin"));
        //执行JavaScript点击元素
        js.executeScript("arguments[0].click();", button);
        //从script获取返回值
        String text = (String) js.executeScript("return arguments[0].innerText", button);
        System.out.println("返回值为:"+text);//返回值为:登陆还是登录
        //直接执行JavaScript
        js.executeScript("console.log('hello world')");
    }
}

img3

打印页面

打印当前浏览器内的页面
注意:此功能需要浏览器工作在headless mode

import org.openqa.selenium.Pdf;
import org.openqa.selenium.PrintsPage;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.print.PrintOptions;

public class printPage
{
    public static void main(String[] args)
    {
        //实例化WebDriver,驱动为Edge
        WebDriver webDriver = new EdgeDriver();
        webDriver.get("https://www.selenium.dev");
        PrintsPage printer = (PrintsPage) webDriver;

        PrintOptions printOptions = new PrintOptions();
        printOptions.setPageRanges("1-2");

        Pdf pdf = printer.print(printOptions);
        String content = pdf.getContent();
    }
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。