Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Selenium WebDriver脚本Java代码示例

Selenium WebDriver脚本Java代码示例

作者头像
软测小生
发布于 2019-09-04 07:45:34
发布于 2019-09-04 07:45:34
5.4K00
代码可运行
举报
文章被收录于专栏:软测小生软测小生
运行总次数:0
代码可运行

本篇文章将介绍如下内容: WebDriver代码 Selenium定位UI元素 Selenium常用命令 Get命令 --Get Commands 导航(跳转)命令-Navigate commands Close和Quite关闭和退出浏览器窗口 切换内嵌框架Frame 切换到弹出框

创建一个WebDriver脚本,它将: 1、跳转到MercuryTours的主页(Demo页面); 2、验证其主页的标题(Title); 3、打印出比较的结果; 4、在结束整个程序之前关闭它。

WebDriver代码

以下是上面场景提供的逻辑实际WebDriver代码: 注意: 自从Firefox35开始,需要使用Mozilla创建的Gecko;Selenium 3.0、gecko和firefox存在兼容性问题,正确设置它们可能会成为一项艰巨的任务。如果代码不能工作,将其降级到Firefox47或更低版本。或者,你也可以在Chrome上运行你的脚本。Selenium在Chrome中开箱即用。你只需要改变3行代码,使你的脚本与Chrome或Firefox兼容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package newpackage;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
//注释上面的行和取消注释下面的行来使用Chrome
//import org.openqa.selenium.chrome.ChromeDriver;
public class PG1 {

    public static void main(String[] args) {
        // 对象/变量的声明和实例化
        System.setProperty("webdriver.firefox.marionette","C:\\geckodriver.exe");
        WebDriver driver = new FirefoxDriver();
        //注释以上两行代码,取消下面两行代码的注释,以使用Chrome
        //System.setProperty("webdriver.chrome.driver","G:\\chromedriver.exe");
        //WebDriver driver = new ChromeDriver();

        String baseUrl = "http://demo.guru99.com/test/newtours/";
        String expectedTitle = "Welcome: Mercury Tours";
        String actualTitle = "";

        // 启动Fire fox并将其指向基本URL
        driver.get(baseUrl);

        // 获取标题的实际值
        actualTitle = driver.getTitle();

        /*
         * 将页面的实际标题与预期标题进行比较并打印
         * 结果为“Passed”或“Failed”
         */
        if (actualTitle.contentEquals(expectedTitle)){
            System.out.println("Test Passed!");
        } else {
            System.out.println("Test Failed");
        }
        //关闭浏览器
        driver.close();
    }
}

代码解读:

导入包 首先,您需要导入以下两个包:

  1. org.openqa.selenium.* --包含实例化加载了特定Driver的新浏览器所需的WebDriver类;
  2. org.openqa.selenium.firefox.FirefoxDriver --包含将特定于Firefox的driver实例化到WebDriver类实例化的浏览器所需的FirefoxDriver类;

如果您的测试需要更复杂的操作,比如访问另一个类、获取浏览器截图或操作外部文件,那么您肯定需要导入更多的包。

实例化对象和变量 通常,这是驱动程序(Driver)对象的实例化方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//Firefox
WebDriver driver = new FirefoxDriver();
//Chrome
WebDriver driver = new ChromeDriver();

没有参数的FirefoxDriver类意味着我们的Java程序将启动默认的Firefox配置文件。默认Firefox配置文件类似于以安全模式启动Firefox(不加载扩展)。

为了方便起见,我们将基本URL和期望的标题保存为变量。

启动浏览器会话 WebDriver的get() 方法用于启动一个新的浏览器会话,并将其定向到作为参数指定的URL。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
driver.get(baseUrl);

获取实际的页面标题 WebDriver类具有getTitle() 方法,该方法总是用于获取当前加载页面的页面标题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
actualTitle = driver.getTitle();

比较预期值和实际值 这部分代码只是使用一个基本的Java if-else 结构来比较实际标题和预期标题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(actualTitle.contentEquals(expectedTitle)){
    System.out.print("Test Passed!");
} else {
    System.out.print("Test Failed!");
}

关闭浏览器会话 close()方法用于关闭浏览器窗口。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    driver.close();

终止整个程序 如果你在没有先关闭所有浏览器窗口的情况下使用此命令,你的整个Java程序将在浏览器窗口打开时结束。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    System.exit(0)

运行测试Eclipse IDE中执行代码有两种方法。 1、在Eclipse的菜单栏上,单击Run > Run; 2、按Ctrl+F11运行整个代码。

按Ctrl+F11运行整个代码

如果所有操作都正确,Eclipse将输出“Test Passed!”

Test Passed

Selenium定位UI元素

在WebDriver中定位元素是通过使用"findElement(by.locator()"方法来完成的。

以下是在WebDriver中定位元素的可用选项:

  • By.className
  • By.cssSelector
  • By.id
  • By.linkText
  • By.name
  • By.partialLinkText
  • By.tagName
  • By.xpath

下面是根据id定位元素的示例代码。Facebook用作基本URL:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package newproject;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class PG2 {
    public static void main(String[] args) {
        System.setProperty("webdriver.firefox.marionette","C:\\geckodriver.exe");
        WebDriver driver = new FirefoxDriver();
        String baseUrl = "http://www.facebook.com";
        String tagName = "";

        driver.get(baseUrl);
        tagName = driver.findElement(By.id("email")).getTagName();
        System.out.println(tagName);
        driver.close();
        System.exit(0);
}
}

我们使用getTagName() 方法提取 idemail的特定元素的标记名。运行时,这段代码应该能够正确识别标记名称input,并将其打印到Eclipse的控制台窗口,如下:

打印tag名称

定位元素摘要:

元素定位的8种方式

Selenium常用命令:

实例化Web元素 在每次访问特定元素时,我们可以为它实例化一个WebElement对象,而不是使用冗长的driver.findElement(By.locator() 语法。 WebElement类包含在org.openqa.selenium.* 包中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
WebElement myElement = driver.findElement(By.id("username"));
myElement.sendKeys("tutorial");

单击元素

单击可能是与Web元素交互的最常见方式。Click()方法用于模拟元素的单击。下面的例子展示了如何使用Click()单击Mercury Tours主页的Sign-In按钮:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
driver.findElement(By.name("login")).click();

使用click()方法时必须注意以下事项:

  • 它不接受任何参数;
  • 如果适用,该方法将自动等待加载新页面;
  • 要选中的元素必须是可见的(高度和宽度不能等于零)。

Get命令 --Get Commands

Get命令获取关于页面/元素的各种重要信息。下面是一些您必须熟悉的重要get命令。

  • get()
  • getTitle()
  • getPageSource()
  • getCurrentUrl()
  • getText()

1、 get(url) 示例用法:

  • 它会自动打开一个新的浏览器窗口,并跳转到括号内指定的url页面。
  • 参数必须是字符串对象。

2、getTitle() 示例用法:

  • 不需要参数
  • 获取当前页的标题
  • 去掉title字符串前后的空白
  • 如果页面没有标题,则返回空字符串

3、getPageSource() 示例用法:

  • 不需要参数
  • 以字符串值的形式返回页面的源代码

4、getCurrentUrl() 示例用法:

  • 不需要参数
  • 获取浏览器当前URL

5、getText() 示例用法:

  • 获取指定元素的内部文本

导航(跳转)命令-Navigate commands

这些命令允许您刷新、进入和在不同的Web页面之间来回切换。

  • navigate().forward()
  • navigate().back()
  • navigate().to()
  • navigate().refresh()

1、navigate().to() 示例用法:

  • 它会自动打开一个新的浏览器窗口,并跳转到括号内指定的url页面;
  • 它的作用与get()方法完全相同。

2、navigate().refresh() 示例用法:

  • 不需要参数
  • 刷新当前页面

3、navigate().back() 示例用法:

  • 不需要参数
  • 返回上一个历史页面

4、navigate().forward() 示例用法:

  • 不需要参数
  • 进入下一个历史页面

Close和Quite关闭和退出浏览器窗口

1、 close() 示例用法:

  • 不需要参数
  • 它只关闭WebDriver控制的当前浏览器窗口;关闭单个浏览器窗口

2、quite() 示例用法:

  • 不需要参数
  • 使用quit()关闭与WebDriver对象所控制的父窗口关联的所有窗口。

关闭和退出浏览器窗口

切换内嵌框架Frame

要访问框架中的GUI元素,我们应该首先引导WebDriver将焦点放在框架或弹出窗口上,然后才能访问其中的元素。让我们以web页面http://demo.guru99.com/selenium/deprecated.html:

在这里插入图片描述

这个页面有3个框架,上面显示了它们的name属性。我们希望访问上面黄色包围的“Deprecated”链接。为了做到这一点,我们必须首先命令WebDriver使用switchTo().frame() 方法切换到classFrame 框架。我们将使用框架的name属性作为frame()部分的参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package newproject;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class PG4 {
      public static void main(String[] args) {
            System.setProperty("webdriver.firefox.marionette","C:\\geckodriver.exe");  
            WebDriver driver = new FirefoxDriver();
            driver.get("http://demo.guru99.com/selenium/deprecated.html");
            driver.switchTo().frame("classFrame");
            driver.findElement(By.linkText("Deprecated")).click();
            driver.close(); 
        }
}

执行此代码后,您将看到classFrame框架被切换到Deprecated API页面,这意味着我们的代码成功地访问了Deprecated链接。

切换到弹出框

WebDriver允许显示诸如警告之类的弹出窗口。要访问警报中的元素(比如它包含的消息),必须使用switchTo().alert() 方法。 在下面的代码中,我们将使用此方法访问警报框,然后使用getText() 方法检索其消息,然后使用switchTo().alert().accept() 方法自动关闭警报框。

首先,跳转到http://jsbin.com/usidix/1,手动单击那里的Go! 按钮,看到如下:

弹出框

WebDriver代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package mypackage;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class myclass {
    public static void main(String[] args) {
        System.setProperty("webdriver.firefox.marionette","C:\\geckodriver.exe");
        WebDriver driver = new FirefoxDriver();
        String alertMessage = "";

        driver.get("http://jsbin.com/usidix/1");
        driver.findElement(By.cssSelector("input[value=\"Go!\"]")).click();
        alertMessage = driver.switchTo().alert().getText();
        driver.switchTo().alert().accept();

        System.out.println(alertMessage);
        driver.quit();     
    }
}

在Eclipse控制台,注意打印的警告消息是:

Eclipse打印信息

总结:

  • 要开始使用WebDriver API,您必须至少导入这两个包。
    • org.openqa.selenium.*
    • org.openqa.selenium.firefox.FirefoxDriver
  • 在WebDriver中定位元素是使用findElement() 方法完成的。
  • switchTo().frame()switchTo().alert() 方法分别用于将WebDriver的焦点切换到框架或警报弹窗上。
  • 隐式等待(Implicit waits) 用于整个页面中设置等待时间;而显式等待(explicit waits) 仅用于等待特定的部分。
  • 在验证元素的状态时,可以使用isEnabled()、isdisplay()、isSelected()WebDriverWaitExpectedConditions 方法的组合; 但这并不是验证元素是否存在,只是确定元素的一种状态。
  • 当元素不存在时调用isEnabled()、isdisplay()或isSelected(), WebDriver将抛出NoSuchElementException
  • 当元素不存在时调用WebDriverWaitExpectedConditions方法,WebDriver将抛出TimeoutException

注意: driver.get() : 它用于访问特定的网站,但它不维护浏览器历史记录和cookie,所以我们不能使用前进后退按钮;使用get()会跳转到一个新的页面,当有需要前进或后退到需要的页面获取元素时,无法再对历史页面来回跳转;

driver.navigate() : 它用于访问特定的网站,但是它维护浏览器历史记录和cookie,所以我们可以在编写Testcase的过程中使用前进和后退按钮在页面之间导航,进行需要的操作或者获取相应的信息。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 软测小生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python基础-2 数字、字符串和列表
前面已经介绍了安装开发环境,运行Python程序。本文开始介绍如何看懂代码及写出自己的代码。
一只大鸽子
2022/12/06
2.4K0
Python基础-2  数字、字符串和列表
Python基础之:Python的数据结构
不管是做科学计算还是编写应用程序,都需要使用到一些基本的数据结构,比如列表,元组,字典等。
程序那些事
2021/03/19
4230
Python 中的字符串 — str
由于 Python 源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为 UTF-­8 编码。当 Python 解释器读取源代码时,为了让它按 UTF-­8 编码读取,我们通常在文件开头写上这两行:
忆想不到的晖
2021/12/06
1.3K0
dart系列之:在dart中使用数字和字符串
要想熟悉一种语言,最简单的做法就是熟悉dart提供的各种核心库。dart为我们提供了包括dart:core,dart:async,dart:math,dart:convert,dart:html和dart:io这几种常用的库。
程序那些事
2021/11/24
1.2K0
【深度学习】 Python 和 NumPy 系列教程(二):Python基本数据类型:3、字符串(索引、切片、运算、格式化)
Python本身是一种伟大的通用编程语言,在一些流行的库(numpy,scipy,matplotlib)的帮助下,成为了科学计算的强大环境。本系列将介绍Python编程语言和使用Python进行科学计算的方法,主要包含以下内容:
Qomolangma
2024/07/29
1120
【深度学习】 Python 和 NumPy 系列教程(二):Python基本数据类型:3、字符串(索引、切片、运算、格式化)
Python | 一文看懂Python列表、元组和字符串操作
列表(List)是Python中非常重要的内置数据类型。列表由一系列元素组成,所有的元组被包含在一对方括号中。列表被创建将后,可以执行添加、删除、修改操作。
咸鱼学Python
2020/11/20
4.7K0
Python | 一文看懂Python列表、元组和字符串操作
Python数字和字符串学习笔记
其中数字、字符串、元组是不可变的,列表、字典是可变的。 对不可变类型的变量重新赋值,实际上是重新创建一个不可变类型的对象,并将原来的变量重新指向新创建的对象(如果没有其他变量引用原有对象的话(即引用计数为0),原有对象就会被回收)。
没有故事的陈师傅
2019/07/27
1.9K0
Python基础(05)字典&字符串
字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中
PM小王
2019/07/02
6740
Python全栈之路系列之字符串数据类
字符串类型是python的序列类型,他的本质就是字符序列,而且python的字符串类型是不可以改变的,你无法将原字符串进行修改,但是可以将字符串的一部分复制到新的字符串中,来达到相同的修改效果。
py3study
2020/01/03
1.1K0
5.python 字符串/列表/元组/字典之间的相互转换
字符串转为列表list,可以使用str.split()方法,split方法是在字符串中对指定字符进行切片,并返回一个列表,示例代码如下:
猿说编程[Python和C]
2020/03/12
1.2K0
Python教程: Python 介绍
     -h                        Display this usage message
py3study
2020/01/07
2.7K0
Python字符串,列表
字符串: 字符串的创建: 单引号, 双引号 ,三引号 <注意: 转义字符的使用> 字符串的特殊性: 索引 切片 连接 重复 成员操作符(in, not in)
py3study
2020/01/14
1K0
Python 入门指南第三节 | Python 简介
下面的例子中,输入和输出分别由大于号和句号提示符( >>> 和 ... )标注:如果想重现这些例子,就要在解释器的提示符后,输入(提示符后面的)那些不包含提示符的代码行。需要注意的是在练习中遇到的从属提示符表示你需要在最后多输入一个空行,解释器才能知道这是一个多行命令的结束。
海拥
2022/09/08
3920
Python 入门指南第三节 | Python 简介
【Python】从基础变量类型到各种容器(列表、字典、元组、集合、字符串)
反向索引:从-1开始,-1代表最后一个,-2代表倒数第二个,以此类推,第一个是-len(s)。
杨丝儿
2022/02/17
2.3K0
【Python】从基础变量类型到各种容器(列表、字典、元组、集合、字符串)
Python字符串操作:常用方法和高级技巧
Python作为一种强大的编程语言,在处理文本数据方面提供了丰富而灵活的工具。字符串是Python中最常用的数据类型之一,掌握字符串操作不仅能提高代码效率,还能解决各种复杂的文本处理问题。本文将深入探讨Python字符串的各种操作方法和高级技巧。
统计学家
2024/10/21
1800
Python字符串操作:常用方法和高级技巧
Python学习入门基础 — 第四章 列表、元组、字典、字符串变量使用、变量进阶
Python学习入门基础 -- 第四章 列表、元组、字典、字符串变量使用、变量进阶
Java架构师必看
2021/07/19
2.2K0
Python学习入门基础 — 第四章 列表、元组、字典、字符串变量使用、变量进阶
一文搞懂Python数据类型--字符串、列表、元组、字典、集合
考虑下面这种情况:A喜欢B,可B不喜欢A 如果A、B待定,用前面的格式化方式定义如下:”%s喜欢%s,可%s不喜欢%s” %(“A”,“B”,“B”,“A”) 这种方式的问题在于:
北山啦
2022/11/27
5860
一文搞懂Python数据类型--字符串、列表、元组、字典、集合
Python黑帽编程2.3 字符串、列表、元组、字典和集合
本节要介绍的是Python里面常用的几种数据结构。通常情况下,声明一个变量只保存一个值是远远不够的,我们需要将一组或多组数据进行存储、查询、排序等操作,本节介绍的Python内置的数据结构可以满足大多数情况下的需求。这一部分的知识点比较多,而且较为零散,需要认真学习。 2.3.1 字符串 字符串是 Python 中最常用的数据类型。我们可以使用引号('或")来创建字符串。 创建字符串很简单,只要为变量分配一个值即可。例如: var1 ='Hello World!' var2 ="Python Runoob
用户1631416
2018/04/12
1.8K0
Python黑帽编程2.3 字符串、列表、元组、字典和集合
Python 基础(字符串)
字符串定义 字符串是 Python中最常用的数据类型。字符串的意思就是"一串字符",比如"Hello,Charlie"是一个字符串,"How are you?"也是一个字符串。 Python要求字符串
数据STUDIO
2021/06/24
7250
Python 基础知识学习
这里只列举一些Python与Java和JavaScript不一样的地方,如果你有任何语言基础,相信看完这篇文章就可以轻松写Python程序。
李振
2021/11/26
4880
Python 基础知识学习
推荐阅读
相关推荐
Python基础-2 数字、字符串和列表
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验