一、Selenium Webdriver 常用的API

(一)引入依赖

org.seleniumhq.selenium

selenium-java

3.141.59

开始:

public static void main(String[] args) throws InterruptedException {

ChromeOptions options = new ChromeOptions();

//允许任何来源的远程连接,这样可以避免一些跨域问题。

options.addArguments("--remote-allow-origins=*");

//初始化 chrome 浏览器 driver 对象

WebDriver webDriver = new ChromeDriver(options);

// 访问指定网页

webDriver.get("https://juejin.cn");

//开始操作页面

//……

}

其它浏览器:

WebDriver driver = new FirefoxDriver(); // Firefox浏览器

WebDriver driver = new EdgeDriver(); // Edge浏览器

WebDriver driver = new InternetExplorerDriver(); // Internet Explorer浏览器

……

如果对软件测试、接口、自动化、性能测试、测试开发、面试经验交流。感兴趣可以加裙485187702,群内会有不定期的发放免费的资料链接,这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。

(二)元素的定位

  要想操作一个对象,首先应该识别这个对象。通过下面的 API,可以获取页面上的标签对象,从而来操作它们。

1.css选择器定位

  css选择器定位,在css中有标签选择器、类选择器、id选择器、后代选择器、子选择器、并集选择器……它们对应的语法在在这里也适用。

public static void main(String[] args) throws InterruptedException {

ChromeOptions options = new ChromeOptions();

//允许任何来源的远程连接,这样可以避免一些跨域问题。

options.addArguments("--remote-allow-origins=*");

WebDriver webDriver = new ChromeDriver(options);

// 访问指定网页

webDriver.get("https://juejin.cn");

//css 选择器 方式1:id选择

WebElement element = webDriver.findElement(By.cssSelector("#elementId"));

//css 选择器 方式2:类选择

WebElement element2 = webDriver.findElement(By.cssSelector(".elementClass"));

//css 选择器 方式3:后代选择

WebElement element2 = webDriver.findElement(By.cssSelector(".elementClass1 .elementClass2……"));

//其它方式

……

}

案例:我想要用webDriver在掘金主页搜索框中输入“selenium”并点击搜索。

先看掘金主页源码中搜索框、搜索按钮的标签属性。

 

代码

public static void main(String[] args) {

ChromeOptions options = new ChromeOptions();

//允许任何来源的远程连接,这样可以避免一些跨域问题。

options.addArguments("--remote-allow-origins=*");

WebDriver webDriver = new ChromeDriver(options);

// 访问指定网页

webDriver.get("https://juejin.cn");

//获取搜索框

WebElement input = webDriver.findElement(By.cssSelector(".search-input"));

//输入值

input.sendKeys("java");

//获取搜索按钮

WebElement seach = webDriver.findElement(By.cssSelector(".seach-icon-container"));

//点击该元素

seach.click();

}

为了简洁,文章后面就不放查找标签class属性的截图了,知道怎么查找就行了。

2.id 定位

  这个跟 css选择器定位 类似,可以作为它的简便写法

webDriver.findElement(By.id("页面元素的id值"));

 

3.name 定位

  如果这个元素有name属性,并且元素的name命名在整个页面是唯一的,那么我们可以用name来定位这个 元素。

webDriver.findElement(By.name("页面元素的name值"));

4.className、tagName 定位

  className就是根据类名字选择,tagName是根据标签名选择。

webDriver.findElement(By.className("class的名字"));

webDriver.findElement(By.tagName("标签的名字"));

5.linkText定位

  对一个文字链接进行定位,我们可以通过链接内容,也就是 link text 来定位。

//获取链接元素

WebElement link = webDriver.findElement(By.linkText("链接文本"));

自动进入首页的“后端”页面

public static void main(String[] args) {

ChromeOptions options = new ChromeOptions();

//允许任何来源的远程连接,这样可以避免一些跨域问题。

options.addArguments("--remote-allow-origins=*");

WebDriver webDriver = new ChromeDriver(options);

// 访问指定网页

webDriver.get("https://juejin.cn");

//获取链接元素

WebElement link = webDriver.findElement(By.linkText("后端"));

//点击元素

link.click();

}

6.partialLinkText定位

  只用链接的一部分文字进行匹配。

//获取带“text”的链接

WebElement link = webDriver.findElement(By.partialLinkText("text"));

//获取所有的带“text”的链接

List articles = webDriver.findElements(By.partialLinkText("text"));

 

  注意,这里适用的是findElements,而不是findElement。当获取的元素有多个的时候就使用findElements。

7.xpath 定位

  xpath表达式:​​​​​​XPath 语法 | 菜鸟教程 (runoob.com)

 

webDriver.findElement(By.xpath("XPath定位表达式"));

 XPath 是一种在 XML 文档中定位元素的语言。因为 HTML 可以看做 XML 的一种实现,所以可以使用这种语言在 web 应用中定位元素。

表达式描述nodename选取此节点的所有子节点。/从根节点选取(取子节点)。//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置(取子孙节点)。.选取当前节点。..选取当前节点的父节点。@选取属性。

通配符描述*匹配任何元素节点。@*匹配任何属性节点。node()匹配任何类型的节点。

  比如://form//span[1]/input。表示选择文档中所有的

元素,然后在每个 元素内部找到第一个 元素,然后再在这个 元素内部选择一个 元素。

  可以在页面中快速地获取xpath,就以搜索框为例:

WebElement element1 = webDriver.findElement(By.xpath("//*[@id=\"juejin\"]/div[1]/div[1]/header/div/nav/ul/ul/li[1]/ul/li[1]/form/input"));

 

(三)操作测试对象

  定位只是第一步,定位之后需要对这个元素进行操作。它们都是 WebElement 接口的方法。

sendKeys():模拟键盘向输入框里输入内容。click():用于单击一个元素,前提是它是可以被单击的对象。getSize():返回元素的尺寸。getText():获取元素的文本。getAttribute():获得属性的值。isDisplayed():查看该元素是否用户可见,返回值为布尔值。submit():用于提交表单,前提必须得有标签。clear():用于清除文本输入框中的内容。

(四)元素等待方式

  案例:百度搜索,在搜索框中输入“软件测试”,统计当前页显示出来多少词条。

public static void main(String[] args) {

ChromeOptions options = new ChromeOptions();

//允许任何来源的远程连接,这样可以避免一些跨域问题。

options.addArguments("--remote-allow-origins=*");

WebDriver webDriver = new ChromeDriver(options);

webDriver.get("https://baidu.com");

//css 选择器,选择输入框

WebElement input = webDriver.findElement(By.cssSelector("#kw"));

//输入软件测试

input.sendKeys("软件测试");

//点击搜索按钮

webDriver.findElement(By.cssSelector("#su")).click();

//获取词条

List aEms = webDriver.findElements(By.cssSelector("a em"));

//查看词条数量

System.out.println(aEms.size());

}

结果:

  这里的结果是0,因为程序还没等浏览器页面加载完 就执行完了,下面就是解决办法。

1.使用 sleep()

  直接使用Thread.sleep()使当前的线程睡眠。

public static void main(String[] args) throws InterruptedException {

ChromeOptions options = new ChromeOptions();

//允许任何来源的远程连接,这样可以避免一些跨域问题。

options.addArguments("--remote-allow-origins=*");

WebDriver webDriver = new ChromeDriver(options);

webDriver.get("https://baidu.com");

//css 选择器,选择输入框

WebElement input = webDriver.findElement(By.cssSelector("#kw"));

//输入软件测试

input.sendKeys("软件测试");

//点击搜索按钮

webDriver.findElement(By.cssSelector("#su")).click();

//睡眠 1 秒

Thread.sleep(1000);

//获取所有的 a em 元素,这里也就是词条

List aEms = webDriver.findElements(By.cssSelector("a em"));

System.out.println(aEms.size());

}

 结果:

这时就把当前页面的词条全获取了。但是用sleep有一个缺点,就是无法把握时间点。如果时间短了则元素获取不完整,如果长了就需要阻塞很长时间,效率低下。好在webDriver提供了API来解决这些问题。

2.隐式等待

  Web驱动程序在每次查找元素时都等待一定的时间,直到找到元素或者超时为止。隐式等待只需要设置一次,就会对整个会话生效。隐式等待的优点是简单易用,缺点是不能针对特定的元素或条件进行灵活的调整。隐式等待可以通过如下代码实现:

……

WebDriver webDriver = new ChromeDriver();

//全局的隐式等待

webDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

……

 

public static void main(String[] args) {

ChromeOptions options = new ChromeOptions();

//允许任何来源的远程连接,这样可以避免一些跨域问题。

options.addArguments("--remote-allow-origins=*");

WebDriver webDriver = new ChromeDriver(options);

//设置全局隐式等待,最长等待时间为 5 秒

webDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

webDriver.get("https://baidu.com");

//css 选择器,选择输入框

WebElement input = webDriver.findElement(By.cssSelector("#kw"));

//输入软件测试

input.sendKeys("软件测试");

//点击搜索按钮

webDriver.findElement(By.cssSelector("#su")).click();

//获取元素

List aEms = webDriver.findElements(By.cssSelector("a em"));

System.out.println(aEms.size());

}

结果:

3.显示等待

  显示等待可以对一个元素进行等待,比隐式等待更灵活。

语法:

WebDriver webDriver = new ChromeDriver();

WebDriverWait wait = new WebDriverWait(webDriver, 5, 1);

WebElement elem = wait.until(ExpectedConditions.presenceOfElementLocated(/* By选择 */By.id("元素id")));

 

  对于第二行代码:

webDriver:浏览器驱动5:最长超时时间(默认以秒为单位)1:检测的的间隔时间

  第三行代码:

  ExpectedConditions 它包含了一系列的预定义条件,用于等待页面上的元素出现或者满足特定的条件。

  presenceOfElementLocated方法会等待页面上的一个元素出现,直到它被找到或者超时。这个元素的ID是"元素id"。如果元素被找到,该方法会返回一个WebElement对象,然后这个对象会被赋值给elem变量。这个WebElement对象可以用来执行其他的操作,比如点击、输入文本等等。如果元素没有被找到,该方法会抛出一个TimeoutException异常。

  ExpectedConditions的其它方法(部分):

方法描述presenceOfAllElementsLocatedBy(By locator)等待一组元素根据指定的定位器在页面 DOM 中出现。条件成立,当元素列表至少包含一个元素或元素列表为空时。elementToBeClickable(By locator)等待元素可以被单击,通常用于等待按钮或链接可点击。visibilityOfElementLocated(By locator)等待元素在页面上可见,通常用于等待元素可见后执行操作。invisibilityOfElementLocated(By locator)等待元素在页面上不可见,通常用于等待元素消失后执行操作。textToBePresentInElement(By locator, String text)等待特定文本出现在元素中。titleIs(String title)等待页面标题与给定的标题完全匹配。titleContains(String partialTitle)等待页面标题包含给定的部分标题。alertIsPresent()等待警告框出现。frameToBeAvailableAndSwitchToIt(By frameLocator)等待并切换到指定的 iframe。

回到案例:

public static void main(String[] args){

ChromeOptions options = new ChromeOptions();

//允许任何来源的远程连接,这样可以避免一些跨域问题。

options.addArguments("--remote-allow-origins=*");

WebDriver webDriver = new ChromeDriver(options);

webDriver.get("https://baidu.com");

// 初始化显式等待条件

WebDriverWait wait = new WebDriverWait(webDriver, 5, 1);

//css 选择器,选择搜索框

WebElement input = webDriver.findElement(By.cssSelector("#kw"));

//输入软件测试

input.sendKeys("软件测试");

//点击搜索按钮

webDriver.findElement(By.cssSelector("#su")).click();

//校验

//1.找到搜索结果

List aEms = wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.cssSelector("a em")));

System.out.println(aEms.size());

}

(五)浏览器的操作

1.浏览器启动的窗口大小

webdriver.manage().window().maximize();窗口最大化webdriver.manage().window().setSize(new Dimension(480, 800));设置窗口宽高

2.浏览器前进后退刷新

webdriver.navigate().back(); 后退webdriver.navigate().forward(); 前进webdriver.navigate().refresh(); 刷新

3.关闭浏览器

webdriver.quit() 关闭整个浏览器webdriver.close() 关闭当前页面

(六)使用 JS 代码

  Selenium 提供了 API 来执行 JS 代码。

JavascriptExecutor js = (JavascriptExecutor) webDriver;

js.executeScript("js代码");

public static void main(String[] args) throws InterruptedException {

ChromeOptions options = new ChromeOptions();

options.addArguments("--remote-allow-origins=*");

WebDriver webDriver = new ChromeDriver(options);

//窗口最大化

webDriver.manage().window().maximize();

//隐式等待

webDriver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);

//打开百度

webDriver.get("https://baidu.com");

//执行 js 代码

JavascriptExecutor js = (JavascriptExecutor) webDriver;

js.executeScript("alert('你好')");

}

滚动条:

JavascriptExecutor js = (JavascriptExecutor) webDriver;

js.executeScript("document.documentElement.scrollTop= x ");//x 表示文档顶部距离视口顶部的距离

//方式2:

//x 参数表示水平的左间距;

//y 参数表示垂直的上边距。

js.executeScript("window.scrollTo(x,y);");

 

(七)模拟键盘操作

  sendKeys()方法也可以模拟键盘操作,例如 sendKeys(Keys.CONTROL, 'a') 表示按下 Ctrl+A 组合键。

方法描述Keys.ARROW_DOWN按下向下箭头键。Keys.ARROW_UP按下向上箭头键。Keys.ARROW_LEFT按下向左箭头键。Keys.ARROW_RIGHT按下向右箭头键。Keys.ENTER按下回车键。Keys.RETURN按下回车键(与 ENTER 类似)。Keys.TAB按下制表键。Keys.ESCAPE按下 ESC 键。Keys.SPACE按下空格键。Keys.BACK_SPACE按下退格键。Keys.DELETE按下删除键。Keys.HOME按下 Home 键。Keys.END按下 End 键。Keys.PAGE_UP按下 Page Up 键。Keys.PAGE_DOWN按下 Page Down 键。Keys.CONTROL按下 Ctrl 键。Keys.SHIFT按下 Shift 键。Keys.ALT按下 Alt 键。Keys.F1, Keys.F2, ... Keys.F12按下 F1 到 F12 键。sendKeys(CharSequence...keysToSend)模拟按下多个键的组合,例如 sendKeys(Keys.CONTROL, "a") 表示按下 Ctrl+A 组合键。Keys.NULL表示空键,通常用于清除已有的键盘操作。

(八)模拟鼠标操作

  Actions类可以帮助我们实现鼠标操作,Actions类的方法是用来创建一系列的操作,但是不会立即执行,而是存放在一个队列中。当调用perform()方法时,队列中的操作才会按顺序执行。

方法说明click在当前鼠标位置点击clickAndHold在当前鼠标位置按住左键不放contextClick在当前鼠标位置右键点击doubleClick在当前鼠标位置双击dragAndDrop将一个元素拖拽到另一个元素上keyDown按下一个修饰键(如Ctrl, Shift, Alt等)keyUp释放一个修饰键(如Ctrl, Shift, Alt等)moveToElement将鼠标移动到一个元素的中心点上pause在两个操作之间暂停一段时间release释放当前鼠标位置的左键或右键sendKeys向当前焦点元素或活动元素发送一系列按键

// 百度首页“设置”悬停下拉菜单

WebDriver driver = new ChromeDriver();

driver.get("https://www.baidu.com/");

WebElement search_setting = driver.findElement(By.id("s-usersetting-top"));

Actions action = new Actions(driver);

action.moveToElement(search_setting).perform();

// 鼠标拖拽动作,将 source 元素拖放到 target 元素的位置

WebElement source = driver.findElement(By.name("element"));

WebElement target = driver.findElement(By.name("element"));

action.dragAndDrop(source,target).perform();

(九)多层框架定位

  frame 是一个 HTML 元素,它定义了一个特定区域,另一个 HTML 文档可以在里面展示。比如:

一个页面里面嵌了三个页面,但是selenium定位的时候默认只能定位到最外面一层的页面,如果想要切换页面(访问下层页面)可以使用如下API:

Frame标签包含 frameset、frame、iframe 三种。Frameset 和普通的标签一样,不会影响正常的定位,可以使用 index、id、name 等任意种方式定位。而 frame 与 iframe 对 selenium 定位而言是一样的。selenium 有一组方法对 frame 进行操作。

webdriver.switchTo().frame(x);//切换到 id 为 x 的fram下

//后面可以定位到该 frame 中的元素

webdriver.findElement(By.id("id"));

……

//如果frame没有标签,可以使用索引来定位

webdriver.switchTo().frame(index);//索引从 1 开始。webdriver.switchTo().frame(1)表示切换到该页面下的第一个frame。

(十)下拉框处理

   有如下的页面:

// 定位