1import { Component, Driver, ON } from '@kit.TestKit'; 2import { expect } from '@ohos/hypium'; 3import { componentUtils, curves } from '@kit.ArkUI'; 4import { MatchPattern, On, Point, Rect } from '@ohos.UiTest'; 5 6const driver = Driver.create(); 7const TAG = 'Test utils' 8 9export class KeyStruct { 10 public key: string; 11 public type: JsonType; 12 13 constructor(key: string, type: JsonType) { 14 this.key = key; 15 this.type = type; 16 } 17} 18 19export enum JsonType { 20 value, 21 obj, 22 array 23} 24 25export enum ToggleClick { 26 Open, 27 Close, 28} 29 30export enum Slide { 31 start = 1, 32 end = 0, 33} 34 35export enum Direction { 36 width = 0, 37 height = 1 38} 39 40export interface toggleClickTypes { 41 toggleClickType?: ToggleClick 42 toggleClickObj?: string 43} 44 45export interface radioOperateType { 46 radioClickObj: number | string 47 toggleClick?: toggleClickTypes 48 id?: string 49 arr?: Array<KeyStruct> 50 assertEqual?: string | number | boolean | Array<number> | Array<string> 51} 52 53export interface sliderOperateType { 54 slideStar: Slide, 55 slideDragObj?: number 56 toggleClick?: toggleClickTypes 57 id?: string, 58 arr?: Array<KeyStruct> 59 assertEqual?: string | number | boolean 60} 61 62export interface buttonOperateType { 63 buttonClickObj: number, 64 toggleClick?: toggleClickTypes 65 id?: string 66 arr?: Array<KeyStruct> 67 assertEqual?: string | number | boolean 68} 69 70// 通过id验证有没有这个组件 有的话点击一下 71export async function checkButtonAndClickWithID(text: string) { 72 let atom = text; 73 await driver.assertComponentExist(ON.id(atom)); 74 let button = await driver.findComponent(ON.id(atom)); 75 await button.click(); 76 await driver.delayMs(2000); 77 console.info(TAG, atom); 78} 79 80// 获取组件属性具体值 81export function getJson(arr: Array<KeyStruct> | undefined, json: string) { 82 if (!arr) { 83 return undefined 84 } 85 let obj: object = JSON.parse(json); 86 let lastType = JsonType.obj; 87 for (let i = 0; i < arr.length; i++) { 88 const keyStruct: KeyStruct = arr[i]; 89 try { 90 if (JsonType.array == lastType) { 91 obj = obj[parseInt(keyStruct.key)]; 92 } else { 93 obj = obj[keyStruct.key]; 94 } 95 } catch (e) { 96 console.error(e); 97 return undefined; 98 } 99 lastType = keyStruct.type; 100 } 101 return obj; 102 103} 104 105// 根据参数点击RadioBlock项 106export async function radioClick(radioOperate: radioOperateType, blockStr?: string, compText?: string, 107 listText?: string) { 108 await getToggle(ToggleClick.Open, radioOperate.toggleClick?.toggleClickObj) 109 if (radioOperate.radioClickObj != undefined) { 110 111 if (typeof radioOperate.radioClickObj === 'string') { 112 await searchRadio(radioOperate.radioClickObj) 113 } else { 114 let radio: Component[] = 115 await driver.findComponents(ON.type('Radio').within(ON.type('Scroll')).clickable(true)) 116 await radio[radioOperate.radioClickObj].click(); // 等待点击操作完成 117 await driver.delayMs(2000); 118 } 119 } 120 if (radioOperate.id) { 121 let idValue = getInspectorByKey(radioOperate.id) 122 console.log(idValue) 123 let result = getJson(radioOperate.arr, idValue) 124 console.log('jj', JSON.stringify(result)) 125 expect(JSON.stringify(result)).assertEqual(JSON.stringify(radioOperate.assertEqual)); 126 console.log(TAG, result, 'expect', radioOperate.assertEqual) 127 } 128 if (radioOperate.toggleClick != undefined && 129 radioOperate.toggleClick.toggleClickType == ToggleClick.Close) { 130 if (typeof radioOperate.radioClickObj === 'string' && blockStr && compText && listText) { 131 await searchParentBlock(blockStr, false, compText, listText) 132 } else { 133 await getToggle(radioOperate.toggleClick.toggleClickType, radioOperate.toggleClick.toggleClickObj) 134 } 135 } 136} 137 138 139// 根据参数滑动SliderBlock 140export async function sliderDrag(sliderOperate: sliderOperateType) { 141 142 143 await getToggle(ToggleClick.Open, sliderOperate.toggleClick?.toggleClickObj) 144 145 let slider: Component 146 147 if (sliderOperate.slideDragObj) { 148 let sliders = await driver.findComponents(ON.type('Slider').within(ON.type('Scroll')).scrollable(true)) 149 slider = sliders[sliderOperate.slideDragObj] 150 } else { 151 slider = await driver.findComponent(ON.type('Slider').within(ON.type('Scroll')).scrollable(true)) 152 } 153 154 let point = await slider.getBoundsCenter(); 155 let rect = await slider.getBounds(); 156 157 if (sliderOperate.slideStar) { 158 await driver.drag(rect.left, point.y, rect.right, point.y) 159 await driver.delayMs(2000); 160 } else { 161 await driver.drag(rect.right, point.y, rect.left, point.y) 162 await driver.delayMs(2000); 163 } 164 165 if (sliderOperate.id) { 166 let idValue = getInspectorByKey(sliderOperate.id) 167 console.log(TAG, idValue) 168 let result = getJson(sliderOperate.arr, idValue) 169 console.log(TAG, result, 'expect', sliderOperate.assertEqual) 170 expect(result).assertEqual(sliderOperate.assertEqual); 171 172 } 173 if (sliderOperate.toggleClick != undefined && 174 sliderOperate.toggleClick.toggleClickType == ToggleClick.Close) { 175 await getToggle(sliderOperate.toggleClick.toggleClickType, sliderOperate.toggleClick.toggleClickObj) 176 } 177} 178 179// 根据参数点击ButtonBlock项 180export async function buttonClick(buttonOperate: buttonOperateType) { 181 await getToggle(ToggleClick.Open, buttonOperate.toggleClick?.toggleClickObj) 182 let button: Component[] = 183 await driver.findComponents(ON.type('Button').within(ON.id('scroll')).clickable(true)) 184 185 await button[buttonOperate.buttonClickObj].click() 186 await driver.delayMs(2000); 187 188 if (buttonOperate.id) { 189 let idValue = getInspectorByKey(buttonOperate.id) 190 191 let result = getJson(buttonOperate.arr, idValue) 192 193 expect(result).assertEqual(buttonOperate.assertEqual); 194 195 196 console.log(TAG, result, 'expect', buttonOperate.assertEqual) 197 } 198 199 if (buttonOperate.toggleClick != undefined && 200 buttonOperate.toggleClick.toggleClickType == ToggleClick.Close) { 201 await getToggle(buttonOperate.toggleClick.toggleClickType, buttonOperate.toggleClick.toggleClickObj) 202 } 203 204} 205 206/*滚动*/ 207export async function scroll(distance: number) { 208 let scroll: Component = await driver.findComponent(ON.id('scroll')); 209 let scroller: Scroller | undefined = AppStorage.get('scroller'); 210 let rect = await scroll.getBounds(); 211 let curve = curves.interpolatingSpring(10, 1, 228, 30) 212 if (scroller) { 213 const yOffset: number = scroller.currentOffset().yOffset; 214 scroller.scrollTo({ 215 xOffset: 0, 216 yOffset: yOffset + px2vp(distance - rect.top - 5), 217 animation: { 218 duration: 1000, curve: curve 219 } 220 }) 221 return true; 222 } 223 return false; 224} 225 226 227//通过id获取组件宽高 228export function getCompSize(id: string, direction: Direction): number { 229 let size = 0 230 if (direction == Direction.width) { 231 size = componentUtils.getRectangleById(id).size.width; 232 } 233 if (direction == Direction.height) { 234 size = componentUtils.getRectangleById(id).size.height; 235 } 236 return size; 237} 238 239//category为参数列表or基本属性,compText为目标文本, listText为可选参数(ListGroup标题) 240export async function Search(category: string, compText: string, listText?: string) { 241 let selection: string | undefined = AppStorage.get('selection') 242 let titleRect: Rect 243 if (category == '参数列表') { 244 let scrolls: Component = await driver.findComponent(ON.id('scroll')); 245 let title: Component = await scrolls.scrollSearch(ON.text(compText)); 246 titleRect = await title.getBounds(); 247 if (title) { 248 await scroll(titleRect.top) 249 } 250 } else { 251 let textSearch: Component = await driver.findComponent(ON.text('基础属性')) 252 await driver.delayMs(2000) 253 await textSearch.click() 254 let scrolls: Component = await driver.findComponent(ON.id('scroll')); 255 if (listText) { 256 if (selection != listText) { 257 let titles: Component = await scrolls.scrollSearch(ON.text(listText)) 258 await titles.click() 259 await scrolls.scrollToTop(); 260 } 261 let title: Component = await scrolls.scrollSearch(ON.text(compText)) 262 console.log('---1' + title) 263 if (title) { 264 titleRect = await title.getBounds(); 265 await scroll(titleRect.top) 266 } 267 } else { 268 let title: Component = await scrolls.scrollSearch(ON.text(compText)) 269 titleRect = await title.getBounds(); 270 if (title) { 271 await scroll(titleRect.top) 272 } 273 } 274 } 275} 276 277//LastCompText为可选参数,当scroller触底之后LastCompText为你要控制toggle的前面一个toggle文本 278export async function getToggle(isClose: ToggleClick = ToggleClick.Open, lastCompText?: string) { 279 let toggle: Component = 280 await driver.findComponent(lastCompText ? 281 ON.type('Toggle').within(ON.type('Scroll')).isAfter(ON.text(lastCompText)) : 282 ON.type('Toggle').within(ON.type('Scroll'))); 283 if (await toggle.isChecked() === (isClose === ToggleClick.Close)) { 284 await toggle.click(); 285 await driver.delayMs(2000) 286 } 287} 288 289export async function titleSearch(category: string, compText: string, listText?: string) { 290 let title = await driver.findComponent(ON.text(compText)) 291 await driver.delayMs(2000) 292 if (title) { 293 let titleRect = await title.getBounds(); 294 await scroll(titleRect.top) 295 } else { 296 await Search(category, compText, listText) 297 } 298} 299 300 301export async function searchRadio(radioName: string) { 302 let isSearch: boolean = true 303 while (isSearch) { 304 let text = await driver.findComponent(ON.text(radioName).within(ON.type('Scroll'))) 305 if (text) { 306 let radios: Component[] = await driver.findComponents(ON.type('Radio').within(ON.type('Scroll')).clickable(true)) 307 let texts: Component[] = await driver.findComponents(ON.type('Text').within(ON.type('Scroll'))) 308 for (let i = 0; i < texts.length; i++) { 309 if (await texts[i].getText() === radioName) { 310 console.log('---radio' + i) 311 await radios[i].click() 312 await driver.delayMs(2000) 313 break 314 } 315 } 316 break 317 } else { 318 scroll(getCompSize('scroll', Direction.height) + 18) 319 } 320 } 321} 322 323// searchStr 搜索关键字 clickBool 想要的状态 category Search的category 324export async function searchParentBlock(searchStr: string, clickBool: boolean = true, category: string = '基础属性', 325 listText?: string) { 326 if (listText) { 327 await Search(category, searchStr, listText) 328 } else { 329 await Search(category, searchStr) 330 } 331 let toggle: Component = 332 await driver.findComponent(ON.type('Toggle').within(ON.type('Scroll')).isAfter(ON.text(searchStr))) 333 await driver.delayMs(2000) 334 if (await toggle.isChecked() !== clickBool) { 335 await toggle.click(); 336 } 337} 338 339export async function searchToggle(toggleName: string, currentText: string, listText?: string, titles?: string) { 340 let selection: string | undefined = AppStorage.get('selection') 341 let textSearch: Component = await driver.findComponent(ON.text(titles ? '参数列表' : '基础属性')) 342 await textSearch.click() 343 if (selection != listText) { 344 console.log('---1') 345 let scrolls: Component = await driver.findComponent(ON.id('scroll')); 346 let title: Component = await scrolls.scrollSearch(ON.text(listText) 347 .isBefore(ON.type('Image')) 348 .within(ON.type('Row')) 349 .within(ON.type('ListItemGroup')) 350 .within(ON.type('List'))) 351 await title.click() 352 } 353 let scrolls: Component = await driver.findComponent(ON.id('scroll')); 354 let title: Component = await scrolls.scrollSearch(ON.text(currentText)) 355 if (!title) { 356 console.log('---2' + title) 357 let titles: Component = await scrolls.scrollSearch(ON.text(toggleName)) 358 if (titles) { 359 console.log('---3' + titles) 360 let toggle: Component = 361 await driver.findComponent(ON.type('Toggle').within(ON.type('Scroll')).isAfter(ON.text(toggleName))) 362 await toggle.click(); 363 } 364 } 365}