本文为霍格沃兹测试学院学员学习笔记,进阶学习文末加群。
本系列文章汇总了从 Appium 自动化测试从基础到框架高级实战中,所涉及到的方方面面的知识点精华内容(如下所示),希望对大家快速总结和复习有所帮助。
本文为第三篇,主要讲解 Appium Toast、参数化、WebView(附实例代码)。
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<hierarchy index="0" class="hierarchy" rotation="3" width="810" height="1440">
<android.widget.FrameLayout index="0" package="io.appium.android.apis" class="android.widget.FrameLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,0][810,1440]" displayed="true">
<android.view.ViewGroup index="0" package="io.appium.android.apis" class="android.view.ViewGroup" text="" resource-id="android:id/decor_content_parent" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,0][810,1440]" displayed="true">
<android.widget.FrameLayout index="0" package="io.appium.android.apis" class="android.widget.FrameLayout" text="" resource-id="android:id/action_bar_container" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,41][810,136]" displayed="true">
<android.view.ViewGroup index="0" package="io.appium.android.apis" class="android.view.ViewGroup" text="" resource-id="android:id/action_bar" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,41][810,136]" displayed="true">
<android.widget.TextView index="0" package="io.appium.android.apis" class="android.widget.TextView" text="Views/Popup Menu" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[27,65][324,111]" displayed="true" />
</android.view.ViewGroup>
</android.widget.FrameLayout>
<android.widget.FrameLayout index="1" package="io.appium.android.apis" class="android.widget.FrameLayout" text="" resource-id="android:id/content" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,136][810,1440]" displayed="true">
<android.widget.LinearLayout index="0" package="io.appium.android.apis" class="android.widget.LinearLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,136][810,1440]" displayed="true">
<android.widget.Button index="0" package="io.appium.android.apis" class="android.widget.Button" text="Make a Popup!" content-desc="Make a Popup!" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[297,136][513,217]" displayed="true" />
</android.widget.LinearLayout>
</android.widget.FrameLayout>
</android.view.ViewGroup>
</android.widget.FrameLayout>
#这里就找到了Tast的控件了
<android.widget.Toast index="1" package="com.android.settings" class="android.widget.Toast" text="Clicked popup menu item Search" checkable="false" checked="false" clickable="false" enabled="false" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,0][0,0]" displayed="false" />
</hierarchy>
from appium import webdriver
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from appium.webdriver.common.mobileby import MobileBy as By
class TestFind():
def setup(self):
self.desire_cap= {
"platformName":"android",
"deviceName":"127.0.0.1:7555",
"appPackage":"io.appium.android.apis",
"appActivity":"io.appium.android.apis.view.PopupMenu1",
"noReset":"true",
"unicodeKeyboard":True
}
self.driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",self.desire_cap)
self.driver.implicitly_wait(5)
def test_search(self):
"""
1.打开appium的演示app
2.直接进入到测试toast的界面
3.点击显示toast的按钮,然后通过driver.page_source获取页面
4.找到toast的伪控件
5.打印出toast的值出来
:return:
"""
#点击Make a Popup的控件
self.driver.find_element(By.XPATH,'//*[@text="Make a Popup!"]').click()
#点击search的控件
self.driver.find_element(By.XPATH, '//*[@text="Search"]').click()
#打印整个布局页面的xml出来
print(self.driver.page_source)
#打印出toast的值
print(self.driver.find_element(By.XPATH, '//*[contains(@text,"popup menu")]').text)
from appium import webdriver
from appium.webdriver.common.mobileby import MobileBy as By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
import pytest
class TestFind():
#设置caps的值
def setup(self):
self.desire_cap= {
#默认是Android
"platformName":"android",
#adb devices的sn名称
"deviceName":"127.0.0.1:7555",
#包名
"appPackage":"com.xueqiu.android",
#activity名字
"appActivity":".view.WelcomeActivityAlias",
"noReset":"true",
"unicodeKeyboard":True
}
#运行appium,前提是要打开appium server
self.driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",self.desire_cap)
self.driver.implicitly_wait(5)
#这个加不加都行,因为参数化运行都会有setup的,setup就是启动app的过程了,这个就显得有点多余了
#但好像setup并不会初始化整个app,还会停留在前一个页面上,所以还是加上比较好
def teardown(self):
self.driver.find_element(By.XPATH,'//*[@text="取消"]').click()
#这是参数化的函数,第一部分是参数化的名字,得和下面的函数参数一模一样,用字符串包含进去
#列表里面的元祖接受具体的参数化的数据,用逗号隔开,和list一样
@pytest.mark.parametrize('searchkey,type,price',[
('alibaba','BABA',180),
('xiaomi','01810',10)
])
#参数哈的函数的参数要和上面的参数名字保持一致
def test_search(self,searchkey,type,price):
"""
1.打开雪球app
2.点击搜索输入框
3.向搜索输入框输入“阿里巴巴”
4.在搜索的结果里选择阿里巴巴,然后点击
5.获取这只上香港 阿里巴巴的股价,并判断这只股价的价格>200
6.通过参数化的方法,用一个用例判断阿里巴巴和小米的股价
:return:
"""
#显示等待进入主页,等主页的元素都加载好了
WebDriverWait(self.driver, 15).until(expected_conditions.element_to_be_clickable((By.XPATH,'//*[@text="我的"]')))
#点击搜索框
self.driver.find_element(By.ID,"com.xueqiu.android:id/tv_search").click()
#向搜索框输入阿里巴巴,小米等参数化的东西f"{searchkey}"是一个好用的东西
self.driver.find_element(By.ID,"com.xueqiu.android:id/search_input_text").send_keys(f"{searchkey}")
#找到搜索框预览结果的阿里巴巴,并点击
self.driver.find_element(By.XPATH,f"//*[@text='{type}']").click()
#选择HK股价的元素,这里是通过父类的方法去定位的
current_price=self.driver.find_element(By.XPATH,f"//*[@text='{type}']/../../..//*[@resource-id='com.xueqiu.android:id/current_price']")
#提取股价的text属性
current_price=float(current_price.text)
#判断股价是否大于200
assert current_price > price
from time import sleep
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
class TestFind():
def setup(self):
self.desire_cap= {
"platformName":"android",
"platformVersion":"6.0",
"deviceName":"127.0.0.1:7555",
#想要使用原生的浏览器就选择,Browser。想要选择chrome浏览器就输入Chrome
"browserName":"Browser",
"noRest":True,
#这里是指定chromedriver的路径,记得路径要全到包括chromedriver.exe
"chromedriverExecutable":r"c:\chrome\chromedriver.exe"
}
self.driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",self.desire_cap)
self.driver.implicitly_wait(5)
def teardown(self):
self.driver.quit()
def test_browser(self):
#打开移动端的百度浏览器
self.driver.get("http://m.baidu.com")
#显示等待找到搜索框是否可见,expected_conditions里面传的locator必须是一个元祖
WebDriverWait(self.driver,10).until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR,"#index-kw")))
#搜索框输入tongtong
self.driver.find_element(By.CSS_SELECTOR,"#index-kw").send_keys("tongtong")
sleep(2)
#百度一下点击一下
self.driver.find_element(By.CSS_SELECTOR, "#index-bn").click()
sleep(3)
from time import sleep
from appium import webdriver
from appium.webdriver.common.mobileby import MobileBy
class TestFind():
def setup(self):
self.desire_cap= {
"platformName":"android",
"platformVersion":"6.0",
"deviceName":"127.0.0.1:7555",
"noRest":True,
"appPackage": "io.appium.android.apis",
"appActivity":"io.appium.android.apis.view.webview1",
#想要切换webview,必须得指定chromdriver,或者你的默认地址的chromedriver的版本和手机的版本是对应的
"chromedriverExecutable": r"c:\chrome\chromedriver.exe"
}
self.driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",self.desire_cap)
self.driver.implicitly_wait(5)
def teardown(self):
self.driver.quit()
def test_appium_api_webview(self):
sleep(3)
#进入到webview页面,直接打印contexts,肯定有两个,一个是原生的,一个是webview
print(self.driver.contexts)
#需要切换到webview的context的,通常是倒数第一个,记得要有chromedriverExecutable
self.driver.switch_to.context(self.driver.contexts[-1])
sleep(2)
#往输入框输入tongtong
self.driver.find_element(MobileBy.ID,"i_am_a_textbox").send_keys("tongtong")
#点击链接
self.driver.find_element(MobileBy.ID,"i am a link").click()
#打印出当前的页面布局,发现是一个webview的html的布局
print(self.driver.page_source)
#由于chrome识别不到雪球的webview,元素定位有问题,所以代码搞不定
from time import sleep
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
class TestFind():
def setup(self):
self.desire_cap= {
"platformName":"android",
"platformVersion":"6.0",
"deviceName":"127.0.0.1:7555",
#想要使用原生的浏览器就选择,Browser。想要选择chrome浏览器就输入Chrome
"browserName":"Browser",
"noRest":True,
#这里是指定chromedriver的路径,记得路径要全到包括chromedriver.exe
"chromedriverExecutable":r"c:\chrome\chromedriver.exe"
}
self.driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",self.desire_cap)
self.driver.implicitly_wait(5)
def teardown(self):
self.driver.quit()
def test_browser(self):
#打开移动端的百度浏览器
self.driver.get("http://m.baidu.com")
#显示等待找到搜索框是否可见,expected_conditions里面传的locator必须是一个元祖
WebDriverWait(self.driver,10).until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR,"#index-kw")))
#搜索框输入tongtong
self.driver.find_element(By.CSS_SELECTOR,"#index-kw").send_keys("tongtong")
sleep(2)
#百度一下点击一下
self.driver.find_element(By.CSS_SELECTOR, "#index-bn").click()
sleep(3)
更多内容,我们在后续文章分享。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。