from appium import webdriver # 后续操作依赖于这个库
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumBy
from selenium.webdriver.common.by import By
desired_caps = {
'platformName': 'Android', # 设备类型;
'platformVersion': '8.1.0', # 设备的类型的版本号,如果是安卓,填写大的版本号即可,小数不用填;
'deviceName': '7424dc5e', # 设备的名称,这个和后续的测试没有多大关系;
'appPackage': 'com.weseekmeta.coco', # 需要测试的app包名;
'appActivity': '.coco.MainActivity', # 需要测试的app启动名;
'unicodeKeyboard': True, # 如果指定了UI2作为驱动,不需要配置;
'resetKeyboard': True, # 重置自动化时设置的键盘;
# 'chromedriverExecutableDir': '路径', # 启动webview的webdriver驱动
'noReset': True, # 防止每次启动app时候都初始化所有数据;
'newCommandTimeout': "", # 代码向appiumserver发送命令的延迟时间,单位是秒,不设置默认一分钟;
'automationName': 'uiautomator2' # 这个并不是所有应用都适配的,1.15.1以前默认是UI1,之后是默认UI2;
# 'autoGrantPermissions': "True", # 自动跳过授权
# 'skipServerInstallation': 'True',
# 'skipDeviceInitialization': 'True' # 跳过安装AppiumSetting
}
import time
options = UiAutomator2Options().load_capabilities(desired_caps)
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',options=options) # /wd/hub 路径是固定的,desired_caps是初始化设置的字典;
driver.implicitly_wait(10) # 隐式等待和selenium的用法是一样的;
# 获取密码登录按钮切换为密码输入
A = driver.find_element(by=AppiumBy.CLASS_NAME, value="android.widget.EditText")
print(A.get_attribute("className"))
driver.find_element(by=AppiumBy.CLASS_NAME, value="android.widget.EditText").send_keys("1850012")
# 隐藏输入法
# driver.hide_keyboard()
# 切换密码登录
driver.find_element(By.ACCESSIBILITY_ID,"密码登录").click()
# 隐藏输入法
# driver.hide_keyboard()
# 获取密码输入框
# driver.find_element(By.XPATH,' new UiSelector().resourceId("android:id/content").childSelector(new UiSelector().className("android.widget.EditText").instance(1))')
text ="/hierarchy/android.widget.FrameLayout[3]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.view.View[1]/android.view.View[2]/android.view.View[1]/android.widget.EditText[2]"
textclass = "//android.widget.EditText"
# B = driver.find_element(by=AppiumBy.XPATH,value=text)
B =driver.find_element(AppiumBy.CLASS_NAME,value="//android.widget.EditText")
print("jiehu adhasdiha",B.get_attribute("className"))
不论是Xpath定位还是class Name都无法定位到
发现app是用flutter开发的,因为flutter开发的元素的是集成元素的,而导致appium获取查询不到该元素!
这就要Appium Flutter Driver 去定位了
求解