软路由 其他 C# 工具 Docker JAVA X86 OpenWrt 飞牛OS iStoreOS 小米路由器 Xray Windows Hyper-V macvlan Windows Server Selenium Mono.Cecil Test Email Java 快捷键 IDEA ImmortalWrt Jenkins Gitlab Redis Mysql Win10 Debian CentOS Docker SpringBoot
头像
WGZZ
Java使用Selenium
2023-08-23 23:48 2023-08-23 23:48 2 0

一、准备工作

1.在pom文件中引入对应的依赖

 <dependency>
     <groupId>org.seleniumhq.selenium</groupId>
     <artifactId>selenium-java</artifactId>
     <version>3.4.0</version>
 </dependency>

2.浏览器驱动下载

设置浏览器驱动

手动创建一个存放浏览器驱动的目录,如: C:\driver , 将下载的浏览器驱动文件(例如:chromedriver、geckodriver)丢到该目录下。
我的电脑–>属性–>系统设置–>高级–>环境变量–>系统变量–>Path,将“C:\driver”目录添加到Path的值中。

二、Selenium 简单示例

  • 打开百度进行搜索:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class BaiduSearch {
    public static void main(String[] args) {
        // 1.创建webdriver驱动
        WebDriver driver = new ChromeDriver();
        // 2.打开百度首页
        driver.get("https://www.baidu.com");
        // 3.获取输入框,输入selenium
        driver.findElement(By.id("kw")).sendKeys("selenium");
        // 4.获取“百度一下”按钮,进行搜索
        driver.findElement(By.id("su")).click();
        // 5.退出浏览器
        driver.quit();
    }
}

三、八大元素定位

  • 我们必须告诉 selenium 怎么去定位元素,用来模拟用户的动作,或者查看元素的属性和状态,以便于我们可以执行检查。例如:我们要搜索一个产品,首先要找到搜索框与搜索按钮,接着通过键盘输入要查询的关键字,最后鼠标单击搜索按钮,提交搜索请求。
    正如上述的人工操作步骤一样,我们也希望 selenium 能模拟这样的动作,然而,selenium 并不能理解类似在搜索框中输入关键字或者点击搜索按钮这样的图形化的操作。所以需要我们程序化的告诉 selenium 如何定位搜索框和搜索按钮,从而模拟键盘和鼠标的操作。

1.定位方式

selenium 提供了8种的定位方式:

  • id
  • name
  • class name
  • tag name
  • link text
  • partial link text
  • xpath
  • css selector

这8种定位方式在java selenium 中对应的方法为:

方法 描述 参数 示例
findElement(By.id()) 通过元素的 id 属性值来定位元素 对应的id属性值 findElement(By.id("kw"))
findElement(By.name()) 通过元素的 name 属性值来定位元素 对应的name值 findElement(By.name("user"))
findElement(By.className()) 通过元素的 class 名来定位元素 对应的class类名 findElement(By.className("passworld"))
findElement(By.tagName()) 通过元素的 tag 标签名来定位元素 对应的标签名 findElement(By.tagName("input"))
findElement(By.linkText()) 通过元素标签对之间的文本信息来定位元素 文本内容 findElement(By.linkText("登录"))
findElement(By.partialLinkText()) 通过元素标签对之间的部分文本信息来定位元素 部分文本内容 findElement(By.partialLinkText("百度"))
findElement(By.xpath()) 通过xpath语法来定位元素 xpath表达式 findElement(By.xpath("//input[@id='kw']"))
findElement(By.cssSelector()) 通过css选择器来定位元素 css元素选择器 findElement(By.cssSelector("#kw"))

同时这8种方法都对应有着返回复数元素的方法,分别在调用的方法findElements(By.id()) 加上一个s:

  • findElements(By.id())
  • findElements(By.name())
  • findElements(By.className())
  • findElements(By.tagName())
  • findElements(By.linkText())
  • findElements(By.partialLinkText())
  • findElements(By.xpath())
  • findElements(By.cssSelector())

2.定位方式的用法

假如我们有一个Web页面,通过前端工具(如,Firebug)查看到一个元素的属性是这样的。

<html>
  <head>
  <body link="#0000cc">
    <a id="result_logo" href="/" onmousedown="return c({'fm':'tab','tab':'logo'})">
    <form id="form" class="fm" name="f" action="/s">
      <span class="soutu-btn">按钮</span>
        <input id="kw" class="s_ipt" name="wd" value="" maxlength="255" autocomplete="off">

我们的目的是要定位input标签的输入框。

  • 通过id定位:
driver.findElement(By.id("kw"))
  • 通过name定位:
driver.findElement(By.name("wd"))
  • 通过class name定位:
driver.findElement(By.className("s_ipt"))
  • 通过tag name定位:
driver.findElement(By.tagName("input"))
  • 通过xpath定位,xpath定位有N种写法,这里列几个常用写法:
driver.findElement(By.xpath("//*[@id='kw']")) // id定位
driver.findElement(By.xpath("//*[@name='wd']")) // 属性值定位
driver.findElement(By.xpath("//span[text()='按钮']")) // 文本定位
driver.findElement(By.xpath("//input[@class='s_ipt']")) // class属性定位
driver.findElement(By.xpath("/html/body/form/span/input")) // 绝对路径定位
driver.findElement(By.xpath("//span[@class='soutu-btn']/input")) // 相对路径定位
driver.findElement(By.xpath("//form[@id='form']/span/input"))
driver.findElement(By.xpath("//input[@id='kw' and @name='wd']")) // 多组合属性定位
driver.findElement(By.xpath("//span[contains(text(),'按钮')]")) // 是否包含文本
  • 通过css定位,css定位有N种写法,这里列几个常用写法:
driver.findElement(By.cssSelector("#kw") // id定位
driver.findElement(By.cssSelector("[name=wd]") // name属性值定位
driver.findElement(By.cssSelector(".s_ipt") // class地位
driver.findElement(By.cssSelector("html > body > form > span > input") // css层级定位
driver.findElement(By.cssSelector("span.soutu-btn> input#kw") 
driver.findElement(By.cssSelector("form#form > span > input")

接下来,我们的页面上有一组文本链接。

<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>
<a class="mnav" href="http://www.hao123.com" name="tj_trhao123">hao123</a>
  • 通过linkText定位:
driver.findElement(By.linkText("新闻")
driver.findElement(By.linkText("hao123")
  • 通过 partialLinkText 定位:
driver.findElement(By.partialLinkText("新")
driver.findElement(By.partialLinkText("hao")
driver.findElement(By.partialLinkText("123")

3.xpath进阶-轴定位

  • parent::div 上层父节点,你那叫div的亲生爸爸,最多有一个;
  • child::div 下层所有子节点,你的所有亲儿子中叫div的;
  • ancestor::div 上面所有直系节点,是你亲生爸爸或者你亲爹或者你亲爹的爸爸中叫div的;
  • descendant::div 下面所有节点,你的后代中叫div的,不包括你弟弟的后代;
  • following::div 自你以下页面中所有节点叫div的;
  • following-sibling::div 同层下节点,你所有的亲弟弟中叫div的;
  • preceding::div 同层上节点,你所有的亲哥哥以及他们的后代中叫div的;
  • preceding-sibling::div 同层上节点,你所有的亲哥哥中叫div的;

轴定位详细操作可参考:https://www.cnblogs.com/wangyi0419/p/11638652.html
xpath 多条件组合查找:https://blog.csdn.net/li575098618/article/details/47853949

关于 xpaht 和 css 的定位比较复杂,请参考: xpath语法css选择器

四、Selenium API

1.WebDriver 常用 API

WebDriver 提供了一系列的 API 来和浏览器进行交互,如下:

方法 描述
get(String url) 访问目标 url 地址,打开网页
getCurrentUrl() 获取当前页面 url 地址
getTitle() 获取页面标题
getPageSource() 获取页面源代码
close() 关闭浏览器当前打开的窗口
quit() 关闭浏览器所有的窗口
findElement(by) 查找单个元素
findElements(by) 查到元素列表,返回一个集合
getWindowHandle() 获取当前窗口句柄
getWindowHandles() 获取所有窗口的句柄

2.WebElement 常用 API

通过 WebElement 实现与网站页面上元素的交互,这些元素包含文本框、文本域、按钮、单选框、div等,WebElement提供了一系列的方法对这些元素进行操作:

方法 描述
click() 对元素进行点击
clear() 清空内容(如文本框内容)
sendKeys(...) 写入内容与模拟按键操作
isDisplayed() 元素是否可见(true:可见,false:不可见)
isEnabled() 元素是否启用
isSelected() 元素是否已选择
getTagName() 获取元素标签名
getAttribute(attributeName) 获取元素对应的属性值
getText() 获取元素文本值(元素可见状态下才能获取到)
submit() 表单提交

代码示例

public class BaiduSearch {
    public static void main(String[] args) {
        // 1.创建webdriver驱动
        WebDriver driver = new ChromeDriver();
        // 2.打开百度首页
        driver.get("https://www.baidu.com");

        // 获取搜索框元素
        WebElement inputElem = driver.findElement(By.id("kw"));

        // clear()方法,清空输入框内容
        inputElem.clear();

        // sendKeys()方法,在搜索框中输入搜索内容
        inputElem.sendKeys("selenium");

        // 元素是否显示
        boolean displayed = inputElem.isDisplayed();
        System.out.println(displayed); // 输出true

        // 元素是否启用
        boolean enabled = inputElem.isEnabled();
        System.out.println(enabled); // 输出true
    
        // 判断元素是否被选中状态,一般用在Radio(单选),Checkbox(多选),Select(下拉选)
        // 在输入框中使用无意义
        boolean selected = inputElem.isSelected();
        System.out.println(selected); // 输出fasle
    
        // 获取标签名
        String tagName = inputElem.getTagName();
        System.out.println(tagName); // 输出input

        // 获取属性名(name属性)
        String name = inputElem.getAttribute("name");
        System.out.println(name); // 输出wd
    
        // 获取文本值
        String text = inputElem.getText();
        System.out.println(text); // 输出selenium
    
        // 通过submit提交
        driver.findElement(By.id("su")).submit();
    
        // click()方法,点击百度一下按钮
        driver.findElement(By.id("su")).click();

        // 退出浏览器
        driver.quit();
    }
}
赞赏
作者:WGZZ
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0协议
转载请注明文章地址及作者
{{globalState.toComment.userName[0]}}
{{globalState.toComment.userName}}
{{globalState.toComment.commentContent}}
{{globalState.toComment.createTime.slice(0, 16)}} {{globalState.toComment.userIpAddr}} 取消回复
>
邮件通知
确认
评论
暂无评论,点击右上角 发布
{{comment.userName[0]}}
{{comment.userName}}
{{comment.commentContent}}
{{comment.createTime.slice(0, 16)}} {{comment.userIpAddr}} 回复
{{child.userName[0]}}
{{child.userName}} {{child.toUserName}}
{{child.commentContent}}
{{child.createTime.slice(0, 16)}} {{child.userIpAddr}} 回复
2022-2025 BY WG日记
本站已运行 {{globalState.formattedTime}}