在selenium-webdriver中我们用两种方式进行等待:显性的等待和隐性的等待。
显性的等待
显式等待 使用ExpectedConditions类中自带方法, 可以进行显试等待的判断。
显式等待可以自定义等待的条件,用于更加复杂的页面等待条件
等待的条件 |
WebDriver方法 |
页面元素是否在页面上可用和可被单击 |
elementToBeClickable(By locator) |
页面元素处于被选中状态 |
elementToBeSelected(WebElement element) |
页面元素在页面中存在 |
presenceOfElementLocated(By locator) |
在页面元素中是否包含特定的文本 |
textToBePresentInElement(By locator) |
页面元素值 |
textToBePresentInElementValue(By locator, java.lang.String text) |
标题 (title) |
titleContains(java.lang.String title) |
隐性等待
1. Xpath往往以“//”开头,属性都是采用@表示,例如//div[@id='_navigation']/div
2. Firefox有个插件叫做xpather,在页面上点击右键选中“show in xpather”,可以很快的给出对应的xpath。它给出的格式是这样的:/html/body/header/nav/ul[1]/li[5]/a/span
3. 根据是否使用属性,Xpath的语法格式有两种:
不使用属性:按照html的层次,如/html/body/header/nav/ul[1]/li[5]/a/span
使用属性:如//input[@class=’input’],直接定位。
Selenium还支持多个属性来定位,如//input[@class=’input’ and @type=’text’]。
4. /div[2]表示第二个,/div[last()]表示最后一个,但是没有/div[first()]的语法,选择第一个用/div[1]
5. 选择一个以上的元素,使用|,如//div|//a,表示选择所有的div标签和a标签
6. 选择未知元素,使用“*”来选择满足条件的所有元素,如/*
7. //input[@class=’input’]选择元素中的属性
//input[@class]选择有属性名为class的input标签
在使用 Selenium WebDriver 做自动化测试的时候,会经常模拟鼠标和键盘的一些行为。比如使用鼠标单击、双击、右击、拖拽等动作;或者键盘输入、快捷键使用、组合键使用等模拟键盘的操作。在 WebDeriver 中,有一个专门的类来负责实现这些测试场景,那就是 Actions 类,在使用该类的过程中会配合使用到 Keys 枚举以及 Mouse、 Keyboard、CompositeAction 等类。
其次,在实际测试过程中,可能会遇到某些按键没办法使用 Actions、Keys 等类来实现的情况。 比如通过使用 Alt+PrtSc 组合键来实现截取屏幕当前活动窗口的图像,在 Keys 枚举中,因为没有枚举出 PrtSc 键,所以没办法通过 Action 的 KeyDown(Keys) 来模拟按下这个动作。
再次是在自动化测试中,可能会遇到一些附件、文件上传的场景,或者是多文件上传,这些在 Selenium2.0 之后,可以直接使用 WebElement 类的 sendKeys() 方法来实现。
下面就分别介绍这些情况的具体使用。
回页首
鼠标点击事件有以下几种类型:
Actions action = new Actions(driver);action.click();// 鼠标左键在当前停留的位置做单击操作 action.click(driver.findElement(By.name(element)))// 鼠标左键点击指定的元素
Actions action = new Actions(driver); action.contextClick();// 鼠标右键在当前停留的位置做单击操作 action.contextClick(driver.findElement(By.name(element)))// 鼠标右键点击指定的元素
Actions action = new Actions(driver); action.doubleClick();// 鼠标在当前停留的位置做双击操作 action.doubleClick(driver.findElement(By.name(element)))// 鼠标双击指定的元素
Actions action = new Actions(driver); // 鼠标拖拽动作,将 source 元素拖放到 target 元素的位置。 action.dragAndDrop(source,target); // 鼠标拖拽动作,将 source 元素拖放到 (xOffset, yOffset) 位置,其中 xOffset 为横坐标,yOffset 为纵坐标。 action.dragAndDrop(source,xOffset,yOffset);
在这个拖拽的过程中,已经使用到了鼠标的组合动作,首先是鼠标点击并按住 (click-and-hold) source 元素,然后执行鼠标移动动作 (mouse move),移动到 target 元素位置或者是 (xOffset, yOffset) 位置,再执行鼠标的释放动作 (mouse release)。所以上面的方法也可以拆分成以下的几个执行动作来完成:
action.clickAndHold(source).moveToElement(target).perform(); action.release();
Actions action = new Actions(driver); action.clickAndHold();// 鼠标悬停在当前位置,既点击并且不释放 action.clickAndHold(onElement);// 鼠标悬停在 onElement 元素的位置
action.clickAndHold(onElement) 这个方法实际上是执行了两个动作,首先是鼠标移动到元素 onElement,然后再 clickAndHold, 所以这个方法也可以写成 action.moveToElement(onElement).clickAndHold()。
Actions action = new Actions(driver); action.moveToElement(toElement);// 将鼠标移到 toElement 元素中点 // 将鼠标移到元素 toElement 的 (xOffset, yOffset) 位置, //这里的 (xOffset, yOffset) 是以元素 toElement 的左上角为 (0,0) 开始的 (x, y) 坐标轴。 action.moveToElement(toElement,xOffset,yOffset) // 以鼠标当前位置或者 (0,0) 为中心开始移动到 (xOffset, yOffset) 坐标轴 action.moveByOffset(xOffset,yOffset);
action.moveByOffset(xOffset,yOffset) 这里需要注意,如果 xOffset 为负数,表示横坐标向左移动,yOffset 为负数表示纵坐标向上移动。而且如果这两个值大于当前屏幕的大小,鼠标只能移到屏幕最边界的位置同时抛出 MoveTargetOutOfBoundsExecption 的异常。
鼠标移动操作在测试环境中比较常用到的场景是需要获取某元素的 flyover/tips,实际应用中很多 flyover 只有当鼠标移动到这个元素之后才出现,所以这个时候通过执行 moveToElement(toElement) 操作,就能达到预期的效果。但是根据我个人的经验,这个方法对于某些特定产品的图标,图像之类的 flyover/tips 也不起作用,虽然在手动操作的时候移动鼠标到这些图标上面可以出现 flyover, 但是当使用 WebDriver 来模拟这一移动操作时,虽然方法成功执行了,但是 flyover 却出不来。所以在实际应用中,还需要对具体的产品页面做相应的处理。
Actions action = new Actions(driver); action.release();// 释放鼠标
回页首
对于键盘的模拟操作,Actions 类中有提供 keyUp(theKey)、keyDown(theKey)、sendKeys(keysToSend) 等方法来实现。键盘的操作有普通键盘和修饰键盘(Modifier Keys, 下面的章节将讲到修饰键的概念)两种 :
1. 对于普通键盘,使用 sendKeys(keysToSend) 就可以实现,比如按键 TAB、Backspace 等。
Actions action = new Actions(driver); action.sendKeys(Keys.TAB);// 模拟按下并释放 TAB 键 action.sendKeys(Keys.SPACE);// 模拟按下并释放空格键 /*** 针对某个元素发出某个键盘的按键操作,或者是输入操作, 比如在 input 框中输入某个字符也可以使用这个方法。这个方法也可以拆分成: action.click(element).sendKeys(keysToSend)。 */ action.sendKeys(element,keysToSend);
注意除了 Actions 类有 sendKeys(keysToSend)方法外,WebElement 类也有一个 sendKeys(keysToSend)方法,这两个方法对于一般的输入操作基本上相同,不同点在于以下几点:
Actions action = New Actions(driver); action.sendKeys(element,“C:\\test\\upload\\test.jpg”); action.click(element).sendKeys(“C:\\test\\upload\\test.jpg”);
这种方式是上传不成功的,虽然 WebDriver 在执行这条语句的时候不会出错,但是实际上并没有将文件上传。所以要上传文件,还是应该使用前面一种方式。
2.对于修饰键(Modifier keys),一般都是跟普通键组合使用的。比如 Ctrl+a、Alt+F4、 Shift+Ctrl+F 等等。
Actions action = new Actions(driver); action.keyDown(Keys.CONTROL);// 按下 Ctrl 键 action.keyDown(Keys.SHIFT);// 按下 Shift 键 action.keyDown(Key.ALT);// 按下 Alt 键 action.keyUp(Keys.CONTROL);// 释放 Ctrl 键 action.keyUp(Keys.SHIFT);// 释放 Shift 键 action.keyUp(Keys.ALT);// 释放 Alt 键
所以要通过 Alt+F4 来关闭当前的活动窗口,可以通过下面语句来实现:action.keyDown(Keys.ALT).keyDown(Keys.F4).keyUp(Keys.ALT).perform();
而如果是对于像键盘上面的字母键 a,b,c,d... 等的组合使用,可以通过以下语句实现 :action.keyDown(Keys.CONTROL).sednKeys(“a”).perform();
在 WebDriver API 中,KeyDown(Keys theKey)、KeyUp(Keys theKey) 方法的参数只能是修饰键:Keys.SHIFT、Keys.ALT、Keys.CONTROL, 否者将抛出 IllegalArgumentException 异常。 其次对于 action.keyDown(theKey) 方法的调用,如果没有显示的调用 action.keyUp(theKey) 或者 action.sendKeys(Keys.NULL) 来释放的话,这个按键将一直保持按住状态。