如何使用两个XPath在WebdriverIO中定位元素
如何在WebdriverIO中组合XPath定位目标元素?
刚接触WebdriverIO的时候,确实容易在组合定位器这块犯迷糊。你想先定位所有用户块,再从目标用户里找到对应操作元素的需求很常见,这里有两种靠谱的方法可以实现:
方法一:直接合并XPath表达式
你可以把两个XPath直接拼接成一个完整的定位器,注意子路径要基于父节点的位置。如果是要定位第N个用户块里的操作元素,写法如下:
// 定位第一个用户块内的目标操作元素 const targetAction = browser.$('//*[@id="react-root-node"]/div/div[2]/div[3]/div[2]/div[1]/div[1]/div[2]/div[1]'); // 动态选择用户块(比如选第2个) const userIndex = 2; const dynamicTargetAction = browser.$(`//*[@id="react-root-node"]/div/div[2]/div[3]/div[2]/div[${userIndex}]/div[1]/div[2]/div[1]`);
这里要注意,XPath里的索引是从1开始的,所以div[1]代表第一个匹配的节点。
方法二:链式调用元素对象(更推荐)
WebdriverIO的元素对象支持链式调用,你可以先用$$获取所有用户块的数组,再从中挑选目标用户,最后在该用户的范围内定位操作元素。这种方式更灵活,也更容易维护:
// 第一步:获取页面上所有用户块 const allUserBlocks = browser.$$('//*[@id="react-root-node"]/div/div[2]/div[3]/div[2]/div'); // 方式1:通过索引选择用户块(注意数组索引从0开始) const firstUserAction = allUserBlocks[0].$('div[1]/div[2]/div[1]'); await firstUserAction.click(); // 执行操作 // 方式2:根据用户信息筛选目标用户(更实用) const targetUser = allUserBlocks.find(async (userBlock) => { // 假设用户块里有用户名元素,用对应的选择器获取文本 const userName = await userBlock.$('.user-name').getText(); return userName === "你要找的用户名"; }); if (targetUser) { const userAction = await targetUser.$('div[1]/div[2]/div[1]'); await userAction.click(); }
小提示
- 用
$$得到的是元素数组,数组索引从0开始,和XPath的索引逻辑不一样,别搞混了 - 如果操作元素有专属的
class、data-testid这类属性,优先用这些属性定位,比纯XPath更稳定 - 链式调用时,子元素的选择器是相对父元素的,不需要加开头的
/或者//,直接写相对路径即可
内容的提问来源于stack exchange,提问作者khaled farhat
相关产品推荐
相关产品推荐

