⾃动化测试常⽤函数(下)
等待通常代码执⾏的速度⽐⻚⾯渲染的速度要快如果避免因为渲染过慢出现的⾃动化误报的问题呢可 以使⽤selenium中提供的三种等待⽅法强制等待Thread.sleep优点使⽤简单调试的时候⽐较有效缺点影响运⾏效率浪费⼤量的时间隐式等待隐式等待是⼀种智能等待他可以规定在查找元素时在指定时间内不断查找元素。如果找到则代码 继续执⾏直到超时没找到元素才会报错。implicitlyWait 参数Duration类中提供的毫秒、秒、分钟等⽅法⽰例//隐式等待1000毫秒 driver.manage().timeouts().implicitlyWait(Duration.ofMillis(1000)); //隐式等待5秒 driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));隐式等待作⽤域是整个脚本的所有元素。即只要driver对象没有被释放掉driver.quit()隐式等待 就⼀直⽣效。优点智能等待作⽤于全局显⽰等待显⽰等待也是⼀种智能等待在指定超时时间范围内只要满⾜操作的条件就会继续执⾏后续代码 new WebDriverWait(driver, Duration.ofSeconds(3)).until($express) $press涉及到selenium.support.ui.ExpectedConditions包下的ExpectedConditions类返回值boolean⽰例WebDriverWait foo new WebDriverWait(driver, Duration.ofSeconds(3)) foo.until(ExpectedConditions.elementToBeClickable(By.cssSelector(#id)));ExpectedConditions预定义⽅法的⼀些⽰例• elementToBeClickable(By locator) ‒⽤于检查元素的期望是可⻅的并已启⽤以便您 可以单击它• textToBe(BylocatorString str) -检查元素。• presenceOfElementLocated(Bylocator) ‒检查⻚⾯的DOM上是否存在元素。• urlToBe(java.lang.String url) ‒检查当前⻚⾯的URL是⼀个特定的URL。WebDriverWait wait new WebDriverWait(driver,Duration.ofSeconds(10)); boolean ispass wait.until(ExpectedConditions.textToBe(By.cssSelector(#s-topleft a:nth-child(1)), 新闻)); if(ispass){ System.out.println(测试通过); }else { System.out.println(测试失败); }优点显⽰等待是智能等待可以⾃定义显⽰等待的条件操作灵活缺点写法复杂隐式等待和显⽰等待⼀起使⽤效果如何呢测试⼀下//隐式等待设置为5s显⽰等待设置为10s那么结果会是51015s吗 SimpleDateFormat sim new SimpleDateFormat(yyyy-MM-dd HH:mm:ss); System.out.println(sim.format(System.currentTimeMillis())); driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5)); driver.findElement(By.cssSelector(#hotsearch-content-wrapper li:nthchild(1) a span.title-content)); WebDriverWait wait new WebDriverWait(driver,Duration.ofSeconds(10)); try{ wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(#hotsear ch-content-wrapper li:nth-child(1) a span.title-content))); }catch (Exception e){ System.out.println(nosuelement!); } System.out.println(sim.format(System.currentTimeMillis()));结果重试多次最终打印的等待时间有10s、11s....结论不要混合隐式和显式等待可能会导致不可预测的等待时间。浏览器导航常⻅操作1打开⽹站// 更⻓的⽅法 driver.navigate().to(https://selenium.dev); // 简洁的⽅法 driver.get(https://selenium.dev);2浏览器的前进、后退、刷新driver.navigate().back(); driver.navigate().forward(); driver.navigate().refresh();案例百度⾸⻚测试https://tool.lu/标签⼊⼝弹窗弹窗是在⻚⾯是找不到任何元素的这种情况怎么处理使⽤selenium提供的Alert接⼝警告弹窗确认弹窗Alert alert driver.switchTo.alert(); //确认 alert.accept() //取消 alert.dismiss()提⽰弹窗Alert alert driver.switchTo.alert(); alert.sendKeys(hello); alert.accept(); alert.dismiss();⽂件上传点击⽂件上传的场景下会弹窗系统窗⼝进⾏⽂件的选择。selenium⽆法识别⾮web的控件上传⽂件窗⼝为系统⾃带⽆法识别窗⼝元素但是可以使⽤sendkeys来上传指定路径的⽂件达到的效果是⼀样的WebElement ele driver.findElement(By.cssSelector(body div div input[typefile])); ele.sendKeys(D:\\selenium2html\\selenium2html\\upload.html);浏览器参数设置1)设置⽆头模式2)设置浏览器加载策略options.setPageLoadStrategy(PageLoadStrategy.NONE);