如何从 Appium 打开推送通知并阅读 Android/iOS 设备中的文本?
Posted
技术标签:
【中文标题】如何从 Appium 打开推送通知并阅读 Android/iOS 设备中的文本?【英文标题】:How to open the push notifications and read the text in Android/iOS device from Appium? 【发布时间】:2017-05-15 11:03:28 【问题描述】:1.当设备收到推送时如何在Appium中自动打开推送通知并阅读文本。
【问题讨论】:
【参考方案1】:我正在使用以下代码来点击带有一些所需文本的通知。您可以使用它并做任何需要的事情(很长时间没有更新代码。某些部分可以重写得更好。但仍然可以与我测试的每部手机一起使用):
页面对象优先:
public class NativeNotificationPage extends Page
@androidFindBy(id= "com.android.systemui:id/notification_panel")
private List<AndroidElement> notificationPanel;
//settings data
@HowToUseLocators(androidAutomation = LocatorGroupStrategy.ALL_POSSIBLE)
@AndroidFindBy(id = "com.android.systemui:id/clear_all_button")
@AndroidFindBy(id = "com.android.systemui:id/dismiss_text")
private List<AndroidElement> clearAllBtn;
//last items
@AndroidFindBy(id = "com.android.systemui:id/latestItems")
private List<AndroidElement> lastItemsContainer;
//events data
@AndroidFindBy(id = "android:id/status_bar_latest_event_content")
private List<AndroidElement> lastItemsContent;
@AndroidFindBy(id = "android:id/title")
private List<AndroidElement> itemTitle;
String itemTitle_Locator_Text = "android:id/title";
@HowToUseLocators(androidAutomation = LocatorGroupStrategy.ALL_POSSIBLE)
@AndroidFindBy (id = "android:id/big_text")
@AndroidFindBy (id = "android:id/text")
private List<AndroidElement> itemText;
String itemText_Phone_Locator_Text = "android:id/text";
String itemText_Tablet_Locator_Text = "android:id/big_text";
@AndroidFindBy(id = "android:id/time")
private List<AndroidElement> itemTime;
public NativeNotificationPage(WebDriver driver)
super(driver);
public boolean isNativeNotificationPage()
System.out.println(" check 'Notification' Screen loaded");
boolean bool;
setFastLookTiming();
bool = !notificationPanel.isEmpty();
setDefaultTiming();
return bool;
public boolean isNativeNotificationPage(int sec)
System.out.println(" check 'Notification' Screen loaded");
boolean bool;
setLookTiming(sec);
bool = !notificationPanel.isEmpty();
setDefaultTiming();
return bool;
public boolean isClearAllBtnLoaded()
System.out.println(" check 'Clear' button loaded");
boolean bool;
setLookTiming(3);
bool = !clearAllBtn.isEmpty();
setDefaultTiming();
return bool;
public int getLastItemsContentSize() return lastItemsContent.size();
public String getItemTitle(int num)
try
return lastItemsContent.get(num).findElement(MobileBy.className("android.widget.TextView")).getText();
catch (Exception e)
return null;
public String getItemText(int num)
if (isPhone())
List<MobileElement> item = lastItemsContent.get(num).findElements(MobileBy.className("android.widget.TextView"));
String tmp = null;
for (int i=1;i<item.size();i++)
if (tmp == null)
tmp = item.get(i).getText();
else
tmp = tmp + "," +item.get(i).getText();
return tmp;
else
setLookTiming(3);
if (lastItemsContent.get(num).findElements(MobileBy.id(itemText_Tablet_Locator_Text)).isEmpty())
setDefaultTiming();
return lastItemsContent.get(num).findElement(MobileBy.id(itemText_Phone_Locator_Text)).getText();
else
setDefaultTiming();
return lastItemsContent.get(num).findElement(MobileBy.id(itemText_Tablet_Locator_Text)).getText();
public boolean tapClearAllBtn()
System.out.println(" tap 'Clear' button");
return tapElementInList_Android(clearAllBtn, 0);
public boolean tapNotificationByNum(int num)
return tapElementInList_Android(lastItemsContent, num);
现在在测试代码中:
public Boolean tapNotificationByTitleAndText_Android(String neededTitle, String neededText, AppiumDriver driver)
((AndroidDriver) driver).openNotifications();
sleep(1);
nativeNotificationPage = new NativeNotificationPage(driver);
assertTrue("Native notification page is NOT loaded", nativeNotificationPage.isNativeNotificationPage());
int itemsListSize = nativeNotificationPage.getLastItemsContentSize();
System.out.println(" number of notifications is: " + itemsListSize);
assertTrue("Number of notifications is 0", itemsListSize != 0);
String title, text;
for (int i = 0; i < itemsListSize; i++)
title = nativeNotificationPage.getItemTitle(i);
text = nativeNotificationPage.getItemText(i);
System.out.println(" notification title is: " + title);
System.out.println(" notification text is: " + text);
.....
return nativeNotificationPage.tapNotificationByNum(i);
return false;
【讨论】:
ios 呢?这个iOS不可用吗,请指教。【参考方案2】:您可以使用以下内置 AndroidDriver 的方法打开通知窗格。
driver.openNotifications();
如果您想向下滚动到特定推送,请使用以下代码 -
WebElement element = driver.findElement(By.name("Element Name"));
HashMap<String, String> arguments = new HashMap<String, String>();
arguments.put("element", element.getId());
(javascriptExecutor)driver.executeScript("mobile: scrollTo", arguments);
注意 - 驱动程序是 AndroidDriver 类型。如果没有,那么您应该对其进行类型转换。
浏览这个库以更好地理解函数 - https://github.com/appium/java-client
【讨论】:
【参考方案3】:首先,您使用的是什么类型的推送通知。 两种推送通知 firebase 报价: 1.通知 2.数据载荷。
【讨论】:
1.通知类型 当您收到通知时,您的应用处于后台或前台。 两者都会有帮助 在这两种情况下您都会收到通知,但问题是当您的应用程序处于后台时您无法处理通知。在第二种情况下您会在服务中获得回调,这意味着您可以做任何您想做的事情。 在第二种情况下,将文本临时保存在共享首选项中,然后到达您想要的任何地方。这样你的问题就迎刃而解了。以上是关于如何从 Appium 打开推送通知并阅读 Android/iOS 设备中的文本?的主要内容,如果未能解决你的问题,请参考以下文章