php-webdriver库中WebDriverExpectedCondition如何使用?

在 PHP WebDriver(php-webdriver/webdriver 库)中,WebDriverExpectedCondition 类提供了一系列静态方法,用于定义等待条件(通常配合 WebDriverWait 使用),判断页面元素、标题、URL 等是否满足预期状态。这些条件是自动化测试或页面采集时 “等待异步操作完成” 的核心工具。那么,这些条件是哪些,又要如何使用这些条件来保证目标数据能够正常加载到页面中呢?

常用判断条件分类及说明

以下是最常用的条件,按场景分类:

一、元素存在与可见性

用于判断元素是否在 DOM 中存在,或是否可见(视觉上可感知)。

条件方法 作用 参数 适用场景
presenceOfElementLocated(WebDriverBy $locator) 判断元素在 DOM 中存在(不要求可见) 定位器(如 WebDriverBy::cssSelector('#id')) 只需元素加载到 DOM,无需等待渲染完成(如隐藏元素)
visibilityOfElementLocated(WebDriverBy $locator) 判断元素存在且可见(display 不为 none,visibility 不为 hidden) 定位器 需元素显示在页面上(如按钮、输入框)
visibilityOfAllElementsLocatedBy(WebDriverBy $locator) 判断所有匹配元素都存在且可见 定位器 等待列表、表格等多个元素加载并显示
invisibilityOfElementLocated(WebDriverBy $locator) 判断元素不可见或不存在于 DOM 中 定位器 等待加载动画消失、弹窗关闭等

二、元素交互性

用于判断元素是否可操作(如点击、输入)。

条件方法 作用 参数 适用场景
elementToBeClickable(WebDriverBy $locator) 判断元素可见且可点击(无 disabled 属性,不在不可点击的父元素内) 定位器 等待按钮、链接加载完成并可点击
elementToBeSelected(WebDriverBy $locator) 判断元素(如复选框、单选框)被选中 定位器 等待选择状态变化(如表单提交后)
stalenessOf(WebElement $element) 判断元素已从 DOM 中移除(失效) 已获取的元素对象 等待页面刷新、元素被替换(如列表项删除后)

三、文本与属性判断

用于验证元素文本、属性或页面内容。

条件方法 作用 参数 适用场景
textToBePresentInElement(WebDriverBy $locator, string $text) 判断元素包含指定文本(精确匹配部分文本) 定位器 + 目标文本 等待元素加载动态文本(如 “加载完成” 提示)
textToBePresentInElementValue(WebDriverBy $locator, string $text) 判断元素的 value 属性包含指定文本 定位器 + 目标文本 验证输入框、下拉框的当前值
attributeToBe(WebDriverBy $locator, string $attribute, string $value) 判断元素的指定属性等于目标值 定位器 + 属性名 + 目标值 验证元素状态(如 class="active")
titleContains(string $title) 判断页面标题包含指定文本 目标文本 等待页面跳转后标题更新
titleIs(string $title) 判断页面标题完全等于指定文本 目标文本 精确验证页面标题
urlContains(string $url) 判断当前 URL包含指定字符串 目标字符串 等待 URL 中出现关键参数(如 ?success=1)
urlMatches(string $pattern) 判断当前 URL匹配正则表达式 正则表达式 复杂 URL 验证(如日期格式 \d{4}-\d{2}-\d{2})

四、框架与窗口

用于处理 iframe 切换或窗口切换。

条件方法 作用 参数 适用场景
frameToBeAvailableAndSwitchToIt(WebDriverBy $locator) 判断 iframe存在并切换到该 iframe 定位器(iframe 的 id、name 或元素) 等待 iframe 加载完成并操作内部元素
numberOfWindowsToBe(int $expectedNumber) 判断当前窗口数量等于预期值 预期窗口数 等待新窗口打开(如点击链接弹出新窗口)

五、其他常用条件

条件方法 作用 参数 适用场景
alertIsPresent() 判断存在 alert 弹窗(无参数) 等待警告框、确认框弹出
elementLocatedBy(WebDriverBy $locator) 等同于 presenceOfElementLocated(兼容旧版本) 定位器 同 presenceOfElementLocated
not(WebDriverExpectedCondition $condition) 对条件取反(“非” 逻辑) 另一个条件实例 等待 “元素不可见”“文本不存在” 等反向场景

使用示例

结合 WebDriverWait 使用条件,等待元素可见后再操作:

复制
use Facebook\WebDriver\WebDriverWait;
use Facebook\WebDriver\WebDriverExpectedCondition;
use Facebook\WebDriver\WebDriverBy;

// 等待 10 秒,直到 #submit-btn 元素可见且可点击
$wait = new WebDriverWait($driver, 10);
$submitBtn = $wait->until(
    WebDriverExpectedCondition::elementToBeClickable(
        WebDriverBy::cssSelector('#submit-btn')
    )
);

// 点击按钮
$submitBtn->click();

区别

  • 存在(presence)≠ 可见(visibility):元素在 DOM 中存在,但可能被隐藏(如 display: none),此时 presence 条件满足,但 visibility 不满足。

  • 可点击(clickable):不仅要求可见,还需元素处于可交互状态(无 disabled 属性,不在被禁用的父容器中)。

根据具体场景选择合适的条件,可避免因 “元素未准备好” 导致的操作失败(如点击不存在的按钮、读取未加载的文本)。