@ appium/ css- 定位器对本地
平台-不可知 CSS 选取器解析并规范本地定位器转换.
安装
npm install @appium/css-locator-to-native
快开始
import {
createCssTransformer,
type AttributeSchema,
type ParsedSelector,
type StrategyKey,
} from '@appium/css-locator-to-native';
const schema: AttributeSchema = {
attributes: {
visible: {type: 'boolean'},
name: {type: 'string', aliases: ['id']},
index: {type: 'numeric', aliases: ['nth-child']},
},
booleanFormat: 'zero-one',
};
const emitters = {
native: {
strategy: 'my-native-strategy',
emit(parsed: ParsedSelector) {
// Map ParsedSelector IR to your platform's selector syntax
return parsed.rule.tag ?? '*';
},
},
};
const transformCss = createCssTransformer({
schema,
emitters,
resolveStrategy(): StrategyKey<typeof emitters> {
return 'native';
},
});
const {strategy, selector} = transformCss('window#foo[visible]');
// => { strategy: 'my-native-strategy', selector: '...' }
API 密码
所有东西都从一个入口出口:
| 导出 | 说明 |
|---|---|
normalizeCssSelector(css, schema) | 将 CSS 选择器解析并规范化为 ParsedSelector 爱尔兰语 |
createCssTransformer(config) | 返回用于剖析 CSS 并生成一个函数 NativeLocator |
InvalidSelectorError | CSS 语法无法解析 |
UnsupportedSelectorError | 解析的 CSS 使用不支持的特性或未知属性 |
UnresolvedStrategyError | 解析策略密钥没有匹配的发射器 |
解析选择器 IR
常态化产生平台-不可知中间代表. IR捕获 CSS 结构——标记,类, #id属性 假象 组合器 与你的计划相对应 没错 没有 编码为iOS类链,UiAutomator,或任何其他本土语法.
interface ParsedSelector {
rule: ParsedRule; // first comma-separated rule only
}
interface ParsedRule {
combinator?: 'descendant' | 'child';
tag?: string; // raw CSS tag (may be '*')
classes: string[]; // raw class tokens
id?: string; // raw #id value
attributes: ParsedAttribute[];
pseudos: ParsedAttribute[];
nested?: ParsedRule;
}
属性计划
驱动程序声明哪些 CSS 属性是有效的, 以及布林是如何被胁迫的 :
interface AttributeSchema {
attributes: Record<string, {type: 'boolean' | 'string' | 'numeric'; aliases?: string[]}>;
booleanFormat?: 'zero-one' | 'true-false' | 'literal';
}
zero-one—— 说true编号 :1(空虚)'1', (中文(简体) ),false编号 :0→'0'true-false—— 说true(空虚)'true', (中文(简体) ),false→'false'literal(默认) —— 原始属性值保持不变; 隐含布尔( 无值) 保持不变
标签,类,和 #id 测绘(如:. XCUIElementType* 前缀, resourceId 前缀)完全是驱动器在发件人中的责任.
多战略路线
createCssTransformer 需要登记 StrategyEmitter页:1 resolveStrategy 调用。 解析器会选择根据选择器外形进行排放使用; 变压器既返回目标策略名称, 也返回本地选择器字符串 .
interface NativeLocator {
strategy: string;
selector: string;
}
具有单一目标策略的驱动程序使用一入式登记器和小解析器.
驱动器集成模式
平台逻辑留在驱动器中. 典型布局 :
lib/css/
schema.ts # AttributeSchema for the platform
*-emitter.ts # StrategyEmitter implementations
resolve-helpers.ts # isSimpleIdSelector, etc.
index.ts # createCssTransformer wrapper
单位 find 命令,使用变换结果中的策略而不是硬编码:
if (strategy === 'css selector') {
({strategy, selector} = cssToNativeLocator(selector));
}
支持的 CSS 子集
匹配现有 Appium 驱动程序接受的子集 :
- 标记(包括
*, (中文(简体) ),#id,类,属性选择器(=, (中文(简体) ),*=, (中文(简体) ),^=, (中文(简体) ),$=, (中文(简体) ),~=(中文(简体) ) - 儿童(
>)和后人(空间)组合器 - 被接受为按照chema(如:.
:visible, (中文(简体) ),:nth-child(2)(中文(简体) ) - 仅以逗号分隔的第一条规则( 其他规则被忽略)
- 不支持 :
+编号 :~组合器、假元素、筑巢(&),命名空间
发展
npm install --no-package-lock
npm run typecheck # type-check lib + test
npm run build # compile to build/
npm test # unit tests (compiled ESM)
npm run lint
npm run format:check
所需资源
- 节点.js
^20.19.0 || ^22.12.0 || >=24.0.0 - 无
>=10