自动化测试
配置chrome driver环境变量
python环境
-
python --version
-
pip --version
-
pip install selenium
Java环境
-
创建Java项目,添加pom配置依赖
import org.openqa.selenium.chrome.ChromeDriver;
public class Main {
public static void main(String\[\] args) {
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
}
}
成功打开了chrome浏览器,说明配置成功
webdriver API
元素定位
自动测试核心:对象的定位
webdriver提供了一系列的对象定位方法,常见的:
- id,name,class name,link text,partial link text,tag name,xpath,css selector
css选择器定位元素
//通过cssSelector,scc选择器定位元素
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
WebElement css = webDriver.findElement(By.cssSelector(".s_ipt"));
if(css==null){
System.out.println("未通过");
}else{
System.out.println("通过");
}
xpath定位元素
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
WebElement xpt = webDriver.findElement(By.xpath("//*[@id=\"chat-submit-button\"]"));
if(xpt==null){
System.out.println("未通过");
}else{
System.out.println("通过");
标签定位元素
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
WebElement tag = webDriver.findElement(By.tagName("jnput"));
if(tag==null){
System.out.println("未通过");
}else{
System.out.println("通过");
-
close:关闭当前浏览器
-
quit:关闭当前浏览器,彻底退出webdriver,,释放与driver server之间的连接、
操作测试对象
-
click:点击对象
-
send_keys:键盘输入数据
-
clear:清除对象输入内容
-
submit:提交
-
text:获取元素文本信息
这个选择器匹配所有在 <a>(超链接)内部的 <em>(强调)标签。
List<WebElement> results = webDriver.findElements(By.cssSelector("a em"));
//清空输入框内容
ipt.clear();
submit和click的区别:
-
submit必须放入form表单中,否则会报错
-
click没有任何限制,模拟鼠标点击的过程,推荐使用click
添加等待
-
强制等待:sleep
-
python:time.sleep(10) 秒
-
jav:Thread.sleep(10000)毫秒
-
-
隐式等待
- 是给 WebDriver 设定的一个"全局超时时间",告诉它"在找不到元素时,请耐心等待最多 X 秒"。
-
显示等待
- 是针对某个特定元素设定的"等待条件",告诉它"请一直等到这个元素满足某个条件
隐式等待
给find element设置一个全局的等待限度,在限度内未找到元素时抛出NoSuchElementException异常
执行过程
-
执行find Element时,立即去浏览器DOM中查找指定元素
-
如果找到则直接返回,不需要进行等待
-
如果没找到则等待设定的时间,并在时间内间断的进行查询
-
如果在设定时间内未找到指定元素,则抛出NoSuchElementException
写法
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
// 隐式等待
webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
显示等待
针对每个特定元素,知道元素可以操作或则出现
写法
// 显示等待(老版本写法)
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("su")));
element.click();
获取对应元素的属性值
.getAttribute("value"),value就是元素的属性值,如果value为空则未null
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
WebElement webElement = webDriver.findElement(By.cssSelector("#fw")
webElement.getAttribute("class")
打印元素相关信息
获取浏览器title
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
//百度官网的title:百度一下,你就知道
String title = webDriver.getTitle();
获取浏览器网址
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
String url = webDriver.getCurrentUrl();
浏览器操作
浏览器最大化
webDriver.manage().window().miximize();
设置浏览器高和宽
webDriver.manage().window().setSize(new dimension(100,100)
设置浏览器前进后退
webDriver.navigate().forward();
webDriver.navigate().back();
控制浏览器滚动条
1、滚动到指定元素出现在视野中
// 先定位到目标元素
WebElement element = driver.findElement(By.id("footer"));
// 方式1:使用 JavaScript 滚动到该元素
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
// 方式2:滚动到元素并使其居中(更平滑)
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView({block: 'center'});", element);
2、滚动到顶部或则底部
//滚动到顶部
((JavascriptExecutor) driver).executeScript("window.scrollTo(0, 0);");
//滚动到底部
((JavascriptExecutor) driver).executeScript("window.scrollTo(0, document.body.scrollHeight);");
3、滚动准确像素
// 向下滚动 300 像素
((JavascriptExecutor) driver).executeScript("window.scrollBy(0, 300);");
// 向上滚动 100 像素
((JavascriptExecutor) driver).executeScript("window.scrollBy(0, -100);");
4、使用Actions模拟键盘操作
// 按下 Page Down 键(页面下翻)
new Actions(driver).sendKeys(Keys.PAGE_DOWN).perform();
// 按下 Page Up 键(页面上翻)
new Actions(driver).sendKeys(Keys.PAGE_UP).perform();
// 连续按 5 次 Page Down
for (int i = 0; i < 5; i++) {
new Actions(driver).sendKeys(Keys.PAGE_DOWN).perform();
Thread.sleep(200); // 等待页面加载
}
5、结合显示等待,滚动到可交互
// 先等待元素出现
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("submitBtn")));
// 滚动到该元素
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
// 等待元素变为可点击
wait.until(ExpectedConditions.elementToBeClickable(element));
element.click();
模拟键盘操作
1、sendkeys-直接发送按键
import org.openqa.selenium.Keys;
// 1. 输入后按回车(搜索)
driver.findElement(By.id("kw")).sendKeys("Selenium", Keys.ENTER);
// 2. 输入后按 Tab 切换到下一个输入框
driver.findElement(By.id("username")).sendKeys("admin", Keys.TAB);
// 3. 清空输入框(全选 + Delete)
driver.findElement(By.id("kw")).sendKeys(Keys.CONTROL + "a", Keys.DELETE);
// 或 Ctrl + Backspace
driver.findElement(By.id("kw")).sendKeys(Keys.CONTROL + "a", Keys.BACK_SPACE);
2、Action-组合键和长按
Actions actions = new Actions(webDriver);
//ctrl a
actions.keyDown(Keys.CONTROL)
.sengKeys("a")
.keyUp(Keys.CONTROL)
.proform();
//ctrl c
actions.keyDown(Keys.CONTROL)
.sendKeys("c")
.keyUp(Keys.CONTROL)
.preform();
//ctrl v
actions.keyDown(Keys.CONTROL)
.sengKeys("v")
.keyUp(Keys.CONTROL)
.preform();
// 4. Shift + 字母(输入大写字母)
actions.keyDown(Keys.SHIFT)
.sendKeys("hello") // 会输入 HELLO
.keyUp(Keys.SHIFT)
.perform();
// 5. 多个按键组合:Ctrl + Shift + Z(重做)
actions.keyDown(Keys.CONTROL)
.keyDown(Keys.SHIFT)
.sendKeys("z")
.keyUp(Keys.SHIFT)
.keyUp(Keys.CONTROL)
.perform();
切换窗口
窗口的唯一标识:窗口句柄:window handle
-
唯一标识每个浏览器窗口或标签页的字符串
-
可以在不同的窗口之间切换焦点
操作流程
-
获取当前窗口
WebDriver webDriver = new ChromeDriver(); webDriver.get("https://www.baidu.com") String mainWindowHandle = webDriver.getWindowHandle(); -
打开执行新窗口的操作
webDriver.findElement(By.linkText("打开新窗口")).click(); -
获取所有窗口句柄
set<String> allWindowHandles = webDriver.getWindowHandles(); -
遍历所有句柄,切换新窗口
for(String handle : allWindowHandle){ if(!handle.equals(mainWindowHandle)){ webDriver.switchTo().window(handle); break; } } -
在新窗口执行新操作
//获取窗口Title String title = webDriver.getTitle(); String copyPath = "E:\\截图保存" //进行窗口截图 File file = ((TakesScreenShot)webDriver).getScreenShotAs(OutPutType.FILE) ; Files.copy(file.toPath(),Paths.get(copyPath); -
执行完操作后返回主窗口
webDriver.close(); webDriver.switchTo().window(mainWindowHandle);
实践操作
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
String mainWindowHandle = webDriver.getWindowHandle();
System.out.println(mainWindowHandle);
Thread.sleep(1000);
webDriver.findElement(By.linkText("新闻")).click();
Set<String> windowHandles = webDriver.getWindowHandles();
for(String handle : windowHandles){
if(!handle.equals(mainWindowHandle)){
webDriver.switchTo().window(handle);
break;
}
}
System.out.println("窗口新窗口标题:"+webDriver.getTitle());
//截取页面
String timestamp = String.valueOf(System.currentTimeMillis());
File file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
String path = "C:\\Users\\gonghao\\Desktop\\Founderintl\\screenshot"+timestamp+".png";
Files.copy(file.toPath(), Paths.get(path), StandardCopyOption.REPLACE_EXISTING);
}
复选框操作
-
选择所有复选框
WebDriver webDriver = new ChromeDriver(); webDriver.get(""); for(WebElement element : webDriver.findElements(By.cssSelector("input[tyoe='checkbox']"))){ if(!element.isSelected()){ element.click(); } } -
取消所有复选框
WebDriver webDriver = new ChromeDriver(); webDriver.get(""); for(WebElement webElement : webDriver.findElements(By.cssSelector("input[type='checkbox']")){ if(webElement.isSelected()){ webElement.click(); } } -
取消特定值的复选框
WebDriver webDriver = new ChromeDriver(); webDriver.get(""); WebElement webElement1 = webDriver.findElement(By.cssSelector("input[value='1']")).click(); WebELement webElement2 = webDriver.findElement(By.cssSelector("input[value='2']")).click(); -
通过标签文本定位
WebDriver webDriver = new ChromeDriver(); webDriver.get(""); driver.findElement(By.xpath(""));
定位下拉框选项
下拉框是类型
现有如下下拉框
<select id="city">
<option value="bj">北京</option>
<option value="sh">上海</option>
<option value="gz">广州</option>
</select>
定位
WebDriver webDriver = new ChromeDriver();
webDriver.get("");
WebElement selectot = webDriver.findElement(By.cssSelector("select"))
Select select = new Select(webDriver);
//bj
select.selectByIndex(0);
//sh
select.selectByValue("sh");
//gz
select.selectByVisibleText("广州");
获取当前选中的选项
WebElement selectedOption = select.getFirstSelectedOption();
selectedOption.getText();
获取全部选中的选项
List<WebElement> selecteds = select.getOptions();
for(WebElement option : selecteds){
system.out.println(option.getText());
}
//判断下拉框是否支持多选
select.isMultiple();
//取消所有下拉框选择
select.deselectAll();
下拉框不是类型
有些前端框架(如 Vue/React)会使用 div 或 ul 模拟下拉框,此时不能用 Select 类。需要模拟点击 + 选择操作
// 1. 点击展开下拉框
driver.findElement(By.cssSelector(".dropdown-trigger")).click();
// 2. 从下拉列表中选择目标项
driver.findElement(By.xpath("//li[text()='上海']")).click();
下拉框可能是动态刷新,建议加上显示等待
WebDriverWait wait = new WebDriverWait(driver, 10);
// 等待下拉框可见
WebElement dropdown = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("city")));
// 创建 Select 对象
Select select = new Select(dropdown);
select.selectByVisibleText("上海");