【问题标题】:How to open the push notifications and read the text in Android/iOS device from Appium?如何从 Appium 打开推送通知并阅读 Android/iOS 设备中的文本?
【发布时间】:2023-04-10 15:35:02
【问题描述】:

1.当设备收到推送时如何在Appium中自动打开推送通知并阅读文本。

【问题讨论】:

    标签: android iphone push-notification 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.通知类型
      • 当您收到通知时,您的应用处于后台或前台。
      • 两者都会有帮助
      • 在这两种情况下您都会收到通知,但问题是当您的应用程序处于后台时您无法处理通知。在第二种情况下您会在服务中获得回调,这意味着您可以做任何您想做的事情。
      • 在第二种情况下,将文本临时保存在共享首选项中,然后到达您想要的任何地方。这样你的问题就迎刃而解了。
      猜你喜欢
      • 2016-05-23
      • 1970-01-01
      • 2023-03-26
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多