目录
sendKeys(CharSequence... keysToSend)
getCssValue(String propertyName)
executeScript(String script, Object... args)
manage().timeouts().implicitlyWait(Duration duration)
1.Junit
JUnit 是一个流行的 Java 单元测试框架。JUnit 4 和 JUnit 5(也称为 Jupiter)通过使用注解来简化测试代码的编写和提供更丰富的测试功能。以下是一些在 JUnit 中常用的注解及其用途:
JUnit 4 常用注解
- `@Test`:表明该方法是一个测试方法。
- `@Before`:每个测试方法执行之前都会执行的方法,常用于设置测试环境。
- `@After`:每个测试方法执行之后都会执行的方法,常用于清理测试环境。
- `@BeforeClass`:所有测试开始之前运行一次的方法,必须是静态方法。
- `@AfterClass`:所有测试结束后运行一次的方法,必须是静态方法。
- `@Ignore`:忽略标记的测试方法,不会执行该测试方法。
- `@RunWith`:指定一个自定义的测试运行器。
JUnit 5 (Jupiter) 常用注解
JUnit 5 引入了新的注解,并对一些旧的注解进行了改进或替换。
- `@Test`:与 JUnit 4 相同,表示方法是测试方法。
- `@BeforeEach`:替代了 JUnit 4 的 `@Before`,用法相同。
- `@AfterEach`:替代了 JUnit 4 的 `@After`,用法相同。
- `@BeforeAll`:替代了 JUnit 4 的 `@BeforeClass`,用法相同,但不再需要是静态方法(如果使用了 TestInstance.Lifecycle.PER_CLASS 策略)。
- `@AfterAll`:替代了 JUnit 4 的 `@AfterClass`,用法相同,但不再需要是静态方法(如果使用了 TestInstance.Lifecycle.PER_CLASS 策略)。
- `@DisplayName`:为测试类或测试方法提供一个自定义的名字。
- `@Disabled`:替代了 JUnit 4 的 `@Ignore`,用于禁用测试方法。
- `@Nested`:允许创建嵌套的测试类,以表达测试类的层次结构。
- `@Tag`:用于声明过滤测试时的标签。
- `@ExtendWith`:用于注册自定义扩展,替代了 JUnit 4 的 `@RunWith`。
- `@ParameterizedTest`:指示方法是参数化测试。
- `@TestFactory`:表示该方法是一个动态测试工厂,返回动态测试集合。
- `@TestMethodOrder`:指定测试方法的执行顺序。
- `@TestInstance`:指定测试类的生命周期,可用于指定测试实例的创建方式。
参数化测试相关注解 (JUnit 5)
JUnit 5 提供了强大的参数化测试功能,下面是一些相关的注解:
- `@ValueSource`:为参数化测试提供一个简单的数组作为数据源。
- `@EnumSource`:为参数化测试提供枚举类型的数据源。
- `@MethodSource`:指定一个方法作为参数化测试的数据源。
- `@CsvSource`:允许使用 CSV 格式的字符串作为参数化测试数据源。
- `@CsvFileSource`:从 CSV 文件中读取数据作为参数化测试的数据源。
- `@ArgumentsSource`:使用自定义的 ArgumentsProvider 提供测试数据。
JUnit 注解是测试编写的核心,它们使得测试结构化、易于阅读并且具有强大的功能。随着版本的迭代,JUnit 5 提供了更多灵活性和强大的新特性来帮助开发者编写和组织测试代码。
Junit断言
assertEquals(expected, actual)
: 检查两个值是否相等。assertNotEquals(unexpected, actual)
: 检查两个值是否不相等。assertTrue(condition)
: 检查条件是否为真。assertFalse(condition)
: 检查条件是否为假。assertNull(object)
: 检查对象是否为null
。assertNotNull(object)
: 检查对象是否不为null
。assertSame(expected, actual)
: 检查两个引用是否指向同一个对象。assertNotSame(unexpected, actual)
: 检查两个引用是否不指向同一个对象。assertArrayEquals(expectedArray, actualArray)
: 检查两个数组是否相等。assertIterableEquals(expectedIterable, actualIterable)
: 检查两个 Iterable 是否相等。assertThrows(expectedException, executable)
: 预期执行某段代码时抛出特定异常。
2.Selenium WebDriver
Selenium WebDriver是一个开源的自动化测试工具,用于对Web应用程序进行自动化测试。它是Selenium项目的核心组件之一,旨在提供一个简单、更强大的编程接口,并且能够跨多种浏览器和操作系统使用。WebDriver通过直接与浏览器的原生功能交互,使得测试脚本能够模拟用户的实际操作,如点击按钮、填写表单、导航页面等。
核心特性
- 跨浏览器支持:WebDriver支持当下最流行的所有主要浏览器,包括Chrome, Firefox, Internet Explorer, Edge, Safari, Opera等。
- 跨平台:可以在Windows, MacOS, Linux等操作系统上运行测试。
- 语言支持:WebDriver提供了多种编程语言的绑定,包括Java, C#, Python, Ruby, JavaScript (Node.js)等,使得不同语言背景的开发者都能使用。
- 直接控制浏览器:WebDriver通过与浏览器的原生API进行交互来执行测试,这使得自动化测试更加可靠和高效。
- 支持复杂的用户交互:模拟键盘和鼠标操作,例如文本输入、鼠标点击、拖放、悬停等。
如何工作
WebDriver通过驱动程序与浏览器交互。每种类型的浏览器(如Chrome, Firefox)都有自己的驱动程序(如chromedriver, geckodriver),这些驱动程序实现了一个服务器,遵循WebDriver协议。测试代码通过WebDriver API发送命令到这个服务器,服务器再将这些命令转换为对应浏览器的原生调用。
基本使用
以下是一个简单的例子,展示了如何使用WebDriver和Java来打开Chrome浏览器并访问一个页面:
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class SeleniumExample {
public static void main(String[] args) {
// 设置chromedriver的位置
System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
// 创建WebDriver实例
WebDriver driver = new ChromeDriver();
// 打开网页
driver.get("http://www.example.com");
// 其他操作...
// 关闭浏览器
driver.quit();
}
}
在实际的测试脚本中,你会使用WebDriver API执行各种操作,比如查找元素、与元素交互、断言页面状态等,来完成更复杂的测试场景。
高级功能
除了基本的页面导航和元素交互,WebDriver还提供了一系列高级功能,包括但不限于:
- 等待机制:显式等待和隐式等待,以处理动态内容和异步加载。
- Cookie管理:获取和设置Cookies,模拟用户登录状态。
- 截屏:捕获当前浏览器视图的屏幕截图。
- 执行JavaScript:直接在浏览器中执行JavaScript代码。
- 窗口和标签页管理:在不同的窗口或标签页之间切换。
- Alerts和Popups:处理JavaScript生成的警告框和弹出框。
当然,下面我会针对每个功能提供具体的举例说明:
-
等待机制:
- 显式等待: 假设我们正在测试一个网页,在点击按钮后,一个新的消息框需要几秒钟才能出现。为了验证消息框的内容,我们可以使用显式等待来等待消息框元素变得可见。
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); WebElement messageBox = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("messageBoxId")));
- 隐式等待: 如果我们知道页面上的所有元素都有可能需要一些时间才能加载完成,我们可以设置一个全局的等待时间,如下所示:
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
- 显式等待: 假设我们正在测试一个网页,在点击按钮后,一个新的消息框需要几秒钟才能出现。为了验证消息框的内容,我们可以使用显式等待来等待消息框元素变得可见。
-
Cookie管理:
- 假设我们要测试用户登录后的页面。我们可以手动登录一次,然后获取登录成功后的Cookies,并在接下来的测试中设置这些Cookies来避免重复登录过程。
// 获取Cookies Set<Cookie> cookies = driver.manage().getCookies(); // 设置Cookies for (Cookie cookie : cookies) { driver.manage().addCookie(cookie); }
- 假设我们要测试用户登录后的页面。我们可以手动登录一次,然后获取登录成功后的Cookies,并在接下来的测试中设置这些Cookies来避免重复登录过程。
-
截屏:
- 如果我们需要验证网页在特定操作后的视觉效果,或者在测试失败时捕获错误的状态,我们可以进行屏幕截图:
TakesScreenshot screenshot = ((TakesScreenshot)driver); File srcFile = screenshot.getScreenshotAs(OutputType.FILE); FileUtils.copyFile(srcFile, new File("screenshot.png"));
- 如果我们需要验证网页在特定操作后的视觉效果,或者在测试失败时捕获错误的状态,我们可以进行屏幕截图:
-
执行JavaScript:
- 某些情况下,我们可能需要滚动到页面底部,而这个操作可能没有直接的WebDriver命令支持。这时候,我们可以通过执行JavaScript来实现:
JavascriptExecutor js = (JavascriptExecutor)driver; js.executeScript("window.scrollTo(0, document.body.scrollHeight)");
- 某些情况下,我们可能需要滚动到页面底部,而这个操作可能没有直接的WebDriver命令支持。这时候,我们可以通过执行JavaScript来实现:
-
窗口和标签页管理:
- 当我们点击一个链接,它在新的标签页打开时,我们需要切换到这个新的标签页来继续我们的测试步骤:
String originalWindow = driver.getWindowHandle(); for(String windowHandle : driver.getWindowHandles()) { if(!originalWindow.contentEquals(windowHandle)) { driver.switchTo().window(windowHandle); break; } } // 现在可以在新标签页上进行操作
- 当我们点击一个链接,它在新的标签页打开时,我们需要切换到这个新的标签页来继续我们的测试步骤:
-
Alerts和Popups:
- 当我们测试的网页执行了某个操作后,可能会弹出一个确认删除的alert对话框,我们需要在自动化脚本中接受这个alert:
driver.findElement(By.id("deleteButton")).click(); // 假设点击删除按钮会弹出alert Alert alert = driver.switchTo().alert(); alert.accept(); // 接受alert
- 当我们测试的网页执行了某个操作后,可能会弹出一个确认删除的alert对话框,我们需要在自动化脚本中接受这个alert:
以上示例代码片段主要用于展示如何在Selenium WebDriver自动化测试中应用各项功能。这些功能是构建稳定且高效自动化测试的关键组成部分,使得测试能够模拟真实用户的行为和响应页面的动态变化。
WebDriver是一款功能强大的工具,适合那些需要执行精确、复杂用户交互测试的情况。随着Web技术的不断发展,WebDriver也在不断更新和改进,以适应新的Web标准和浏览器特性。
3.自动化测试常用命令
1.停顿函数(常用)
public void setInterval(int a){
try {
Thread.sleep(a * 1000L); // 参数是毫秒,因此我们乘以1000将秒转换为秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
遇到一些时间太短而报错找不到对应元素(实际上多为来不及加载元素)的情况时,使用停顿函数有很大概率解决问题。
2.常用初始命令
// 打开网站
driver.get("http://10.0.200.52:8080/wh1b/#/login?redirect=%2Fforum%2Ftopic%2F384");
// 最大化网页
driver.manage().window().maximize();
driver.get();传入要打开的网页地址字符串会打开这个网页,
driver.manage().window().maximize();则会最大化网页。
3.driver相关常用命令
需要先加上这段(上一个段也一样)
/** 这一行声明了一个私有的 WebDriver 实例。
* WebDriver 是 Selenium 的核心接口,用于模拟浏览器操作。
* 你可以使用它来打开网页、获取元素、点击按钮等。
*/
private WebDriver driver;
/** 打开网页
* driver.get("https://www.example.com");
*/
/** 获取元素
* WebElement element = driver.findElement(By.id/className/tagName("XXX"));
*/
private Map<String, Object> vars;
JavascriptExecutor js;
private WebUtil webUtil;
@Before
public void setUp() {
driver = new ChromeDriver();
js = (JavascriptExecutor) driver;
vars = new HashMap<String, Object>();
webUtil = new WebUtil(driver);
new ResponseMockUtil().reset();
}
3.1.driver.findByElement()
以下图为例:
以上By.后的多种选择按字面意思理解,即通过元素的xpath、id、name等属性去寻找元素。
以下以name为例:
driver.findElement(By.name("userName"));
以上这行代码就是在当前打开的网页中查找名为"userName"
的元素,接下来是对找到的这个元素进行的一些操作:
driver.findElement(By.name("userName")).sendKeys("qipeng.dong");
这行代码会在当前打开的网页中查找名为"userName"
的元素,并在该元素中输入用户名"qipeng.dong"。其中,sendKeys("qipeng.dong")
: sendKeys
是一个WebElement
方法,允许模拟键盘输入。在找到元素之后,这个方法会将提供的字符串(在这个案例中是"qipeng.dong"
)输入到选中的元素中。这通常用于填写文本字段,如用户名、搜索框等,sendKeys()方法
之后再详写。除此之外,如果同一个元素需要被多次使用,还可以将它赋值给一个WebElement类型的变量,然后对这个变量来进行操作以达到简化效果,如下:
// 找到并点击登录按钮
WebElement login = driver.findElement(By.xpath("/html/body/div/div/form/button/span"));
login.click();
以上是通过所述方式实现点击按钮。
在Selenium WebDriver中,findElement
方法返回一个 WebElement
对象,这个对象代表了页面上的一个DOM元素。对于这个对象,你可以调用一系列的方法来与这个元素进行交互或者获取它的属性和状态。以下是一些可能用到的方法示例:
-
click()
:模拟鼠标点击该元素。driver.findElement(By.name("aaa")).click();
-
sendKeys(CharSequence... keysToSend)
:向该元素发送键盘输入。driver.findElement(By.name("aaa")).sendKeys("text to input");
-
这里有一个问题:如果涉及到搜索框内容的清空,最好使用以下方法进行清空,否则可能会出现监听器故障导致搜索功能瘫痪:
driver.findElement(By.id("lastNameInput")).sendKeys(Keys.CONTROL + "a"); driver.findElement(By.id("lastNameInput")).sendKeys(Keys.DELETE);
-
getText()
:获取该元素的可见文本。String text = driver.findElement(By.name("aaa")).getText();
-
getAttribute(String name)
:获取元素的特定属性的值。String attributeValue = driver.findElement(By.name("aaa")).getAttribute("href");
-
clear()
:如果这个元素是一个文本输入元素,这个方法会清除其值。可能会导致搜索故障driver.findElement(By.name("aaa")).clear();
-
isDisplayed()
:检查元素当前是否可见。boolean displayed = driver.findElement(By.name("aaa")).isDisplayed();
-
isEnabled()
:检查元素是否为可用状态(例如按钮是否可以点击)。boolean enabled = driver.findElement(By.name("aaa")).isEnabled();
-
isSelected()
:检查元素是否被选中,通常用于复选框、单选按钮等。boolean selected = driver.findElement(By.name("aaa")).isSelected();
-
submit()
:如果这个元素是表单元素,这个方法可以提交表单。driver.findElement(By.name("aaa")).submit();
-
getSize()
:返回元素的尺寸。Dimension size = driver.findElement(By.name("aaa")).getSize();
-
getLocation()
:返回元素在页面上的位置。Point location = driver.findElement(By.name("aaa")).getLocation();
-
getCssValue(String propertyName)
:获取元素的CSS属性值。String cssValue = driver.findElement(By.name("aaa")).getCssValue("color");
以上只是部分常用的方法,根据不同的测试需求,你可能会用到其他的 WebElement
方法。需要注意的是,如果找不到指定name属性为"aaa"的元素,findElement
方法会抛出 NoSuchElementException
。
3.2.sendKeys()详解
在Selenium WebDriver中,sendKeys()
方法主要用于向网页元素发送键盘操作。以下是 sendKeys
方法的一些常见用法:
-
输入文本: 向文本框、文本域或可编辑的元素中输入字符串。
driver.findElement(By.id("username")).sendKeys("myUsername");
-
组合按键: 与特殊按键(如Shift, Ctrl, Alt等)组合使用,执行快捷操作。
driver.findElement(By.id("inputField")).sendKeys(Keys.SHIFT + "hello"); // 输入大写的"HELLO"
-
特殊按键: 发送诸如Enter, Tab, Escape等特殊按键来模拟键盘事件。
driver.findElement(By.id("searchButton")).sendKeys(Keys.ENTER); // 模拟回车键进行搜索
-
清除并输入文本: 如果需要在一个输入框中先清除已有的内容再输入新的文本,可以结合使用
clear()
和sendKeys()
方法。WebElement element = driver.findElement(By.id("inputField")); element.clear(); // 清除已有文本 element.sendKeys("new text"); // 输入新文本
-
输入文件路径: 在
<input type="file">
元素中使用,以提供文件的完整路径,实现文件上传功能。driver.findElement(By.name("fileUpload")).sendKeys("/path/to/the/file.txt");
-
模拟键盘快捷操作: 可以通过
sendKeys()
来模拟键盘的快捷操作,例如复制粘贴。WebElement inputField = driver.findElement(By.id("inputField")); inputField.sendKeys(Keys.CONTROL + "a"); // 全选文本 inputField.sendKeys(Keys.CONTROL + "c"); // 复制文本 WebElement anotherField = driver.findElement(By.id("anotherField")); anotherField.sendKeys(Keys.CONTROL + "v"); // 粘贴文本
-
连续多个按键: 连续输入多个字符或按键。
driver.findElement(By.id("inputField")).sendKeys("Hello", Keys.SPACE, "World", Keys.EXCLAMATION_MARK); // 输入"Hello World!"
-
使用Chord方法: 如果需要同时按下多个键(不仅限于Ctrl、Alt和Shift),可以使用
Keys.chord()
方法。String selectAll = Keys.chord(Keys.CONTROL, "a"); driver.findElement(By.id("inputField")).sendKeys(selectAll); // 使用chord组合键全选文本
sendKeys()
是非常灵活的,可以模拟几乎所有的键盘操作。当你使用 sendKeys()
时,应确保目标元素支持文本输入或能够响应键盘事件。对于不接受输入的元素(比如大多数按钮),sendKeys()
可能不会有任何效果。此外,特定的键盘行为可能会因浏览器、操作系统或WebDriver的实现而有所差异。
4.driver其他命令
在Selenium WebDriver中,driver
是一个WebDriver实例,用于与浏览器进行交云。driver.XXX();
中的 XXX
表示你可以调用的方法,这些方法允许你执行各种操作,如打开网页、查找元素或更改配置等。以下是一些具体的方法示例:
-
get(String url) - 打开指定的URL。这是最常用的方法之一,它告诉WebDriver打开一个新的浏览器窗口并导航到指定的URL。
driver.get("https://www.google.com");
-
findElement(By by) - 查找页面上的单个元素。这个方法返回一个WebElement对象,表示页面上的DOM元素。你可以通过不同的定位策略来查找元素,比如id、name、class name、tag name、xpath、css selector等。
WebElement searchBox = driver.findElement(By.name("q")); searchBox.sendKeys("Selenium WebDriver");
-
findElements(By by) - 查找页面上所有匹配指定定位器的元素。这个方法返回一个List,包含所有找到的元素。
List<WebElement> links = driver.findElements(By.tagName("a")); for (WebElement link : links) { System.out.println(link.getText()); }
-
quit() - 关闭所有关联的窗口并退出WebDriver会话。这个方法用于结束测试,关闭所有由WebDriver打开的窗口。
driver.quit();
-
close() - 关闭当前的浏览器窗口。如果只有一个窗口打开,它的行为与
quit()
相似,但如果有多个窗口打开,它只会关闭当前聚焦的那个。driver.close();
-
navigate().to(String url) - 与
get()
类似,也用于导航到特定的URL。不同的是,navigate()
方法还可以让你回退和前进浏览器历史。driver.navigate().to("https://www.example.com"); driver.navigate().back(); driver.navigate().forward(); driver.navigate().refresh();
-
manage().window().maximize() - 最大化浏览器窗口。这个方法常用于确保浏览器窗口足够大,以避免某些元素因窗口大小而不可见。
driver.manage().window().maximize();
-
switchTo().frame(int index) - 切换到页面中的iframe。如果页面布局中包含iframe,你可能需要先切换到对应的iframe中,才能操作其中的元素。
-
driver.switchTo().frame(0); // 通过索引切换 WebElement frameElement = driver.findElement(By.tagName("iframe")); driver.switchTo().frame(frameElement); /**driver.switchTo().frame(0); *这一行代码使用了 switchTo().frame() 方法,并传入了一个整数参数(在这里是 0), *表示iframe的索引。因为索引是从0开始的,所以 0 表示页面上的第一个iframe。 */
-
getPageSource() - 获取当前页面的源代码。这个方法返回表示当前页面DOM结构的字符串,常用于调试或验证页面内容。
String pageSource = driver.getPageSource();
-
getCurrentUrl() - 获取当前页面的URL。这个方法返回用户当前所处页面的字符串URL,常用于确认导航是否成功。
String currentUrl = driver.getCurrentUrl();
-
getTitle() - 获取当前页面的标题。这个方法返回当前页面的title标签中的文本,常用于验证页面是否正确加载。
String title = driver.getTitle();
-
executeScript(String script, Object... args) - 执行JavaScript脚本。这个方法非常强大,允许你直接在浏览器中运行JavaScript代码。
JavascriptExecutor js = (JavascriptExecutor) driver; js.executeScript("alert('Hello, World!');");
-
manage().timeouts().implicitlyWait(Duration duration) - 设置隐式等待时间。隐式等待是告诉WebDriver,在抛出找不到元素的异常之前,应该等待一个固定的时间去查找DOM上的元素。
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
-
nage().addCookie(Cookie cookie) - 添加一个cookie到当前的浏览器会话。这个方法常用于模拟用户登录状态。
Cookie cookie = new Cookie("key", "value"); driver.manage().addCookie(cookie);
这些方法代表了Selenium WebDriver提供的核心功能,可以帮助你进行各种Web自动化测试任务。需要注意的是,这些方法必须在有效的WebDriver会话中使用,并且必须在浏览器完全初始化后调用。此外,方法的使用和效果可能会受到浏览器类型和驱动程序版本的影响。