如何在我的 appium 本机应用程序测试中添加类似 isClickable() 的内容

How to add something like isClickable() in my appium native app tests

如何在我的 appium 本机应用程序测试中添加类似 isClickable() 的内容。我已经编写了我的测试,但是它们非常不稳定并且有时会失败,因为它找不到元素。我正在考虑使用隐式等待时间制作自定义点击和设置值函数。

我考虑过使用 isClickable() 但 appium 文档说 - 请注意 isClickable 仅适用于网络和网络视图,它不适用于移动应用程序本机上下文。

我还有其他选择吗?我可以使用smartwait吗?如果是的话我该如何实现

我是这样定义的home.screen.js

import AppScreen from './app.screen';

const SELECTORS = {
    HOME_SCREEN: '~homeBarButton',
    PRODUCTSEARCH_SCREEN: '~productSearchBarButton',
    CUSTOMERSEARCH_SCREEN: '~customersBarButton',
    STOREHUB_SCREEN: '~storeHubBarButton',
    SETTING_ICON: '~SettingsIcon',
    LOGOUT_BUTTON: '~settingsMainLogoutButton'
};

class HomeScreen extends AppScreen {
    constructor () {
        super(SELECTORS.HOME_SCREEN);
    }

    get homescreenButton () {
        return $(SELECTORS.HOME_SCREEN);
    }

    get productsearchField () {
        return $(SELECTORS.PRODUCTSEARCH_SCREEN);
    }

    get customersearchButon () {
        return $(SELECTORS.CUSTOMERSEARCH_SCREEN);
    }

    get storehubButon () {
        return $(SELECTORS.STOREHUB_SCREEN);
    }

    get settingIcon () {
        return $(SELECTORS.SETTING_ICON);
    }

    get logoutButton () {
        return $(SELECTORS.LOGOUT_BUTTON);
    }
}

export default new HomeScreen();

我正在这样写我的测试test.js:

import HomeScreen from '../screenobjects/home.screen';
import FormScreen from '../screenobjects/forms.screen';
import CommonPage from '../pageobjects/common.page';

describe('Sending item successfullt,', () => {

    beforeEach(() => {
        CommonPage.login()
    });

    afterEach(() => {
        CommonPage.logout()
    });

    it('should be able to send the item to the mirror', () => {
        driver.pause(3000)
        HomeScreen.productsearchField.click();
        driver.pause(3000)
        HomeScreen.customersearchButon.click();

    });


});

正如您在上面看到的,我必须添加 driver.pause 否则我的测试会因为按钮不可点击或不可输入而失败。

我的建议是你可以获取你的元素属性 clickable 如果它 true 继续做你的事情

public boolean isClickable(String element) {
        return androidDriver.findElementByAccessibilityId(element).getAttribute("clickable").equals("true");
    }

您可以使用任何方法找到您的元素。

最好的方法是停止使用隐式等待,并在每个驱动程序 UI 交互之前进行显式等待。

您应该阅读 waitUntil / WebDriverWait(不确定 node.js 实现中是否有)。

然后创建与应用中所有类型的元素进行交互的函数,这些元素在执行前执行显式等待。

伪代码:

get clickButton (Selector element) {
        waitUntil(clickable(element),...);
        return $(driver.click(element));
    }

为应用程序中所有类型的元素(按钮、文本字段、下拉菜单...)编写通用方法,并从驱动程序中删除隐式等待。你会发现你的测试稳定性有很大的不同。