python3+Appium自动化13-H5元素定位实践案例
测试场景
启动钉钉app进入工作H5页面,点击考勤签到
查看webview上元素
1.电脑上打开chrome浏览器输入:chrome://inspect/#devices
2.Discover USB devices这个要勾选的,可以检查到手机设备
3.Discover network targets 这个勾选,检查到网络
4.下图箭头指向的,是手机的设备名称
5.Webview in com.alibaba.android.rimet(39.0.00)这个是手机上浏览器的内核版本号39
(一般电脑上的chrome版本号最好要大于等于这个版本号)
1.上图红色框框的两个地址就是加载到的webview的网页地址了,点地址下的inspect按钮,进入调试界面
(当然没有梯子爬的同学,打开是一片空白的,你懂得)
2.不会爬梯子的也没关系,把对应的url地址复制出来,重新打开一个浏览器标签,输入地址后,按F12也可以进调试界面。
3.接下来的元素定位就跟selenium的定位是一回事了。
代码实践:
1 from appium import webdriver
2 from selenium.webdriver.support.ui import WebDriverWait
3 from selenium.common.exceptions import NoSuchElementException
4 import time
5 desired_caps = {
6 #android的apk
7 'platformName': 'Android',
8 #手机设备名称
9 'deviceName': '127.0.0.1:21503',
10 #android系统的版本号
11 'platformVersion': '5.1.1',
12 # 'deviceName': 'ceshi',
13 # 'platformVersion': '7.0',
14 # 'udid':'83f04b4b5338424e',
15
16
17 # 'app':r'C:\Users\bzART\Desktop\app-artmall-release.apk',
18 # apk包名
19 'appPackage': 'com.alibaba.android.rimet',
20 # apk的launcherActivity
21 'appActivity': 'biz.home.activity.HomeActivity',
22 #默认neReset为false,不要在会话前重置应用状态,每次启动都跟第一次启动一样,变为true则不一样
23 'noReset':'True',
24 #下面两行代码是为了屏蔽软件盘以至于可以输入中文
25 'unicodeKeyboard':True,#使用unicode编码方式发送字符串
26 'resetKeyboard':True#将键盘隐藏起来
27 }
28 driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
29 WebDriverWait(driver,8).until(lambda x:x.find_element_by_id('com.alibaba.android.rimet:id/home_bottom_tab_button_work'))
30 driver.find_element_by_id('com.alibaba.android.rimet:id/home_bottom_tab_button_work').click()
31
32 WebDriverWait(driver,8).until(lambda x:x.find_element_by_class_name('android.webkit.WebView'))
33 #获取所有的环境
34 contexts=driver.contexts
35 print(contexts)
36 time.sleep(10)
37 #切换到webview
38 driver.switch_to.context('WEBVIEW_com.alibaba.android.rimet')
39 #获取当前的环境,看是否切换成功
40 print(driver.current_context)
41
42 time.sleep(20)
43 #点击考勤签到
44 driver.find_element_by_xpath('//*[@id="dingapp"]/div/div[4]/div[1]/div[2]/div/div[3]/div/div[2]/p').click()
45
46 #切换回native
47 driver.switch_to.context("NATIVE_APP")
48 # driver.switch_to.context(contexts[0])