selenium基本使用方式

自动化测试

配置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)会使用 divul 模拟下拉框,此时不能用 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("上海");
相关推荐
plainGeekDev4 小时前
kapt 替换为 KSP
android·java·kotlin
蜡台4 小时前
通过Gradle脚本声明更改Java变量
android·java·开发语言·python·kotlin·gradle·groovy
程序员天天困5 小时前
后端视角看 EventBus:发布订阅总线的原理、场景与用法
java·后端
要开心吖ZSH5 小时前
AI医疗分诊与健康咨询助手agent开发——(4-2)从零到一:我给AI医疗分诊助手加了个“知识库大脑“,终于搞懂了RAG是什么
java·docker·agent·医疗·rag
怎么比啊都是大神6 小时前
关于==null、isEmpty()和StrUtil.isBlank()
java
唐青枫7 小时前
Java Neo4j 实战指南:从图模型、Cypher 到 Spring Boot 关系查询
java
观远数据7 小时前
从离线开发到实时同步:DataFlow如何支撑企业级数据治理闭环
java·windows·microsoft·excel
今天AI了吗8 小时前
Hermes Agent 搭建全流程:从本机试跑到可持续运行的个人 AI Agent
java·人工智能·python·学习·embedding
春卷同学8 小时前
032-关系型数据库在记账应用中的建模与查询优化
java·jvm·数据库
不平衡的叉叉树8 小时前
Springboot+Mockito简单使用单元测试
java·spring boot·单元测试