如何从 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 设备中的文本?的主要内容,如果未能解决你的问题,请参考以下文章

Worklight 应用程序在收到推送通知时崩溃

打开另一个通知时,如何防止通知从通知中心消失? iOS

Chrome推送通知 - 点击后如何打开URL地址?

用于桌面的异地推送通知

保留阅读推送通知

如何清除 iOS 的远程推送通知?