<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://community.appian.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Guide</title><link>https://community.appian.com/success/w/guide</link><description /><dc:language>en-US</dc:language><generator>Telligent Community 12</generator><item><title>Writing to Synced Record Types at High Throughput</title><link>https://community.appian.com/success/w/guide/3623/writing-to-synced-record-types-at-high-throughput</link><pubDate>Thu, 18 Dec 2025 16:34:29 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:c655af54-6f28-49d4-9fdc-87a90630339c</guid><dc:creator>joel.larin</dc:creator><description>Current Revision posted to Guide by joel.larin on 12/18/2025 4:34:29 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Appian&amp;#39;s &lt;a href="https://docs.appian.com/suite/help/latest/data-fabric.html"&gt;data fabric&lt;/a&gt; allows you to unify, secure, and optimize data spread across the enterprise. Typically, writing and syncing data in record types is as easy as using one of Appian&amp;rsquo;s smart services like Write Records, Write to Data Store Entity, and Write to Multiple Data Store Entities. However, when designing extremely high throughput autoscaled processes, you may need to modify your design to workaround write throughput limitations.&lt;/p&gt;
&lt;p&gt;Synced record types are limited to handling up to ~30,000 write requests per minute for processes writing data in small batches (1-10 rows). Trying to sync data above this level of throughput will fail and can cause record type invalidations.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This guide explains how to design a process that supports writes to data fabric when peak times require more than ~30,000 write requests per minute across all of the applications on your site. This is accomplished through an incremental sync pattern where data is synced into the record types independently from the writes to the source table in large batches enabling over 1,000,000 rows to be synced per minute.&lt;/p&gt;
&lt;h2 id="example_process"&gt;Example Process&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s say we have a process model with Autoscale enabled, which receives data over an API call, performs some transformations on the data, and then writes a single record to a synced record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1676x798/__key/communityserver-wikis-components-files/00-00-00-00-46/example_2D00_process.png" /&gt;&lt;/div&gt;
&lt;p&gt;Typically, the API is called only 200 to 300 times per minute. However, at peak times, the API is called over 30,000 times in a single minute. At these peak times, the Write Records node fails due to data sync limitations. Upon reaching data sync write throughput limitations, write performance will degrade, leading to request timeouts. Failed requests will return either &amp;#39;could not obtain a reservation within the time limit&amp;#39; or &amp;#39;the request has timed out due to the system being busy.&amp;#39;&lt;/p&gt;
&lt;h2 id="deferred_sync_pattern"&gt;Deferred Sync Pattern&lt;/h2&gt;
&lt;p&gt;In order to allow the process model to continue to process data even in times of peak load, we need to implement an independent sync pattern where data is synced in batches rather than one row at a time.&lt;/p&gt;
&lt;p&gt;To avoid automatically syncing data to data fabric from the process model, an independent data store or a connected system data source must be created and used in the autoscaled process model to write data. This will allow us to write data only to the source table at first, and sync it in the record type independently.&lt;/p&gt;
&lt;h3 id="mcetoc_1iipe0q170"&gt;Configure a New Data Source, Data Type, and Data Store&lt;/h3&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new &lt;a href="https://docs.appian.com/suite/help/24.4/data-source-connected-systems.html"&gt;Data Source Connected System&lt;/a&gt; that connects to the same database as your existing record type.&lt;/li&gt;
&lt;li&gt;Create a CDT from the table that already backs the synced record type.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/2386x1038/__key/communityserver-wikis-components-files/00-00-00-00-46/jlt_5F00_record_2D00_1.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Create a new data store with that CDT as an entity. Use the connected system data source you just created as the data source.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1658x968/__key/communityserver-wikis-components-files/00-00-00-00-46/data_2D00_schema_2D00_2.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="callout-box callout-info"&gt;If your record type does not already have a modifiedOn timestamp, you will need to add that to your data structure, and ensure it is being updated every time the row is updated.&lt;/div&gt;
&lt;h3&gt;Replace the Write Records Node&lt;/h3&gt;
&lt;p&gt;In the autoscaled process model:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Update the process variable that holds the data being written to use a CDT instead of a record type (the one we just created). Update all usage of this variable.&lt;/li&gt;
&lt;li&gt;Replace the Write Records node with a Write to Data Store Entity node, using a constant for the new data store we just created.&lt;/li&gt;
&lt;li&gt;Click Save &amp;amp; Publish.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, your autoscaled process model will only write to the source table instead of automatically syncing data in the record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x260/__key/communityserver-wikis-components-files/00-00-00-00-46/records_2D00_node.png" /&gt;&lt;/div&gt;
&lt;h3&gt;Sync Batches of Data Every 5 Minutes&lt;/h3&gt;
&lt;p&gt;After re-configuring the autoscaled model, create a separate process model running without autoscale enabled to incrementally sync data the record type from the source table.&lt;/p&gt;
&lt;p&gt;To configure incremental sync:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new process model without autoscale enabled.&lt;/li&gt;
&lt;li&gt;Create process variables to track the timestamp at which data was last synced (lastSyncTime) and the list of IDs to sync (recordsToSync).&lt;/li&gt;
&lt;li&gt;Set the default value of the lastSyncTime variable to now()-5. This will cause the first run of the process to sync anything updated after 5 minutes ago.&lt;/li&gt;
&lt;li&gt;Configure a timer event on the start node to run the process every 5 minutes.&lt;/li&gt;
&lt;li&gt;In a new expression rule, query the IDs of any rows modified after the lastSyncTime timestamp, using a query that looks like this:
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;pre class="ui-code" data-mode="text"&gt;a!queryEntity(
  entity: cons!JLT_RecordEntity,
  query: a!query(
    selection: a!querySelection(
      columns: {
        a!queryColumn(
          field: &amp;quot;id&amp;quot;
        )
      }
    ),
    logicalExpression: a!queryLogicalExpression(
      operator: &amp;quot;AND&amp;quot;,
      filters: {
        a!queryFilter(
          field: &amp;quot;modifiedOn&amp;quot;,
          operator: &amp;quot;&amp;gt;&amp;quot;,
          value: ri!lastSyncTime
        )
      },
      ignoreFiltersWithEmptyValues: true
    ),
    pagingInfo: a!pagingInfo(
      startIndex: 1,
      batchSize: 50,
      sort: a!sortInfo(
        field: &amp;quot;modifiedOn&amp;quot;,
        ascending: true
      )
    )
  ),
  fetchTotalCount: false
)
&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Add a Script Task to the process and call the expression rule created above, passing in lastSyncTime.&lt;/li&gt;
&lt;li&gt;Add a Sync Records smart service node to sync the IDs you just queried in the record type. Since this will most likely require syncing more than 1000 rows at a time, you will need to &lt;a href="https://docs.appian.com/suite/help/24.4/Sync_Records_Smart_Service.html#syncing-more-than-1000-records"&gt;use a loop&lt;/a&gt; to iterate over all rows that need to be synced.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x838/__key/communityserver-wikis-components-files/00-00-00-00-46/loop.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;rsquo;s it! This pattern of ingesting data in larger batches can support syncing&amp;nbsp;over 1,000,000 rows per minute in record types across all applications on your site, with data being updated in 5 minutes or less.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: records, design patterns, Architecture, data fabric&lt;/div&gt;
</description></item><item><title>Writing to Synced Record Types at High Throughput</title><link>https://community.appian.com/success/w/guide/3623/writing-to-synced-record-types-at-high-throughput/revision/34</link><pubDate>Thu, 18 Dec 2025 16:33:43 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:c655af54-6f28-49d4-9fdc-87a90630339c</guid><dc:creator>joel.larin</dc:creator><description>Revision 34 posted to Guide by joel.larin on 12/18/2025 4:33:43 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Appian&amp;#39;s &lt;a href="https://docs.appian.com/suite/help/latest/data-fabric.html"&gt;data fabric&lt;/a&gt; allows you to unify, secure, and optimize data spread across the enterprise. Typically, writing and syncing data in record types is as easy as using one of Appian&amp;rsquo;s smart services like Write Records, Write to Data Store Entity, and Write to Multiple Data Store Entities. However, when designing extremely high throughput autoscaled processes, you may need to modify your design to workaround write throughput limitations. Synced record types are limited to handling up to ~30,000 write requests per minute for processes writing data in small batches (1-10 rows).&lt;/p&gt;
&lt;p&gt;Trying to sync data above this level of throughput will fail and can cause record type invalidations.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This guide explains how to design a process that supports writes to data fabric when peak times require more than ~30,000 write requests per minute across all of the applications on your site. This is accomplished through an incremental sync pattern where data is synced into the record types independently from the writes to the source table in large batches enabling over 1,000,000 rows to be synced per minute.&lt;/p&gt;
&lt;h2 id="example_process"&gt;Example Process&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s say we have a process model with Autoscale enabled, which receives data over an API call, performs some transformations on the data, and then writes a single record to a synced record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1676x798/__key/communityserver-wikis-components-files/00-00-00-00-46/example_2D00_process.png" /&gt;&lt;/div&gt;
&lt;p&gt;Typically, the API is called only 200 to 300 times per minute. However, at peak times, the API is called over 30,000 times in a single minute. At these peak times, the Write Records node fails due to data sync limitations. Upon reaching data sync write throughput limitations, write performance will degrade, leading to request timeouts. Failed requests will return either &amp;#39;could not obtain a reservation within the time limit&amp;#39; or &amp;#39;the request has timed out due to the system being busy.&amp;#39;&lt;/p&gt;
&lt;h2 id="deferred_sync_pattern"&gt;Deferred Sync Pattern&lt;/h2&gt;
&lt;p&gt;In order to allow the process model to continue to process data even in times of peak load, we need to implement an independent sync pattern where data is synced in batches rather than one row at a time.&lt;/p&gt;
&lt;p&gt;To avoid automatically syncing data to data fabric from the process model, an independent data store or a connected system data source must be created and used in the autoscaled process model to write data. This will allow us to write data only to the source table at first, and sync it in the record type independently.&lt;/p&gt;
&lt;h3 id="mcetoc_1iipe0q170"&gt;Configure a New Data Source, Data Type, and Data Store&lt;/h3&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new &lt;a href="https://docs.appian.com/suite/help/24.4/data-source-connected-systems.html"&gt;Data Source Connected System&lt;/a&gt; that connects to the same database as your existing record type.&lt;/li&gt;
&lt;li&gt;Create a CDT from the table that already backs the synced record type.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/2386x1038/__key/communityserver-wikis-components-files/00-00-00-00-46/jlt_5F00_record_2D00_1.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Create a new data store with that CDT as an entity. Use the connected system data source you just created as the data source.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1658x968/__key/communityserver-wikis-components-files/00-00-00-00-46/data_2D00_schema_2D00_2.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="callout-box callout-info"&gt;If your record type does not already have a modifiedOn timestamp, you will need to add that to your data structure, and ensure it is being updated every time the row is updated.&lt;/div&gt;
&lt;h3&gt;Replace the Write Records Node&lt;/h3&gt;
&lt;p&gt;In the autoscaled process model:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Update the process variable that holds the data being written to use a CDT instead of a record type (the one we just created). Update all usage of this variable.&lt;/li&gt;
&lt;li&gt;Replace the Write Records node with a Write to Data Store Entity node, using a constant for the new data store we just created.&lt;/li&gt;
&lt;li&gt;Click Save &amp;amp; Publish.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, your autoscaled process model will only write to the source table instead of automatically syncing data in the record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x260/__key/communityserver-wikis-components-files/00-00-00-00-46/records_2D00_node.png" /&gt;&lt;/div&gt;
&lt;h3&gt;Sync Batches of Data Every 5 Minutes&lt;/h3&gt;
&lt;p&gt;After re-configuring the autoscaled model, create a separate process model running without autoscale enabled to incrementally sync data the record type from the source table.&lt;/p&gt;
&lt;p&gt;To configure incremental sync:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new process model without autoscale enabled.&lt;/li&gt;
&lt;li&gt;Create process variables to track the timestamp at which data was last synced (lastSyncTime) and the list of IDs to sync (recordsToSync).&lt;/li&gt;
&lt;li&gt;Set the default value of the lastSyncTime variable to now()-5. This will cause the first run of the process to sync anything updated after 5 minutes ago.&lt;/li&gt;
&lt;li&gt;Configure a timer event on the start node to run the process every 5 minutes.&lt;/li&gt;
&lt;li&gt;In a new expression rule, query the IDs of any rows modified after the lastSyncTime timestamp, using a query that looks like this:
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;pre class="ui-code" data-mode="text"&gt;a!queryEntity(
  entity: cons!JLT_RecordEntity,
  query: a!query(
    selection: a!querySelection(
      columns: {
        a!queryColumn(
          field: &amp;quot;id&amp;quot;
        )
      }
    ),
    logicalExpression: a!queryLogicalExpression(
      operator: &amp;quot;AND&amp;quot;,
      filters: {
        a!queryFilter(
          field: &amp;quot;modifiedOn&amp;quot;,
          operator: &amp;quot;&amp;gt;&amp;quot;,
          value: ri!lastSyncTime
        )
      },
      ignoreFiltersWithEmptyValues: true
    ),
    pagingInfo: a!pagingInfo(
      startIndex: 1,
      batchSize: 50,
      sort: a!sortInfo(
        field: &amp;quot;modifiedOn&amp;quot;,
        ascending: true
      )
    )
  ),
  fetchTotalCount: false
)
&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Add a Script Task to the process and call the expression rule created above, passing in lastSyncTime.&lt;/li&gt;
&lt;li&gt;Add a Sync Records smart service node to sync the IDs you just queried in the record type. Since this will most likely require syncing more than 1000 rows at a time, you will need to &lt;a href="https://docs.appian.com/suite/help/24.4/Sync_Records_Smart_Service.html#syncing-more-than-1000-records"&gt;use a loop&lt;/a&gt; to iterate over all rows that need to be synced.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x838/__key/communityserver-wikis-components-files/00-00-00-00-46/loop.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;rsquo;s it! This pattern of ingesting data in larger batches can support syncing&amp;nbsp;over 1,000,000 rows per minute in record types across all applications on your site, with data being updated in 5 minutes or less.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: records, design patterns, Architecture, data fabric&lt;/div&gt;
</description></item><item><title>Writing to Synced Record Types at High Throughput</title><link>https://community.appian.com/success/w/guide/3623/writing-to-synced-record-types-at-high-throughput/revision/33</link><pubDate>Thu, 18 Dec 2025 16:31:32 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:c655af54-6f28-49d4-9fdc-87a90630339c</guid><dc:creator>joel.larin</dc:creator><description>Revision 33 posted to Guide by joel.larin on 12/18/2025 4:31:32 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Appian&amp;#39;s &lt;a href="https://docs.appian.com/suite/help/latest/data-fabric.html"&gt;data fabric&lt;/a&gt; allows you to unify, secure, and optimize data spread across the enterprise. Typically, writing and syncing data in record types is as easy as using one of Appian&amp;rsquo;s smart services like Write Records, Write to Data Store Entity, and Write to Multiple Data Store Entities. However, when designing autoscaled processes, you may want to avoid using these smart services directly. Synced record types are limited to handling ~1,000 write requests per minute for processes writing data in small batches (1-10 rows).&lt;/p&gt;
&lt;p&gt;Trying to sync data above this level of throughput will fail and can cause record type invalidations.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This guide explains how to design a process that supports writes to data fabric when peak times require more than ~30,000 write requests per minute across all of the applications on your site. This is accomplished through an incremental sync pattern where data is synced into the record types independently from the writes to the source table in large batches enabling over 1,000,000 rows to be synced per minute.&lt;/p&gt;
&lt;h2 id="example_process"&gt;Example Process&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s say we have a process model with Autoscale enabled, which receives data over an API call, performs some transformations on the data, and then writes a single record to a synced record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1676x798/__key/communityserver-wikis-components-files/00-00-00-00-46/example_2D00_process.png" /&gt;&lt;/div&gt;
&lt;p&gt;Typically, the API is called only 200 to 300 times per minute. However, at peak times, the API is called over 10,000 times in a single minute. At these peak times, the Write Records node fails due to data sync limitations. Upon reaching data sync write throughput limitations, write performance will degrade, leading to request timeouts. Failed requests will return either &amp;#39;could not obtain a reservation within the time limit&amp;#39; or &amp;#39;the request has timed out due to the system being busy.&amp;#39;&lt;/p&gt;
&lt;h2 id="deferred_sync_pattern"&gt;Deferred Sync Pattern&lt;/h2&gt;
&lt;p&gt;In order to allow the process model to continue to process data even in times of peak load, we need to implement an independent sync pattern where data is synced in batches rather than one row at a time.&lt;/p&gt;
&lt;p&gt;To avoid automatically syncing data to data fabric from the process model, an independent data store or a connected system data source must be created and used in the autoscaled process model to write data. This will allow us to write data only to the source table at first, and sync it in the record type independently.&lt;/p&gt;
&lt;h3 id="mcetoc_1iipe0q170"&gt;Configure a New Data Source, Data Type, and Data Store&lt;/h3&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new &lt;a href="https://docs.appian.com/suite/help/24.4/data-source-connected-systems.html"&gt;Data Source Connected System&lt;/a&gt; that connects to the same database as your existing record type.&lt;/li&gt;
&lt;li&gt;Create a CDT from the table that already backs the synced record type.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/2386x1038/__key/communityserver-wikis-components-files/00-00-00-00-46/jlt_5F00_record_2D00_1.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Create a new data store with that CDT as an entity. Use the connected system data source you just created as the data source.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1658x968/__key/communityserver-wikis-components-files/00-00-00-00-46/data_2D00_schema_2D00_2.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="callout-box callout-info"&gt;If your record type does not already have a modifiedOn timestamp, you will need to add that to your data structure, and ensure it is being updated every time the row is updated.&lt;/div&gt;
&lt;h3&gt;Replace the Write Records Node&lt;/h3&gt;
&lt;p&gt;In the autoscaled process model:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Update the process variable that holds the data being written to use a CDT instead of a record type (the one we just created). Update all usage of this variable.&lt;/li&gt;
&lt;li&gt;Replace the Write Records node with a Write to Data Store Entity node, using a constant for the new data store we just created.&lt;/li&gt;
&lt;li&gt;Click Save &amp;amp; Publish.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, your autoscaled process model will only write to the source table instead of automatically syncing data in the record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x260/__key/communityserver-wikis-components-files/00-00-00-00-46/records_2D00_node.png" /&gt;&lt;/div&gt;
&lt;h3&gt;Sync Batches of Data Every 5 Minutes&lt;/h3&gt;
&lt;p&gt;After re-configuring the autoscaled model, create a separate process model running without autoscale enabled to incrementally sync data the record type from the source table.&lt;/p&gt;
&lt;p&gt;To configure incremental sync:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new process model without autoscale enabled.&lt;/li&gt;
&lt;li&gt;Create process variables to track the timestamp at which data was last synced (lastSyncTime) and the list of IDs to sync (recordsToSync).&lt;/li&gt;
&lt;li&gt;Set the default value of the lastSyncTime variable to now()-5. This will cause the first run of the process to sync anything updated after 5 minutes ago.&lt;/li&gt;
&lt;li&gt;Configure a timer event on the start node to run the process every 5 minutes.&lt;/li&gt;
&lt;li&gt;In a new expression rule, query the IDs of any rows modified after the lastSyncTime timestamp, using a query that looks like this:
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;pre class="ui-code" data-mode="text"&gt;a!queryEntity(
  entity: cons!JLT_RecordEntity,
  query: a!query(
    selection: a!querySelection(
      columns: {
        a!queryColumn(
          field: &amp;quot;id&amp;quot;
        )
      }
    ),
    logicalExpression: a!queryLogicalExpression(
      operator: &amp;quot;AND&amp;quot;,
      filters: {
        a!queryFilter(
          field: &amp;quot;modifiedOn&amp;quot;,
          operator: &amp;quot;&amp;gt;&amp;quot;,
          value: ri!lastSyncTime
        )
      },
      ignoreFiltersWithEmptyValues: true
    ),
    pagingInfo: a!pagingInfo(
      startIndex: 1,
      batchSize: 50,
      sort: a!sortInfo(
        field: &amp;quot;modifiedOn&amp;quot;,
        ascending: true
      )
    )
  ),
  fetchTotalCount: false
)
&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Add a Script Task to the process and call the expression rule created above, passing in lastSyncTime.&lt;/li&gt;
&lt;li&gt;Add a Sync Records smart service node to sync the IDs you just queried in the record type. Since this will most likely require syncing more than 1000 rows at a time, you will need to &lt;a href="https://docs.appian.com/suite/help/24.4/Sync_Records_Smart_Service.html#syncing-more-than-1000-records"&gt;use a loop&lt;/a&gt; to iterate over all rows that need to be synced.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x838/__key/communityserver-wikis-components-files/00-00-00-00-46/loop.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;rsquo;s it! This pattern of ingesting data in larger batches can support syncing up to 200,000 rows per minute in record types across all applications on your site, with data being updated in 5 minutes or less.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: records, design patterns, Architecture, data fabric&lt;/div&gt;
</description></item><item><title>Automated Testing With Cucumber For Appian</title><link>https://community.appian.com/success/w/guide/3311/automated-testing-with-cucumber-for-appian</link><pubDate>Tue, 10 Jun 2025 23:23:50 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:46bc0e4d-d906-4f38-a453-edf5b739bc6f</guid><dc:creator>joel.larin</dc:creator><description>Current Revision posted to Guide by joel.larin on 6/10/2025 11:23:50 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;div class="callout-box callout-info"&gt;Please be advised that this package has moved to a new &lt;a href="https://gitlab.com/appian-oss/appian-selenium-api"&gt;open-source repository&lt;/a&gt;, as future updates on the App Market will be discontinued. We encourage all users to switch to the new repository to gain the ability to contribute, receive immediate access to bug fixes and new functionality, and improve communication with other users and maintainers via GitLab issues.&lt;/div&gt;
&lt;p&gt;Cucumber For Appian is a client-side tool that builds on top of what &lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;FitNesse For Appian&lt;/a&gt; has implemented and allows users to write automated UI tests against Appian with &lt;a href="https://docs.cucumber.io/gherkin/"&gt;Gherkin syntax&lt;/a&gt;. Cucumber For Appian will support all of the same fixture methods that FitNesse For Appian currently supports.&lt;/p&gt;
&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;
&lt;ul style="font-size:110%;"&gt;
&lt;li&gt;Appian 22.2 and above&lt;/li&gt;
&lt;li&gt;Java Runtime Environment 11&lt;/li&gt;
&lt;li&gt;Chrome or Firefox browsers
&lt;div class="callout-box callout-info"&gt;If using Chrome, we recommend using &lt;a href="https://developer.chrome.com/blog/chrome-for-testing/"&gt;Chrome For Testing&lt;/a&gt; for a more consistent testing experience.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Access to Terminal if you&amp;rsquo;re on Mac/Linux or Command Prompt if on Windows&lt;/li&gt;
&lt;li&gt;Apache Maven tool&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;The zip file for the tool can be downloaded from the AppMarket.&lt;/p&gt;
&lt;ul style="font-size:110%;"&gt;
&lt;li&gt;Unzip the contents into any directory (e.g. C:/)&lt;/li&gt;
&lt;li&gt;In a terminal window, navigate to the &amp;lsquo;CucumberForAppian-x&amp;rsquo; (where x corresponds to the version number) folder extracted from the zip file (e.g. C:\CucumberForAppian-19.1-SNAPSHOT)
&lt;ul&gt;
&lt;li&gt;We will refer to this directory as CUCUMBER_ROOT from now on&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="running_cucumber_tests"&gt;Running Cucumber Tests&lt;/h2&gt;
&lt;ul style="font-size:110%;"&gt;
&lt;li&gt;Navigate to src/test/resources from CUCUMBER_ROOT&lt;/li&gt;
&lt;li&gt;Edit either the ApplicationExample.feature or TempoNavigationExample.feature file
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;BROWSER&amp;rdquo; - Chrome or Firefox&lt;/li&gt;
&lt;li&gt;&amp;ldquo;APPIAN_URL&amp;rdquo; - e.g. https://site-name.appiancloud.com&lt;/li&gt;
&lt;li&gt;&amp;ldquo;APPIAN_VERSION&amp;rdquo; - e.g. 18.4&lt;/li&gt;
&lt;li&gt;&amp;ldquo;APPIAN_LOCALE&amp;rdquo; - en_US or en_GB&lt;/li&gt;
&lt;li&gt;&amp;ldquo;APPIAN_USERNAME&amp;rdquo; - e.g. fitnesse.user&lt;/li&gt;
&lt;li&gt;The comments on the top of the .feature files will also help you in setting up&lt;/li&gt;
&lt;li&gt;The completed feature file should look like the one shown below:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/900x750/__key/communityserver-wikis-components-files/00-00-00-00-46/8713.Playbook_5F00_feature_5F00_file.png" /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;In CUCUMBER_ROOT, run ./setupCustomPropertiesForMac if using a mac or ./setupCustomPropertiesForLinux if using UNIX. If using Windows:
&lt;ul&gt;
&lt;li&gt;Open the &amp;ldquo;custom.properties&amp;rdquo; file located in CUCUMBER_ROOT/src/main/resources/configs and modify:
&lt;ul&gt;
&lt;li&gt;automated.testing.home to be CUCUMBER_ROOT (e.g. C:\CucumberForAppian-19.1-SNAPSHOT)&lt;/li&gt;
&lt;li&gt;download.directory to be CUCUMBER_ROOT/target (e.g. C:\CucumberForAppian-19.1-SNAPSHOT\target)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Run mvn clean test in CUCUMBER_ROOT&lt;/li&gt;
&lt;li&gt;The output in the terminal should be similar to what&amp;rsquo;s displayed below&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/900x800/__key/communityserver-wikis-components-files/00-00-00-00-46/2766.Playbook_5F00_cucumber_5F00_run.png" /&gt;&lt;/div&gt;
&lt;p&gt;*NOTE* By default, only the TempoNavigationExample.feature test file will run when you execute the command above due to the &amp;ldquo;tags&amp;rdquo; argument in RunCucumberForAppianTest.java&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/600x800/__key/communityserver-wikis-components-files/00-00-00-00-46/8814.Playbook_5F00_cucumber_5F00_java.png" /&gt;&lt;/div&gt;
&lt;p&gt;At the top of the TempoNavigationExample.feature file, there is a tag &amp;ldquo;@Tempo&amp;rdquo; which corresponds to that in the .java file. To selectively run the tests, you can add or remove tags as you wish. You can completely remove the tags parameter if you&amp;rsquo;d like to run all of the tests together.&lt;/p&gt;
&lt;p&gt;By default, the tool collects usage metrics for analytics purposes.&lt;/p&gt;
&lt;h2&gt;Developing Custom Cucumber tests&lt;/h2&gt;
&lt;p&gt;The Cucumber sample tests from above will be a good model to follow when developing your own tests.&lt;/p&gt;
&lt;p&gt;To help you out, we have provided a CucumberForAppian Cheatsheet. You can find it individually in the combined files ZIP you downloaded from the App Market.&amp;nbsp;When developing tests, be sure you are using methods for the environment you are testing. For example, if testing sites, use navigation methods that come from the &amp;quot;Sites Methods&amp;quot; scenario. Using methods from a different environment has the potential to break in future releases.&lt;/p&gt;
&lt;p&gt;The CheatSheet.feature file lists out all the methods we support and how to invoke them using the @Given, @When, @Then, @But, @And.... and other Cucumber supported annotation&lt;/p&gt;
&lt;h2&gt;Features&lt;/h2&gt;
&lt;p&gt;Multiple browser support&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chrome (v64-66)&lt;/li&gt;
&lt;li&gt;Firefox (v53-v62)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="benefits"&gt;Benefits&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Test your Appian application within minutes of downloading the tool&lt;/li&gt;
&lt;li&gt;Methods created specifically to operate within Appian applications and Tempo&lt;/li&gt;
&lt;li&gt;Test scripts do not need to be updated for upgrades to supported Appian versions&lt;/li&gt;
&lt;li&gt;Appian design knowledge is not required to create test scripts&lt;/li&gt;
&lt;li&gt;Common test case scenarios can be created for reusability throughout test suites&lt;/li&gt;
&lt;li&gt;Test scripts are easily updated for new UI changes to a form or interface&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="release_notes"&gt;Release Notes&lt;/h2&gt;
&lt;h3 id="25.1"&gt;March 2025 - Release 25.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Added support for defining and using custom locales. Use create appian locale | PATH TO File. This method must be called after setting the version.&lt;br /&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;File must be JSON file with the format&lt;/strong&gt;:&amp;nbsp;{ &amp;quot;dateFormats&amp;quot;: [ { "label": "dateFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "dateDisplayFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "timeFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "timeDisplayFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "datetimeFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "datetimeDisplayFormat","value": &amp;lt;FORMAT_STRING&amp;gt; } ], &amp;quot;labels&amp;quot;: [ { "label": "acceptButton", "value": "Accept" } ], &amp;quot;locale&amp;quot;: &amp;lt;LOCALE_CODE&amp;gt; }&lt;!-- notionvc: a0caf744-193a-430a-a07c-8fec6fed1e37 --&gt;&lt;!-- notionvc: bac86f8d-84e2-4689-b153-1bb90e3d5c2e --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Fixed clickOnRecordRelatedAction to function correctly when the Record Summary page contains more than three action items.&lt;!-- notionvc: dd49e574-46f8-4e3a-8588-5e6b22f5c63a --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="24.3"&gt;August 2024 - Release 24.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Added built-in retry to click operation in case of element not interactable exception.&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Updated the milestone locator.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="24.2"&gt;June 2024 - Release 24.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Updated locator for site menu links&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Created method which supports clicking on text within an interface. This is particularly useful for nested cards such as tab layouts, but can also be used as a fallback when existing methods don&amp;#39;t work. This method is available for all Appian versions.&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Click operation on Card layout will be performed on the left side of the element instead of the right. We&amp;#39;re not expecting any impact on existing test cases.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;March 2024 - Release 24.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Support for Appian version 24.1&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Adds support for collapsing/opening sidebars&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;ClickOnCard updated to support clicking on cards with complex content. For example, the method can now click on cards that have a component nested in multiple layouts within the card&lt;!-- notionvc: c9bfab53-e4e1-4301-9c43-08f4d6f59a50 --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;November&amp;nbsp;2023 - Release 23.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: &lt;span style="font-weight:400;"&gt;Project has been updated to require Java 11 JRE&lt;/span&gt;&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Support for Appian version 23.4&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for the side navigation menu in sites&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for downloading charts&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for buttons configured with custom colors&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Honor the download directory given in custom.properties for Remote Drivers&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Update dropdowns for versions greater than 23.3 to ignore the aria-checked value&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Fixed Populate Record Type Data Range User Filter method&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;August&amp;nbsp;2023 - Release 23.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Supports Appian version 23.3&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Added functionality to interact with new site group headers&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Updated to Selenium 4.11.0&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for Date Range user filters in Record Types&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Update checkboxes to support CARD style for 23.3 and later Appian versions&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;June&amp;nbsp;2023 - Release 23.2.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: Updates to site navigation in the 23.2 product breaks the use of the &amp;quot;click on menu&amp;quot; method in site environments. &amp;quot;click on menu&amp;quot;, and other Tempo navigation methods, are guaranteed&amp;nbsp;to work only in Tempo environments. Use the &amp;quot;click on site page&amp;quot; method instead&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Update pickers to recognize selections with links (e.g. Record Pickers)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2"&gt;June&amp;nbsp;2023 - Release 23.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Supports Appian version 23.2
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: Updates to site navigation in the 23.2 product breaks the use of the &amp;quot;click on menu&amp;quot; method in site environments. &amp;quot;click on menu&amp;quot;, and other Tempo navigation methods, are guaranteed&amp;nbsp;to work only in Tempo environments. Use the &amp;quot;click on site page&amp;quot; method instead&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="may_2023_-_release_23.1.2"&gt;May 2023 - Release 23.1.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fixes an issue where Dropdowns with Search were not working&lt;/li&gt;
&lt;li&gt;Fixes an Issue where verifyText did not work on multi-node components&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="february_2023_-_release_23.1"&gt;February 2023 - Release 23.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Supports Appian version 23.1&lt;/li&gt;
&lt;li&gt;Updated locator for Dropdown class&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Update CVEs&lt;/li&gt;
&lt;li&gt;Update scripts (start.bat, start-mac.sh, start-unix.sh, runFitNesseTest.sh) toreference the new fitnesse-20221219-standalone.jar&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august&amp;nbsp;2022_-_release_22.3"&gt;August&amp;nbsp;2022 - Release 22.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cucumber for Appian is released and supported&lt;/li&gt;
&lt;li&gt;Removed support for 20.3&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="november&amp;nbsp;2021_-_release_21.4"&gt;November&amp;nbsp;2021 - Release 21.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Support new card choice components&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Update CVEs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august&amp;nbsp;2021_-_release_21.3"&gt;August&amp;nbsp;2021 - Release 21.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for radio button card&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for date picker&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june_2021_-_release_21.2"&gt;June 2021 - Release 21.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Support new SectionLayout&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Upgrade Selenium Server to 3.141.59&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for radio button card&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for icon link alt text&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="february&amp;nbsp;2021_-_release_21.1"&gt;February&amp;nbsp;2021 - Release 21.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Supports Appian version 21.1&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="november&amp;nbsp;2020_-_release_20.4"&gt;November&amp;nbsp;2020 - Release 20.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Support Chrome capabilities&lt;/li&gt;
&lt;li&gt;Update Cucumber to 6.8.2&lt;/li&gt;
&lt;li&gt;NEW METHOD: Support Stamp Field&lt;/li&gt;
&lt;li&gt;NEW METHOD: Support Tag field&lt;/li&gt;
&lt;li&gt;NEW METHOD:&amp;nbsp;Support signature field&lt;/li&gt;
&lt;li&gt;NEW METHOD: Support record action field&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fix grid row count bug when there is no paging&lt;/li&gt;
&lt;li&gt;Fix getGridColumnRowValue when the grid cell is a button&lt;/li&gt;
&lt;li&gt;Fix clear picker bug when there are multiple selections&lt;/li&gt;
&lt;li&gt;Fix capturing an empty rich text field&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="september&amp;nbsp;2020_-_release_20.3"&gt;September&amp;nbsp;2020 - Release 20.3&lt;/h3&gt;
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Enhancements
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;NEW METHOD: Populates the search box in a dropdown with some text&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;Bug fixes
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Fixed a bug for custom login submit button&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august&amp;nbsp;2020_-_release_20.2.1"&gt;August&amp;nbsp;2020 - Release 20.2.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fixed a bug regarding clicking on card layouts&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="july&amp;nbsp;2020_-_release_20.4"&gt;July&amp;nbsp;2020 - Release 20.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fix bug with milestone click&lt;/li&gt;
&lt;li&gt;Fix toggle box visibility on related action pop up&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="april&amp;nbsp;2020_-_release_20.1"&gt;April&amp;nbsp;2020 - Release 20.1&lt;/h3&gt;
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Enhancements
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;NEW METHOD:&amp;nbsp;click on bar chart *&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: click on menu widget&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: click on button with tooltip&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: verify confirmation dialog header&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: verify confirmation dialog message&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: Verify a field is not blank&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: click on document image link&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: clear search field in record&lt;/li&gt;
&lt;li class="li1"&gt;Include all jars in Cucumber&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;Bug fixes
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Remove pie chart hover for fragility and also make it the page scroll before hovering for firefox&lt;/li&gt;
&lt;li class="li1"&gt;Clicking on standalone icons by making the xpath less specific&lt;/li&gt;
&lt;li class="li1"&gt;&lt;strong&gt;Fix closing social task bug&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="january&amp;nbsp;2020_-_release_19.4.1"&gt;January&amp;nbsp;2020 - Release 19.4.1&lt;/h3&gt;
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Enhancements
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;NEW METHOD: star and unstar action with action name&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: click on icon link with alt text&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;Bug fixes
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Fixed issues for dropdowns with many options&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="november&amp;nbsp;2019_-_release_19.4"&gt;November&amp;nbsp;2019 - Release 19.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;NEW METHOD: verify button with label is enabled&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify button with label is disabled&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify link containing text is not present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a box with given label is present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a box with given label is not present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a section with given label is present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a section with given label is not present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a card with given accessibility text is present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a card with given accessibility text is not present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify if text is not present anywhere in the user interface&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Fixed populate first column in a grid when rowheader is set to 1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="september&amp;nbsp;2019_-_release_19.3.1"&gt;September&amp;nbsp;2019 - Release 19.3.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Enhancements
&lt;ul&gt;
&lt;li&gt;Added additional logging for site page navigation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Bug fixes
&lt;ul&gt;
&lt;li&gt;Fixed verify text present for text with apostrophe&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2019_-_release_19.2"&gt;June&amp;nbsp;2019 - Release 19.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Bug fixes
&lt;ul&gt;
&lt;li&gt;Support sending news post without participants&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="may&amp;nbsp;2019_-_release_19.1.3"&gt;May&amp;nbsp;2019 - Release 19.1.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Bug fixes
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Fixed the bug that users can not click on menu tabs on Appian 19.1&lt;/li&gt;
&lt;li&gt;Fixed the bug on Read Only field &amp;quot;contains&amp;quot;&lt;/li&gt;
&lt;li&gt;Fixed the bug on sending news post on Appian 19.1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="april_2019_-_release_19.1.2"&gt;April 2019 - Release 19.1.2&lt;/h3&gt;
&lt;p&gt;Enhancements&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support Wait For Progress&lt;/li&gt;
&lt;li&gt;Support Click on X and Y coordinates on monitor&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bug fixes&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed the bug that box layout toggle only acts on the first box&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="march_2019_-_release_19.1.1"&gt;March 2019 - Release 19.1.1&lt;/h3&gt;
&lt;p&gt;Bug fixes&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed error popup caused by loading Automation Extension&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="february&amp;nbsp;2019_-_release_19.1"&gt;February&amp;nbsp;2019 - Release 19.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cucumber For Appian available&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: testing, Architecture&lt;/div&gt;
</description></item><item><title>Automated Testing With FitNesse for Appian</title><link>https://community.appian.com/success/w/guide/3313/automated-testing-with-fitnesse-for-appian</link><pubDate>Tue, 10 Jun 2025 23:23:43 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:c8850879-8dd5-475d-984d-48e7e52228fa</guid><dc:creator>joel.larin</dc:creator><description>Current Revision posted to Guide by joel.larin on 6/10/2025 11:23:43 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;div class="callout-box callout-info"&gt;Please be advised that this package has moved to a new &lt;a href="https://gitlab.com/appian-oss/appian-selenium-api"&gt;open-source repository&lt;/a&gt;, as future updates on the App Market will be discontinued. We encourage all users to switch to the new repository to gain the ability to contribute, receive immediate access to bug fixes and new functionality, and improve communication with other users and maintainers via GitLab issues.&lt;/div&gt;
&lt;p&gt;FitNesse for Appian is a client side tool, built on top of&amp;nbsp;&lt;a href="http://docs.fitnesse.org/FrontPage"&gt;FitNesse&lt;/a&gt;, that makes it easy to create automated tests on the Appian platform. This&amp;nbsp;tool allows you to create test scripts in a easy to read wiki language that will&amp;nbsp;be run by the system to interact with an Appian application as a human user.&lt;/p&gt;
&lt;p&gt;FitNesse for Appian provides an Appian-specific wiki language within FitNesse that maps directly to actions that can be performed in Appian, such as:&lt;/p&gt;
&lt;ul style="font-size:110%;"&gt;
&lt;li&gt;Navigating the interface (News, Tasks, Records, Reports, Actions, Sites)&lt;/li&gt;
&lt;li&gt;Starting actions and completing tasks&lt;/li&gt;
&lt;li&gt;Validating content on record views or in news events&lt;/li&gt;
&lt;li&gt;And much more... the complete list is available directly within the tool!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information about&amp;nbsp;testing and development best practices when using FitNesse for Appian, visit the&amp;nbsp;&lt;a href="/w/guide/3212/fitnesse-for-appian-best-practices"&gt;FitNesse for Appian Best Practices&lt;/a&gt;&amp;nbsp;guide.&lt;/p&gt;
&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;
&lt;ul style="font-size:110%;"&gt;
&lt;li&gt;Appian 22.2 and above&lt;/li&gt;
&lt;li&gt;Java Runtime Environment 11&lt;/li&gt;
&lt;li&gt;Chrome or Firefox browsers
&lt;div class="callout-box callout-info"&gt;If using Chrome, we recommend using &lt;a href="https://developer.chrome.com/blog/chrome-for-testing/"&gt;Chrome For Testing&lt;/a&gt; for a more consistent testing experience.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="setup"&gt;Setup&lt;/h2&gt;
&lt;p&gt;The&amp;nbsp;zip file for the tool can be downloaded from the&amp;nbsp;&lt;a href="/b/appmarket/posts/fitnesse-for-appian"&gt;App Market Public Listings&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;
&lt;ol style="font-size:110%;"&gt;
&lt;li&gt;Unzip the contents into your root directory or preferred location (e.g. C:\)&lt;/li&gt;
&lt;li&gt;In a terminal window navigate to the folder extracted from the zip file (e.g. C:\fitnesse-for-appian). We will refer to this directory as TESTING_HOME throughout this documentation
&lt;ol&gt;
&lt;li&gt;For PC, main commands will be:
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;dir:&amp;nbsp;&lt;/strong&gt;used to show contents of current directory (folder)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cd: &lt;/strong&gt;used to change directory (open a folder), e.g. &lt;em&gt;cd Documents&amp;nbsp;&lt;/em&gt;would open the Documents folder.&amp;nbsp;&lt;em&gt;cd ..&amp;nbsp;&lt;/em&gt;would go to the parent folder of current folder.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;For Mac/Linux,
&lt;ol style="font-size:110%;"&gt;
&lt;li&gt;&lt;strong&gt;ls:&lt;/strong&gt; used to show contents of a directory (folder)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cd:&amp;nbsp;&lt;/strong&gt;used to change directory (open a folder), e.g.&amp;nbsp;&lt;em&gt;cd Documents&amp;nbsp;&lt;/em&gt;would open the Documents folder.&amp;nbsp;&lt;em&gt;cd ..&amp;nbsp;&lt;/em&gt;would go to the parent folder of current folder.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Open the &amp;quot;custom.properties&amp;quot; file located in TESTING_HOME/configs and change:
&lt;ol&gt;
&lt;li&gt;automated.testing.home to be TESTING_HOME (e.g. C:\FitNesseForAppian)&lt;/li&gt;
&lt;li&gt;download.directory to be a folder of your choosing&lt;/li&gt;
&lt;li&gt;chrome.driver.home to be TESTING_HOME/lib/drivers/chromedriver(.exe if using windows, -mac if using a mac, -linux if using UNIX)&lt;/li&gt;
&lt;li&gt;firefox.driver.home to be TESTING_HOME/lib/drivers/geckodriver(.exe if using windows, -mac if using a mac, -linux64 if using UNIX)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Run start.bat if using windows, start-mac.sh for Mac, and start-unix.sh for UNIX to install and run FitNesse for Appian.&amp;nbsp;Installation should take around 30 seconds and is complete when you see the message &amp;quot;Starting FitNesse on port: 8980&amp;quot;. To stop FitNesse for Appian, invoke Ctrl+C in the&amp;nbsp;terminal.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="running_your_first_fitnesse_test"&gt;Running your first FitNesse test&lt;/h2&gt;
&lt;ol style="font-size:110%;"&gt;
&lt;li&gt;Start FitNesse if it isn&amp;#39;t already running by running start.bat/start-mac.sh/start-unix.sh depending on your system&lt;/li&gt;
&lt;li&gt;Navigate to http://localhost:8980/FitNesseForAppian.Examples.TestExample&lt;/li&gt;
&lt;li&gt;Follow the configuration instructions marked by &amp;quot;Please follow the directions below to execute the test&amp;quot;&lt;/li&gt;
&lt;li&gt;Click Test at the top of the page&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="developing_custom_tests"&gt;Developing custom tests&lt;/h3&gt;
&lt;p&gt;To&amp;nbsp;try out the tool further, use the Appian application included in the combined files download&amp;nbsp;(Automated Testing - 1x.x.zip) and import it into your corresponding version of Appian environment.&lt;/p&gt;
&lt;p&gt;Navigate to the FitNesseForAppian Cheatsheet&amp;nbsp;and make use of the supported methods to write your own test suite to run against the sample application! Be sure you are using methods for the environment you are testing. For example, if testing sites, use navigation methods that come from the &amp;quot;Sites Methods&amp;quot; scenario. Using methods from a different environment has the potential to break in future releases.&lt;/p&gt;
&lt;p&gt;An example test suite run could look like this:&amp;nbsp;&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/1200x0/__key/communityserver-wikis-components-files/00-00-00-00-46/8206.Appian_5F00_FitNesse_5F00_0.png" /&gt;&lt;/div&gt;
&lt;p&gt;By default, the tool collects usage metrics for analytics purposes. Set collect.metrics=false in the &amp;quot;metrics.properties&amp;quot; file to opt-out of metrics collection.&lt;/p&gt;
&lt;h2 id="features"&gt;Features&lt;/h2&gt;
&lt;p&gt;Multiple browser support&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chrome (v64-66)&lt;/li&gt;
&lt;li&gt;Firefox (v53-62)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="benefits"&gt;Benefits&lt;/h2&gt;
&lt;ul style="font-size:110%;"&gt;
&lt;li&gt;Test your Appian application within minutes of downloading the tool&lt;/li&gt;
&lt;li&gt;Methods created specifically to operate within Appian applications and Tempo&lt;/li&gt;
&lt;li&gt;Test scripts do not need to be updated for upgrades to supported Appian versions&lt;/li&gt;
&lt;li&gt;Test scripts are written in a wiki language&amp;nbsp;that is very easy to read and synthesize&lt;/li&gt;
&lt;li&gt;Appian design knowledge is not required to create test scripts&lt;/li&gt;
&lt;li&gt;Common case scenarios can be created for reusability throughout test suites&lt;/li&gt;
&lt;li&gt;Isolate test steps into scenarios to perform Spec by Example tests&lt;/li&gt;
&lt;li&gt;Test scripts are easily updated for new UI changes to a form or interface&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="release_notes"&gt;Release Notes&lt;/h2&gt;
&lt;h3 id="25.1"&gt;March 2025 - Release 25.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Added support for defining and using custom locales. Use create appian locale | PATH TO File. This method must be called after setting the version.&lt;br /&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;File must be JSON file with the format&lt;/strong&gt;:&amp;nbsp;{ &amp;quot;dateFormats&amp;quot;: [ { "label": "dateFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "dateDisplayFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "timeFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "timeDisplayFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "datetimeFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "datetimeDisplayFormat","value": &amp;lt;FORMAT_STRING&amp;gt; } ], &amp;quot;labels&amp;quot;: [ { "label": "acceptButton", "value": "Accept" } ], &amp;quot;locale&amp;quot;: &amp;lt;LOCALE_CODE&amp;gt; }&lt;!-- notionvc: a0caf744-193a-430a-a07c-8fec6fed1e37 --&gt;&lt;!-- notionvc: bac86f8d-84e2-4689-b153-1bb90e3d5c2e --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Fixed clickOnRecordRelatedAction to function correctly when the Record Summary page contains more than three action items.&lt;!-- notionvc: dd49e574-46f8-4e3a-8588-5e6b22f5c63a --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="24.3"&gt;August 2024 - Release 24.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Added built-in retry to click operation in case of element not interactable exception.&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Updated the milestone locator.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="24.2"&gt;June 2024 - Release 24.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Updated locator for site menu links&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Created method which supports clicking on text within an interface. This is particularly useful for nested cards such as tab layouts, but can also be used as a fallback when existing methods don&amp;#39;t work. This method is available for all Appian versions.&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Click operation on Card layout will be performed on the left side of the element instead of the right. We&amp;#39;re not expecting any impact on existing test cases.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;March 2024 - Release 24.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Support for Appian version 24.1&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Adds support for collapsing/opening sidebars&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;ClickOnCard updated to support clicking on cards with complex content. For example, the method can now click on cards that have a component nested in multiple layouts within the card&lt;!-- notionvc: c9bfab53-e4e1-4301-9c43-08f4d6f59a50 --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;November 2023 - Release 23.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE: &lt;span style="font-weight:400;"&gt;Project has been updated to require Java 11 JRE&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;&lt;/strong&gt;Enhancements&lt;br /&gt;
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Support for Appian version 23.4&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for the side navigation menu in sites&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for downloading charts&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for buttons configured with custom colors&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Honor the download directory given in custom.properties for Remote Drivers&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Update dropdowns for versions greater than 23.3 to ignore the aria-checked value&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Fixed Populate Record Type Data Range User Filter method&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;August&amp;nbsp;2023 - Release 23.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements&lt;br /&gt;
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Supports Appian version 23.3&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Added functionality to interact with new site group headers&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Updated to Selenium 4.11.0&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for Date Range user filters in Record Types&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Update checkboxes to support CARD style for 23.3 and later Appian versions&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;June&amp;nbsp;2023 - Release 23.2.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE:&amp;nbsp;&lt;/strong&gt;Updates to site navigation in the 23.2 product breaks the use of the &amp;quot;click on menu&amp;quot; method in site environments. &amp;quot;click on menu&amp;quot;, and other navigation methods from Tempo, are guaranteed&amp;nbsp;to work only in Tempo environments. Use the &amp;quot;click on site page&amp;quot; method instead&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Update pickers to recognize selections with links (e.g. Record Pickers)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2"&gt;June&amp;nbsp;2023 - Release 23.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Supports Appian version 23.2&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE:&amp;nbsp;&lt;/strong&gt;Updates to site navigation in the 23.2 product breaks the use of the &amp;quot;click on menu&amp;quot; method in site environments. &amp;quot;click on menu&amp;quot;, and other navigation methods from Tempo, are guaranteed&amp;nbsp;to work only in Tempo environments. Use the &amp;quot;click on site page&amp;quot; method instead&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="may_2023_-_release_23.1.2"&gt;May 2023 - Release 23.1.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fixes an issue where Dropdowns with Search were not working&lt;/li&gt;
&lt;li&gt;Fixes an Issue where verifyText did not work on multi-node components&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="february_2023_-_release_23.1"&gt;February 2023 - Release 23.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Supports Appian version 23.1&lt;/li&gt;
&lt;li&gt;Updated locator for Dropdown class&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Update CVEs&lt;/li&gt;
&lt;li&gt;Update scripts (start.bat, start-mac.sh, start-unix.sh, runFitNesseTest.sh) toreference the new fitnesse-20221219-standalone.jar&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august&amp;nbsp;2022_-_release_22.3"&gt;August&amp;nbsp;2022 - Release 22.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;FitNesse for Appian is released and supported&lt;/li&gt;
&lt;li&gt;Removed support for 20.3&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="november&amp;nbsp;2021_-_release_21.4"&gt;November&amp;nbsp;2021 - Release 21.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Support new card choice components&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Update CVEs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august&amp;nbsp;2021_-_release_21.3"&gt;August&amp;nbsp;2021 - Release 21.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for radio button card&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for date picker&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june_2021_-_release_21.2"&gt;June 2021 - Release 21.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Support new SectionLayout&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Upgrade Selenium Server to 3.141.59&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for radio button card&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for icon link alt text&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="february&amp;nbsp;2021_-_release_21.1"&gt;February&amp;nbsp;2021 - Release 21.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Supports Appian version 21.1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="november&amp;nbsp;2020_-_release_20.4"&gt;November&amp;nbsp;2020 - Release 20.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Support Chrome capabilities&lt;/li&gt;
&lt;li&gt;Update FitNesse version to 20200501&lt;/li&gt;
&lt;li&gt;NEW METHOD: Support Stamp Field&lt;/li&gt;
&lt;li&gt;NEW METHOD: Support Tag field&lt;/li&gt;
&lt;li&gt;NEW METHOD:&amp;nbsp;Support signature field&lt;/li&gt;
&lt;li&gt;NEW METHOD: Support record action field&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fix grid row count bug when there is no paging&lt;/li&gt;
&lt;li&gt;Fix getGridColumnRowValue when the grid cell is a button&lt;/li&gt;
&lt;li&gt;Fix clear picker bug when there are multiple selections&lt;/li&gt;
&lt;li&gt;Fix capturing an empty rich text field&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="september&amp;nbsp;2020_-_release_20.3"&gt;September&amp;nbsp;2020 - Release 20.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;NEW METHOD: Populates the search box in a dropdown with some text&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fixed a bug for custom login submit button&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august&amp;nbsp;2020_-_release_20.2.1"&gt;August&amp;nbsp;2020 - Release 20.2.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Fixed a bug regarding clicking on card layouts&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="july&amp;nbsp;2020_-_release_20.2"&gt;July&amp;nbsp;2020 - Release 20.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Fix bug with milestone click&lt;/li&gt;
&lt;li&gt;Fix toggle box visibility on related action pop up&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="apr&amp;nbsp;2020_-_release_20.1"&gt;Apr&amp;nbsp;2020 - Release 20.1&lt;/h3&gt;
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Enhancements
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;NEW METHOD: click on bar chart&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: click on menu widget&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: click on button with tooltip&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: verify confirmation dialog header&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: verify confirmation dialog message&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: Verify a field is not blank&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: click on document image link&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: clear search field in record&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;Bug fixes
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Remove pie chart hover for fragility and also make it the page scroll before hovering for firefox&lt;/li&gt;
&lt;li class="li1"&gt;Clicking on standalone icons by making the xpath less specific&lt;/li&gt;
&lt;li class="li1"&gt;Fixed closing social task bug&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="january&amp;nbsp;2020_-_release_19.4.1"&gt;January&amp;nbsp;2020 - Release 19.4.1&lt;/h3&gt;
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Enhancements
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;NEW METHOD: star and unstar action with action name&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: click on icon link with alt text&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;Bug fixes
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Fixed issues for dropdowns with many options&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="november&amp;nbsp;2019_-_release_19.4"&gt;November&amp;nbsp;2019 - Release 19.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;NEW METHOD: verify button with label is enabled&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify button with label is disabled&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify link containing text is not present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a box with given label is present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a box with given label is not present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a section with given label is present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a section with given label is not present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a card with given accessibility text is present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a card with given accessibility text is not present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify if text is not present anywhere in the user interface&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Fixed populate first column in a grid when rowheader is set to 1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="september&amp;nbsp;2019_-_release_19.3.1"&gt;September&amp;nbsp;2019 - Release 19.3.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Enhancements
&lt;ul&gt;
&lt;li&gt;Added additional logging for site page navigation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Bug fixes
&lt;ul&gt;
&lt;li&gt;Fixed verify text present for text with apostrophe&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sep&amp;nbsp;2019_-_release_19.3"&gt;Sep&amp;nbsp;2019 - Release 19.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Support gauge field&lt;/li&gt;
&lt;li&gt;Support locating field using placeholder, instructions or tooltip&lt;/li&gt;
&lt;li&gt;NEW METHOD: get gauge field GAUGE_FIELD or GAUGE_FIELD[INDEX] percentage&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify gauge field GAUGE_FIELD or GAUGE_FIELD[INDEX] percentage is PERCENTAGE&lt;/li&gt;
&lt;li&gt;NEW METHOD: populate field with placeholder PLACEHOLDER with VALUE(S)&lt;/li&gt;
&lt;li&gt;NEW METHOD: populate field with instructions INSTRUCTIONS with VALUE(S)&lt;/li&gt;
&lt;li&gt;NEW METHOD: populate field with tooltip TOOLTIP with VALUE(S)&lt;/li&gt;
&lt;li&gt;NEW METHOD: get field with placeholder PLACEHOLDER value&lt;/li&gt;
&lt;li&gt;NEW METHOD: get field with instructions INSTRUCTIONS value&lt;/li&gt;
&lt;li&gt;NEW METHOD: get field with tooltip TOOLTIP value&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify field with placeholder PLACEHOLDER contains VALUE(S)&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify field with instructions INSTRUCTIONS contains VALUE(S)&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify field with tooltip TOOLTIP contains VALUE(S)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2019_-_release_19.2"&gt;June&amp;nbsp;2019 - Release 19.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Bug fixes
&lt;ul&gt;
&lt;li&gt;Support sending news post without participants&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="may&amp;nbsp;2019_-_release_19.1.3"&gt;May&amp;nbsp;2019 - Release 19.1.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Bug fixes
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Fixed the bug that users can not click on menu tabs on Appian 19.1&lt;/li&gt;
&lt;li&gt;Fixed the bug on Read Only field &amp;quot;contains&amp;quot;&lt;/li&gt;
&lt;li&gt;Fixed the bug on sending news post on Appian 19.1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="april_2019_-_release_19.1.2"&gt;April 2019 - Release 19.1.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Support Wait For Progress&lt;/li&gt;
&lt;li&gt;Support Click on X and Y coordinates on monitor&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Bug fixes
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Fixed the bug that box layout toggle only acts on the first box&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="march&amp;nbsp;2019_-_release_19.1.1"&gt;March&amp;nbsp;2019 - Release 19.1.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug fixes&amp;nbsp;
&lt;ul&gt;
&lt;li&gt;Fixed error popup caused by loading Automation Extension&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="february_2019_-_release_19.1"&gt;February 2019 - Release 19.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Support Masked Barcode&lt;/li&gt;
&lt;li&gt;Support Vertical Milestone&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes&amp;nbsp;
&lt;ul&gt;
&lt;li&gt;Fixed login with terms for 17.2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="january_2019_-_release_18.4.4"&gt;January 2019 - Release 18.4.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;NEW METHOD: populate field with partially matching picker field suggestion&lt;/li&gt;
&lt;li&gt;NEW METHOD: login into URL with username&lt;/li&gt;
&lt;li&gt;NEW METHOD: login into URL with role&lt;/li&gt;
&lt;li&gt;NEW METHOD: wait for seconds&lt;/li&gt;
&lt;li&gt;NEW METHOD: wait for minutes&lt;/li&gt;
&lt;li&gt;NEW METHOD: wait for working&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="january_2019_-_release_18.4.3"&gt;January 2019 - Release 18.4.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Add capability to run tests on remote web drivers&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Fixed milestone step verification&lt;/li&gt;
&lt;li&gt;Fixed section containing validation message verification&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="december&amp;nbsp;2018_-_release_18.4.2"&gt;December&amp;nbsp;2018 - Release 18.4.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;NEW METHOD:&amp;nbsp;populate grid column row with partially matching picker field suggestion&lt;/li&gt;
&lt;li&gt;Other minor enhancements&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="november_2018_-_release_18.4.1"&gt;November 2018 - Release 18.4.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Documentation overhaul&lt;/li&gt;
&lt;li&gt;Improved out of the box examples&lt;/li&gt;
&lt;li&gt;Updated information about supported Appian versions&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="october&amp;nbsp;2018_-_release_18.4"&gt;October&amp;nbsp;2018 - Release 18.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;NEW METHOD: open settings menu&lt;/li&gt;
&lt;li&gt;NEW METHOD: open user profile&lt;/li&gt;
&lt;li&gt;NEW METHOD: use discoverability to navigate to&lt;/li&gt;
&lt;li&gt;NEW METHOD: close social task&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify task feed containing text is not present&lt;/li&gt;
&lt;li&gt;Added usage metrics and corresponding metrics.properties file&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fixed login with terms&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august_2018_-_release_18.3.1"&gt;August 2018 - Release 18.3.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Added new methods for hovering and clicking on profile links and circles in news posts&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Fixed NoClassDefFoundError for TempoEncryptedTextField introduced in 18.3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august&amp;nbsp;2018_-_release_18.3"&gt;August&amp;nbsp;2018 - Release 18.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;NEW METHOD: create a news post&lt;/li&gt;
&lt;li&gt;NEW METHOD: send kudos&lt;/li&gt;
&lt;li&gt;NEW METHOD: send messages&lt;/li&gt;
&lt;li&gt;NEW METHOD: send tasks&lt;/li&gt;
&lt;li&gt;NEW METHOD: sort tasks&lt;/li&gt;
&lt;li&gt;NEW METHOD: star a news feed item&lt;/li&gt;
&lt;li&gt;NEW METHOD: filter news feed&lt;/li&gt;
&lt;li&gt;NEW METHOD: navigate to link in news post&lt;/li&gt;
&lt;li&gt;NEW METHOD: generic assertion that text is present&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fixed bug with MilestoneField pre-18.2&lt;/li&gt;
&lt;li&gt;Added WebContentField to 18.1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="may&amp;nbsp;2018_-_release_18.2.1"&gt;May&amp;nbsp;2018 - Release 18.2.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Auto login to previously set URL&lt;/li&gt;
&lt;li&gt;Milestones in side by side layout&lt;/li&gt;
&lt;li&gt;Card click identified by link name index&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify video (not) present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify web content (not) present&lt;/li&gt;
&lt;li&gt;Updated test app for 18.2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;User pickers not selecting correct field value&lt;/li&gt;
&lt;li&gt;Card click not working in Firefox&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="may&amp;nbsp;2018_-_release_18.2"&gt;May&amp;nbsp;2018 - Release 18.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Added support for 18.2&lt;/li&gt;
&lt;li&gt;NEW METHOD: click on card&lt;/li&gt;
&lt;li&gt;Updated select grid method to account for the row highlight selection style&lt;/li&gt;
&lt;li&gt;Added test app for 18.2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Fixed fragility of file upload&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="march&amp;nbsp;2018_-_release_18.1.4"&gt;March&amp;nbsp;2018 - Release 18.1.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Added Support for finding grid indices&lt;/li&gt;
&lt;li&gt;Added the ability to delete documents downloaded by Fitnesse&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="february&amp;nbsp;2018_-_release_18.1.3"&gt;February&amp;nbsp;2018 - Release 18.1.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Updated mac and linux scripts shebang to /bin/sh&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="february&amp;nbsp;2018_-_release_18.1.2"&gt;February&amp;nbsp;2018 - Release 18.1.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Fixed Windows start script to run FitNesse successfully&lt;/li&gt;
&lt;li&gt;Fixed the example page and default fixture to use TempoFixture instead of SitesFixture&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="january&amp;nbsp;2018_-_release_18.1.1"&gt;January&amp;nbsp;2018 - Release 18.1.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Updated 16.3 Test Zip&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Fixed issue with navigating to /logout URL&lt;/li&gt;
&lt;li&gt;Fixed Multiselect dropdown on 16.3&lt;/li&gt;
&lt;li&gt;Fixed Record filter clearing on 16.3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="january&amp;nbsp;2018_-_release_18.1"&gt;January&amp;nbsp;2018 - Release 18.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Added support for 18.1&lt;/li&gt;
&lt;li&gt;Added test app for 17.3 and 18.1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="january&amp;nbsp;2018_-_release_17.4.1"&gt;January&amp;nbsp;2018 - Release 17.4.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Add ability to accept Tasks&lt;/li&gt;
&lt;li&gt;Add ability to populate Record Type user filter&lt;/li&gt;
&lt;li&gt;Add ability to download files&lt;/li&gt;
&lt;li&gt;Make LinkField capturable&lt;/li&gt;
&lt;li&gt;Added advanced functionality to adjust dates, including setting dates in the past&lt;/li&gt;
&lt;li&gt;If url contains &amp;quot;/suite&amp;quot;, remove anything after it to prevent navigation failure.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Updated chromedriver to version 2.33&lt;/li&gt;
&lt;li&gt;Updated startup scripts to pass FitNesseRoot properly&lt;/li&gt;
&lt;li&gt;Always logout before login in case a previous test failed and didn&amp;#39;t logout&lt;/li&gt;
&lt;li&gt;Made Firefox webdrivers executable&lt;/li&gt;
&lt;li&gt;Fix BarcodeField not working in 17.1+&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="november&amp;nbsp;2017_-_release_17.4"&gt;November&amp;nbsp;2017 - Release 17.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancement
&lt;ul&gt;
&lt;li&gt;Change FitNesse usernames&lt;/li&gt;
&lt;li&gt;Allow FitNesse tests to hit an arbitrary endpoint through an environment variable&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Mac Firefox date and dateTime field tests no longer throw an null character&lt;/li&gt;
&lt;li&gt;Dropdown tests does not read duplicate values&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="october&amp;nbsp;2017_-_release_17.3.2"&gt;October&amp;nbsp;2017 - Release 17.3.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Updated test application to run initialize on import&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Checkboxes that are too short are not checked&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="october&amp;nbsp;2017_-_release_17.3.1"&gt;October&amp;nbsp;2017 - Release 17.3.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Updated Test App to create users&lt;/li&gt;
&lt;li&gt;Documentation tweaks/ Readme tweaks&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Allowed login for internationalized pages&lt;/li&gt;
&lt;li&gt;Fixed an issue preventing searching in record list view&lt;/li&gt;
&lt;li&gt;Changed the way the start-unix script was sourced&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="september&amp;nbsp;2017_-_release_17.3"&gt;September&amp;nbsp;2017 - Release 17.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Supports Appian version 17.3&lt;/li&gt;
&lt;li&gt;Ability to configure custom login page&lt;/li&gt;
&lt;li&gt;Updated the following components to be compatible with the latest Appian Hotfix Package for 17.1 (G), and 17.2 (D):
&lt;ul&gt;
&lt;li&gt;Paging Grid&lt;/li&gt;
&lt;li&gt;Editable Grid&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Scripts now recognize new loading bar and wait for it to be done before continuing&lt;/li&gt;
&lt;li&gt;Added shell scripts and drivers for F4A on Mac and Linux&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Browser is maximized by default which ensures the &amp;quot;Sign Out&amp;quot; button is always visibleNote: Previously tests could hang waiting to logout if the browser window was within a specific size range where the &amp;quot;Sign Out&amp;quot; button got hidden&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: testing, Platform, Architecture&lt;/div&gt;
</description></item><item><title>Automated Testing with Appian Selenium API</title><link>https://community.appian.com/success/w/guide/3312/automated-testing-with-appian-selenium-api</link><pubDate>Tue, 10 Jun 2025 23:23:25 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:af6be428-e229-4a89-9844-d99ca095396c</guid><dc:creator>joel.larin</dc:creator><description>Current Revision posted to Guide by joel.larin on 6/10/2025 11:23:25 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;div class="callout-box callout-info"&gt;Please be advised that this package has moved to a new &lt;a href="https://gitlab.com/appian-oss/appian-selenium-api"&gt;open-source repository&lt;/a&gt;, as future updates on the App Market will be discontinued. We encourage all users to switch to the new repository to gain the ability to contribute, receive immediate access to bug fixes and new functionality, and improve communication with other users and maintainers via GitLab issues.&lt;/div&gt;
&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;
&lt;ul style="font-size:110%;"&gt;
&lt;li&gt;Appian 22.2 and above&lt;/li&gt;
&lt;li&gt;Java Runtime Environment 11&lt;/li&gt;
&lt;li&gt;Chrome or Firefox browsers
&lt;div class="callout-box callout-info"&gt;If using Chrome, we recommend using &lt;a href="https://developer.chrome.com/blog/chrome-for-testing/"&gt;Chrome For Testing&lt;/a&gt; for a more consistent testing experience.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;An IDE, such as IntelliJ IDEA or Eclipse&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="setup"&gt;Setup&lt;/h2&gt;
&lt;p&gt;The &lt;a href="/b/appmarket/posts/appian_2d00_selenium_2d00_api"&gt;Appian Selenium API&lt;/a&gt; plug-in is a Java library which allows you to write automated tests for your Appian UIs. It contains methods which allow you to interact with Appian components in a browser. It provides methods and fixtures to interact with Appian applications in its various environments, e.g. Tempo or Sites. When writing tests, be sure to use methods from the correct fixture for the environment under test, e.g. use SitesFixture where possible to test Sites. Methods defined in fixtures that are intended for different environments are not guaranteed to work in future versions of the plugin.&lt;/p&gt;
&lt;p&gt;It can be used in a Java application or integrated directly into any Selenium or Java-based testing tool.&lt;/p&gt;
&lt;p&gt;Appian Selenium API contains the underlying Selenium methods used by &lt;a href="/b/appmarket/posts/cucumber-for-appian"&gt;Cucumber for Appian&lt;/a&gt; and &lt;a href="/b/appmarket/posts/fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;, but offers you more flexibility by allowing you to define your own automated test cases. You can create your own Cucumber Step Definitions, your own testNG test, or the Java Framework of your choosing. You are no longer tied to Cucumber for Appian or FitNesse for Appian yet you get the same ease and simplicity of those respective frameworks.&lt;/p&gt;
&lt;ol style="font-size:110%;"&gt;
&lt;li&gt;Open this project in an IDE, such as IntelliJ IDEA or Eclipse.&lt;/li&gt;
&lt;li&gt;Update configurations:
&lt;ol&gt;
&lt;li&gt;&amp;nbsp;Open file &lt;strong&gt;configs/custom.properties&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;Update &lt;strong&gt;automated.testing.hom&lt;/strong&gt;e with the path to this installation. Examples:
&lt;ol&gt;
&lt;li&gt;Windows: &lt;strong&gt;automated.testing.home=C:\\testFolder\\appian-selenium-api-example-java&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Mac: &lt;strong&gt;automated.testing.home=/Users/tester/Desktop/appian-selenium-api-example-java&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Update &lt;strong&gt;chrome.driver.home&lt;/strong&gt; with the path to the Chrome driver that comes with this installation. Examples: * Windows: &lt;strong&gt;automated.testing.home=C:\\testFolder\\appian-selenium-api-example-java\\lib\\drivers\\chromedriver.exe&lt;/strong&gt; * Mac: &lt;strong&gt;automated.testing.home=/Users/tester/Desktop/appian-selenium-api-example-java/lib/drivers/chromedriver-mac&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Open file&lt;strong&gt; configs/users.properties&lt;/strong&gt;, for each username used in a test add a line in the format of &lt;strong&gt;&amp;lt;username&amp;gt;=&amp;lt;password&amp;gt;&lt;/strong&gt; to this file.
&lt;ol&gt;
&lt;li&gt;If you prefer not to disclose your password in plain text, you can also choose to use &lt;strong&gt;com.appiancorp.ps.automatedtest.fixture.BaseFixture.loginIntoWithUsernameAndPassword&lt;/strong&gt; fixture method to login by passing in the password from a system property value.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Open &amp;quot;src/main/java/com/appiancorp/example/HelloAppian.java&amp;quot;:
&lt;ol&gt;
&lt;li&gt;Update &lt;strong&gt;TEST_SITE_URL&lt;/strong&gt; to your Appian URL, such as &lt;strong&gt;protected static String TEST_SITE_URL = &amp;quot;https://example.appiancloud.com/suite&amp;quot;;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Update &lt;strong&gt;TEST_USERNAME&lt;/strong&gt; with a username, such as &lt;strong&gt;protected static String TEST_USERNAME = &amp;quot;tester.tester&amp;quot;;&lt;/strong&gt; * Make sure this user exists in &lt;strong&gt;configs/users.properties&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Run the &lt;strong&gt;main()&lt;/strong&gt; method of this class:
&lt;ol&gt;
&lt;li&gt;&amp;nbsp;You should see that a Chrome browser will open up, and the fixture commands in &lt;strong&gt;HelloAppian.java&lt;/strong&gt; will execute accordingly.&lt;/li&gt;
&lt;li&gt;Note that this test will fail since your site might not have an action &amp;quot;Create a Case&amp;quot; under menu &amp;quot;Actions&amp;quot; that opens up an interface that has a &amp;quot;Submit&amp;quot; button.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="features"&gt;Features&lt;/h2&gt;
&lt;p&gt;Multiple browser support&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chrome&lt;/li&gt;
&lt;li&gt;Firefox&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="benefits"&gt;Benefits&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Define your own integration tests without being limited by a third-party testing tool&lt;/li&gt;
&lt;li&gt;Selenium-based test scripts can be created for reusability throughout test suites&lt;/li&gt;
&lt;li&gt;Methods created specifically to operate within Appian applications and Tempo&lt;/li&gt;
&lt;li&gt;Test scripts do not need to be updated when upgrading between supported Appian versions&lt;/li&gt;
&lt;li&gt;Test scripts are easily updated for new UI changes to a form or interface&lt;/li&gt;
&lt;li&gt;Appian design knowledge is not required to create test scripts&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="release_notes"&gt;Release Notes&lt;/h2&gt;
&lt;h3 id="25.1"&gt;March 2025 - Release 25.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Added support for defining and using custom locales. Use create appian locale | PATH TO File. This method must be called after setting the version.&lt;br /&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;File must be JSON file with the format&lt;/strong&gt;:&amp;nbsp;{ &amp;quot;dateFormats&amp;quot;: [ { "label": "dateFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "dateDisplayFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "timeFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "timeDisplayFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "datetimeFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "datetimeDisplayFormat","value": &amp;lt;FORMAT_STRING&amp;gt; } ], &amp;quot;labels&amp;quot;: [ { "label": "acceptButton", "value": "Accept" } ], &amp;quot;locale&amp;quot;: &amp;lt;LOCALE_CODE&amp;gt; }&lt;!-- notionvc: a0caf744-193a-430a-a07c-8fec6fed1e37 --&gt;&lt;!-- notionvc: bac86f8d-84e2-4689-b153-1bb90e3d5c2e --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Fixed clickOnRecordRelatedAction to function correctly when the Record Summary page contains more than three action items.&lt;!-- notionvc: dd49e574-46f8-4e3a-8588-5e6b22f5c63a --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="24.3"&gt;August 2024 - Release 24.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Added built-in retry to click operation in case of element not interactable exception.&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Updated the milestone locator.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="24.2"&gt;June 2024 - Release 24.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Updated locator for site menu links&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Created method which supports clicking on text within an interface. This is particularly useful for nested cards such as tab layouts, but can also be used as a fallback when existing methods don&amp;#39;t work. This method is available for all Appian versions.&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Click operation on Card layout will be performed on the left side of the element instead of the right. We&amp;#39;re not expecting any impact on existing test cases.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;March 2024 - Release 24.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Support for Appian version 24.1&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Adds support for collapsing/opening sidebars&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;ClickOnCard updated to support clicking on cards with complex content. For example, the method can now click on cards that have a component nested in multiple layouts within the card&lt;!--mce:protected %3C%21--mce%3Aprotected%20%253C%2521--mce%253Aprotected%2520%25253C%252521--%252520notionvc%25253A%252520c9bfab53-e4e1-4301-9c43-08f4d6f59a50%252520--%25253E--%253E--%3E--&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;November&amp;nbsp;2023 - Release 23.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: &lt;span style="font-weight:400;"&gt;Project has been updated to require Java 11 JRE&lt;/span&gt;&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Support for Appian version 23.4&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for the side navigation menu in sites&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for downloading charts&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for buttons configured with custom colors&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Honor the download directory given in custom.properties for Remote Drivers&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Update dropdowns for versions greater than 23.3 to ignore the aria-checked value&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Fixed Populate Record Type Data Range User Filter method&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;August 2023 - Release 23.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: &lt;span style="font-weight:400;"&gt;Project has been updated to require Java 11 JRE&lt;/span&gt;&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Supports Appian version 23.3&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Added functionality to interact with new site group headers&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Updated to Selenium 4.11.0&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Update checkboxes to support CARD style for 23.3 and later Appian versions&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;June&amp;nbsp;2023 - Release 23.2.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: Updates to site navigation in the 23.2 product breaks the use of the clickOnMenu method defined in TempoFixtures for site environments. clickOnMenu, and other navigation methods defined in TempoFixtures, are guaranteed&amp;nbsp;to work only in Tempo environments. Use the clickOnSitePage method defined in SitesFixtures instead&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Update pickers to recognize selections with links (e.g. Record Pickers)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2"&gt;June&amp;nbsp;2023 - Release 23.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Supports Appian version 23.2
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: Updates to site navigation in the 23.2 product breaks the use of the clickOnMenu method defined in TempoFixtures for site environments. clickOnMenu, and other navigation methods defined in TempoFixtures, are guaranteed&amp;nbsp;to work only in Tempo environments. Use the clickOnSitePage method defined in SitesFixtures instead&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="may_2023_-_release_23.1.2"&gt;May 2023 - Release 23.1.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fixes an issue where Dropdowns with Search were not working&lt;/li&gt;
&lt;li&gt;Fixes an Issue where verifyText did not work on multi-node components&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="february_2023_-_release_23.1"&gt;February 2023 - Release 23.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Supports Appian version 23.1&lt;/li&gt;
&lt;li&gt;Updated locator for Dropdown class&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Update CVEs&lt;/li&gt;
&lt;li&gt;Update scripts (start.bat, start-mac.sh, start-unix.sh, runFitNesseTest.sh) to reference the new fitnesse-20221219-standalone.jar&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august&amp;nbsp;2022_-_release_22.3"&gt;August&amp;nbsp;2022 - Release 22.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Appian Selenium API is released and supported&lt;/li&gt;
&lt;li&gt;Removed support for 20.3&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="november&amp;nbsp;2021_-_release_21.4"&gt;November&amp;nbsp;2021 - Release 21.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Support new card choice components&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Update CVEs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august&amp;nbsp;2021_-_release_21.3"&gt;August&amp;nbsp;2021 - Release 21.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for radio button card&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for date picker&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june_2021_-_release_21.2"&gt;June 2021 - Release 21.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Support new SectionLayout&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Upgrade Selenium Server to 3.141.59&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for radio button card&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for icon link alt text&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="march&amp;nbsp;2021_-_release_21.1"&gt;March&amp;nbsp;2021 - Release 21.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Appian Selenium API is released and supported&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: testing, Architecture&lt;/div&gt;
</description></item><item><title>Automated Testing With Cucumber For Appian</title><link>https://community.appian.com/success/w/guide/3311/automated-testing-with-cucumber-for-appian/revision/20</link><pubDate>Tue, 10 Jun 2025 23:22:12 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:46bc0e4d-d906-4f38-a453-edf5b739bc6f</guid><dc:creator>joel.larin</dc:creator><description>Revision 20 posted to Guide by joel.larin on 6/10/2025 11:22:12 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;div class="callout-box callout-info"&gt;Please be advised that this package has moved to a new &lt;a href="https://gitlab.com/appian-oss/appian-selenium-api"&gt;open-source repository&lt;/a&gt;, as future updates on the App Market will be discontinued. We encourage all users to switch to the new repository to gain the ability to contribute, receive immediate access to bug fixes and new functionality, and improve communication with other users and maintainers via GitLab issues.&lt;/div&gt;
&lt;p&gt;Cucumber For Appian is a client-side tool that builds on top of what &lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;FitNesse For Appian&lt;/a&gt; has implemented and allows users to write automated UI tests against Appian with &lt;a href="https://docs.cucumber.io/gherkin/"&gt;Gherkin syntax&lt;/a&gt;. Cucumber For Appian will support all of the same fixture methods that FitNesse For Appian currently supports.&lt;/p&gt;
&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;
&lt;ul style="font-size:110%;"&gt;
&lt;li&gt;Appian 22.2 and above&lt;/li&gt;
&lt;li&gt;Java Runtime Environment 11&lt;/li&gt;
&lt;li&gt;Chrome or Firefox browsers
&lt;div class="callout-box callout-info"&gt;If using Chrome, we recommend using &lt;a href="https://developer.chrome.com/blog/chrome-for-testing/"&gt;Chrome For Testing&lt;/a&gt; for a more consistent testing experience.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Access to Terminal if you&amp;rsquo;re on Mac/Linux or Command Prompt if on Windows&lt;/li&gt;
&lt;li&gt;Apache Maven tool&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;The zip file for the tool can be downloaded from the AppMarket.&lt;/p&gt;
&lt;ul style="font-size:110%;"&gt;
&lt;li&gt;Unzip the contents into any directory (e.g. C:/)&lt;/li&gt;
&lt;li&gt;In a terminal window, navigate to the &amp;lsquo;CucumberForAppian-x&amp;rsquo; (where x corresponds to the version number) folder extracted from the zip file (e.g. C:\CucumberForAppian-19.1-SNAPSHOT)
&lt;ul&gt;
&lt;li&gt;We will refer to this directory as CUCUMBER_ROOT from now on&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="running_cucumber_tests"&gt;Running Cucumber Tests&lt;/h2&gt;
&lt;ul style="font-size:110%;"&gt;
&lt;li&gt;Navigate to src/test/resources from CUCUMBER_ROOT&lt;/li&gt;
&lt;li&gt;Edit either the ApplicationExample.feature or TempoNavigationExample.feature file
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;BROWSER&amp;rdquo; - Chrome or Firefox&lt;/li&gt;
&lt;li&gt;&amp;ldquo;APPIAN_URL&amp;rdquo; - e.g. https://site-name.appiancloud.com&lt;/li&gt;
&lt;li&gt;&amp;ldquo;APPIAN_VERSION&amp;rdquo; - e.g. 18.4&lt;/li&gt;
&lt;li&gt;&amp;ldquo;APPIAN_LOCALE&amp;rdquo; - en_US or en_GB&lt;/li&gt;
&lt;li&gt;&amp;ldquo;APPIAN_USERNAME&amp;rdquo; - e.g. fitnesse.user&lt;/li&gt;
&lt;li&gt;The comments on the top of the .feature files will also help you in setting up&lt;/li&gt;
&lt;li&gt;The completed feature file should look like the one shown below:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/900x750/__key/communityserver-wikis-components-files/00-00-00-00-46/8713.Playbook_5F00_feature_5F00_file.png" /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;In CUCUMBER_ROOT, run ./setupCustomPropertiesForMac if using a mac or ./setupCustomPropertiesForLinux if using UNIX. If using Windows:
&lt;ul&gt;
&lt;li&gt;Open the &amp;ldquo;custom.properties&amp;rdquo; file located in CUCUMBER_ROOT/src/main/resources/configs and modify:
&lt;ul&gt;
&lt;li&gt;automated.testing.home to be CUCUMBER_ROOT (e.g. C:\CucumberForAppian-19.1-SNAPSHOT)&lt;/li&gt;
&lt;li&gt;download.directory to be CUCUMBER_ROOT/target (e.g. C:\CucumberForAppian-19.1-SNAPSHOT\target)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Run mvn clean test in CUCUMBER_ROOT&lt;/li&gt;
&lt;li&gt;The output in the terminal should be similar to what&amp;rsquo;s displayed below&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/900x800/__key/communityserver-wikis-components-files/00-00-00-00-46/2766.Playbook_5F00_cucumber_5F00_run.png" /&gt;&lt;/div&gt;
&lt;p&gt;*NOTE* By default, only the TempoNavigationExample.feature test file will run when you execute the command above due to the &amp;ldquo;tags&amp;rdquo; argument in RunCucumberForAppianTest.java&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/600x800/__key/communityserver-wikis-components-files/00-00-00-00-46/8814.Playbook_5F00_cucumber_5F00_java.png" /&gt;&lt;/div&gt;
&lt;p&gt;At the top of the TempoNavigationExample.feature file, there is a tag &amp;ldquo;@Tempo&amp;rdquo; which corresponds to that in the .java file. To selectively run the tests, you can add or remove tags as you wish. You can completely remove the tags parameter if you&amp;rsquo;d like to run all of the tests together.&lt;/p&gt;
&lt;p&gt;By default, the tool collects usage metrics for analytics purposes.&lt;/p&gt;
&lt;h2&gt;Developing Custom Cucumber tests&lt;/h2&gt;
&lt;p&gt;The Cucumber sample tests from above will be a good model to follow when developing your own tests.&lt;/p&gt;
&lt;p&gt;To help you out, we have provided a CucumberForAppian Cheatsheet. You can find it individually in the combined files ZIP you downloaded from the App Market.&amp;nbsp;When developing tests, be sure you are using methods for the environment you are testing. For example, if testing sites, use navigation methods that come from the &amp;quot;Sites Methods&amp;quot; scenario. Using methods from a different environment has the potential to break in future releases.&lt;/p&gt;
&lt;p&gt;The CheatSheet.feature file lists out all the methods we support and how to invoke them using the @Given, @When, @Then, @But, @And.... and other Cucumber supported annotation&lt;/p&gt;
&lt;h2&gt;Features&lt;/h2&gt;
&lt;p&gt;Multiple browser support&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chrome (v64-66)&lt;/li&gt;
&lt;li&gt;Firefox (v53-v62)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="benefits"&gt;Benefits&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Test your Appian application within minutes of downloading the tool&lt;/li&gt;
&lt;li&gt;Methods created specifically to operate within Appian applications and Tempo&lt;/li&gt;
&lt;li&gt;Test scripts do not need to be updated for upgrades to supported Appian versions&lt;/li&gt;
&lt;li&gt;Appian design knowledge is not required to create test scripts&lt;/li&gt;
&lt;li&gt;Common test case scenarios can be created for reusability throughout test suites&lt;/li&gt;
&lt;li&gt;Test scripts are easily updated for new UI changes to a form or interface&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="release_notes"&gt;Release Notes&lt;/h2&gt;
&lt;h3 id="25.1"&gt;March 2025 - Release 25.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Added support for defining and using custom locales. Use create appian locale | PATH TO File. This method must be called after setting the version.&lt;br /&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;File must be JSON file with the format&lt;/strong&gt;:&amp;nbsp;{ &amp;quot;dateFormats&amp;quot;: [ { "label": "dateFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "dateDisplayFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "timeFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "timeDisplayFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "datetimeFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "datetimeDisplayFormat","value": &amp;lt;FORMAT_STRING&amp;gt; } ], &amp;quot;labels&amp;quot;: [ { "label": "acceptButton", "value": "Accept" } ], &amp;quot;locale&amp;quot;: &amp;lt;LOCALE_CODE&amp;gt; }&lt;!-- notionvc: a0caf744-193a-430a-a07c-8fec6fed1e37 --&gt;&lt;!-- notionvc: bac86f8d-84e2-4689-b153-1bb90e3d5c2e --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Fixed clickOnRecordRelatedAction to function correctly when the Record Summary page contains more than three action items.&lt;!-- notionvc: dd49e574-46f8-4e3a-8588-5e6b22f5c63a --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="24.3"&gt;August 2024 - Release 24.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Added built-in retry to click operation in case of element not interactable exception.&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Updated the milestone locator.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="24.2"&gt;June 2024 - Release 24.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Updated locator for site menu links&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Created method which supports clicking on text within an interface. This is particularly useful for nested cards such as tab layouts, but can also be used as a fallback when existing methods don&amp;#39;t work. This method is available for all Appian versions.&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Click operation on Card layout will be performed on the left side of the element instead of the right. We&amp;#39;re not expecting any impact on existing test cases.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;March 2024 - Release 24.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Support for Appian version 24.1&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Adds support for collapsing/opening sidebars&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;ClickOnCard updated to support clicking on cards with complex content. For example, the method can now click on cards that have a component nested in multiple layouts within the card&lt;!-- notionvc: c9bfab53-e4e1-4301-9c43-08f4d6f59a50 --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;November&amp;nbsp;2023 - Release 23.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: &lt;span style="font-weight:400;"&gt;Project has been updated to require Java 11 JRE&lt;/span&gt;&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Support for Appian version 23.4&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for the side navigation menu in sites&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for downloading charts&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for buttons configured with custom colors&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Honor the download directory given in custom.properties for Remote Drivers&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Update dropdowns for versions greater than 23.3 to ignore the aria-checked value&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Fixed Populate Record Type Data Range User Filter method&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;August&amp;nbsp;2023 - Release 23.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Supports Appian version 23.3&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Added functionality to interact with new site group headers&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Updated to Selenium 4.11.0&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for Date Range user filters in Record Types&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Update checkboxes to support CARD style for 23.3 and later Appian versions&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;June&amp;nbsp;2023 - Release 23.2.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: Updates to site navigation in the 23.2 product breaks the use of the &amp;quot;click on menu&amp;quot; method in site environments. &amp;quot;click on menu&amp;quot;, and other Tempo navigation methods, are guaranteed&amp;nbsp;to work only in Tempo environments. Use the &amp;quot;click on site page&amp;quot; method instead&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Update pickers to recognize selections with links (e.g. Record Pickers)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2"&gt;June&amp;nbsp;2023 - Release 23.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Supports Appian version 23.2
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: Updates to site navigation in the 23.2 product breaks the use of the &amp;quot;click on menu&amp;quot; method in site environments. &amp;quot;click on menu&amp;quot;, and other Tempo navigation methods, are guaranteed&amp;nbsp;to work only in Tempo environments. Use the &amp;quot;click on site page&amp;quot; method instead&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="may_2023_-_release_23.1.2"&gt;May 2023 - Release 23.1.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fixes an issue where Dropdowns with Search were not working&lt;/li&gt;
&lt;li&gt;Fixes an Issue where verifyText did not work on multi-node components&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="february_2023_-_release_23.1"&gt;February 2023 - Release 23.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Supports Appian version 23.1&lt;/li&gt;
&lt;li&gt;Updated locator for Dropdown class&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Update CVEs&lt;/li&gt;
&lt;li&gt;Update scripts (start.bat, start-mac.sh, start-unix.sh, runFitNesseTest.sh) toreference the new fitnesse-20221219-standalone.jar&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august&amp;nbsp;2022_-_release_22.3"&gt;August&amp;nbsp;2022 - Release 22.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cucumber for Appian is released and supported&lt;/li&gt;
&lt;li&gt;Removed support for 20.3&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="november&amp;nbsp;2021_-_release_21.4"&gt;November&amp;nbsp;2021 - Release 21.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Support new card choice components&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Update CVEs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august&amp;nbsp;2021_-_release_21.3"&gt;August&amp;nbsp;2021 - Release 21.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for radio button card&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for date picker&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june_2021_-_release_21.2"&gt;June 2021 - Release 21.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Support new SectionLayout&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Upgrade Selenium Server to 3.141.59&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for radio button card&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for icon link alt text&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="february&amp;nbsp;2021_-_release_21.1"&gt;February&amp;nbsp;2021 - Release 21.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Supports Appian version 21.1&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="november&amp;nbsp;2020_-_release_20.4"&gt;November&amp;nbsp;2020 - Release 20.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Support Chrome capabilities&lt;/li&gt;
&lt;li&gt;Update Cucumber to 6.8.2&lt;/li&gt;
&lt;li&gt;NEW METHOD: Support Stamp Field&lt;/li&gt;
&lt;li&gt;NEW METHOD: Support Tag field&lt;/li&gt;
&lt;li&gt;NEW METHOD:&amp;nbsp;Support signature field&lt;/li&gt;
&lt;li&gt;NEW METHOD: Support record action field&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fix grid row count bug when there is no paging&lt;/li&gt;
&lt;li&gt;Fix getGridColumnRowValue when the grid cell is a button&lt;/li&gt;
&lt;li&gt;Fix clear picker bug when there are multiple selections&lt;/li&gt;
&lt;li&gt;Fix capturing an empty rich text field&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="september&amp;nbsp;2020_-_release_20.3"&gt;September&amp;nbsp;2020 - Release 20.3&lt;/h3&gt;
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Enhancements
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;NEW METHOD: Populates the search box in a dropdown with some text&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;Bug fixes
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Fixed a bug for custom login submit button&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august&amp;nbsp;2020_-_release_20.2.1"&gt;August&amp;nbsp;2020 - Release 20.2.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fixed a bug regarding clicking on card layouts&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="july&amp;nbsp;2020_-_release_20.4"&gt;July&amp;nbsp;2020 - Release 20.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fix bug with milestone click&lt;/li&gt;
&lt;li&gt;Fix toggle box visibility on related action pop up&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="april&amp;nbsp;2020_-_release_20.1"&gt;April&amp;nbsp;2020 - Release 20.1&lt;/h3&gt;
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Enhancements
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;NEW METHOD:&amp;nbsp;click on bar chart *&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: click on menu widget&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: click on button with tooltip&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: verify confirmation dialog header&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: verify confirmation dialog message&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: Verify a field is not blank&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: click on document image link&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: clear search field in record&lt;/li&gt;
&lt;li class="li1"&gt;Include all jars in Cucumber&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;Bug fixes
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Remove pie chart hover for fragility and also make it the page scroll before hovering for firefox&lt;/li&gt;
&lt;li class="li1"&gt;Clicking on standalone icons by making the xpath less specific&lt;/li&gt;
&lt;li class="li1"&gt;&lt;strong&gt;Fix closing social task bug&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="january&amp;nbsp;2020_-_release_19.4.1"&gt;January&amp;nbsp;2020 - Release 19.4.1&lt;/h3&gt;
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Enhancements
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;NEW METHOD: star and unstar action with action name&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: click on icon link with alt text&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;Bug fixes
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Fixed issues for dropdowns with many options&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="november&amp;nbsp;2019_-_release_19.4"&gt;November&amp;nbsp;2019 - Release 19.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;NEW METHOD: verify button with label is enabled&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify button with label is disabled&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify link containing text is not present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a box with given label is present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a box with given label is not present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a section with given label is present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a section with given label is not present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a card with given accessibility text is present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a card with given accessibility text is not present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify if text is not present anywhere in the user interface&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Fixed populate first column in a grid when rowheader is set to 1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="september&amp;nbsp;2019_-_release_19.3.1"&gt;September&amp;nbsp;2019 - Release 19.3.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Enhancements
&lt;ul&gt;
&lt;li&gt;Added additional logging for site page navigation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Bug fixes
&lt;ul&gt;
&lt;li&gt;Fixed verify text present for text with apostrophe&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2019_-_release_19.2"&gt;June&amp;nbsp;2019 - Release 19.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Bug fixes
&lt;ul&gt;
&lt;li&gt;Support sending news post without participants&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="may&amp;nbsp;2019_-_release_19.1.3"&gt;May&amp;nbsp;2019 - Release 19.1.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Bug fixes
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Fixed the bug that users can not click on menu tabs on Appian 19.1&lt;/li&gt;
&lt;li&gt;Fixed the bug on Read Only field &amp;quot;contains&amp;quot;&lt;/li&gt;
&lt;li&gt;Fixed the bug on sending news post on Appian 19.1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="april_2019_-_release_19.1.2"&gt;April 2019 - Release 19.1.2&lt;/h3&gt;
&lt;p&gt;Enhancements&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support Wait For Progress&lt;/li&gt;
&lt;li&gt;Support Click on X and Y coordinates on monitor&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bug fixes&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed the bug that box layout toggle only acts on the first box&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="march_2019_-_release_19.1.1"&gt;March 2019 - Release 19.1.1&lt;/h3&gt;
&lt;p&gt;Bug fixes&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed error popup caused by loading Automation Extension&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="february&amp;nbsp;2019_-_release_19.1"&gt;February&amp;nbsp;2019 - Release 19.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cucumber For Appian available&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: testing, Architecture&lt;/div&gt;
</description></item><item><title>Automated Testing With Cucumber For Appian</title><link>https://community.appian.com/success/w/guide/3311/automated-testing-with-cucumber-for-appian/revision/19</link><pubDate>Wed, 05 Mar 2025 20:53:19 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:46bc0e4d-d906-4f38-a453-edf5b739bc6f</guid><dc:creator>Appian Max Team</dc:creator><description>Revision 19 posted to Guide by Appian Max Team on 3/5/2025 8:53:19 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;p&gt;Cucumber For Appian is a client-side tool that builds on top of what &lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;FitNesse For Appian&lt;/a&gt; has implemented and allows users to write automated UI tests against Appian with &lt;a href="https://docs.cucumber.io/gherkin/"&gt;Gherkin syntax&lt;/a&gt;. Cucumber For Appian will support all of the same fixture methods that FitNesse For Appian currently supports.&lt;/p&gt;
&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;
&lt;ul style="font-size:110%;"&gt;
&lt;li&gt;Appian 22.2 and above&lt;/li&gt;
&lt;li&gt;Java Runtime Environment 11&lt;/li&gt;
&lt;li&gt;Chrome or Firefox browsers
&lt;div class="callout-box callout-info"&gt;If using Chrome, we recommend using &lt;a href="https://developer.chrome.com/blog/chrome-for-testing/"&gt;Chrome For Testing&lt;/a&gt; for a more consistent testing experience.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Access to Terminal if you&amp;rsquo;re on Mac/Linux or Command Prompt if on Windows&lt;/li&gt;
&lt;li&gt;Apache Maven tool&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;The zip file for the tool can be downloaded from the AppMarket.&lt;/p&gt;
&lt;ul style="font-size:110%;"&gt;
&lt;li&gt;Unzip the contents into any directory (e.g. C:/)&lt;/li&gt;
&lt;li&gt;In a terminal window, navigate to the &amp;lsquo;CucumberForAppian-x&amp;rsquo; (where x corresponds to the version number) folder extracted from the zip file (e.g. C:\CucumberForAppian-19.1-SNAPSHOT)
&lt;ul&gt;
&lt;li&gt;We will refer to this directory as CUCUMBER_ROOT from now on&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="running_cucumber_tests"&gt;Running Cucumber Tests&lt;/h2&gt;
&lt;ul style="font-size:110%;"&gt;
&lt;li&gt;Navigate to src/test/resources from CUCUMBER_ROOT&lt;/li&gt;
&lt;li&gt;Edit either the ApplicationExample.feature or TempoNavigationExample.feature file
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;BROWSER&amp;rdquo; - Chrome or Firefox&lt;/li&gt;
&lt;li&gt;&amp;ldquo;APPIAN_URL&amp;rdquo; - e.g. https://site-name.appiancloud.com&lt;/li&gt;
&lt;li&gt;&amp;ldquo;APPIAN_VERSION&amp;rdquo; - e.g. 18.4&lt;/li&gt;
&lt;li&gt;&amp;ldquo;APPIAN_LOCALE&amp;rdquo; - en_US or en_GB&lt;/li&gt;
&lt;li&gt;&amp;ldquo;APPIAN_USERNAME&amp;rdquo; - e.g. fitnesse.user&lt;/li&gt;
&lt;li&gt;The comments on the top of the .feature files will also help you in setting up&lt;/li&gt;
&lt;li&gt;The completed feature file should look like the one shown below:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/900x750/__key/communityserver-wikis-components-files/00-00-00-00-46/8713.Playbook_5F00_feature_5F00_file.png" /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;In CUCUMBER_ROOT, run ./setupCustomPropertiesForMac if using a mac or ./setupCustomPropertiesForLinux if using UNIX. If using Windows:
&lt;ul&gt;
&lt;li&gt;Open the &amp;ldquo;custom.properties&amp;rdquo; file located in CUCUMBER_ROOT/src/main/resources/configs and modify:
&lt;ul&gt;
&lt;li&gt;automated.testing.home to be CUCUMBER_ROOT (e.g. C:\CucumberForAppian-19.1-SNAPSHOT)&lt;/li&gt;
&lt;li&gt;download.directory to be CUCUMBER_ROOT/target (e.g. C:\CucumberForAppian-19.1-SNAPSHOT\target)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Run mvn clean test in CUCUMBER_ROOT&lt;/li&gt;
&lt;li&gt;The output in the terminal should be similar to what&amp;rsquo;s displayed below&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/900x800/__key/communityserver-wikis-components-files/00-00-00-00-46/2766.Playbook_5F00_cucumber_5F00_run.png" /&gt;&lt;/div&gt;
&lt;p&gt;*NOTE* By default, only the TempoNavigationExample.feature test file will run when you execute the command above due to the &amp;ldquo;tags&amp;rdquo; argument in RunCucumberForAppianTest.java&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/600x800/__key/communityserver-wikis-components-files/00-00-00-00-46/8814.Playbook_5F00_cucumber_5F00_java.png" /&gt;&lt;/div&gt;
&lt;p&gt;At the top of the TempoNavigationExample.feature file, there is a tag &amp;ldquo;@Tempo&amp;rdquo; which corresponds to that in the .java file. To selectively run the tests, you can add or remove tags as you wish. You can completely remove the tags parameter if you&amp;rsquo;d like to run all of the tests together.&lt;/p&gt;
&lt;p&gt;By default, the tool collects usage metrics for analytics purposes.&lt;/p&gt;
&lt;h2&gt;Developing Custom Cucumber tests&lt;/h2&gt;
&lt;p&gt;The Cucumber sample tests from above will be a good model to follow when developing your own tests.&lt;/p&gt;
&lt;p&gt;To help you out, we have provided a CucumberForAppian Cheatsheet. You can find it individually in the combined files ZIP you downloaded from the App Market.&amp;nbsp;When developing tests, be sure you are using methods for the environment you are testing. For example, if testing sites, use navigation methods that come from the &amp;quot;Sites Methods&amp;quot; scenario. Using methods from a different environment has the potential to break in future releases.&lt;/p&gt;
&lt;p&gt;The CheatSheet.feature file lists out all the methods we support and how to invoke them using the @Given, @When, @Then, @But, @And.... and other Cucumber supported annotation&lt;/p&gt;
&lt;h2&gt;Features&lt;/h2&gt;
&lt;p&gt;Multiple browser support&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chrome (v64-66)&lt;/li&gt;
&lt;li&gt;Firefox (v53-v62)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="benefits"&gt;Benefits&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Test your Appian application within minutes of downloading the tool&lt;/li&gt;
&lt;li&gt;Methods created specifically to operate within Appian applications and Tempo&lt;/li&gt;
&lt;li&gt;Test scripts do not need to be updated for upgrades to supported Appian versions&lt;/li&gt;
&lt;li&gt;Appian design knowledge is not required to create test scripts&lt;/li&gt;
&lt;li&gt;Common test case scenarios can be created for reusability throughout test suites&lt;/li&gt;
&lt;li&gt;Test scripts are easily updated for new UI changes to a form or interface&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="release_notes"&gt;Release Notes&lt;/h2&gt;
&lt;h3 id="25.1"&gt;March 2025 - Release 25.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Added support for defining and using custom locales. Use create appian locale | PATH TO File. This method must be called after setting the version.&lt;br /&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;File must be JSON file with the format&lt;/strong&gt;:&amp;nbsp;{ &amp;quot;dateFormats&amp;quot;: [ { "label": "dateFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "dateDisplayFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "timeFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "timeDisplayFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "datetimeFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "datetimeDisplayFormat","value": &amp;lt;FORMAT_STRING&amp;gt; } ], &amp;quot;labels&amp;quot;: [ { "label": "acceptButton", "value": "Accept" } ], &amp;quot;locale&amp;quot;: &amp;lt;LOCALE_CODE&amp;gt; }&lt;!-- notionvc: a0caf744-193a-430a-a07c-8fec6fed1e37 --&gt;&lt;!-- notionvc: bac86f8d-84e2-4689-b153-1bb90e3d5c2e --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Fixed clickOnRecordRelatedAction to function correctly when the Record Summary page contains more than three action items.&lt;!-- notionvc: dd49e574-46f8-4e3a-8588-5e6b22f5c63a --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="24.3"&gt;August 2024 - Release 24.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Added built-in retry to click operation in case of element not interactable exception.&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Updated the milestone locator.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="24.2"&gt;June 2024 - Release 24.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Updated locator for site menu links&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Created method which supports clicking on text within an interface. This is particularly useful for nested cards such as tab layouts, but can also be used as a fallback when existing methods don&amp;#39;t work. This method is available for all Appian versions.&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Click operation on Card layout will be performed on the left side of the element instead of the right. We&amp;#39;re not expecting any impact on existing test cases.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;March 2024 - Release 24.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Support for Appian version 24.1&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Adds support for collapsing/opening sidebars&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;ClickOnCard updated to support clicking on cards with complex content. For example, the method can now click on cards that have a component nested in multiple layouts within the card&lt;!-- notionvc: c9bfab53-e4e1-4301-9c43-08f4d6f59a50 --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;November&amp;nbsp;2023 - Release 23.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: &lt;span style="font-weight:400;"&gt;Project has been updated to require Java 11 JRE&lt;/span&gt;&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Support for Appian version 23.4&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for the side navigation menu in sites&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for downloading charts&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for buttons configured with custom colors&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Honor the download directory given in custom.properties for Remote Drivers&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Update dropdowns for versions greater than 23.3 to ignore the aria-checked value&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Fixed Populate Record Type Data Range User Filter method&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;August&amp;nbsp;2023 - Release 23.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Supports Appian version 23.3&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Added functionality to interact with new site group headers&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Updated to Selenium 4.11.0&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for Date Range user filters in Record Types&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Update checkboxes to support CARD style for 23.3 and later Appian versions&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;June&amp;nbsp;2023 - Release 23.2.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: Updates to site navigation in the 23.2 product breaks the use of the &amp;quot;click on menu&amp;quot; method in site environments. &amp;quot;click on menu&amp;quot;, and other Tempo navigation methods, are guaranteed&amp;nbsp;to work only in Tempo environments. Use the &amp;quot;click on site page&amp;quot; method instead&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Update pickers to recognize selections with links (e.g. Record Pickers)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2"&gt;June&amp;nbsp;2023 - Release 23.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Supports Appian version 23.2
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: Updates to site navigation in the 23.2 product breaks the use of the &amp;quot;click on menu&amp;quot; method in site environments. &amp;quot;click on menu&amp;quot;, and other Tempo navigation methods, are guaranteed&amp;nbsp;to work only in Tempo environments. Use the &amp;quot;click on site page&amp;quot; method instead&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="may_2023_-_release_23.1.2"&gt;May 2023 - Release 23.1.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fixes an issue where Dropdowns with Search were not working&lt;/li&gt;
&lt;li&gt;Fixes an Issue where verifyText did not work on multi-node components&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="february_2023_-_release_23.1"&gt;February 2023 - Release 23.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Supports Appian version 23.1&lt;/li&gt;
&lt;li&gt;Updated locator for Dropdown class&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Update CVEs&lt;/li&gt;
&lt;li&gt;Update scripts (start.bat, start-mac.sh, start-unix.sh, runFitNesseTest.sh) toreference the new fitnesse-20221219-standalone.jar&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august&amp;nbsp;2022_-_release_22.3"&gt;August&amp;nbsp;2022 - Release 22.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cucumber for Appian is released and supported&lt;/li&gt;
&lt;li&gt;Removed support for 20.3&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="november&amp;nbsp;2021_-_release_21.4"&gt;November&amp;nbsp;2021 - Release 21.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Support new card choice components&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Update CVEs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august&amp;nbsp;2021_-_release_21.3"&gt;August&amp;nbsp;2021 - Release 21.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for radio button card&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for date picker&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june_2021_-_release_21.2"&gt;June 2021 - Release 21.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Support new SectionLayout&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Upgrade Selenium Server to 3.141.59&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for radio button card&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for icon link alt text&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="february&amp;nbsp;2021_-_release_21.1"&gt;February&amp;nbsp;2021 - Release 21.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Supports Appian version 21.1&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="november&amp;nbsp;2020_-_release_20.4"&gt;November&amp;nbsp;2020 - Release 20.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Support Chrome capabilities&lt;/li&gt;
&lt;li&gt;Update Cucumber to 6.8.2&lt;/li&gt;
&lt;li&gt;NEW METHOD: Support Stamp Field&lt;/li&gt;
&lt;li&gt;NEW METHOD: Support Tag field&lt;/li&gt;
&lt;li&gt;NEW METHOD:&amp;nbsp;Support signature field&lt;/li&gt;
&lt;li&gt;NEW METHOD: Support record action field&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fix grid row count bug when there is no paging&lt;/li&gt;
&lt;li&gt;Fix getGridColumnRowValue when the grid cell is a button&lt;/li&gt;
&lt;li&gt;Fix clear picker bug when there are multiple selections&lt;/li&gt;
&lt;li&gt;Fix capturing an empty rich text field&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="september&amp;nbsp;2020_-_release_20.3"&gt;September&amp;nbsp;2020 - Release 20.3&lt;/h3&gt;
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Enhancements
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;NEW METHOD: Populates the search box in a dropdown with some text&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;Bug fixes
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Fixed a bug for custom login submit button&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august&amp;nbsp;2020_-_release_20.2.1"&gt;August&amp;nbsp;2020 - Release 20.2.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fixed a bug regarding clicking on card layouts&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="july&amp;nbsp;2020_-_release_20.4"&gt;July&amp;nbsp;2020 - Release 20.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fix bug with milestone click&lt;/li&gt;
&lt;li&gt;Fix toggle box visibility on related action pop up&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="april&amp;nbsp;2020_-_release_20.1"&gt;April&amp;nbsp;2020 - Release 20.1&lt;/h3&gt;
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Enhancements
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;NEW METHOD:&amp;nbsp;click on bar chart *&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: click on menu widget&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: click on button with tooltip&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: verify confirmation dialog header&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: verify confirmation dialog message&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: Verify a field is not blank&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: click on document image link&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: clear search field in record&lt;/li&gt;
&lt;li class="li1"&gt;Include all jars in Cucumber&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;Bug fixes
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Remove pie chart hover for fragility and also make it the page scroll before hovering for firefox&lt;/li&gt;
&lt;li class="li1"&gt;Clicking on standalone icons by making the xpath less specific&lt;/li&gt;
&lt;li class="li1"&gt;&lt;strong&gt;Fix closing social task bug&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="january&amp;nbsp;2020_-_release_19.4.1"&gt;January&amp;nbsp;2020 - Release 19.4.1&lt;/h3&gt;
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Enhancements
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;NEW METHOD: star and unstar action with action name&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: click on icon link with alt text&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;Bug fixes
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Fixed issues for dropdowns with many options&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="november&amp;nbsp;2019_-_release_19.4"&gt;November&amp;nbsp;2019 - Release 19.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;NEW METHOD: verify button with label is enabled&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify button with label is disabled&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify link containing text is not present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a box with given label is present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a box with given label is not present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a section with given label is present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a section with given label is not present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a card with given accessibility text is present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a card with given accessibility text is not present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify if text is not present anywhere in the user interface&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Fixed populate first column in a grid when rowheader is set to 1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="september&amp;nbsp;2019_-_release_19.3.1"&gt;September&amp;nbsp;2019 - Release 19.3.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Enhancements
&lt;ul&gt;
&lt;li&gt;Added additional logging for site page navigation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Bug fixes
&lt;ul&gt;
&lt;li&gt;Fixed verify text present for text with apostrophe&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2019_-_release_19.2"&gt;June&amp;nbsp;2019 - Release 19.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Bug fixes
&lt;ul&gt;
&lt;li&gt;Support sending news post without participants&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="may&amp;nbsp;2019_-_release_19.1.3"&gt;May&amp;nbsp;2019 - Release 19.1.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Bug fixes
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Fixed the bug that users can not click on menu tabs on Appian 19.1&lt;/li&gt;
&lt;li&gt;Fixed the bug on Read Only field &amp;quot;contains&amp;quot;&lt;/li&gt;
&lt;li&gt;Fixed the bug on sending news post on Appian 19.1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="april_2019_-_release_19.1.2"&gt;April 2019 - Release 19.1.2&lt;/h3&gt;
&lt;p&gt;Enhancements&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support Wait For Progress&lt;/li&gt;
&lt;li&gt;Support Click on X and Y coordinates on monitor&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bug fixes&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed the bug that box layout toggle only acts on the first box&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="march_2019_-_release_19.1.1"&gt;March 2019 - Release 19.1.1&lt;/h3&gt;
&lt;p&gt;Bug fixes&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed error popup caused by loading Automation Extension&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="february&amp;nbsp;2019_-_release_19.1"&gt;February&amp;nbsp;2019 - Release 19.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cucumber For Appian available&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: testing, Architecture&lt;/div&gt;
</description></item><item><title>Automated Testing With FitNesse for Appian</title><link>https://community.appian.com/success/w/guide/3313/automated-testing-with-fitnesse-for-appian/revision/20</link><pubDate>Wed, 05 Mar 2025 20:52:22 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:c8850879-8dd5-475d-984d-48e7e52228fa</guid><dc:creator>Appian Max Team</dc:creator><description>Revision 20 posted to Guide by Appian Max Team on 3/5/2025 8:52:22 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;p&gt;FitNesse for Appian is a client side tool, built on top of&amp;nbsp;&lt;a href="http://docs.fitnesse.org/FrontPage"&gt;FitNesse&lt;/a&gt;, that makes it easy to create automated tests on the Appian platform. This&amp;nbsp;tool allows you to create test scripts in a easy to read wiki language that will&amp;nbsp;be run by the system to interact with an Appian application as a human user.&lt;/p&gt;
&lt;p&gt;FitNesse for Appian provides an Appian-specific wiki language within FitNesse that maps directly to actions that can be performed in Appian, such as:&lt;/p&gt;
&lt;ul style="font-size:110%;"&gt;
&lt;li&gt;Navigating the interface (News, Tasks, Records, Reports, Actions, Sites)&lt;/li&gt;
&lt;li&gt;Starting actions and completing tasks&lt;/li&gt;
&lt;li&gt;Validating content on record views or in news events&lt;/li&gt;
&lt;li&gt;And much more... the complete list is available directly within the tool!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information about&amp;nbsp;testing and development best practices when using FitNesse for Appian, visit the&amp;nbsp;&lt;a href="/w/guide/3212/fitnesse-for-appian-best-practices"&gt;FitNesse for Appian Best Practices&lt;/a&gt;&amp;nbsp;guide.&lt;/p&gt;
&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;
&lt;ul style="font-size:110%;"&gt;
&lt;li&gt;Appian 22.2 and above&lt;/li&gt;
&lt;li&gt;Java Runtime Environment 11&lt;/li&gt;
&lt;li&gt;Chrome or Firefox browsers
&lt;div class="callout-box callout-info"&gt;If using Chrome, we recommend using &lt;a href="https://developer.chrome.com/blog/chrome-for-testing/"&gt;Chrome For Testing&lt;/a&gt; for a more consistent testing experience.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="setup"&gt;Setup&lt;/h2&gt;
&lt;p&gt;The&amp;nbsp;zip file for the tool can be downloaded from the&amp;nbsp;&lt;a href="/b/appmarket/posts/fitnesse-for-appian"&gt;App Market Public Listings&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;
&lt;ol style="font-size:110%;"&gt;
&lt;li&gt;Unzip the contents into your root directory or preferred location (e.g. C:\)&lt;/li&gt;
&lt;li&gt;In a terminal window navigate to the folder extracted from the zip file (e.g. C:\fitnesse-for-appian). We will refer to this directory as TESTING_HOME throughout this documentation
&lt;ol&gt;
&lt;li&gt;For PC, main commands will be:
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;dir:&amp;nbsp;&lt;/strong&gt;used to show contents of current directory (folder)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cd: &lt;/strong&gt;used to change directory (open a folder), e.g. &lt;em&gt;cd Documents&amp;nbsp;&lt;/em&gt;would open the Documents folder.&amp;nbsp;&lt;em&gt;cd ..&amp;nbsp;&lt;/em&gt;would go to the parent folder of current folder.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;For Mac/Linux,
&lt;ol style="font-size:110%;"&gt;
&lt;li&gt;&lt;strong&gt;ls:&lt;/strong&gt; used to show contents of a directory (folder)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cd:&amp;nbsp;&lt;/strong&gt;used to change directory (open a folder), e.g.&amp;nbsp;&lt;em&gt;cd Documents&amp;nbsp;&lt;/em&gt;would open the Documents folder.&amp;nbsp;&lt;em&gt;cd ..&amp;nbsp;&lt;/em&gt;would go to the parent folder of current folder.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Open the &amp;quot;custom.properties&amp;quot; file located in TESTING_HOME/configs and change:
&lt;ol&gt;
&lt;li&gt;automated.testing.home to be TESTING_HOME (e.g. C:\FitNesseForAppian)&lt;/li&gt;
&lt;li&gt;download.directory to be a folder of your choosing&lt;/li&gt;
&lt;li&gt;chrome.driver.home to be TESTING_HOME/lib/drivers/chromedriver(.exe if using windows, -mac if using a mac, -linux if using UNIX)&lt;/li&gt;
&lt;li&gt;firefox.driver.home to be TESTING_HOME/lib/drivers/geckodriver(.exe if using windows, -mac if using a mac, -linux64 if using UNIX)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Run start.bat if using windows, start-mac.sh for Mac, and start-unix.sh for UNIX to install and run FitNesse for Appian.&amp;nbsp;Installation should take around 30 seconds and is complete when you see the message &amp;quot;Starting FitNesse on port: 8980&amp;quot;. To stop FitNesse for Appian, invoke Ctrl+C in the&amp;nbsp;terminal.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="running_your_first_fitnesse_test"&gt;Running your first FitNesse test&lt;/h2&gt;
&lt;ol style="font-size:110%;"&gt;
&lt;li&gt;Start FitNesse if it isn&amp;#39;t already running by running start.bat/start-mac.sh/start-unix.sh depending on your system&lt;/li&gt;
&lt;li&gt;Navigate to http://localhost:8980/FitNesseForAppian.Examples.TestExample&lt;/li&gt;
&lt;li&gt;Follow the configuration instructions marked by &amp;quot;Please follow the directions below to execute the test&amp;quot;&lt;/li&gt;
&lt;li&gt;Click Test at the top of the page&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="developing_custom_tests"&gt;Developing custom tests&lt;/h3&gt;
&lt;p&gt;To&amp;nbsp;try out the tool further, use the Appian application included in the combined files download&amp;nbsp;(Automated Testing - 1x.x.zip) and import it into your corresponding version of Appian environment.&lt;/p&gt;
&lt;p&gt;Navigate to the FitNesseForAppian Cheatsheet&amp;nbsp;and make use of the supported methods to write your own test suite to run against the sample application! Be sure you are using methods for the environment you are testing. For example, if testing sites, use navigation methods that come from the &amp;quot;Sites Methods&amp;quot; scenario. Using methods from a different environment has the potential to break in future releases.&lt;/p&gt;
&lt;p&gt;An example test suite run could look like this:&amp;nbsp;&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/1200x0/__key/communityserver-wikis-components-files/00-00-00-00-46/8206.Appian_5F00_FitNesse_5F00_0.png" /&gt;&lt;/div&gt;
&lt;p&gt;By default, the tool collects usage metrics for analytics purposes. Set collect.metrics=false in the &amp;quot;metrics.properties&amp;quot; file to opt-out of metrics collection.&lt;/p&gt;
&lt;h2 id="features"&gt;Features&lt;/h2&gt;
&lt;p&gt;Multiple browser support&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chrome (v64-66)&lt;/li&gt;
&lt;li&gt;Firefox (v53-62)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="benefits"&gt;Benefits&lt;/h2&gt;
&lt;ul style="font-size:110%;"&gt;
&lt;li&gt;Test your Appian application within minutes of downloading the tool&lt;/li&gt;
&lt;li&gt;Methods created specifically to operate within Appian applications and Tempo&lt;/li&gt;
&lt;li&gt;Test scripts do not need to be updated for upgrades to supported Appian versions&lt;/li&gt;
&lt;li&gt;Test scripts are written in a wiki language&amp;nbsp;that is very easy to read and synthesize&lt;/li&gt;
&lt;li&gt;Appian design knowledge is not required to create test scripts&lt;/li&gt;
&lt;li&gt;Common case scenarios can be created for reusability throughout test suites&lt;/li&gt;
&lt;li&gt;Isolate test steps into scenarios to perform Spec by Example tests&lt;/li&gt;
&lt;li&gt;Test scripts are easily updated for new UI changes to a form or interface&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="release_notes"&gt;Release Notes&lt;/h2&gt;
&lt;h3 id="25.1"&gt;March 2025 - Release 25.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Added support for defining and using custom locales. Use create appian locale | PATH TO File. This method must be called after setting the version.&lt;br /&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;File must be JSON file with the format&lt;/strong&gt;:&amp;nbsp;{ &amp;quot;dateFormats&amp;quot;: [ { "label": "dateFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "dateDisplayFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "timeFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "timeDisplayFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "datetimeFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "datetimeDisplayFormat","value": &amp;lt;FORMAT_STRING&amp;gt; } ], &amp;quot;labels&amp;quot;: [ { "label": "acceptButton", "value": "Accept" } ], &amp;quot;locale&amp;quot;: &amp;lt;LOCALE_CODE&amp;gt; }&lt;!-- notionvc: a0caf744-193a-430a-a07c-8fec6fed1e37 --&gt;&lt;!-- notionvc: bac86f8d-84e2-4689-b153-1bb90e3d5c2e --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Fixed clickOnRecordRelatedAction to function correctly when the Record Summary page contains more than three action items.&lt;!-- notionvc: dd49e574-46f8-4e3a-8588-5e6b22f5c63a --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="24.3"&gt;August 2024 - Release 24.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Added built-in retry to click operation in case of element not interactable exception.&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Updated the milestone locator.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="24.2"&gt;June 2024 - Release 24.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Updated locator for site menu links&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Created method which supports clicking on text within an interface. This is particularly useful for nested cards such as tab layouts, but can also be used as a fallback when existing methods don&amp;#39;t work. This method is available for all Appian versions.&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Click operation on Card layout will be performed on the left side of the element instead of the right. We&amp;#39;re not expecting any impact on existing test cases.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;March 2024 - Release 24.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Support for Appian version 24.1&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Adds support for collapsing/opening sidebars&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;ClickOnCard updated to support clicking on cards with complex content. For example, the method can now click on cards that have a component nested in multiple layouts within the card&lt;!-- notionvc: c9bfab53-e4e1-4301-9c43-08f4d6f59a50 --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;November 2023 - Release 23.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE: &lt;span style="font-weight:400;"&gt;Project has been updated to require Java 11 JRE&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;&lt;/strong&gt;Enhancements&lt;br /&gt;
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Support for Appian version 23.4&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for the side navigation menu in sites&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for downloading charts&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for buttons configured with custom colors&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Honor the download directory given in custom.properties for Remote Drivers&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Update dropdowns for versions greater than 23.3 to ignore the aria-checked value&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Fixed Populate Record Type Data Range User Filter method&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;August&amp;nbsp;2023 - Release 23.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements&lt;br /&gt;
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Supports Appian version 23.3&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Added functionality to interact with new site group headers&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Updated to Selenium 4.11.0&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for Date Range user filters in Record Types&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Update checkboxes to support CARD style for 23.3 and later Appian versions&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;June&amp;nbsp;2023 - Release 23.2.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE:&amp;nbsp;&lt;/strong&gt;Updates to site navigation in the 23.2 product breaks the use of the &amp;quot;click on menu&amp;quot; method in site environments. &amp;quot;click on menu&amp;quot;, and other navigation methods from Tempo, are guaranteed&amp;nbsp;to work only in Tempo environments. Use the &amp;quot;click on site page&amp;quot; method instead&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Update pickers to recognize selections with links (e.g. Record Pickers)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2"&gt;June&amp;nbsp;2023 - Release 23.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Supports Appian version 23.2&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE:&amp;nbsp;&lt;/strong&gt;Updates to site navigation in the 23.2 product breaks the use of the &amp;quot;click on menu&amp;quot; method in site environments. &amp;quot;click on menu&amp;quot;, and other navigation methods from Tempo, are guaranteed&amp;nbsp;to work only in Tempo environments. Use the &amp;quot;click on site page&amp;quot; method instead&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="may_2023_-_release_23.1.2"&gt;May 2023 - Release 23.1.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fixes an issue where Dropdowns with Search were not working&lt;/li&gt;
&lt;li&gt;Fixes an Issue where verifyText did not work on multi-node components&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="february_2023_-_release_23.1"&gt;February 2023 - Release 23.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Supports Appian version 23.1&lt;/li&gt;
&lt;li&gt;Updated locator for Dropdown class&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Update CVEs&lt;/li&gt;
&lt;li&gt;Update scripts (start.bat, start-mac.sh, start-unix.sh, runFitNesseTest.sh) toreference the new fitnesse-20221219-standalone.jar&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august&amp;nbsp;2022_-_release_22.3"&gt;August&amp;nbsp;2022 - Release 22.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;FitNesse for Appian is released and supported&lt;/li&gt;
&lt;li&gt;Removed support for 20.3&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="november&amp;nbsp;2021_-_release_21.4"&gt;November&amp;nbsp;2021 - Release 21.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Support new card choice components&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Update CVEs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august&amp;nbsp;2021_-_release_21.3"&gt;August&amp;nbsp;2021 - Release 21.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for radio button card&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for date picker&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june_2021_-_release_21.2"&gt;June 2021 - Release 21.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Support new SectionLayout&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Upgrade Selenium Server to 3.141.59&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for radio button card&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for icon link alt text&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="february&amp;nbsp;2021_-_release_21.1"&gt;February&amp;nbsp;2021 - Release 21.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Supports Appian version 21.1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="november&amp;nbsp;2020_-_release_20.4"&gt;November&amp;nbsp;2020 - Release 20.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Support Chrome capabilities&lt;/li&gt;
&lt;li&gt;Update FitNesse version to 20200501&lt;/li&gt;
&lt;li&gt;NEW METHOD: Support Stamp Field&lt;/li&gt;
&lt;li&gt;NEW METHOD: Support Tag field&lt;/li&gt;
&lt;li&gt;NEW METHOD:&amp;nbsp;Support signature field&lt;/li&gt;
&lt;li&gt;NEW METHOD: Support record action field&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fix grid row count bug when there is no paging&lt;/li&gt;
&lt;li&gt;Fix getGridColumnRowValue when the grid cell is a button&lt;/li&gt;
&lt;li&gt;Fix clear picker bug when there are multiple selections&lt;/li&gt;
&lt;li&gt;Fix capturing an empty rich text field&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="september&amp;nbsp;2020_-_release_20.3"&gt;September&amp;nbsp;2020 - Release 20.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;NEW METHOD: Populates the search box in a dropdown with some text&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fixed a bug for custom login submit button&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august&amp;nbsp;2020_-_release_20.2.1"&gt;August&amp;nbsp;2020 - Release 20.2.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Fixed a bug regarding clicking on card layouts&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="july&amp;nbsp;2020_-_release_20.2"&gt;July&amp;nbsp;2020 - Release 20.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Fix bug with milestone click&lt;/li&gt;
&lt;li&gt;Fix toggle box visibility on related action pop up&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="apr&amp;nbsp;2020_-_release_20.1"&gt;Apr&amp;nbsp;2020 - Release 20.1&lt;/h3&gt;
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Enhancements
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;NEW METHOD: click on bar chart&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: click on menu widget&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: click on button with tooltip&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: verify confirmation dialog header&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: verify confirmation dialog message&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: Verify a field is not blank&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: click on document image link&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: clear search field in record&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;Bug fixes
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Remove pie chart hover for fragility and also make it the page scroll before hovering for firefox&lt;/li&gt;
&lt;li class="li1"&gt;Clicking on standalone icons by making the xpath less specific&lt;/li&gt;
&lt;li class="li1"&gt;Fixed closing social task bug&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="january&amp;nbsp;2020_-_release_19.4.1"&gt;January&amp;nbsp;2020 - Release 19.4.1&lt;/h3&gt;
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Enhancements
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;NEW METHOD: star and unstar action with action name&lt;/li&gt;
&lt;li class="li1"&gt;NEW METHOD: click on icon link with alt text&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="li1"&gt;Bug fixes
&lt;ul class="ul1"&gt;
&lt;li class="li1"&gt;Fixed issues for dropdowns with many options&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="november&amp;nbsp;2019_-_release_19.4"&gt;November&amp;nbsp;2019 - Release 19.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;NEW METHOD: verify button with label is enabled&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify button with label is disabled&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify link containing text is not present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a box with given label is present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a box with given label is not present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a section with given label is present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a section with given label is not present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a card with given accessibility text is present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify a card with given accessibility text is not present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify if text is not present anywhere in the user interface&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Fixed populate first column in a grid when rowheader is set to 1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="september&amp;nbsp;2019_-_release_19.3.1"&gt;September&amp;nbsp;2019 - Release 19.3.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Enhancements
&lt;ul&gt;
&lt;li&gt;Added additional logging for site page navigation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Bug fixes
&lt;ul&gt;
&lt;li&gt;Fixed verify text present for text with apostrophe&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sep&amp;nbsp;2019_-_release_19.3"&gt;Sep&amp;nbsp;2019 - Release 19.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Support gauge field&lt;/li&gt;
&lt;li&gt;Support locating field using placeholder, instructions or tooltip&lt;/li&gt;
&lt;li&gt;NEW METHOD: get gauge field GAUGE_FIELD or GAUGE_FIELD[INDEX] percentage&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify gauge field GAUGE_FIELD or GAUGE_FIELD[INDEX] percentage is PERCENTAGE&lt;/li&gt;
&lt;li&gt;NEW METHOD: populate field with placeholder PLACEHOLDER with VALUE(S)&lt;/li&gt;
&lt;li&gt;NEW METHOD: populate field with instructions INSTRUCTIONS with VALUE(S)&lt;/li&gt;
&lt;li&gt;NEW METHOD: populate field with tooltip TOOLTIP with VALUE(S)&lt;/li&gt;
&lt;li&gt;NEW METHOD: get field with placeholder PLACEHOLDER value&lt;/li&gt;
&lt;li&gt;NEW METHOD: get field with instructions INSTRUCTIONS value&lt;/li&gt;
&lt;li&gt;NEW METHOD: get field with tooltip TOOLTIP value&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify field with placeholder PLACEHOLDER contains VALUE(S)&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify field with instructions INSTRUCTIONS contains VALUE(S)&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify field with tooltip TOOLTIP contains VALUE(S)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2019_-_release_19.2"&gt;June&amp;nbsp;2019 - Release 19.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Bug fixes
&lt;ul&gt;
&lt;li&gt;Support sending news post without participants&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="may&amp;nbsp;2019_-_release_19.1.3"&gt;May&amp;nbsp;2019 - Release 19.1.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Bug fixes
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Fixed the bug that users can not click on menu tabs on Appian 19.1&lt;/li&gt;
&lt;li&gt;Fixed the bug on Read Only field &amp;quot;contains&amp;quot;&lt;/li&gt;
&lt;li&gt;Fixed the bug on sending news post on Appian 19.1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="april_2019_-_release_19.1.2"&gt;April 2019 - Release 19.1.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Support Wait For Progress&lt;/li&gt;
&lt;li&gt;Support Click on X and Y coordinates on monitor&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Bug fixes
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Fixed the bug that box layout toggle only acts on the first box&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="march&amp;nbsp;2019_-_release_19.1.1"&gt;March&amp;nbsp;2019 - Release 19.1.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug fixes&amp;nbsp;
&lt;ul&gt;
&lt;li&gt;Fixed error popup caused by loading Automation Extension&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="february_2019_-_release_19.1"&gt;February 2019 - Release 19.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Support Masked Barcode&lt;/li&gt;
&lt;li&gt;Support Vertical Milestone&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes&amp;nbsp;
&lt;ul&gt;
&lt;li&gt;Fixed login with terms for 17.2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="january_2019_-_release_18.4.4"&gt;January 2019 - Release 18.4.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;NEW METHOD: populate field with partially matching picker field suggestion&lt;/li&gt;
&lt;li&gt;NEW METHOD: login into URL with username&lt;/li&gt;
&lt;li&gt;NEW METHOD: login into URL with role&lt;/li&gt;
&lt;li&gt;NEW METHOD: wait for seconds&lt;/li&gt;
&lt;li&gt;NEW METHOD: wait for minutes&lt;/li&gt;
&lt;li&gt;NEW METHOD: wait for working&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="january_2019_-_release_18.4.3"&gt;January 2019 - Release 18.4.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Add capability to run tests on remote web drivers&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Fixed milestone step verification&lt;/li&gt;
&lt;li&gt;Fixed section containing validation message verification&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="december&amp;nbsp;2018_-_release_18.4.2"&gt;December&amp;nbsp;2018 - Release 18.4.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;NEW METHOD:&amp;nbsp;populate grid column row with partially matching picker field suggestion&lt;/li&gt;
&lt;li&gt;Other minor enhancements&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="november_2018_-_release_18.4.1"&gt;November 2018 - Release 18.4.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Documentation overhaul&lt;/li&gt;
&lt;li&gt;Improved out of the box examples&lt;/li&gt;
&lt;li&gt;Updated information about supported Appian versions&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="october&amp;nbsp;2018_-_release_18.4"&gt;October&amp;nbsp;2018 - Release 18.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;NEW METHOD: open settings menu&lt;/li&gt;
&lt;li&gt;NEW METHOD: open user profile&lt;/li&gt;
&lt;li&gt;NEW METHOD: use discoverability to navigate to&lt;/li&gt;
&lt;li&gt;NEW METHOD: close social task&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify task feed containing text is not present&lt;/li&gt;
&lt;li&gt;Added usage metrics and corresponding metrics.properties file&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fixed login with terms&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august_2018_-_release_18.3.1"&gt;August 2018 - Release 18.3.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Added new methods for hovering and clicking on profile links and circles in news posts&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Fixed NoClassDefFoundError for TempoEncryptedTextField introduced in 18.3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august&amp;nbsp;2018_-_release_18.3"&gt;August&amp;nbsp;2018 - Release 18.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;NEW METHOD: create a news post&lt;/li&gt;
&lt;li&gt;NEW METHOD: send kudos&lt;/li&gt;
&lt;li&gt;NEW METHOD: send messages&lt;/li&gt;
&lt;li&gt;NEW METHOD: send tasks&lt;/li&gt;
&lt;li&gt;NEW METHOD: sort tasks&lt;/li&gt;
&lt;li&gt;NEW METHOD: star a news feed item&lt;/li&gt;
&lt;li&gt;NEW METHOD: filter news feed&lt;/li&gt;
&lt;li&gt;NEW METHOD: navigate to link in news post&lt;/li&gt;
&lt;li&gt;NEW METHOD: generic assertion that text is present&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fixed bug with MilestoneField pre-18.2&lt;/li&gt;
&lt;li&gt;Added WebContentField to 18.1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="may&amp;nbsp;2018_-_release_18.2.1"&gt;May&amp;nbsp;2018 - Release 18.2.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Auto login to previously set URL&lt;/li&gt;
&lt;li&gt;Milestones in side by side layout&lt;/li&gt;
&lt;li&gt;Card click identified by link name index&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify video (not) present&lt;/li&gt;
&lt;li&gt;NEW METHOD: verify web content (not) present&lt;/li&gt;
&lt;li&gt;Updated test app for 18.2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;User pickers not selecting correct field value&lt;/li&gt;
&lt;li&gt;Card click not working in Firefox&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="may&amp;nbsp;2018_-_release_18.2"&gt;May&amp;nbsp;2018 - Release 18.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Added support for 18.2&lt;/li&gt;
&lt;li&gt;NEW METHOD: click on card&lt;/li&gt;
&lt;li&gt;Updated select grid method to account for the row highlight selection style&lt;/li&gt;
&lt;li&gt;Added test app for 18.2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Fixed fragility of file upload&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="march&amp;nbsp;2018_-_release_18.1.4"&gt;March&amp;nbsp;2018 - Release 18.1.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Added Support for finding grid indices&lt;/li&gt;
&lt;li&gt;Added the ability to delete documents downloaded by Fitnesse&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="february&amp;nbsp;2018_-_release_18.1.3"&gt;February&amp;nbsp;2018 - Release 18.1.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Updated mac and linux scripts shebang to /bin/sh&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="february&amp;nbsp;2018_-_release_18.1.2"&gt;February&amp;nbsp;2018 - Release 18.1.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Fixed Windows start script to run FitNesse successfully&lt;/li&gt;
&lt;li&gt;Fixed the example page and default fixture to use TempoFixture instead of SitesFixture&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="january&amp;nbsp;2018_-_release_18.1.1"&gt;January&amp;nbsp;2018 - Release 18.1.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Updated 16.3 Test Zip&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Fixed issue with navigating to /logout URL&lt;/li&gt;
&lt;li&gt;Fixed Multiselect dropdown on 16.3&lt;/li&gt;
&lt;li&gt;Fixed Record filter clearing on 16.3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="january&amp;nbsp;2018_-_release_18.1"&gt;January&amp;nbsp;2018 - Release 18.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Added support for 18.1&lt;/li&gt;
&lt;li&gt;Added test app for 17.3 and 18.1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="january&amp;nbsp;2018_-_release_17.4.1"&gt;January&amp;nbsp;2018 - Release 17.4.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Add ability to accept Tasks&lt;/li&gt;
&lt;li&gt;Add ability to populate Record Type user filter&lt;/li&gt;
&lt;li&gt;Add ability to download files&lt;/li&gt;
&lt;li&gt;Make LinkField capturable&lt;/li&gt;
&lt;li&gt;Added advanced functionality to adjust dates, including setting dates in the past&lt;/li&gt;
&lt;li&gt;If url contains &amp;quot;/suite&amp;quot;, remove anything after it to prevent navigation failure.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Updated chromedriver to version 2.33&lt;/li&gt;
&lt;li&gt;Updated startup scripts to pass FitNesseRoot properly&lt;/li&gt;
&lt;li&gt;Always logout before login in case a previous test failed and didn&amp;#39;t logout&lt;/li&gt;
&lt;li&gt;Made Firefox webdrivers executable&lt;/li&gt;
&lt;li&gt;Fix BarcodeField not working in 17.1+&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="november&amp;nbsp;2017_-_release_17.4"&gt;November&amp;nbsp;2017 - Release 17.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancement
&lt;ul&gt;
&lt;li&gt;Change FitNesse usernames&lt;/li&gt;
&lt;li&gt;Allow FitNesse tests to hit an arbitrary endpoint through an environment variable&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Mac Firefox date and dateTime field tests no longer throw an null character&lt;/li&gt;
&lt;li&gt;Dropdown tests does not read duplicate values&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="october&amp;nbsp;2017_-_release_17.3.2"&gt;October&amp;nbsp;2017 - Release 17.3.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Updated test application to run initialize on import&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Checkboxes that are too short are not checked&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="october&amp;nbsp;2017_-_release_17.3.1"&gt;October&amp;nbsp;2017 - Release 17.3.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Updated Test App to create users&lt;/li&gt;
&lt;li&gt;Documentation tweaks/ Readme tweaks&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Allowed login for internationalized pages&lt;/li&gt;
&lt;li&gt;Fixed an issue preventing searching in record list view&lt;/li&gt;
&lt;li&gt;Changed the way the start-unix script was sourced&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="september&amp;nbsp;2017_-_release_17.3"&gt;September&amp;nbsp;2017 - Release 17.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Supports Appian version 17.3&lt;/li&gt;
&lt;li&gt;Ability to configure custom login page&lt;/li&gt;
&lt;li&gt;Updated the following components to be compatible with the latest Appian Hotfix Package for 17.1 (G), and 17.2 (D):
&lt;ul&gt;
&lt;li&gt;Paging Grid&lt;/li&gt;
&lt;li&gt;Editable Grid&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Scripts now recognize new loading bar and wait for it to be done before continuing&lt;/li&gt;
&lt;li&gt;Added shell scripts and drivers for F4A on Mac and Linux&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes
&lt;ul&gt;
&lt;li&gt;Browser is maximized by default which ensures the &amp;quot;Sign Out&amp;quot; button is always visibleNote: Previously tests could hang waiting to logout if the browser window was within a specific size range where the &amp;quot;Sign Out&amp;quot; button got hidden&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: testing, Platform, Architecture&lt;/div&gt;
</description></item><item><title>Automated Testing with Appian Selenium API</title><link>https://community.appian.com/success/w/guide/3312/automated-testing-with-appian-selenium-api/revision/34</link><pubDate>Wed, 05 Mar 2025 20:51:00 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:af6be428-e229-4a89-9844-d99ca095396c</guid><dc:creator>Appian Max Team</dc:creator><description>Revision 34 posted to Guide by Appian Max Team on 3/5/2025 8:51:00 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;
&lt;ul style="font-size:110%;"&gt;
&lt;li&gt;Appian 22.2 and above&lt;/li&gt;
&lt;li&gt;Java Runtime Environment 11&lt;/li&gt;
&lt;li&gt;Chrome or Firefox browsers
&lt;div class="callout-box callout-info"&gt;If using Chrome, we recommend using &lt;a href="https://developer.chrome.com/blog/chrome-for-testing/"&gt;Chrome For Testing&lt;/a&gt; for a more consistent testing experience.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;An IDE, such as IntelliJ IDEA or Eclipse&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="setup"&gt;Setup&lt;/h2&gt;
&lt;p&gt;The &lt;a href="/b/appmarket/posts/appian_2d00_selenium_2d00_api"&gt;Appian Selenium API&lt;/a&gt; plug-in is a Java library which allows you to write automated tests for your Appian UIs. It contains methods which allow you to interact with Appian components in a browser. It provides methods and fixtures to interact with Appian applications in its various environments, e.g. Tempo or Sites. When writing tests, be sure to use methods from the correct fixture for the environment under test, e.g. use SitesFixture where possible to test Sites. Methods defined in fixtures that are intended for different environments are not guaranteed to work in future versions of the plugin.&lt;/p&gt;
&lt;p&gt;It can be used in a Java application or integrated directly into any Selenium or Java-based testing tool.&lt;/p&gt;
&lt;p&gt;Appian Selenium API contains the underlying Selenium methods used by &lt;a href="/b/appmarket/posts/cucumber-for-appian"&gt;Cucumber for Appian&lt;/a&gt; and &lt;a href="/b/appmarket/posts/fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;, but offers you more flexibility by allowing you to define your own automated test cases. You can create your own Cucumber Step Definitions, your own testNG test, or the Java Framework of your choosing. You are no longer tied to Cucumber for Appian or FitNesse for Appian yet you get the same ease and simplicity of those respective frameworks.&lt;/p&gt;
&lt;ol style="font-size:110%;"&gt;
&lt;li&gt;Open this project in an IDE, such as IntelliJ IDEA or Eclipse.&lt;/li&gt;
&lt;li&gt;Update configurations:
&lt;ol&gt;
&lt;li&gt;&amp;nbsp;Open file &lt;strong&gt;configs/custom.properties&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;Update &lt;strong&gt;automated.testing.hom&lt;/strong&gt;e with the path to this installation. Examples:
&lt;ol&gt;
&lt;li&gt;Windows: &lt;strong&gt;automated.testing.home=C:\\testFolder\\appian-selenium-api-example-java&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Mac: &lt;strong&gt;automated.testing.home=/Users/tester/Desktop/appian-selenium-api-example-java&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Update &lt;strong&gt;chrome.driver.home&lt;/strong&gt; with the path to the Chrome driver that comes with this installation. Examples: * Windows: &lt;strong&gt;automated.testing.home=C:\\testFolder\\appian-selenium-api-example-java\\lib\\drivers\\chromedriver.exe&lt;/strong&gt; * Mac: &lt;strong&gt;automated.testing.home=/Users/tester/Desktop/appian-selenium-api-example-java/lib/drivers/chromedriver-mac&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Open file&lt;strong&gt; configs/users.properties&lt;/strong&gt;, for each username used in a test add a line in the format of &lt;strong&gt;&amp;lt;username&amp;gt;=&amp;lt;password&amp;gt;&lt;/strong&gt; to this file.
&lt;ol&gt;
&lt;li&gt;If you prefer not to disclose your password in plain text, you can also choose to use &lt;strong&gt;com.appiancorp.ps.automatedtest.fixture.BaseFixture.loginIntoWithUsernameAndPassword&lt;/strong&gt; fixture method to login by passing in the password from a system property value.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Open &amp;quot;src/main/java/com/appiancorp/example/HelloAppian.java&amp;quot;:
&lt;ol&gt;
&lt;li&gt;Update &lt;strong&gt;TEST_SITE_URL&lt;/strong&gt; to your Appian URL, such as &lt;strong&gt;protected static String TEST_SITE_URL = &amp;quot;https://example.appiancloud.com/suite&amp;quot;;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Update &lt;strong&gt;TEST_USERNAME&lt;/strong&gt; with a username, such as &lt;strong&gt;protected static String TEST_USERNAME = &amp;quot;tester.tester&amp;quot;;&lt;/strong&gt; * Make sure this user exists in &lt;strong&gt;configs/users.properties&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Run the &lt;strong&gt;main()&lt;/strong&gt; method of this class:
&lt;ol&gt;
&lt;li&gt;&amp;nbsp;You should see that a Chrome browser will open up, and the fixture commands in &lt;strong&gt;HelloAppian.java&lt;/strong&gt; will execute accordingly.&lt;/li&gt;
&lt;li&gt;Note that this test will fail since your site might not have an action &amp;quot;Create a Case&amp;quot; under menu &amp;quot;Actions&amp;quot; that opens up an interface that has a &amp;quot;Submit&amp;quot; button.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="features"&gt;Features&lt;/h2&gt;
&lt;p&gt;Multiple browser support&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chrome&lt;/li&gt;
&lt;li&gt;Firefox&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="benefits"&gt;Benefits&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Define your own integration tests without being limited by a third-party testing tool&lt;/li&gt;
&lt;li&gt;Selenium-based test scripts can be created for reusability throughout test suites&lt;/li&gt;
&lt;li&gt;Methods created specifically to operate within Appian applications and Tempo&lt;/li&gt;
&lt;li&gt;Test scripts do not need to be updated when upgrading between supported Appian versions&lt;/li&gt;
&lt;li&gt;Test scripts are easily updated for new UI changes to a form or interface&lt;/li&gt;
&lt;li&gt;Appian design knowledge is not required to create test scripts&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="release_notes"&gt;Release Notes&lt;/h2&gt;
&lt;h3 id="25.1"&gt;March 2025 - Release 25.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Added support for defining and using custom locales. Use create appian locale | PATH TO File. This method must be called after setting the version.&lt;br /&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;File must be JSON file with the format&lt;/strong&gt;:&amp;nbsp;{ &amp;quot;dateFormats&amp;quot;: [ { "label": "dateFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "dateDisplayFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "timeFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "timeDisplayFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "datetimeFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "datetimeDisplayFormat","value": &amp;lt;FORMAT_STRING&amp;gt; } ], &amp;quot;labels&amp;quot;: [ { "label": "acceptButton", "value": "Accept" } ], &amp;quot;locale&amp;quot;: &amp;lt;LOCALE_CODE&amp;gt; }&lt;!-- notionvc: a0caf744-193a-430a-a07c-8fec6fed1e37 --&gt;&lt;!-- notionvc: bac86f8d-84e2-4689-b153-1bb90e3d5c2e --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Fixed clickOnRecordRelatedAction to function correctly when the Record Summary page contains more than three action items.&lt;!-- notionvc: dd49e574-46f8-4e3a-8588-5e6b22f5c63a --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="24.3"&gt;August 2024 - Release 24.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Added built-in retry to click operation in case of element not interactable exception.&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Updated the milestone locator.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="24.2"&gt;June 2024 - Release 24.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Updated locator for site menu links&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Created method which supports clicking on text within an interface. This is particularly useful for nested cards such as tab layouts, but can also be used as a fallback when existing methods don&amp;#39;t work. This method is available for all Appian versions.&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Click operation on Card layout will be performed on the left side of the element instead of the right. We&amp;#39;re not expecting any impact on existing test cases.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;March 2024 - Release 24.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Support for Appian version 24.1&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Adds support for collapsing/opening sidebars&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;ClickOnCard updated to support clicking on cards with complex content. For example, the method can now click on cards that have a component nested in multiple layouts within the card&lt;!--mce:protected %3C%21--mce%3Aprotected%20%253C%2521--mce%253Aprotected%2520%25253C%252521--%252520notionvc%25253A%252520c9bfab53-e4e1-4301-9c43-08f4d6f59a50%252520--%25253E--%253E--%3E--&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;November&amp;nbsp;2023 - Release 23.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: &lt;span style="font-weight:400;"&gt;Project has been updated to require Java 11 JRE&lt;/span&gt;&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Support for Appian version 23.4&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for the side navigation menu in sites&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for downloading charts&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for buttons configured with custom colors&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Honor the download directory given in custom.properties for Remote Drivers&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Update dropdowns for versions greater than 23.3 to ignore the aria-checked value&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Fixed Populate Record Type Data Range User Filter method&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;August 2023 - Release 23.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: &lt;span style="font-weight:400;"&gt;Project has been updated to require Java 11 JRE&lt;/span&gt;&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Supports Appian version 23.3&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Added functionality to interact with new site group headers&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Updated to Selenium 4.11.0&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Update checkboxes to support CARD style for 23.3 and later Appian versions&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;June&amp;nbsp;2023 - Release 23.2.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: Updates to site navigation in the 23.2 product breaks the use of the clickOnMenu method defined in TempoFixtures for site environments. clickOnMenu, and other navigation methods defined in TempoFixtures, are guaranteed&amp;nbsp;to work only in Tempo environments. Use the clickOnSitePage method defined in SitesFixtures instead&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Update pickers to recognize selections with links (e.g. Record Pickers)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2"&gt;June&amp;nbsp;2023 - Release 23.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Supports Appian version 23.2
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: Updates to site navigation in the 23.2 product breaks the use of the clickOnMenu method defined in TempoFixtures for site environments. clickOnMenu, and other navigation methods defined in TempoFixtures, are guaranteed&amp;nbsp;to work only in Tempo environments. Use the clickOnSitePage method defined in SitesFixtures instead&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="may_2023_-_release_23.1.2"&gt;May 2023 - Release 23.1.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fixes an issue where Dropdowns with Search were not working&lt;/li&gt;
&lt;li&gt;Fixes an Issue where verifyText did not work on multi-node components&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="february_2023_-_release_23.1"&gt;February 2023 - Release 23.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Supports Appian version 23.1&lt;/li&gt;
&lt;li&gt;Updated locator for Dropdown class&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Update CVEs&lt;/li&gt;
&lt;li&gt;Update scripts (start.bat, start-mac.sh, start-unix.sh, runFitNesseTest.sh) to reference the new fitnesse-20221219-standalone.jar&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august&amp;nbsp;2022_-_release_22.3"&gt;August&amp;nbsp;2022 - Release 22.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Appian Selenium API is released and supported&lt;/li&gt;
&lt;li&gt;Removed support for 20.3&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="november&amp;nbsp;2021_-_release_21.4"&gt;November&amp;nbsp;2021 - Release 21.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Support new card choice components&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Update CVEs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august&amp;nbsp;2021_-_release_21.3"&gt;August&amp;nbsp;2021 - Release 21.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for radio button card&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for date picker&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june_2021_-_release_21.2"&gt;June 2021 - Release 21.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Support new SectionLayout&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Upgrade Selenium Server to 3.141.59&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for radio button card&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for icon link alt text&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="march&amp;nbsp;2021_-_release_21.1"&gt;March&amp;nbsp;2021 - Release 21.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Appian Selenium API is released and supported&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: testing, Architecture&lt;/div&gt;
</description></item><item><title>Automated Testing with Appian Selenium API</title><link>https://community.appian.com/success/w/guide/3312/automated-testing-with-appian-selenium-api/revision/33</link><pubDate>Wed, 05 Mar 2025 20:48:14 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:af6be428-e229-4a89-9844-d99ca095396c</guid><dc:creator>Appian Max Team</dc:creator><description>Revision 33 posted to Guide by Appian Max Team on 3/5/2025 8:48:14 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;
&lt;ul style="font-size:110%;"&gt;
&lt;li&gt;Appian 22.2 and above&lt;/li&gt;
&lt;li&gt;Java Runtime Environment 11&lt;/li&gt;
&lt;li&gt;Chrome or Firefox browsers
&lt;div class="callout-box callout-info"&gt;If using Chrome, we recommend using &lt;a href="https://developer.chrome.com/blog/chrome-for-testing/"&gt;Chrome For Testing&lt;/a&gt; for a more consistent testing experience.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;An IDE, such as IntelliJ IDEA or Eclipse&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="setup"&gt;Setup&lt;/h2&gt;
&lt;p&gt;The &lt;a href="/b/appmarket/posts/appian_2d00_selenium_2d00_api"&gt;Appian Selenium API&lt;/a&gt; plug-in is a Java library which allows you to write automated tests for your Appian UIs. It contains methods which allow you to interact with Appian components in a browser. It provides methods and fixtures to interact with Appian applications in its various environments, e.g. Tempo or Sites. When writing tests, be sure to use methods from the correct fixture for the environment under test, e.g. use SitesFixture where possible to test Sites. Methods defined in fixtures that are intended for different environments are not guaranteed to work in future versions of the plugin.&lt;/p&gt;
&lt;p&gt;It can be used in a Java application or integrated directly into any Selenium or Java-based testing tool.&lt;/p&gt;
&lt;p&gt;Appian Selenium API contains the underlying Selenium methods used by &lt;a href="/b/appmarket/posts/cucumber-for-appian"&gt;Cucumber for Appian&lt;/a&gt; and &lt;a href="/b/appmarket/posts/fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;, but offers you more flexibility by allowing you to define your own automated test cases. You can create your own Cucumber Step Definitions, your own testNG test, or the Java Framework of your choosing. You are no longer tied to Cucumber for Appian or FitNesse for Appian yet you get the same ease and simplicity of those respective frameworks.&lt;/p&gt;
&lt;ol style="font-size:110%;"&gt;
&lt;li&gt;Open this project in an IDE, such as IntelliJ IDEA or Eclipse.&lt;/li&gt;
&lt;li&gt;Update configurations:
&lt;ol&gt;
&lt;li&gt;&amp;nbsp;Open file &lt;strong&gt;configs/custom.properties&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;Update &lt;strong&gt;automated.testing.hom&lt;/strong&gt;e with the path to this installation. Examples:
&lt;ol&gt;
&lt;li&gt;Windows: &lt;strong&gt;automated.testing.home=C:\\testFolder\\appian-selenium-api-example-java&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Mac: &lt;strong&gt;automated.testing.home=/Users/tester/Desktop/appian-selenium-api-example-java&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Update &lt;strong&gt;chrome.driver.home&lt;/strong&gt; with the path to the Chrome driver that comes with this installation. Examples: * Windows: &lt;strong&gt;automated.testing.home=C:\\testFolder\\appian-selenium-api-example-java\\lib\\drivers\\chromedriver.exe&lt;/strong&gt; * Mac: &lt;strong&gt;automated.testing.home=/Users/tester/Desktop/appian-selenium-api-example-java/lib/drivers/chromedriver-mac&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Open file&lt;strong&gt; configs/users.properties&lt;/strong&gt;, for each username used in a test add a line in the format of &lt;strong&gt;&amp;lt;username&amp;gt;=&amp;lt;password&amp;gt;&lt;/strong&gt; to this file.
&lt;ol&gt;
&lt;li&gt;If you prefer not to disclose your password in plain text, you can also choose to use &lt;strong&gt;com.appiancorp.ps.automatedtest.fixture.BaseFixture.loginIntoWithUsernameAndPassword&lt;/strong&gt; fixture method to login by passing in the password from a system property value.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Open &amp;quot;src/main/java/com/appiancorp/example/HelloAppian.java&amp;quot;:
&lt;ol&gt;
&lt;li&gt;Update &lt;strong&gt;TEST_SITE_URL&lt;/strong&gt; to your Appian URL, such as &lt;strong&gt;protected static String TEST_SITE_URL = &amp;quot;https://example.appiancloud.com/suite&amp;quot;;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Update &lt;strong&gt;TEST_USERNAME&lt;/strong&gt; with a username, such as &lt;strong&gt;protected static String TEST_USERNAME = &amp;quot;tester.tester&amp;quot;;&lt;/strong&gt; * Make sure this user exists in &lt;strong&gt;configs/users.properties&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Run the &lt;strong&gt;main()&lt;/strong&gt; method of this class:
&lt;ol&gt;
&lt;li&gt;&amp;nbsp;You should see that a Chrome browser will open up, and the fixture commands in &lt;strong&gt;HelloAppian.java&lt;/strong&gt; will execute accordingly.&lt;/li&gt;
&lt;li&gt;Note that this test will fail since your site might not have an action &amp;quot;Create a Case&amp;quot; under menu &amp;quot;Actions&amp;quot; that opens up an interface that has a &amp;quot;Submit&amp;quot; button.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="features"&gt;Features&lt;/h2&gt;
&lt;p&gt;Multiple browser support&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chrome&lt;/li&gt;
&lt;li&gt;Firefox&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="benefits"&gt;Benefits&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Define your own integration tests without being limited by a third-party testing tool&lt;/li&gt;
&lt;li&gt;Selenium-based test scripts can be created for reusability throughout test suites&lt;/li&gt;
&lt;li&gt;Methods created specifically to operate within Appian applications and Tempo&lt;/li&gt;
&lt;li&gt;Test scripts do not need to be updated when upgrading between supported Appian versions&lt;/li&gt;
&lt;li&gt;Test scripts are easily updated for new UI changes to a form or interface&lt;/li&gt;
&lt;li&gt;Appian design knowledge is not required to create test scripts&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="release_notes"&gt;Release Notes&lt;/h2&gt;
&lt;h3 id="25.1"&gt;March 2025 - Release 25.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Added support for defining and using custom locales. Use create appian locale | PATH TO File. This method must be called after setting the version.&lt;br /&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;File must be JSON file with the format:&amp;nbsp;{ &amp;quot;dateFormats&amp;quot;: [ { "label": "dateFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "dateDisplayFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "timeFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "timeDisplayFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "datetimeFormat", "value": &amp;lt;FORMAT_STRING&amp;gt; }, { "label": "datetimeDisplayFormat","value": &amp;lt;FORMAT_STRING&amp;gt; } ], &amp;quot;labels&amp;quot;: [ { "label": "acceptButton", "value": "Accept" } ], &amp;quot;locale&amp;quot;: &amp;lt;LOCALE_CODE&amp;gt; }&lt;!-- notionvc: a0caf744-193a-430a-a07c-8fec6fed1e37 --&gt;&lt;!-- notionvc: bac86f8d-84e2-4689-b153-1bb90e3d5c2e --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="24.3"&gt;August 2024 - Release 24.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Added built-in retry to click operation in case of element not interactable exception.&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Updated the milestone locator.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="24.2"&gt;June 2024 - Release 24.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Updated locator for site menu links&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Created method which supports clicking on text within an interface. This is particularly useful for nested cards such as tab layouts, but can also be used as a fallback when existing methods don&amp;#39;t work. This method is available for all Appian versions.&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Click operation on Card layout will be performed on the left side of the element instead of the right. We&amp;#39;re not expecting any impact on existing test cases.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;March 2024 - Release 24.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Support for Appian version 24.1&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Adds support for collapsing/opening sidebars&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;ClickOnCard updated to support clicking on cards with complex content. For example, the method can now click on cards that have a component nested in multiple layouts within the card&lt;!--mce:protected %3C%21--mce%3Aprotected%20%253C%2521--mce%253Aprotected%2520%25253C%252521--%252520notionvc%25253A%252520c9bfab53-e4e1-4301-9c43-08f4d6f59a50%252520--%25253E--%253E--%3E--&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;November&amp;nbsp;2023 - Release 23.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: &lt;span style="font-weight:400;"&gt;Project has been updated to require Java 11 JRE&lt;/span&gt;&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Support for Appian version 23.4&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for the side navigation menu in sites&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for downloading charts&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add support for buttons configured with custom colors&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Honor the download directory given in custom.properties for Remote Drivers&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Update dropdowns for versions greater than 23.3 to ignore the aria-checked value&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Fixed Populate Record Type Data Range User Filter method&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;August 2023 - Release 23.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: &lt;span style="font-weight:400;"&gt;Project has been updated to require Java 11 JRE&lt;/span&gt;&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Enhancements
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Supports Appian version 23.3&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Added functionality to interact with new site group headers&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Updated to Selenium 4.11.0&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Update checkboxes to support CARD style for 23.3 and later Appian versions&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2.1"&gt;June&amp;nbsp;2023 - Release 23.2.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: Updates to site navigation in the 23.2 product breaks the use of the clickOnMenu method defined in TempoFixtures for site environments. clickOnMenu, and other navigation methods defined in TempoFixtures, are guaranteed&amp;nbsp;to work only in Tempo environments. Use the clickOnSitePage method defined in SitesFixtures instead&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Update pickers to recognize selections with links (e.g. Record Pickers)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june&amp;nbsp;2023_-_release_23.2"&gt;June&amp;nbsp;2023 - Release 23.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Supports Appian version 23.2
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: Updates to site navigation in the 23.2 product breaks the use of the clickOnMenu method defined in TempoFixtures for site environments. clickOnMenu, and other navigation methods defined in TempoFixtures, are guaranteed&amp;nbsp;to work only in Tempo environments. Use the clickOnSitePage method defined in SitesFixtures instead&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="may_2023_-_release_23.1.2"&gt;May 2023 - Release 23.1.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Fixes an issue where Dropdowns with Search were not working&lt;/li&gt;
&lt;li&gt;Fixes an Issue where verifyText did not work on multi-node components&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="february_2023_-_release_23.1"&gt;February 2023 - Release 23.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Supports Appian version 23.1&lt;/li&gt;
&lt;li&gt;Updated locator for Dropdown class&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li&gt;Update CVEs&lt;/li&gt;
&lt;li&gt;Update scripts (start.bat, start-mac.sh, start-unix.sh, runFitNesseTest.sh) to reference the new fitnesse-20221219-standalone.jar&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august&amp;nbsp;2022_-_release_22.3"&gt;August&amp;nbsp;2022 - Release 22.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Appian Selenium API is released and supported&lt;/li&gt;
&lt;li&gt;Removed support for 20.3&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="november&amp;nbsp;2021_-_release_21.4"&gt;November&amp;nbsp;2021 - Release 21.4&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li&gt;Support new card choice components&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Update CVEs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="august&amp;nbsp;2021_-_release_21.3"&gt;August&amp;nbsp;2021 - Release 21.3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for radio button card&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for date picker&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="june_2021_-_release_21.2"&gt;June 2021 - Release 21.2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Support new SectionLayout&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Upgrade Selenium Server to 3.141.59&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Fixes
&lt;ul&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for radio button card&lt;/li&gt;
&lt;li class="ql-indent-1"&gt;Fix bug for icon link alt text&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="march&amp;nbsp;2021_-_release_21.1"&gt;March&amp;nbsp;2021 - Release 21.1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Appian Selenium API is released and supported&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: testing, Architecture&lt;/div&gt;
</description></item><item><title>Writing to Synced Record Types at High Throughput</title><link>https://community.appian.com/success/w/guide/3623/writing-to-synced-record-types-at-high-throughput/revision/32</link><pubDate>Wed, 05 Mar 2025 20:26:34 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:c655af54-6f28-49d4-9fdc-87a90630339c</guid><dc:creator>Appian Max Team</dc:creator><description>Revision 32 posted to Guide by Appian Max Team on 3/5/2025 8:26:34 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Appian&amp;#39;s &lt;a href="https://docs.appian.com/suite/help/latest/data-fabric.html"&gt;data fabric&lt;/a&gt; allows you to unify, secure, and optimize data spread across the enterprise. Typically, writing and syncing data in record types is as easy as using one of Appian&amp;rsquo;s smart services like Write Records, Write to Data Store Entity, and Write to Multiple Data Store Entities. However, when designing autoscaled processes, you may want to avoid using these smart services directly. Synced record types are limited to handling ~1,000 write requests per minute for processes writing data in small batches (1-10 rows).&lt;/p&gt;
&lt;p&gt;Trying to sync data above this level of throughput will fail and can cause record type invalidations. When using the Write Record smart service, writes will be throttled when exceeding a certain limit. This means that the nodes will fail and must be manually restarted, but the synced record type will remain available. When using Write to Data Store, failed writes will cause an invalidation, bringing down the impacted record type until a manual full sync is performed.&lt;/p&gt;
&lt;p&gt;This guide explains how to design a process that supports writes to data fabric when peak times require more than ~1,000 write requests per minute across all of the applications on your site. This is accomplished through an incremental sync pattern where data is synced into the record types independently from the writes to the source table in large batches enabling up to 200,000 rows to be synced per minute.&lt;/p&gt;
&lt;h2 id="example_process"&gt;Example Process&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s say we have a process model with Autoscale enabled, which receives data over an API call, performs some transformations on the data, and then writes a single record to a synced record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1676x798/__key/communityserver-wikis-components-files/00-00-00-00-46/example_2D00_process.png" /&gt;&lt;/div&gt;
&lt;p&gt;Typically, the API is called only 200 to 300 times per minute. However, at peak times, the API is called over 10,000 times in a single minute. At these peak times, the Write Records node fails due to data sync limitations. Upon reaching data sync write throughput limitations, write performance will degrade, leading to request timeouts. Failed requests will return either &amp;#39;could not obtain a reservation within the time limit&amp;#39; or &amp;#39;the request has timed out due to the system being busy.&amp;#39;&lt;/p&gt;
&lt;h2 id="deferred_sync_pattern"&gt;Deferred Sync Pattern&lt;/h2&gt;
&lt;p&gt;In order to allow the process model to continue to process data even in times of peak load, we need to implement an independent sync pattern where data is synced in batches rather than one row at a time.&lt;/p&gt;
&lt;p&gt;To avoid automatically syncing data to data fabric from the process model, an independent data store or a connected system data source must be created and used in the autoscaled process model to write data. This will allow us to write data only to the source table at first, and sync it in the record type independently.&lt;/p&gt;
&lt;h3 id="mcetoc_1iipe0q170"&gt;Configure a New Data Source, Data Type, and Data Store&lt;/h3&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new &lt;a href="https://docs.appian.com/suite/help/24.4/data-source-connected-systems.html"&gt;Data Source Connected System&lt;/a&gt; that connects to the same database as your existing record type.&lt;/li&gt;
&lt;li&gt;Create a CDT from the table that already backs the synced record type.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/2386x1038/__key/communityserver-wikis-components-files/00-00-00-00-46/jlt_5F00_record_2D00_1.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Create a new data store with that CDT as an entity. Use the connected system data source you just created as the data source.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1658x968/__key/communityserver-wikis-components-files/00-00-00-00-46/data_2D00_schema_2D00_2.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="callout-box callout-info"&gt;If your record type does not already have a modifiedOn timestamp, you will need to add that to your data structure, and ensure it is being updated every time the row is updated.&lt;/div&gt;
&lt;h3&gt;Replace the Write Records Node&lt;/h3&gt;
&lt;p&gt;In the autoscaled process model:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Update the process variable that holds the data being written to use a CDT instead of a record type (the one we just created). Update all usage of this variable.&lt;/li&gt;
&lt;li&gt;Replace the Write Records node with a Write to Data Store Entity node, using a constant for the new data store we just created.&lt;/li&gt;
&lt;li&gt;Click Save &amp;amp; Publish.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, your autoscaled process model will only write to the source table instead of automatically syncing data in the record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x260/__key/communityserver-wikis-components-files/00-00-00-00-46/records_2D00_node.png" /&gt;&lt;/div&gt;
&lt;h3&gt;Sync Batches of Data Every 5 Minutes&lt;/h3&gt;
&lt;p&gt;After re-configuring the autoscaled model, create a separate process model running without autoscale enabled to incrementally sync data the record type from the source table.&lt;/p&gt;
&lt;p&gt;To configure incremental sync:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new process model without autoscale enabled.&lt;/li&gt;
&lt;li&gt;Create process variables to track the timestamp at which data was last synced (lastSyncTime) and the list of IDs to sync (recordsToSync).&lt;/li&gt;
&lt;li&gt;Set the default value of the lastSyncTime variable to now()-5. This will cause the first run of the process to sync anything updated after 5 minutes ago.&lt;/li&gt;
&lt;li&gt;Configure a timer event on the start node to run the process every 5 minutes.&lt;/li&gt;
&lt;li&gt;In a new expression rule, query the IDs of any rows modified after the lastSyncTime timestamp, using a query that looks like this:
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;pre class="ui-code" data-mode="text"&gt;a!queryEntity(
  entity: cons!JLT_RecordEntity,
  query: a!query(
    selection: a!querySelection(
      columns: {
        a!queryColumn(
          field: &amp;quot;id&amp;quot;
        )
      }
    ),
    logicalExpression: a!queryLogicalExpression(
      operator: &amp;quot;AND&amp;quot;,
      filters: {
        a!queryFilter(
          field: &amp;quot;modifiedOn&amp;quot;,
          operator: &amp;quot;&amp;gt;&amp;quot;,
          value: ri!lastSyncTime
        )
      },
      ignoreFiltersWithEmptyValues: true
    ),
    pagingInfo: a!pagingInfo(
      startIndex: 1,
      batchSize: 50,
      sort: a!sortInfo(
        field: &amp;quot;modifiedOn&amp;quot;,
        ascending: true
      )
    )
  ),
  fetchTotalCount: false
)
&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Add a Script Task to the process and call the expression rule created above, passing in lastSyncTime.&lt;/li&gt;
&lt;li&gt;Add a Sync Records smart service node to sync the IDs you just queried in the record type. Since this will most likely require syncing more than 1000 rows at a time, you will need to &lt;a href="https://docs.appian.com/suite/help/24.4/Sync_Records_Smart_Service.html#syncing-more-than-1000-records"&gt;use a loop&lt;/a&gt; to iterate over all rows that need to be synced.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x838/__key/communityserver-wikis-components-files/00-00-00-00-46/loop.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;rsquo;s it! This pattern of ingesting data in larger batches can support syncing up to 200,000 rows per minute in record types across all applications on your site, with data being updated in 5 minutes or less.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: records, design patterns, Architecture, data fabric&lt;/div&gt;
</description></item><item><title>Writing to Synced Record Types at High Throughput</title><link>https://community.appian.com/success/w/guide/3623/writing-to-synced-record-types-at-high-throughput/revision/31</link><pubDate>Wed, 05 Mar 2025 20:25:53 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:c655af54-6f28-49d4-9fdc-87a90630339c</guid><dc:creator>Appian Max Team</dc:creator><description>Revision 31 posted to Guide by Appian Max Team on 3/5/2025 8:25:53 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Appian&amp;#39;s &lt;a href="https://docs.appian.com/suite/help/latest/data-fabric.html"&gt;data fabric&lt;/a&gt; allows you to unify, secure, and optimize data spread across the enterprise. Typically, writing and syncing data in record types is as easy as using one of Appian&amp;rsquo;s smart services like Write Records, Write to Data Store Entity, and Write to Multiple Data Store Entities. However, when designing autoscaled processes, you may want to avoid using these smart services directly. Synced record types are limited to handling ~1,000 write requests per minute for processes writing data in small batches (1-10 rows).&lt;/p&gt;
&lt;p&gt;Trying to sync data above this level of throughput will fail and can cause record type invalidations. When using the Write Record smart service, writes will be throttled when exceeding a certain limit. This means that the nodes will fail and must be manually restarted, but the synced record type will remain available. When using Write to Data Store, failed writes will cause an invalidation, bringing down the impacted record type until a manual full sync is performed.&lt;/p&gt;
&lt;p&gt;This guide explains how to design a process that supports writes to data fabric when peak times require more than ~1,000 write requests per minute across all of the applications on your site. This is accomplished through an incremental sync pattern where data is synced into the record types independently from the writes to the source table in large batches enabling up to 200,000 rows to be synced per minute.&lt;/p&gt;
&lt;h2 id="example_process"&gt;Example Process&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s say we have a process model with Autoscale enabled, which receives data over an API call, performs some transformations on the data, and then writes a single record to a synced record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1676x798/__key/communityserver-wikis-components-files/00-00-00-00-46/example_2D00_process.png" /&gt;&lt;/div&gt;
&lt;p&gt;Typically, the API is called only 200 to 300 times per minute. However, at peak times, the API is called over 10,000 times in a single minute. At these peak times, the Write Records node fails due to data sync limitations. Upon reaching data sync write throughput limitations, write performance will degrade, leading to request timeouts. Failed requests will return either &amp;#39;could not obtain a reservation within the time limit&amp;#39; or &amp;#39;the request has timed out due to the system being busy.&amp;#39;&lt;/p&gt;
&lt;h2 id="deferred_sync_pattern"&gt;Deferred Sync Pattern&lt;/h2&gt;
&lt;p&gt;In order to allow the process model to continue to process data even in times of peak load, we need to implement an independent sync pattern where data is synced in batches rather than one row at a time.&lt;/p&gt;
&lt;p&gt;To avoid automatically syncing data to data fabric from the process model, an independent data store or a connected system data source must be created and used in the autoscaled process model to write data. This will allow us to write data only to the source table at first, and sync it in the record type independently.&lt;/p&gt;
&lt;h3 id="mcetoc_1iipe0q170"&gt;Configure a New Data Source, Data Type, and Data Store&lt;/h3&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new &lt;a href="https://docs.appian.com/suite/help/24.4/data-source-connected-systems.html"&gt;Data Source Connected System&lt;/a&gt; that connects to the same database as your existing record type.&lt;/li&gt;
&lt;li&gt;Create a CDT from the table that already backs the synced record type.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/2386x1038/__key/communityserver-wikis-components-files/00-00-00-00-46/jlt_5F00_record_2D00_1.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Create a new data store with that CDT as an entity. Use the connected system data source you just created as the data source.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1658x968/__key/communityserver-wikis-components-files/00-00-00-00-46/data_2D00_schema_2D00_2.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="callout-box callout-info"&gt;If your record type does not already have a modifiedOn timestamp, you will need to add that to your data structure, and ensure it is being updated every time the row is updated.&lt;/div&gt;
&lt;h3&gt;Replace the Write Records Node&lt;/h3&gt;
&lt;p&gt;In the autoscaled process model:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Update the process variable that holds the data being written to use a CDT instead of a record type (the one we just created). Update all usage of this variable.&lt;/li&gt;
&lt;li&gt;Replace the Write Records node with a Write to Data Store Entity node, using a constant for the new data store we just created.&lt;/li&gt;
&lt;li&gt;Click Save &amp;amp; Publish.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, your autoscaled process model will only write to the source table instead of automatically syncing data in the record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x260/__key/communityserver-wikis-components-files/00-00-00-00-46/records_2D00_node.png" /&gt;&lt;/div&gt;
&lt;h3&gt;Sync Batches of Data Every 5 Minutes&lt;/h3&gt;
&lt;p&gt;After re-configuring the autoscaled model, create a separate process model running without autoscale enabled to incrementally sync data the record type from the source table.&lt;/p&gt;
&lt;p&gt;To configure incremental sync:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new process model without autoscale enabled.&lt;/li&gt;
&lt;li&gt;Create process variables to track the timestamp at which data was last synced (lastSyncTime) and the list of IDs to sync (recordsToSync).&lt;/li&gt;
&lt;li&gt;Set the default value of the lastSyncTime variable to now()-5. This will cause the first run of the process to sync anything updated after 5 minutes ago.&lt;/li&gt;
&lt;li&gt;Configure a timer event on the start node to run the process every 5 minutes.&lt;/li&gt;
&lt;li&gt;In a new expression rule, query the IDs of any rows modified after the lastSyncTime timestamp, using a query that looks like this:
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;pre class="ui-code" data-mode="text"&gt;a!queryEntity(
  entity: cons!JLT_RecordEntity,
  query: a!query(
    selection: a!querySelection(
      columns: {
        a!queryColumn(
          field: &amp;quot;id&amp;quot;
        )
      }
    ),
    logicalExpression: a!queryLogicalExpression(
      operator: &amp;quot;AND&amp;quot;,
      filters: {
        a!queryFilter(
          field: &amp;quot;modifiedOn&amp;quot;,
          operator: &amp;quot;&amp;gt;&amp;quot;,
          value: ri!lastSyncTime
        )
      },
      ignoreFiltersWithEmptyValues: true
    ),
    pagingInfo: a!pagingInfo(
      startIndex: 1,
      batchSize: 50,
      sort: a!sortInfo(
        field: &amp;quot;modifiedOn&amp;quot;,
        ascending: true
      )
    )
  ),
  fetchTotalCount: false
)
&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Add a Script Task to the process and call the expression rule created above, passing in lastSyncTime.&lt;/li&gt;
&lt;li&gt;Add a Sync Records smart service node to sync the IDs you just queried in the record type. Since this will most likely require syncing more than 1000 rows at a time, you will need to &lt;a href="https://docs.appian.com/suite/help/24.4/Sync_Records_Smart_Service.html#syncing-more-than-1000-records"&gt;use a loop&lt;/a&gt; to iterate over all rows that need to be synced.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x838/__key/communityserver-wikis-components-files/00-00-00-00-46/loop.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;rsquo;s it! This pattern of ingesting data in larger batches can support syncing up to 200,000 rows per minute in record types across all applications on your site, with data being updated in 5 minutes or less.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: records, design patterns, Architecture&lt;/div&gt;
</description></item><item><title>Writing to Synced Record Types at High Throughput</title><link>https://community.appian.com/success/w/guide/3623/writing-to-synced-record-types-at-high-throughput/revision/30</link><pubDate>Wed, 29 Jan 2025 17:26:03 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:c655af54-6f28-49d4-9fdc-87a90630339c</guid><dc:creator>joel.larin</dc:creator><description>Revision 30 posted to Guide by joel.larin on 1/29/2025 5:26:03 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Appian&amp;#39;s &lt;a href="https://docs.appian.com/suite/help/latest/data-fabric.html"&gt;data fabric&lt;/a&gt; allows you to unify, secure, and optimize data spread across the enterprise. Typically, writing and syncing data in record types is as easy as using one of Appian&amp;rsquo;s smart services like Write Records, Write to Data Store Entity, and Write to Multiple Data Store Entities. However, when designing autoscaled processes, you may want to avoid using these smart services directly. Synced record types are limited to handling ~1,000 write requests per minute for processes writing data in small batches (1-10 rows).&lt;/p&gt;
&lt;p&gt;Trying to sync data above this level of throughput will fail and can cause record type invalidations. When using the Write Record smart service, writes will be throttled when exceeding a certain limit. This means that the nodes will fail and must be manually restarted, but the synced record type will remain available. When using Write to Data Store, failed writes will cause an invalidation, bringing down the impacted record type until a manual full sync is performed.&lt;/p&gt;
&lt;p&gt;This guide explains how to design a process that supports writes to data fabric when peak times require more than ~1,000 write requests per minute across all of the applications on your site. This is accomplished through an incremental sync pattern where data is synced into the record types independently from the writes to the source table in large batches enabling up to 200,000 rows to be synced per minute.&lt;/p&gt;
&lt;h2 id="example_process"&gt;Example Process&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s say we have a process model with Autoscale enabled, which receives data over an API call, performs some transformations on the data, and then writes a single record to a synced record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1676x798/__key/communityserver-wikis-components-files/00-00-00-00-46/example_2D00_process.png" /&gt;&lt;/div&gt;
&lt;p&gt;Typically, the API is called only 200 to 300 times per minute. However, at peak times, the API is called over 10,000 times in a single minute. At these peak times, the Write Records node fails due to data sync limitations. Upon reaching data sync write throughput limitations, write performance will degrade, leading to request timeouts. Failed requests will return either &amp;#39;could not obtain a reservation within the time limit&amp;#39; or &amp;#39;the request has timed out due to the system being busy.&amp;#39;&lt;/p&gt;
&lt;h2 id="deferred_sync_pattern"&gt;Deferred Sync Pattern&lt;/h2&gt;
&lt;p&gt;In order to allow the process model to continue to process data even in times of peak load, we need to implement an independent sync pattern where data is synced in batches rather than one row at a time.&lt;/p&gt;
&lt;p&gt;To avoid automatically syncing data to data fabric from the process model, an independent data store or a connected system data source must be created and used in the autoscaled process model to write data. This will allow us to write data only to the source table at first, and sync it in the record type independently.&lt;/p&gt;
&lt;h3 id="mcetoc_1iipe0q170"&gt;Configure a New Data Source, Data Type, and Data Store&lt;/h3&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new &lt;a href="https://docs.appian.com/suite/help/24.4/data-source-connected-systems.html"&gt;Data Source Connected System&lt;/a&gt; that connects to the same database as your existing record type.&lt;/li&gt;
&lt;li&gt;Create a CDT from the table that already backs the synced record type.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/2386x1038/__key/communityserver-wikis-components-files/00-00-00-00-46/jlt_5F00_record_2D00_1.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Create a new data store with that CDT as an entity. Use the connected system data source you just created as the data source.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1658x968/__key/communityserver-wikis-components-files/00-00-00-00-46/data_2D00_schema_2D00_2.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="callout-box callout-info"&gt;If your record type does not already have a modifiedOn timestamp, you will need to add that to your data structure, and ensure it is being updated every time the row is updated.&lt;/div&gt;
&lt;h3&gt;Replace the Write Records Node&lt;/h3&gt;
&lt;p&gt;In the autoscaled process model:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Update the process variable that holds the data being written to use a CDT instead of a record type (the one we just created). Update all usage of this variable.&lt;/li&gt;
&lt;li&gt;Replace the Write Records node with a Write to Data Store Entity node, using a constant for the new data store we just created.&lt;/li&gt;
&lt;li&gt;Click Save &amp;amp; Publish.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, your autoscaled process model will only write to the source table instead of automatically syncing data in the record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x260/__key/communityserver-wikis-components-files/00-00-00-00-46/records_2D00_node.png" /&gt;&lt;/div&gt;
&lt;h3&gt;Sync Batches of Data Every 5 Minutes&lt;/h3&gt;
&lt;p&gt;After re-configuring the autoscaled model, create a separate process model running without autoscale enabled to incrementally sync data the record type from the source table.&lt;/p&gt;
&lt;p&gt;To configure incremental sync:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new process model without autoscale enabled.&lt;/li&gt;
&lt;li&gt;Create process variables to track the timestamp at which data was last synced (lastSyncTime) and the list of IDs to sync (recordsToSync).&lt;/li&gt;
&lt;li&gt;Set the default value of the lastSyncTime variable to now()-5. This will cause the first run of the process to sync anything updated after 5 minutes ago.&lt;/li&gt;
&lt;li&gt;Configure a timer event on the start node to run the process every 5 minutes.&lt;/li&gt;
&lt;li&gt;In a new expression rule, query the IDs of any rows modified after the lastSyncTime timestamp, using a query that looks like this:
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;pre class="ui-code" data-mode="text"&gt;a!queryEntity(
  entity: cons!JLT_RecordEntity,
  query: a!query(
    selection: a!querySelection(
      columns: {
        a!queryColumn(
          field: &amp;quot;id&amp;quot;
        )
      }
    ),
    logicalExpression: a!queryLogicalExpression(
      operator: &amp;quot;AND&amp;quot;,
      filters: {
        a!queryFilter(
          field: &amp;quot;modifiedOn&amp;quot;,
          operator: &amp;quot;&amp;gt;&amp;quot;,
          value: ri!lastSyncTime
        )
      },
      ignoreFiltersWithEmptyValues: true
    ),
    pagingInfo: a!pagingInfo(
      startIndex: 1,
      batchSize: 50,
      sort: a!sortInfo(
        field: &amp;quot;modifiedOn&amp;quot;,
        ascending: true
      )
    )
  ),
  fetchTotalCount: false
)
&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Add a Script Task to the process and call the expression rule created above, passing in lastSyncTime.&lt;/li&gt;
&lt;li&gt;Add a Sync Records smart service node to sync the IDs you just queried in the record type. Since this will most likely require syncing more than 1000 rows at a time, you will need to &lt;a href="https://docs.appian.com/suite/help/24.4/Sync_Records_Smart_Service.html#syncing-more-than-1000-records"&gt;use a loop&lt;/a&gt; to iterate over all rows that need to be synced.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x838/__key/communityserver-wikis-components-files/00-00-00-00-46/loop.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;rsquo;s it! This pattern of ingesting data in larger batches can support syncing up to 200,000 rows per minute in record types across all applications on your site, with data being updated in 5 minutes or less.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: records, design patterns, Architecture&lt;/div&gt;
</description></item><item><title>Writing to Synced Record Types at High Throughput</title><link>https://community.appian.com/success/w/guide/3623/writing-to-synced-record-types-at-high-throughput/revision/29</link><pubDate>Wed, 29 Jan 2025 17:24:11 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:c655af54-6f28-49d4-9fdc-87a90630339c</guid><dc:creator>joel.larin</dc:creator><description>Revision 29 posted to Guide by joel.larin on 1/29/2025 5:24:11 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Appian&amp;#39;s &lt;a href="https://docs.appian.com/suite/help/latest/data-fabric.html"&gt;data fabric&lt;/a&gt; allows you to unify, secure, and optimize data spread across the enterprise. Typically, writing and syncing data in record types is as easy as using one of Appian&amp;rsquo;s smart services like Write Records, Write to Data Store Entity, and Write to Multiple Data Store Entities. However, when designing autoscaled processes, you may want to avoid using these smart services directly. Synced record types are limited to handling ~1,000 write requests per minute for processes writing data in small batches (1-10 rows).&lt;/p&gt;
&lt;p&gt;Trying to sync data above this level of throughput will fail and can cause record type invalidations. When using the Write Record smart service, writes will be throttled when exceeding a certain limit. This means that the nodes will fail and must be manually restarted, but the synced record type will remain available. When using Write to Data Store, failed writes will cause an invalidation, bringing down the impacted record type until a manual full sync is performed.&lt;/p&gt;
&lt;p&gt;This guide explains how to design a process that supports writes to data fabric when peak times require more than ~1,000 write requests per minute across all of the applications on your site. This is accomplished through an incremental sync pattern where data is synced into the record types independently from the writes to the source table in large batches enabling up to 200,000 rows to be synced per minute.&lt;/p&gt;
&lt;h2 id="example_process"&gt;Example Process&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s say we have a process model with Autoscale enabled, which receives data over an API call, performs some transformations on the data, and then writes a single record to a synced record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1676x798/__key/communityserver-wikis-components-files/00-00-00-00-46/example_2D00_process.png" /&gt;&lt;/div&gt;
&lt;p&gt;Typically, the API is called only 200 to 300 times per minute. However, at peak times, the API is called over 10,000 times in a single minute. At these peak times, the Write Records node fails due to data sync limitations. Upon reaching data sync write throughput limitations, write performance will degrade, leading to request timeouts. Failed requests will return either &amp;#39;could not obtain a reservation within the time limit&amp;#39; or &amp;#39;the request has timed out due to the system being busy.&amp;#39;&lt;/p&gt;
&lt;h2 id="deferred_sync_pattern"&gt;Deferred Sync Pattern&lt;/h2&gt;
&lt;p&gt;In order to allow the process model to continue to process data even in times of peak load, we need to implement an independent sync pattern where data is synced in batches rather than one row at a time.&lt;/p&gt;
&lt;p&gt;To avoid automatically syncing data to data fabric from the process model, an independent data store or a connected system data source must be created and used in the autoscaled process model to write data. This will allow us to write data only to the source table at first, and sync it in the record type independently.&lt;/p&gt;
&lt;h3 id="mcetoc_1iipe0q170"&gt;Configure a New Data Source, Data Type, and Data Store&lt;/h3&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new &lt;a href="https://docs.appian.com/suite/help/24.4/data-source-connected-systems.html"&gt;Data Source Connected System&lt;/a&gt; that connects to the same database as your existing record type.&lt;/li&gt;
&lt;li&gt;Create a CDT from the table that already backs the synced record type.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/2386x1038/__key/communityserver-wikis-components-files/00-00-00-00-46/jlt_5F00_record_2D00_1.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Create a new data store with that CDT as an entity. Use the connected system data source you just created as the data source.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/2144x1048/__key/communityserver-wikis-components-files/00-00-00-00-46/data_2D00_source_2D00_2.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="callout-box callout-info"&gt;If your record type does not already have a modifiedOn timestamp, you will need to add that to your data structure, and ensure it is being updated every time the row is updated.&lt;/div&gt;
&lt;h3&gt;Replace the Write Records Node&lt;/h3&gt;
&lt;p&gt;In the autoscaled process model:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Update the process variable that holds the data being written to use a CDT instead of a record type (the one we just created). Update all usage of this variable.&lt;/li&gt;
&lt;li&gt;Replace the Write Records node with a Write to Data Store Entity node, using a constant for the new data store we just created.&lt;/li&gt;
&lt;li&gt;Click Save &amp;amp; Publish.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, your autoscaled process model will only write to the source table instead of automatically syncing data in the record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x260/__key/communityserver-wikis-components-files/00-00-00-00-46/records_2D00_node.png" /&gt;&lt;/div&gt;
&lt;h3&gt;Sync Batches of Data Every 5 Minutes&lt;/h3&gt;
&lt;p&gt;After re-configuring the autoscaled model, create a separate process model running without autoscale enabled to incrementally sync data the record type from the source table.&lt;/p&gt;
&lt;p&gt;To configure incremental sync:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new process model without autoscale enabled.&lt;/li&gt;
&lt;li&gt;Create process variables to track the timestamp at which data was last synced (lastSyncTime) and the list of IDs to sync (recordsToSync).&lt;/li&gt;
&lt;li&gt;Set the default value of the lastSyncTime variable to now()-5. This will cause the first run of the process to sync anything updated after 5 minutes ago.&lt;/li&gt;
&lt;li&gt;Configure a timer event on the start node to run the process every 5 minutes.&lt;/li&gt;
&lt;li&gt;In a new expression rule, query the IDs of any rows modified after the lastSyncTime timestamp, using a query that looks like this:
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;pre class="ui-code" data-mode="text"&gt;a!queryEntity(
  entity: cons!JLT_RecordEntity,
  query: a!query(
    selection: a!querySelection(
      columns: {
        a!queryColumn(
          field: &amp;quot;id&amp;quot;
        )
      }
    ),
    logicalExpression: a!queryLogicalExpression(
      operator: &amp;quot;AND&amp;quot;,
      filters: {
        a!queryFilter(
          field: &amp;quot;modifiedOn&amp;quot;,
          operator: &amp;quot;&amp;gt;&amp;quot;,
          value: ri!lastSyncTime
        )
      },
      ignoreFiltersWithEmptyValues: true
    ),
    pagingInfo: a!pagingInfo(
      startIndex: 1,
      batchSize: 50,
      sort: a!sortInfo(
        field: &amp;quot;modifiedOn&amp;quot;,
        ascending: true
      )
    )
  ),
  fetchTotalCount: false
)
&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Add a Script Task to the process and call the expression rule created above, passing in lastSyncTime.&lt;/li&gt;
&lt;li&gt;Add a Sync Records smart service node to sync the IDs you just queried in the record type. Since this will most likely require syncing more than 1000 rows at a time, you will need to &lt;a href="https://docs.appian.com/suite/help/24.4/Sync_Records_Smart_Service.html#syncing-more-than-1000-records"&gt;use a loop&lt;/a&gt; to iterate over all rows that need to be synced.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x838/__key/communityserver-wikis-components-files/00-00-00-00-46/loop.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;rsquo;s it! This pattern of ingesting data in larger batches can support syncing up to 200,000 rows per minute in record types across all applications on your site, with data being updated in 5 minutes or less.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: records, design patterns, Architecture&lt;/div&gt;
</description></item><item><title>Writing to Synced Record Types at High Throughput</title><link>https://community.appian.com/success/w/guide/3623/writing-to-synced-record-types-at-high-throughput/revision/28</link><pubDate>Wed, 29 Jan 2025 16:53:54 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:c655af54-6f28-49d4-9fdc-87a90630339c</guid><dc:creator>joel.larin</dc:creator><description>Revision 28 posted to Guide by joel.larin on 1/29/2025 4:53:54 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Appian&amp;#39;s &lt;a href="https://docs.appian.com/suite/help/latest/data-fabric.html"&gt;data fabric&lt;/a&gt; allows you to unify, secure, and optimize data spread across the enterprise. Typically, writing and syncing data in record types is as easy as using one of Appian&amp;rsquo;s smart services like Write Records, Write to Data Store Entity, and Write to Multiple Data Store Entities. However, when designing autoscaled processes, you may want to avoid using these smart services directly. Synced record types are limited to handling ~1,000 write requests per minute for processes writing data in small batches (1-10 rows).&lt;/p&gt;
&lt;p&gt;Trying to sync data above this level of throughput will fail and can cause record type invalidations. When using the Write Record smart service, writes will be throttled when exceeding a certain limit. This means that the nodes will fail and must be manually restarted, but the synced record type will remain available. When using Write to Data Store, failed writes will cause an invalidation, bringing down the impacted record type until a manual full sync is performed.&lt;/p&gt;
&lt;p&gt;This guide explains how to design a process that supports writes to data fabric when peak times require more than ~1,000 write requests per minute across all of the applications on your site. This is accomplished through an incremental sync pattern where data is synced into the record types independently from the writes to the source table in large batches enabling up to 200,000 rows to be synced per minute.&lt;/p&gt;
&lt;h2 id="example_process"&gt;Example Process&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s say we have a process model with Autoscale enabled, which receives data over an API call, performs some transformations on the data, and then writes a single record to a synced record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1676x798/__key/communityserver-wikis-components-files/00-00-00-00-46/example_2D00_process.png" /&gt;&lt;/div&gt;
&lt;p&gt;Typically, the API is called only 200 to 300 times per minute. However, at peak times, the API is called over 10,000 times in a single minute. At these peak times, the Write Records node fails due to data sync limitations. Upon reaching data sync write throughput limitations, write performance will degrade, leading to request timeouts. Failed requests will return either &amp;#39;could not obtain a reservation within the time limit&amp;#39; or &amp;#39;the request has timed out due to the system being busy.&amp;#39;&lt;/p&gt;
&lt;h2 id="deferred_sync_pattern"&gt;Deferred Sync Pattern&lt;/h2&gt;
&lt;p&gt;In order to allow the process model to continue to process data even in times of peak load, we need to implement an independent sync pattern where data is synced in batches rather than one row at a time.&lt;/p&gt;
&lt;p&gt;To avoid automatically syncing data to data fabric from the process model, an independent data store or a connected system data source must be created and used in the autoscaled process model to write data. This will allow us to write data only to the source table at first, and sync it in the record type independently.&lt;/p&gt;
&lt;h3 id="mcetoc_1iipe0q170"&gt;Configure a New Data Source, Data Type, and Data Store&lt;/h3&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new &lt;a href="https://docs.appian.com/suite/help/24.4/data-source-connected-systems.html"&gt;Data Source Connected System&lt;/a&gt; that connects to the same database as your existing record type.&lt;/li&gt;
&lt;li&gt;Create a CDT from the table that already backs the synced record type.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/2144x1048/__key/communityserver-wikis-components-files/00-00-00-00-46/cdt_2D00_table.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Create a new data store with that CDT as an entity. Use the connected system data source you just created as the data source.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/2144x1048/__key/communityserver-wikis-components-files/00-00-00-00-46/data_2D00_source_2D00_2.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="callout-box callout-info"&gt;If your record type does not already have a modifiedOn timestamp, you will need to add that to your data structure, and ensure it is being updated every time the row is updated.&lt;/div&gt;
&lt;h3&gt;Replace the Write Records Node&lt;/h3&gt;
&lt;p&gt;In the autoscaled process model:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Update the process variable that holds the data being written to use a CDT instead of a record type (the one we just created). Update all usage of this variable.&lt;/li&gt;
&lt;li&gt;Replace the Write Records node with a Write to Data Store Entity node, using a constant for the new data store we just created.&lt;/li&gt;
&lt;li&gt;Click Save &amp;amp; Publish.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, your autoscaled process model will only write to the source table instead of automatically syncing data in the record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x260/__key/communityserver-wikis-components-files/00-00-00-00-46/records_2D00_node.png" /&gt;&lt;/div&gt;
&lt;h3&gt;Sync Batches of Data Every 5 Minutes&lt;/h3&gt;
&lt;p&gt;After re-configuring the autoscaled model, create a separate process model running without autoscale enabled to incrementally sync data the record type from the source table.&lt;/p&gt;
&lt;p&gt;To configure incremental sync:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new process model without autoscale enabled.&lt;/li&gt;
&lt;li&gt;Create process variables to track the timestamp at which data was last synced (lastSyncTime) and the list of IDs to sync (recordsToSync).&lt;/li&gt;
&lt;li&gt;Set the default value of the lastSyncTime variable to now()-5. This will cause the first run of the process to sync anything updated after 5 minutes ago.&lt;/li&gt;
&lt;li&gt;Configure a timer event on the start node to run the process every 5 minutes.&lt;/li&gt;
&lt;li&gt;In a new expression rule, query the IDs of any rows modified after the lastSyncTime timestamp, using a query that looks like this:
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;pre class="ui-code" data-mode="text"&gt;a!queryEntity(
  entity: cons!JLT_RecordEntity,
  query: a!query(
    selection: a!querySelection(
      columns: {
        a!queryColumn(
          field: &amp;quot;id&amp;quot;
        )
      }
    ),
    logicalExpression: a!queryLogicalExpression(
      operator: &amp;quot;AND&amp;quot;,
      filters: {
        a!queryFilter(
          field: &amp;quot;modifiedOn&amp;quot;,
          operator: &amp;quot;&amp;gt;&amp;quot;,
          value: ri!lastSyncTime
        )
      },
      ignoreFiltersWithEmptyValues: true
    ),
    pagingInfo: a!pagingInfo(
      startIndex: 1,
      batchSize: 50,
      sort: a!sortInfo(
        field: &amp;quot;modifiedOn&amp;quot;,
        ascending: true
      )
    )
  ),
  fetchTotalCount: false
)
&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Add a Script Task to the process and call the expression rule created above, passing in lastSyncTime.&lt;/li&gt;
&lt;li&gt;Add a Sync Records smart service node to sync the IDs you just queried in the record type. Since this will most likely require syncing more than 1000 rows at a time, you will need to &lt;a href="https://docs.appian.com/suite/help/24.4/Sync_Records_Smart_Service.html#syncing-more-than-1000-records"&gt;use a loop&lt;/a&gt; to iterate over all rows that need to be synced.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x838/__key/communityserver-wikis-components-files/00-00-00-00-46/loop.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;rsquo;s it! This pattern of ingesting data in larger batches can support syncing up to 200,000 rows per minute in record types across all applications on your site, with data being updated in 5 minutes or less.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: records, design patterns, Architecture&lt;/div&gt;
</description></item><item><title>Writing to Synced Record Types at High Throughput</title><link>https://community.appian.com/success/w/guide/3623/writing-to-synced-record-types-at-high-throughput/revision/27</link><pubDate>Wed, 29 Jan 2025 16:51:11 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:c655af54-6f28-49d4-9fdc-87a90630339c</guid><dc:creator>joel.larin</dc:creator><description>Revision 27 posted to Guide by joel.larin on 1/29/2025 4:51:11 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Appian&amp;#39;s &lt;a href="https://docs.appian.com/suite/help/latest/data-fabric.html"&gt;data fabric&lt;/a&gt; allows you to unify, secure, and optimize data spread across the enterprise. Typically, writing and syncing data in record types is as easy as using one of Appian&amp;rsquo;s smart services like Write Records, Write to Data Store Entity, and Write to Multiple Data Store Entities. However, when designing autoscaled processes, you may want to avoid using these smart services directly. Synced record types are limited to handling ~1,000 write requests per minute for processes writing data in small batches (1-10 rows).&lt;/p&gt;
&lt;p&gt;Trying to sync data above this level of throughput will fail and can cause record type invalidations. When using the Write Record smart service, writes will be throttled when exceeding a certain limit. This means that the nodes will fail and must be manually restarted, but the synced record type will remain available. When using Write to Data Store, failed writes will cause an invalidation, bringing down the impacted record type until a manual full sync is performed.&lt;/p&gt;
&lt;p&gt;This guide explains how to design a process that supports writes to data fabric when peak times require more than ~1,000 write requests per minute across all of the applications on your site. This is accomplished through an incremental sync pattern where data is synced into the record types independently from the writes to the source table in large batches enabling up to 200,000 rows to be synced per minute.&lt;/p&gt;
&lt;h2 id="example_process"&gt;Example Process&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s say we have a process model with Autoscale enabled, which receives data over an API call, performs some transformations on the data, and then writes a single record to a synced record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1676x798/__key/communityserver-wikis-components-files/00-00-00-00-46/example_2D00_process.png" /&gt;&lt;/div&gt;
&lt;p&gt;Typically, the API is called only 200 to 300 times per minute. However, at peak times, the API is called over 10,000 times in a single minute. At these peak times, the Write Records node fails due to data sync limitations. Upon reaching data sync write throughput limitations, write performance will degrade, leading to request timeouts. Failed requests will return either &amp;#39;could not obtain a reservation within the time limit&amp;#39; or &amp;#39;the request has timed out due to the system being busy.&amp;#39;&lt;/p&gt;
&lt;h2 id="deferred_sync_pattern"&gt;Deferred Sync Pattern&lt;/h2&gt;
&lt;p&gt;In order to allow the process model to continue to process data even in times of peak load, we need to implement an independent sync pattern where data is synced in batches rather than one row at a time.&lt;/p&gt;
&lt;p&gt;To avoid automatically syncing data to data fabric from the process model, an independent data store or a connected system data source must be created and used in the autoscaled process model to write data. This will allow us to write data only to the source table at first, and sync it in the record type independently.&lt;/p&gt;
&lt;h3 id="mcetoc_1iipe0q170"&gt;Configure a New Data Source, Data Type, and Data Store&lt;/h3&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new &lt;a href="https://docs.appian.com/suite/help/24.4/data-source-connected-systems.html"&gt;Data Source Connected System&lt;/a&gt; that connects to the same database as your existing record type.&lt;/li&gt;
&lt;li&gt;Create a CDT from the table that already backs the synced record type.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/2144x1048/__key/communityserver-wikis-components-files/00-00-00-00-46/cdt_2D00_table.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Create a new data store with that CDT as an entity. Use the connected system data source you just created as the data source.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/2144x1048/__key/communityserver-wikis-components-files/00-00-00-00-46/data_2D00_source_2D00_2.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="callout-box callout-info"&gt;If your record type does not already have a modifiedOn timestamp, you will need to add that to your data structure, and ensure it is being updated every time the row is updated.&lt;/div&gt;
&lt;h3&gt;Replace the Write Records Node&lt;/h3&gt;
&lt;p&gt;In the autoscaled process model:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Update the process variable that holds the data being written to use a CDT instead of a record type (the one we just created). Update all usage of this variable.&lt;/li&gt;
&lt;li&gt;Replace the Write Records node with a Write to Data Store Entity node, using a constant for the new data store we just created.&lt;/li&gt;
&lt;li&gt;Click Save &amp;amp; Publish.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, your autoscaled process model will only write to the source table instead of automatically syncing data in the record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x260/__key/communityserver-wikis-components-files/00-00-00-00-46/records_2D00_node.png" /&gt;&lt;/div&gt;
&lt;h3&gt;Sync Batches of Data Every 5 Minutes&lt;/h3&gt;
&lt;p&gt;After re-configuring the autoscaled model, create a separate process model running without autoscale enabled to incrementally sync data the record type from the source table.&lt;/p&gt;
&lt;p&gt;To configure incremental sync:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new process model without autoscale enabled.&lt;/li&gt;
&lt;li&gt;Create process variables to track the timestamp at which data was last synced (lastSyncTime) and the list of IDs to sync (recordsToSync).&lt;/li&gt;
&lt;li&gt;Set the default value of the lastSyncTime variable to now()-5. This will cause the first run of the process to sync anything updated after 5 minutes ago.&lt;/li&gt;
&lt;li&gt;Configure a timer event on the start node to run the process every 5 minutes.&lt;/li&gt;
&lt;li&gt;In a new expression rule, query the IDs of any rows modified after the lastSyncTime timestamp, using a query that looks like this:
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;pre class="ui-code" data-mode="text"&gt;a!queryEntity(
  entity: cons!JLT_RecordEntity,
  query: a!query(
    selection: a!querySelection(
      columns: {
        a!queryColumn(
          field: &amp;quot;id&amp;quot;
        )
      }
    ),
    logicalExpression: a!queryLogicalExpression(
      operator: &amp;quot;AND&amp;quot;,
      filters: {
        a!queryFilter(
          field: &amp;quot;modifiedOn&amp;quot;,
          operator: &amp;quot;&amp;gt;&amp;quot;,
          value: ri!lastSyncTime
        )
      },
      ignoreFiltersWithEmptyValues: true
    ),
    pagingInfo: a!pagingInfo(
      startIndex: 1,
      batchSize: 50,
      sort: a!sortInfo(
        field: &amp;quot;modifiedOn&amp;quot;,
        ascending: true
      )
    )
  ),
  fetchTotalCount: false
)
&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Add a Script Task to the process and call the expression rule created above, passing in lastSyncTime.&lt;/li&gt;
&lt;li&gt;Add a Sync Records smart service node to sync the IDs you just queried in the record type. Since this will most likely require syncing more than 1000 rows at a time, you will need to &lt;a href="https://docs.appian.com/suite/help/24.4/Sync_Records_Smart_Service.html#syncing-more-than-1000-records"&gt;use a loop&lt;/a&gt; to iterate over all rows that need to be synced.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x838/__key/communityserver-wikis-components-files/00-00-00-00-46/loop.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;rsquo;s it! This pattern of ingesting data in larger batches can support syncing up to 200,000 rows per minute in record types across all applications on your site, with data being updated in 5 minutes or less.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item><item><title>Writing to Synced Record Types at High Throughput</title><link>https://community.appian.com/success/w/guide/3623/writing-to-synced-record-types-at-high-throughput/revision/26</link><pubDate>Wed, 29 Jan 2025 16:49:35 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:c655af54-6f28-49d4-9fdc-87a90630339c</guid><dc:creator>joel.larin</dc:creator><description>Revision 26 posted to Guide by joel.larin on 1/29/2025 4:49:35 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Appian&amp;#39;s &lt;a href="https://docs.appian.com/suite/help/latest/data-fabric.html"&gt;data fabric&lt;/a&gt; allows you to unify, secure, and optimize data spread across the enterprise. Typically, writing and syncing data in record types is as easy as using one of Appian&amp;rsquo;s smart services like Write Records, Write to Data Store Entity, and Write to Multiple Data Store Entities. However, when designing autoscaled processes, you may want to avoid using these smart services directly. Synced record types are limited to handling ~1,000 write requests per minute for processes writing data in small batches (1-10 rows).&lt;/p&gt;
&lt;p&gt;Trying to sync data above this level of throughput will fail and can cause record type invalidations. When using the Write Record smart service, writes will be throttled when exceeding a certain limit. This means that the nodes will fail and must be manually restarted, but the synced record type will remain available. When using Write to Data Store, failed writes will cause an invalidation, bringing down the impacted record type until a manual full sync is performed.&lt;/p&gt;
&lt;p&gt;This guide explains how to design a process that supports writes to data fabric when peak times require more than ~1,000 write requests per minute across all of the applications on your site. This is accomplished through an incremental sync pattern where data is synced into the record types independently from the writes to the source table in large batches enabling up to 200,000 rows to be synced per minute.&lt;/p&gt;
&lt;h2 id="example_process"&gt;Example Process&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s say we have a process model with Autoscale enabled, which receives data over an API call, performs some transformations on the data, and then writes a single record to a synced record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1676x798/__key/communityserver-wikis-components-files/00-00-00-00-46/example_2D00_process.png" /&gt;&lt;/div&gt;
&lt;p&gt;Typically, the API is called only 200 to 300 times per minute. However, at peak times, the API is called over 10,000 times in a single minute. At these peak times, the Write Records node fails due to data sync limitations. Upon reaching data sync write throughput limitations, write performance will degrade, leading to request timeouts. Failed requests will return either &amp;#39;could not obtain a reservation within the time limit&amp;#39; or &amp;#39;the request has timed out due to the system being busy.&amp;#39;&lt;/p&gt;
&lt;h2 id="deferred_sync_pattern"&gt;Deferred Sync Pattern&lt;/h2&gt;
&lt;p&gt;In order to allow the process model to continue to process data even in times of peak load, we need to implement an independent sync pattern where data is synced in batches rather than one row at a time.&lt;/p&gt;
&lt;p&gt;To avoid automatically syncing data to data fabric from the process model, an independent data store or a connected system data source must be created and used in the autoscaled process model to write data. This will allow us to write data only to the source table at first, and sync it in the record type independently.&lt;/p&gt;
&lt;h3 id="mcetoc_1iipe0q170"&gt;Configure a New Data Source, Data Type, and Data Store&lt;/h3&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new &lt;a href="https://docs.appian.com/suite/help/24.4/data-source-connected-systems.html"&gt;Data Source Connected System&lt;/a&gt; that connects to the same database as your existing record type.&lt;/li&gt;
&lt;li&gt;Create a CDT from the table that already backs the synced record type.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x598/__key/communityserver-wikis-components-files/00-00-00-00-46/data_2D00_source_2D00_1.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Create a new data store with that CDT as an entity. Use the connected system data source you just created as the data source.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/2144x1048/__key/communityserver-wikis-components-files/00-00-00-00-46/data_2D00_source_2D00_2.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="callout-box callout-info"&gt;If your record type does not already have a modifiedOn timestamp, you will need to add that to your data structure, and ensure it is being updated every time the row is updated.&lt;/div&gt;
&lt;h3&gt;Replace the Write Records Node&lt;/h3&gt;
&lt;p&gt;In the autoscaled process model:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Update the process variable that holds the data being written to use a CDT instead of a record type (the one we just created). Update all usage of this variable.&lt;/li&gt;
&lt;li&gt;Replace the Write Records node with a Write to Data Store Entity node, using a constant for the new data store we just created.&lt;/li&gt;
&lt;li&gt;Click Save &amp;amp; Publish.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, your autoscaled process model will only write to the source table instead of automatically syncing data in the record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x260/__key/communityserver-wikis-components-files/00-00-00-00-46/records_2D00_node.png" /&gt;&lt;/div&gt;
&lt;h3&gt;Sync Batches of Data Every 5 Minutes&lt;/h3&gt;
&lt;p&gt;After re-configuring the autoscaled model, create a separate process model running without autoscale enabled to incrementally sync data the record type from the source table.&lt;/p&gt;
&lt;p&gt;To configure incremental sync:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new process model without autoscale enabled.&lt;/li&gt;
&lt;li&gt;Create process variables to track the timestamp at which data was last synced (lastSyncTime) and the list of IDs to sync (recordsToSync).&lt;/li&gt;
&lt;li&gt;Set the default value of the lastSyncTime variable to now()-5. This will cause the first run of the process to sync anything updated after 5 minutes ago.&lt;/li&gt;
&lt;li&gt;Configure a timer event on the start node to run the process every 5 minutes.&lt;/li&gt;
&lt;li&gt;In a new expression rule, query the IDs of any rows modified after the lastSyncTime timestamp, using a query that looks like this:
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;pre class="ui-code" data-mode="text"&gt;a!queryEntity(
  entity: cons!JLT_RecordEntity,
  query: a!query(
    selection: a!querySelection(
      columns: {
        a!queryColumn(
          field: &amp;quot;id&amp;quot;
        )
      }
    ),
    logicalExpression: a!queryLogicalExpression(
      operator: &amp;quot;AND&amp;quot;,
      filters: {
        a!queryFilter(
          field: &amp;quot;modifiedOn&amp;quot;,
          operator: &amp;quot;&amp;gt;&amp;quot;,
          value: ri!lastSyncTime
        )
      },
      ignoreFiltersWithEmptyValues: true
    ),
    pagingInfo: a!pagingInfo(
      startIndex: 1,
      batchSize: 50,
      sort: a!sortInfo(
        field: &amp;quot;modifiedOn&amp;quot;,
        ascending: true
      )
    )
  ),
  fetchTotalCount: false
)
&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Add a Script Task to the process and call the expression rule created above, passing in lastSyncTime.&lt;/li&gt;
&lt;li&gt;Add a Sync Records smart service node to sync the IDs you just queried in the record type. Since this will most likely require syncing more than 1000 rows at a time, you will need to &lt;a href="https://docs.appian.com/suite/help/24.4/Sync_Records_Smart_Service.html#syncing-more-than-1000-records"&gt;use a loop&lt;/a&gt; to iterate over all rows that need to be synced.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x838/__key/communityserver-wikis-components-files/00-00-00-00-46/loop.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;rsquo;s it! This pattern of ingesting data in larger batches can support syncing up to 200,000 rows per minute in record types across all applications on your site, with data being updated in 5 minutes or less.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item><item><title>Writing to Synced Record Types at High Throughput</title><link>https://community.appian.com/success/w/guide/3623/writing-to-synced-record-types-at-high-throughput/revision/25</link><pubDate>Wed, 29 Jan 2025 16:47:08 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:c655af54-6f28-49d4-9fdc-87a90630339c</guid><dc:creator>joel.larin</dc:creator><description>Revision 25 posted to Guide by joel.larin on 1/29/2025 4:47:08 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Appian&amp;#39;s &lt;a href="https://docs.appian.com/suite/help/latest/data-fabric.html"&gt;data fabric&lt;/a&gt; allows you to unify, secure, and optimize data spread across the enterprise. Typically, writing and syncing data in record types is as easy as using one of Appian&amp;rsquo;s smart services like Write Records, Write to Data Store Entity, and Write to Multiple Data Store Entities. However, when designing autoscaled processes, you may want to avoid using these smart services directly. Synced record types are limited to handling ~1,000 write requests per minute for processes writing data in small batches (1-10 rows).&lt;/p&gt;
&lt;p&gt;Trying to sync data above this level of throughput will fail and can cause record type invalidations. When using the Write Record smart service, writes will be throttled when exceeding a certain limit. This means that the nodes will fail and must be manually restarted, but the synced record type will remain available. When using Write to Data Store, failed writes will cause an invalidation, bringing down the impacted record type until a manual full sync is performed.&lt;/p&gt;
&lt;p&gt;This guide explains how to design a process that supports writes to data fabric when peak times require more than ~1,000 write requests per minute across all of the applications on your site. This is accomplished through an incremental sync pattern where data is synced into the record types independently from the writes to the source table in large batches enabling up to 200,000 rows to be synced per minute.&lt;/p&gt;
&lt;h2 id="example_process"&gt;Example Process&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s say we have a process model with Autoscale enabled, which receives data over an API call, performs some transformations on the data, and then writes a single record to a synced record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1676x798/__key/communityserver-wikis-components-files/00-00-00-00-46/example_2D00_process.png" /&gt;&lt;/div&gt;
&lt;p&gt;Typically, the API is called only 200 to 300 times per minute. However, at peak times, the API is called over 10,000 times in a single minute. At these peak times, the Write Records node fails due to data sync limitations. Upon reaching data sync write throughput limitations, write performance will degrade, leading to request timeouts. Failed requests will return either &amp;#39;could not obtain a reservation within the time limit&amp;#39; or &amp;#39;the request has timed out due to the system being busy.&amp;#39;&lt;/p&gt;
&lt;h2 id="deferred_sync_pattern"&gt;Deferred Sync Pattern&lt;/h2&gt;
&lt;p&gt;In order to allow the process model to continue to process data even in times of peak load, we need to implement an independent sync pattern where data is synced in batches rather than one row at a time.&lt;/p&gt;
&lt;p&gt;To avoid automatically syncing data to data fabric from the process model, an independent data store or a connected system data source must be created and used in the autoscaled process model to write data. This will allow us to write data only to the source table at first, and sync it in the record type independently.&lt;/p&gt;
&lt;h3 id="mcetoc_1iipe0q170"&gt;Configure a New Data Source, Data Type, and Data Store&lt;/h3&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new &lt;a href="https://docs.appian.com/suite/help/24.4/data-source-connected-systems.html"&gt;Data Source Connected System&lt;/a&gt; that connects to the same database as your existing record type.&lt;/li&gt;
&lt;li&gt;Create a CDT from the table that already backs the synced record type.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x598/__key/communityserver-wikis-components-files/00-00-00-00-46/data_2D00_source_2D00_1.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Create a new data store with that CDT as an entity. Use the connected system data source you just created as the data source.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x260/__key/communityserver-wikis-components-files/00-00-00-00-46/data_2D00_store_2D00_cdt.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="callout-box callout-info"&gt;If your record type does not already have a modifiedOn timestamp, you will need to add that to your data structure, and ensure it is being updated every time the row is updated.&lt;/div&gt;
&lt;h3&gt;Replace the Write Records Node&lt;/h3&gt;
&lt;p&gt;In the autoscaled process model:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Update the process variable that holds the data being written to use a CDT instead of a record type (the one we just created). Update all usage of this variable.&lt;/li&gt;
&lt;li&gt;Replace the Write Records node with a Write to Data Store Entity node, using a constant for the new data store we just created.&lt;/li&gt;
&lt;li&gt;Click Save &amp;amp; Publish.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, your autoscaled process model will only write to the source table instead of automatically syncing data in the record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x260/__key/communityserver-wikis-components-files/00-00-00-00-46/records_2D00_node.png" /&gt;&lt;/div&gt;
&lt;h3&gt;Sync Batches of Data Every 5 Minutes&lt;/h3&gt;
&lt;p&gt;After re-configuring the autoscaled model, create a separate process model running without autoscale enabled to incrementally sync data the record type from the source table.&lt;/p&gt;
&lt;p&gt;To configure incremental sync:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new process model without autoscale enabled.&lt;/li&gt;
&lt;li&gt;Create process variables to track the timestamp at which data was last synced (lastSyncTime) and the list of IDs to sync (recordsToSync).&lt;/li&gt;
&lt;li&gt;Set the default value of the lastSyncTime variable to now()-5. This will cause the first run of the process to sync anything updated after 5 minutes ago.&lt;/li&gt;
&lt;li&gt;Configure a timer event on the start node to run the process every 5 minutes.&lt;/li&gt;
&lt;li&gt;In a new expression rule, query the IDs of any rows modified after the lastSyncTime timestamp, using a query that looks like this:
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;pre class="ui-code" data-mode="text"&gt;a!queryEntity(
  entity: cons!JLT_RecordEntity,
  query: a!query(
    selection: a!querySelection(
      columns: {
        a!queryColumn(
          field: &amp;quot;id&amp;quot;
        )
      }
    ),
    logicalExpression: a!queryLogicalExpression(
      operator: &amp;quot;AND&amp;quot;,
      filters: {
        a!queryFilter(
          field: &amp;quot;modifiedOn&amp;quot;,
          operator: &amp;quot;&amp;gt;&amp;quot;,
          value: ri!lastSyncTime
        )
      },
      ignoreFiltersWithEmptyValues: true
    ),
    pagingInfo: a!pagingInfo(
      startIndex: 1,
      batchSize: 50,
      sort: a!sortInfo(
        field: &amp;quot;modifiedOn&amp;quot;,
        ascending: true
      )
    )
  ),
  fetchTotalCount: false
)
&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Add a Script Task to the process and call the expression rule created above, passing in lastSyncTime.&lt;/li&gt;
&lt;li&gt;Add a Sync Records smart service node to sync the IDs you just queried in the record type. Since this will most likely require syncing more than 1000 rows at a time, you will need to &lt;a href="https://docs.appian.com/suite/help/24.4/Sync_Records_Smart_Service.html#syncing-more-than-1000-records"&gt;use a loop&lt;/a&gt; to iterate over all rows that need to be synced.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x838/__key/communityserver-wikis-components-files/00-00-00-00-46/loop.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;rsquo;s it! This pattern of ingesting data in larger batches can support syncing up to 200,000 rows per minute in record types across all applications on your site, with data being updated in 5 minutes or less.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item><item><title>Writing to Synced Record Types at High Throughput</title><link>https://community.appian.com/success/w/guide/3623/writing-to-synced-record-types-at-high-throughput/revision/24</link><pubDate>Wed, 29 Jan 2025 16:46:17 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:c655af54-6f28-49d4-9fdc-87a90630339c</guid><dc:creator>joel.larin</dc:creator><description>Revision 24 posted to Guide by joel.larin on 1/29/2025 4:46:17 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Appian&amp;#39;s &lt;a href="https://docs.appian.com/suite/help/latest/data-fabric.html"&gt;data fabric&lt;/a&gt; allows you to unify, secure, and optimize data spread across the enterprise. Typically, writing and syncing data in record types is as easy as using one of Appian&amp;rsquo;s smart services like Write Records, Write to Data Store Entity, and Write to Multiple Data Store Entities. However, when designing autoscaled processes, you may want to avoid using these smart services directly. Synced record types are limited to handling ~1,000 write requests per minute for processes writing data in small batches (1-10 rows).&lt;/p&gt;
&lt;p&gt;Trying to sync data above this level of throughput will fail and can cause record type invalidations. When using the Write Record smart service, writes will be throttled when exceeding a certain limit. This means that the nodes will fail and must be manually restarted, but the synced record type will remain available. When using Write to Data Store, failed writes will cause an invalidation, bringing down the impacted record type until a manual full sync is performed.&lt;/p&gt;
&lt;p&gt;This guide explains how to design a process that supports writes to data fabric when peak times require more than ~1,000 write requests per minute across all of the applications on your site. This is accomplished through an incremental sync pattern where data is synced into the record types independently from the writes to the source table in large batches enabling up to 200,000 rows to be synced per minute.&lt;/p&gt;
&lt;h2 id="example_process"&gt;Example Process&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s say we have a process model with Autoscale enabled, which receives data over an API call, performs some transformations on the data, and then writes a single record to a synced record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1676x798/__key/communityserver-wikis-components-files/00-00-00-00-46/example_2D00_process.png" /&gt;&lt;/div&gt;
&lt;p&gt;Typically, the API is called only 200 to 300 times per minute. However, at peak times, the API is called over 10,000 times in a single minute. At these peak times, the Write Records node fails due to data sync limitations. Upon reaching data sync write throughput limitations, write performance will degrade, leading to request timeouts. Failed requests will return either &amp;#39;could not obtain a reservation within the time limit&amp;#39; or &amp;#39;the request has timed out due to the system being busy.&amp;#39;&lt;/p&gt;
&lt;h2 id="deferred_sync_pattern"&gt;Deferred Sync Pattern&lt;/h2&gt;
&lt;p&gt;In order to allow the process model to continue to process data even in times of peak load, we need to implement an independent sync pattern where data is synced in batches rather than one row at a time.&lt;/p&gt;
&lt;p&gt;To avoid automatically syncing data to data fabric from the process model, an independent data store or a connected system data source must be created and used in the autoscaled process model to write data. This will allow us to write data only to the source table at first, and sync it in the record type independently.&lt;/p&gt;
&lt;h3 id="mcetoc_1iipe0q170"&gt;Configure a New Data Source, Data Type, and Data Store&lt;/h3&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new &lt;a href="https://docs.appian.com/suite/help/24.4/data-source-connected-systems.html"&gt;Data Source Connected System&lt;/a&gt; that connects to the same database as your existing record type.&lt;/li&gt;
&lt;li&gt;Create a CDT from the table that already backs the synced record type.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x598/__key/communityserver-wikis-components-files/00-00-00-00-46/data_2D00_source_2D00_1.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Create a new data store with that CDT as an entity. Use the connected system data source you just created as the data source.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x260/__key/communityserver-wikis-components-files/00-00-00-00-46/data_2D00_store_2D00_cdt.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="callout-box callout-info"&gt;If your record type does not already have a modifiedOn timestamp, you will need to add that to your data structure, and ensure it is being updated every time the row is updated.&lt;/div&gt;
&lt;h3&gt;Replace the Write Records Node&lt;/h3&gt;
&lt;p&gt;In the autoscaled process model:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Update the process variable that holds the data being written to use a CDT instead of a record type (the one we just created). Update all usage of this variable.&lt;/li&gt;
&lt;li&gt;Replace the Write Records node with a Write to Data Store Entity node, using a constant for the new data store we just created.&lt;/li&gt;
&lt;li&gt;Click Save &amp;amp; Publish.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, your autoscaled process model will only write to the source table instead of automatically syncing data in the record type.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x260/__key/communityserver-wikis-components-files/00-00-00-00-46/records_2D00_node.png" /&gt;&lt;/div&gt;
&lt;h3&gt;Sync Batches of Data Every 5 Minutes&lt;/h3&gt;
&lt;p&gt;After re-configuring the autoscaled model, create a separate process model running without autoscale enabled to incrementally sync data the record type from the source table.&lt;/p&gt;
&lt;p&gt;To configure incremental sync:&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a new process model without autoscale enabled.&lt;/li&gt;
&lt;li&gt;Create process variables to track the timestamp at which data was last synced (lastSyncTime) and the list of IDs to sync (recordsToSync).&lt;/li&gt;
&lt;li&gt;Set the default value of the lastSyncTime variable to now()-5. This will cause the first run of the process to sync anything updated after 5 minutes ago.&lt;/li&gt;
&lt;li&gt;Configure a timer event on the start node to run the process every 5 minutes.&lt;/li&gt;
&lt;li&gt;In a new expression rule, query the IDs of any rows modified after the lastSyncTime timestamp, using a query that looks like this:
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;pre class="ui-code" data-mode="text"&gt;a!queryEntity(
  entity: cons!JLT_RecordEntity,
  query: a!query(
    selection: a!querySelection(
      columns: {
        a!queryColumn(
          field: &amp;quot;id&amp;quot;
        )
      }
    ),
    logicalExpression: a!queryLogicalExpression(
      operator: &amp;quot;AND&amp;quot;,
      filters: {
        a!queryFilter(
          field: &amp;quot;modifiedOn&amp;quot;,
          operator: &amp;quot;&amp;gt;&amp;quot;,
          value: ri!lastSyncTime
        )
      },
      ignoreFiltersWithEmptyValues: true
    ),
    pagingInfo: a!pagingInfo(
      startIndex: 1,
      batchSize: 50,
      sort: a!sortInfo(
        field: &amp;quot;modifiedOn&amp;quot;,
        ascending: true
      )
    )
  ),
  fetchTotalCount: false
)
&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Add a Script Task to the process and call the expression rule created above, passing in lastSyncTime.&lt;/li&gt;
&lt;li&gt;Add a Sync Records smart service node to sync the IDs you just queried in the record type. Since this will most likely require syncing more than 1000 rows at a time, you will need to &lt;a href="https://docs.appian.com/suite/help/24.4/Sync_Records_Smart_Service.html#syncing-more-than-1000-records"&gt;use a loop&lt;/a&gt; to iterate over all rows that need to be synced.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt="Process Model example" src="/resized-image/__size/1024x838/__key/communityserver-wikis-components-files/00-00-00-00-46/loop.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;rsquo;s it! This pattern of ingesting data in larger batches can support syncing up to 200,000 rows per minute in record types across all applications on your site, with data being updated in 5 minutes or less.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item></channel></rss>