本篇知识点:
- 查看页面元素的属性
- 获取页面元素的css属性值
- 隐式等待
- 常用显式等待
- 自定义显示等待
查看页面元素的属性
被测试网页的网址:http://www.baidu.com
// 查看页面元素的属性 @Test public void getWebElementAttribute() { driver.get("http://www.baidu.com"); String inputString = "测试工程师指定的输入内容"; WebElement input = driver.findElement(By.id("kw")); input.sendKeys(inputString); String inputText = input.getAttribute("value"); Assert.assertEquals(inputText, inputString); }
获取页面元素的css属性值
被测试网页的网址:http://www.baidu.com
// 获取页面元素的css属性值 @Test(enabled = false) public void getWebElementCssValue() { driver.get("http://www.baidu.com"); WebElement input = driver.findElement(By.id("kw")); String inputcss = input.getCssValue("width"); System.out.println(inputcss); Assert.assertEquals("500px", inputcss); }
隐式等待
被测试网页的网址:http://www.baidu.com
// 隐式等待 @Test(enabled = false) public void testImplictWait() { driver.get("http://www.baidu.com"); // 使用implicitlyWait方法设定查找页面元素的最大等待时间。调用findElement方法时没有立刻找到定位元素,则程序会每间隔一定时间后不断尝试判断页面的DOM中是否出现被查找元素。 // 若超过设定的等待时长依然没有找到,则抛出NoSuchElementException driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); try { WebElement input = driver.findElement(By.id("kw")); WebElement but = driver.findElement(By.id("su")); input.sendKeys("输入框元素被成功找到了!"); but.click(); } catch (NoSuchElementException e) { Assert.fail("找不到输入框"); e.printStackTrace(); } }
隐式等待的默认等待最长时间是0,一旦设置,这个隐式等待会在WebDriver对象实例的整个生命周期起作用。
常用显式等待
被测试网页的网址:http://www.baidu.com
显式等待比隐式等待更节约测试脚本执行的时间,一般推荐使用显式等待方式来判断页面元素是否存在。使用ExpectedConditions类中自带的方法,可以进行显式等待的判断。
只有满足显式等待的条件要求,测试代码才会继续向后执行后续的测试逻辑。当显示等待条件未被满足的时候,在设定的最大显示等待时间阈值内,会停在当前代码位置进行等待,直到设定的等待条件被满足,才能继续执行后续的测试逻辑。如果超过设定的最大显式等待时间阈值,则测试程序会抛出异常,测试用例会被认为失败。
常用的显示等待条件如下:
- ExpectedConditions.elementToBeClickable(By locator):页面元素是否在页面上可用或可被单击
- ExpectedConditions.elementToBeSelected(WebElement element):页面元素处于被选中状态
- ExpectedConditions.presenceOfElementLocated(By locator):页面元素在页面中存在
- ExpectedConditions.textToBePresentInElement(By locator):在页面元素中是否包含特定的文本
- ExpectedConditions.textToBePresentInElementValue(By locator, java.lang.String text):页面元素值
- ExpectedConditions.titleContains(java.lang.String title):标题(title)
// 显式等待 @Test(enabled=false) public void testExplicitWait(){ driver.get("http://www.baidu.com"); //声明一个WedDriverWait对象,设定出发条件的最长等待时间为10秒 WebDriverWait wait=new WebDriverWait(driver, 10); wait.until(ExpectedConditions.titleContains("百度")); System.out.println("网页标题出现了“百度”关键字"); //使用ExpectedConditions中的 presenceOfAllElementsLocatedBy判断id为kw的这个输入框是否存在 wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.id("kw"))); System.out.println("页面中id为kw的元素已显示"); //查找出百度页面中的“更多产品”链接 WebElement element1 = driver.findElement(By.name("tj_briicon")); //调用ExpectedConditions中的textToBePresentInElement判断element1中是否包含“更多产品”这几个字。 wait.until(ExpectedConditions.textToBePresentInElement(element1, "更多产品")); System.out.println("element1中包含“更多产品”这几个字"); }
自定义显示等待
被测试网页:http://www.baidu.com//自定义的显式等待 @Test(enabled = false) public void testExpectedCondition() { driver.get("http://www.baidu.com"); WebElement input = driver.findElement(By.id("kw")); input.sendKeys("zTree"); input.submit(); // 使用ExpectedConditions的静态方法titleContain来实现比较title里是否含有“zTree” new WebDriverWait(driver, 10).until(ExpectedConditions.titleContains("zTree")); // 使用ExpectedCondition接口,自定义方法来比较title全变成小写后是否含有“ztree”。 // 使用ExpectedCondition接口,一定要实现apply方法 new WebDriverWait(driver, 10).until(new ExpectedCondition<Boolean>() { public Boolean apply(WebDriver arg0) { // TODO Auto-generated method stub return driver.getTitle().toLowerCase().startsWith("ztree"); } }); }