如何从 Appium 打开推送通知并读取 Android/iOS 设备中的文本?

问题描述 投票:0回答:4

1.当设备收到推送时如何在Appium中自动化,以便它会打开推送通知并读取文本。

android iphone push-notification appium
4个回答
2
投票

我正在使用以下代码来点击带有一些所需文本的通知。你可以使用它并做任何需要的事情(很长时间没有更新代码。有些部分可以更好地重写。但仍然适用于我测试的每部手机):

首先是页面对象:

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;
        }

1
投票

您可以使用以下内置的 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


0
投票

首先,您使用什么类型的推送通知。
两种类型的推送通知 Firebase 优惠:
1.通知
2.数据负载。


0
投票

公共类 NativeNotificationPage 扩展 Page { 你能帮我完成这个Page课程吗

© www.soinside.com 2019 - 2024. All rights reserved.