eXpress App Framework Team

This Blog

June 2017 - Posts

  • How to use a Barcode Scanner in XAF Mobile

    We've created a KB article that describes how to scan barcodes in your XAF mobile application using the Cordova Barcode Scanner plugin

    In this KB article, we'll show you how to implement an Action in a DetailView to save a scanned barcode to a current object property. Additionally, you will learn how to access the PhoneGap config file (regular XML file), add the plugin to your application and get access to the camera functionality with it.

    Your feedback is needed!
    This is not an official feature of our Mobile UI (CTP) and our API may change in future release cycles. We are publishing this article prior to the 17.2 release to collect early user feedback and improve overall functionality. We would appreciate your thoughts on this feature once you've had the opportunity to review it. Please report any issues, missing capabilities or suggestions in separate tickets in our Support Center. Thanks for your help in advance!

    Test the new XAF features prior to the 17.2 release!

    We would appreciate your thoughts on these features once you've had the opportunity to review them:
        Performance improvements (Core)
        OAuth2 authentication (Web)
        Push notifications (Mobile)
  • How to replace XAF exception handling with Logify

    With our most recent update (v17.1.4), the easiest way to integrate Logify within an XAF app is to use the LogifyAlertTraceListener API. You will find common and platform-dependent integration instructions for this recommended approach in the the following KB article

    Please note that we are using this exact approach for our online Web and Mobile demos (available at As you would expect, using Logify helps us improve product stability and product quality for both XAF's Mobile UI (CTP) platform and associated demo apps

    Logify itself is also widely used to deliver crash reports in other demos, runtime and design time tools for many DevExpress products and technologies:

    Feel free to contact us if you're already using Logify (the product is currently an invitation only beta) and want to try this new approach. We will be more than happy to provide you with the assistance needed to get started.

  • XAF - Using TestCafe for Functional Testing of Our Mobile UI

    In addition to the Mobile UI features announced last month, we've been hard at work improving the quality and stability of mobile apps generated via XAF's mobile UI platform. Specifically, we have developed an internal functional testing system based upon TestCafe and successfully used it with our internal tests apps (MainDemo.Mobile among others). This online demo also uses our new DevExpress Logify service to track exceptions and improve overall product quality.

    Frankly speaking, the main reasons we chose TestCafe was its simplicity and flexibility. TestCafe can be installed as npm package with a simple command, and its API can emulate all necessary webpage actions. We're using our own wrappers for the Selector function to find different element types:

    const activeViewSelector = Selector('.dx-active-view');
    const textboxClassName = '.dx-texteditor-input';
    this.findTextBox = function (fieldName) {
        return activeViewSelector.find('div[data-options*="name: \'' + fieldName + '\'"]').find(textboxClassName);

    We've also implemented custom wrappers for TestCafe actions (click, drag, etc.) to handle the moment wherein all the activities on the page (animation, movements, queries) are complete and all required elements become visible: = async function () {
         await this.waitElementToAppeared.apply(this, arguments);
         await, arguments);
         await this.wait(); 
         await checkForExceptions();
    These wrappers are combined in a large helper (I will not show its full source code here) that allows us to write cleaner and more user-friendly test code. For instance, this is what a test case looks like:

    import { Selector, ClientFunction } from 'testcafe';
    import { XafMobileTestHelper } from './lib/helper';
    var helper = new XafMobileTestHelper();
    .beforeEach(async (t) => {
        helper.testCafe = t; await t.navigateTo('http://localhost/');
        await helper.switchToIframe("#simulatorFrame");
        await helper.typeText(helper.findTextBox("UserName"), "Sam", { replace: true });
        await"Log On"));
    test('Delete action(action with detail view)', async t => {
        await helper.typeText(helper.findTextBox("Subject"), "Task To Delete");
        await t.expect(helper.findListViewRecord("Task To Delete").exists).ok();
        await"Task To Delete"));
        await t .expect(helper.findListViewRecord("Task To Delete").exists).notOk();

    Running tests and accumulating results is easy with TestCafe via a single command line:

    Our mobile tests are integrated into the advanced and CCTray-based system used for automated execution and monitoring of all our unit and functional tests:

    If you are interested in learning more about our Mobile UI (CTP), check out eXpressApp Framework > Getting Started > XAF Mobile (CTP) Tutorial and feel free to contact us with any questions or suggestions via the Support Center (


Chat is one of the many ways you can contact members of the DevExpress Team.
We are available Monday-Friday between 7:30am and 4:30pm Pacific Time.

If you need additional product information, write to us at or call us at +1 (818) 844-3383


DevExpress engineers feature-complete Presentation Controls, IDE Productivity Tools, Business Application Frameworks, and Reporting Systems for Visual Studio, Delphi, HTML5 or iOS & Android development. Whether using WPF, ASP.NET, WinForms, HTML5 or Windows 10, DevExpress tools help you build and deliver your best in the shortest time possible.

Copyright © 1998-2018 Developer Express Inc.
All trademarks or registered trademarks are property of their respective owners