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

如何在我的appium本机应用程序测试中添加类似isClickable()的内容,appium,wait,implicit,webdriver-io,Appium,Wait,Implicit,Webdriver Io,如何在我的appium本机应用程序测试中添加类似isClickable()的内容。我已经写了我的测试,但是它们非常脆弱,有时会因为找不到元素而失败。我正在考虑使用隐式等待时间来定制单击和设置值函数 我曾考虑过使用isClickable(),但appium文档中说-请注意,isClickable仅在web和WebView中有效,在移动应用程序本机上下文中不起作用 我还有别的选择吗?我可以用smartwait吗?如果是,我如何实施 下面是我如何定义home.screen.js的 import App

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

我曾考虑过使用isClickable(),但appium文档中说-请注意,isClickable仅在web和WebView中有效,在移动应用程序本机上下文中不起作用

我还有别的选择吗?我可以用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();

    });


});

正如您在上面看到的,我必须添加驱动程序。暂停,否则我的测试将失败,因为按钮不可单击或不可键入。

我的建议是,您可以获得元素属性
可单击
,如果它
为真
,请继续执行您的操作

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

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

我的建议是,您可以获取元素属性
可单击
,如果它
为真
,请继续执行您的操作

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

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

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

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

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

伪代码:

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

为应用程序中所有类型的元素(按钮、文本字段、下拉列表…)编写通用方法,并从驱动程序中删除隐式等待。您将看到测试稳定性方面的巨大差异。

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

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

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

伪代码:

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

为应用程序中所有类型的元素(按钮、文本字段、下拉列表…)编写通用方法,并从驱动程序中删除隐式等待。您将看到测试稳定性方面的巨大差异。

欢迎使用Stackoverflow。请提供您的代码,以便其他人容易理解。我可以提供一些示例,但使用Java。你想要吗?@Vault23你可以输入,我会检查它,然后返回Stackoverflow。请提供您的代码,以便其他人容易理解。我可以提供一些示例,但使用Java。你想要吗?@Vault23你可以输入,我会检查的,会有帮助的