Selenium3+Pytest+Allure落地Python Web自动化测试(15章已完结)

15 阅读4分钟

Selenium3+Pytest+Allure落地Python Web自动化测试---xingkeit.top/7734/

Selenium3 的定位能力优势:轻松应对复杂页面

在现代 Web 自动化测试中,面对日益复杂的页面结构——无论是嵌套多层的动态 Div、动态生成的表格,还是深不见底的 Shadow DOM(影子 DOM)——精准找到页面元素往往是测试工程师最大的痛点。

Selenium 3 之所以久经不衰,核心优势之一就在于它提供了极其丰富且灵活的元素定位策略。它不仅支持基础的 ID 和 XPath,更引入了强大的 CSS 选择器和层级定位逻辑,能像手术刀一样精准剖析复杂页面。

一、 应对动态属性:灵活的 CSS 与 XPath

在单页应用(SPA)中,元素的 id 或 class 往往是动态生成的(如 class="btn-3f9a12"),直接硬编码必然失败。Selenium 3 的优势在于你可以利用部分匹配层级关系来锁定元素。

场景:忽略动态类名,定位特定按钮

假设页面中有多个按钮,但我们只想点击“提交”按钮,且它的 class 包含动态哈希值。

java

复制

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class DynamicLocatorDemo {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();
        driver.get("https://example.com/form") ;

        // 策略 1:使用 CSS 包含匹配 (^= 表示以...开头,*= 表示包含)
        // 即使 class 变成了 "btn-submit-x7k9L",也能定位到
        WebElement submitBtn = driver.findElement(
            By.cssSelector("button[class^='btn-submit']")
        );
        submitBtn.click();

        // 策略 2:使用 XPath 的文本定位,完全无视样式和 ID
        // 这是一个极其强大的“容错”手段,只要页面文案不变,代码就不会崩
        WebElement loginBtn = driver.findElement(
            By.xpath("//button[contains(text(), '登 录')]")
        );
        loginBtn.click();
        
        driver.quit();
    }
}

二、 应对复杂表格:轴定位的降维打击

这是 Selenium 3 相比 Playwright 等新工具最具“极客范儿”的优势。在处理复杂的嵌套表格时,单纯靠索引定位非常脆弱。利用 XPath 的轴定位,我们可以基于“已知元素”找到“未知元素”。

场景:找到“用户名”所在行,点击该行的“编辑”按钮

如果表格结构是:
<tr><td>张三</td><td><input type='button' value='编辑'></td></tr>

我们只知道用户叫“张三”,不知道他在第几行。

java

复制

public class ComplexTableDemo {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();
        driver.get("https://example.com/user-table") ;

        // 1. 先找到包含文本 "张三" 的单元格
        // 2. 利用 parent:: 获取其父节点 (tr)
        // 3. 利用 descendant-or-self:: 找到该行内的编辑按钮
        
        String xpathQuery = "//td[contains(text(), '张三')]/parent::tr//input[@value='编辑']";
        
        WebElement editButton = driver.findElement(By.xpath(xpathQuery));
        
        // 或者更复杂的轴定位逻辑:
        // 找到张三的单元格 -> 找到它的父级行 -> 找到该行下的第 3 个单元格
        String advancedQuery = "//td[text()='张三']/parent::tr/td[3]/a";
        
        WebElement detailLink = driver.findElement(By.xpath(advancedQuery));
        detailLink.click();
        
        driver.quit();
    }
}

三、 应对层级结构:父子级与兄弟级联查找

现代页面往往嵌套极深,直接写一个长长的 div/div/div/ul/li/a 不仅难看,而且一旦父级结构微调就会失效。Selenium 3 允许我们先定位父容器,再在父容器内进行子查找,既提高了可读性,又提高了性能。

场景:多级菜单操作

java

复制

public class HierarchicalSearchDemo {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();
        driver.get("https://example.com/dashboard") ;

        // 第一步:先定位到侧边栏菜单(父容器)
        // 这样可以减少全局搜索范围
        WebElement sidebar = driver.findElement(By.id("sidebar-menu"));

        // 第二步:在父容器内查找子元素(子级查找)
        // 这里的查找范围被限制在了 sidebar 内部,不会误触 Header 里的同名元素
        WebElement systemMenu = sidebar.findElement(By.linkText("系统管理"));

        // 鼠标悬停触发下拉
        Actions actions = new Actions(driver);
        actions.moveToElement(systemMenu).perform();

        // 第三步:查找兄弟级元素(下拉菜单)
        // 在 systemMenu 的父级下,查找显示出来的子菜单
        WebElement userManage = driver.findElement(
            By.xpath("//a[contains(text(), '系统管理')]/following-sibling::ul//a[text()='用户管理']")
        );
        
        userManage.click();
        
        driver.quit();
    }
}

四、 总结

Selenium 3 的定位能力之所以强大,不仅仅是因为它支持 8 种基础定位策略,更在于它支持这些策略的组合使用

  • CSS Selector 适合处理样式相关的、动态 Class 的场景,语法简洁。
  • XPath 是处理复杂逻辑、文本匹配、层级结构的终极武器,特别是它的轴定位功能,几乎能应对任何变态的 DOM 结构。

在面试或实际工作中,当自动化脚本因为“找不到元素”而失败时,往往是开发者没有充分利用 Selenium 3 提供的这些高级定位能力。掌握它们,你就能轻松应对任何复杂的 Web 页面。