// 进阶版本的屏幕截图
void getScreenShot(String str) throws IOException {
// ./src/test/image/ 存放图片路径
// 屏幕截图
SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sim2 = new SimpleDateFormat("HHmmss");
String dirTime = sim1.format(System.currentTimeMillis());
String fileName = sim2.format(System.currentTimeMillis());
String filename = "./src/test/image/" + dirTime + "/" + str + "-" + fileName + ".png";
System.out.println("filename:" + filename);
File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
// srcFile放到指定位置
FileUtils.copyFile(srcFile, new File(filename));
driver.findElement(By.cssSelector("#headline-tabs > ul"));
driver.quit();
}
void test04() {
createDriver();
try {
// 打开百度首页
driver.get("https://www.baidu.com");
System.out.println("已打开百度首页:" + driver.getTitle());
// 显式等待页面加载完成
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
// 点击“新闻”链接
WebElement newsLink = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#s-top-left > a:nth-child(1)")));
newsLink.click();
// System.out.println("已点击新闻链接");
// 获取当前窗口句柄
String curHandle = driver.getWindowHandle();
// System.out.println("当前窗口句柄为:" + curHandle);
// System.out.println("===============================================");
// 获取所有窗口句柄并切换到新窗口
Set<String> allHandles = driver.getWindowHandles();
for (String handle : allHandles) {
if (handle != curHandle) {
driver.switchTo().window(handle);
// 显式等待目标元素加载完成
// WebElement headlineTabs = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#headline-tabs > ul")));
// System.out.println("找到目标元素:" + headlineTabs.getText());
}
}
/*for (String handle : allHandles) {
if (!handle.equals(curHandle)) { // 使用 equals() 比较字符串
driver.switchTo().window(handle);
System.out.println("跳转之后:" + driver.getTitle());
// 显式等待目标元素加载完成
WebElement headlineTabs = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#headline-tabs > ul")));
System.out.println("找到目标元素:" + headlineTabs.getText());
break; // 切换到新窗口后退出循环
}
}*/
// 屏幕截图
// File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
// srcFile放到指定位置
// FileUtils.copyFile(srcFile, new File("my.png"));
getScreenShot(getClass().getName());
driver.findElement(By.cssSelector("#headline-tabs > ul"));
driver.quit();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭浏览器
if (driver != null) {
driver.quit();
}
}
}
测试打开的新的标签页之后还要继续返回到前一个标签页中进行测试。
#\31 > div > div > div > div > div > div.new-tag_4ozgi.new-text-link_3k9GD > div > div.flex-wrapper-top_3ucFS > div.flex-col-left_3trtY.baike-wrapper_6AORN.cu-pt-xs-lg.baike-wrapper-pc_26R04.cu-pt-xl.baike-wrapper-left-pc_5eYY8.cos-space-pb-sm > div > div > p > span:nth-child(1) > span
driver.findElement(By.cssSelector("#\\31 > div > div > div > div > div > div.new-tag_4ozgi.new-text-link_3k9GD > div > div.flex-wrapper-top_3ucFS > div.flex-col-left_3trtY.baike-wrapper_6AORN.cu-pt-xs-lg.baike-wrapper-pc_26R04.cu-pt-xl.baike-wrapper-left-pc_5eYY8.cos-space-pb-sm > div > div > p > span:nth-child(1) > span"));
选择器复制好直接粘贴到这里,不要再手动去修改
隐式等待:implicitlyWait() 参数:Duration类中提供的毫秒、秒、分钟等方法
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));// 设置等待时间
两种情况:在3秒内找到元素继续执行
在3S内没有找到元素–报错NoSuchElement
搜索迪丽热巴,百度百科
void test05() throws InterruptedException {
createDriver();
try {
driver.get("https://www.baidu.com");
driver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");
driver.findElement(By.cssSelector("#su")).click();
Thread.sleep(3000);
driver.findElement(By.cssSelector("#\\31 > div > div > div > div > div > div.new-tag_4ozgi.new-text-link_3k9GD > div > div.flex-wrapper-top_3ucFS > div.flex-col-left_3trtY.baike-wrapper_6AORN.cu-pt-xs-lg.baike-wrapper-pc_26R04.cu-pt-xl.baike-wrapper-left-pc_5eYY8.cos-space-pb-sm > div > div > p > span:nth-child(1) > span"));
// driver.findElement(By.xpath("//*[@id=\"1\"]/div/div/div/div/div/div[2]/div/div[1]/div[1]/div/div/p/span[1]/span"));
driver.quit();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭浏览器
driver.quit();
}
}
隐式等待,只有在查找元素的时候,在指定时间内查找元素
问题:先搜索迪丽热巴,在搜索邓紫棋,输出邓紫棋的名字
实际结果:输出的是“迪丽热巴”
预期结果:输出的是“邓紫棋”
问题原因:implicitWait只用来查找元素是否存在
解决办法:在查找“邓紫棋”关键词之前等待三秒,在这三秒里,clear、sendkeys、click操作+页面渲染肯定能完成(Thread.sleep(3000))
显示等待
显示等待也是一种智能等待,在指定超时时间范围内只要满足操作的条件就会继续执行后续代码。
elementToBeClickable(By locator) - 用于检查元素的期望是可见的并已启用,以便您可以单击它。
testToBe(Bylocator,String str) - 检查元素。(精确匹配)
presenceOfElementLocated(Bylocator) - 检查页面的DOM上是否存在元素。
urlToBe(java.lang.String url) - 检查当前页面的URL是一个特定的URL。
显示等待只作用在当前的条件上
若在超时间内为满足条件,则报错超时
隐式等待和显示等待一起使用效果如何呢?
结果:重试多次,最终打印的等待时间有10s、11s…
结论:注意混合隐式和显式等待,可能会导致不可预测的等待时间。
浏览器导航
常见操作:
1)打开网站
1 // 更长的方法
driver.navigate().to(“https://selenium.dev”);
// 简洁的方法
driver.get(“https://selenium.dev”);
2) 浏览器的前进、后退、刷新
driver.navigate().back();
driver.navigate().forward();
driver.navigate().refresh();
分别对应前进,后退、刷新的操作