<?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>Fundamentals of Testing in Appian</title><link>https://community.appian.com/success/w/guide/3409/fundamentals-of-testing-in-appian</link><pubDate>Thu, 11 Jun 2026 21:52:58 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:7e5fd8d4-d42b-4897-906e-78449b0086d1</guid><dc:creator>joel.larin</dc:creator><description>Current Revision posted to Guide by joel.larin on 6/11/2026 9:52:58 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&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/800x601/__key/communityserver-wikis-components-files/00-00-00-00-46/testing_5F00_overview_5F00_3.png" /&gt;&lt;/div&gt;
&lt;p&gt;Testing is vital to ensure that only high-quality projects are produced. Throughout the application&amp;#39;s lifecycle, testing strategies can be categorized into the following stages:&lt;/p&gt;
&lt;ol style="font-size:110%;"&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Before development&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;During development&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Leading up to go-live&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;During hardening&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Deployment&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This article will provide an overview of the varied activities and types of tests that can be conducted at each development stage.&lt;/p&gt;
&lt;h2&gt;Before Development&lt;/h2&gt;
&lt;p&gt;At the start of the development cycle, the project team should convene to establish a testing strategy. This strategy ensures that project requirements are met, necessary resources are allocated, and potential risks are identified.&lt;/p&gt;
&lt;h3&gt;User Story Testing Standards&lt;/h3&gt;
&lt;p&gt;User stories are non-technical descriptions of an application&amp;#39;s feature and are central to agile software development. Before development begins, the Appian team and the customer team should agree on standards for testing. A &lt;a href="/success/w/article/3217/user-story-testing-checklist"&gt;User Story Testing Checklist&lt;/a&gt; can be used to test each story. Each user story will be required to pass the criteria set forth in its &lt;a href="/success/w/guide/3315/ready-to-done-streamline-user-stories-in-appian"&gt;Definition of Ready&lt;/a&gt;, so test cases should be created ahead of time to give the developer a better idea of the requirements.&lt;/p&gt;
&lt;h3&gt;Performance and Load Testing&lt;/h3&gt;
&lt;p&gt;These tests assess the application&amp;#39;s behavior under varying conditions. Performance testing observes the system during peak usage, while load testing focuses on its response to a large user base. Factors like data size, peak usage, and user count are essential. Before initiating performance testing, it&amp;#39;s crucial to:&lt;/p&gt;
&lt;ul style="font-size:110%;"&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Identify test data&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Establish expected workflow.&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Identify different usage scenarios.&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Determine the performance test environment.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additional resources can be found in &lt;a href="/success/w/guide/3215/performance-testing-methodology/"&gt;Performance Testing Methodology&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Automated Testing&lt;/h3&gt;
&lt;p&gt;Automated testing is a software tool that automates the process of application testing by running a series of test cases. While automating manual end user tests can decrease the time needed for testing, there&amp;rsquo;s a time and cost involved in creating the tests for the entire application. The project team and stakeholders should meet to determine what types of automated tests will take place based on the time and resources that are available. Some types of automated testing tools are &lt;a href="/b/appmarket/posts/fitnesse-for-appian"&gt;Fitnesse for Appian&lt;/a&gt;, &lt;a href="/b/appmarket/posts/cucumber-for-appian"&gt;Cucumber for Appian&lt;/a&gt;, and &lt;a href="/b/appmarket/posts/appian_2d00_selenium_2d00_api"&gt;Appian&amp;rsquo;s Selenium API&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="during_development"&gt;During Development&lt;/h2&gt;
&lt;p&gt;Throughout the development sprint, a variety of tests are conducted. Most are performed by the development team, but as the sprint concludes, the client or their QA team should undertake some.&lt;/p&gt;
&lt;h3&gt;Expression Rule Test Cases&lt;/h3&gt;
&lt;p&gt;In an expression rule object, test cases can be written and stored to determine if the expected results are being achieved based on certain input. Test cases can be run within the expression rule or through the Manage Test Cases dialog from the Settings menu in the Appian Designer.&amp;nbsp;See &lt;a href="/success/w/guide/3342/how-to-create-expression-rule-test-cases"&gt;Creating Expression Rule Test Cases&lt;/a&gt;&amp;nbsp;to learn more.&lt;/p&gt;
&lt;h3&gt;Unit Testing&lt;/h3&gt;
&lt;p&gt;Unit testing is for testing individual units or small interconnected functionalities of the application. Typically performed by the developer, test cases are created before development. Objects such as expression rules and decision rules have an expected result, so code is written to test all possible scenarios. More information can be found in &lt;a href="/success/w/guide/3336/functional-testing"&gt;Functional Testing&amp;nbsp;- Unit Testing&lt;/a&gt;&amp;nbsp;and &lt;a href="/success/w/guide/3342/how-to-create-expression-rule-test-cases"&gt;Creating Expression Rule Test Cases&lt;/a&gt;.&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/960x720/__key/communityserver-wikis-components-files/00-00-00-00-46/2350.expressionImage2.png" /&gt;
&lt;figure style="display:inline-block;font-size:100%;margin-top:0.6rem;"&gt;&lt;em&gt;An example expression rule that has coverage and error handling tests.&lt;/em&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;h3&gt;System Integration Testing&lt;/h3&gt;
&lt;p&gt;After Unit Testing, &lt;a href="/success/w/guide/3341/system-integration-testing"&gt;System integration testing (SIT)&lt;/a&gt; is used to assess the overall functionality and interactions between the different components. This testing includes workflows, integrations with outside systems, and database connections.&lt;/p&gt;
&lt;h3&gt;Peer Testing&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;&lt;span style="font-weight:400;"&gt;During a sprint, peer reviewers (fellow developers from the team) should be utilized to conduct similar tests performed by the developer, as well as to ensure best practices and common design standards are followed.&amp;nbsp;&lt;/span&gt;Review&amp;nbsp;the &lt;a href="/success/w/article/3217/user-story-testing-checklist"&gt;user story testing checklist&lt;/a&gt; completed prior to development and use it as a guide for your developer and peer review testing.&amp;nbsp;&lt;/span&gt;Consider adopting the&amp;nbsp;&lt;span&gt;&lt;a href="/b/appmarket/posts/aquaman"&gt;AQuAMan&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;framework to automate and speed up some of the peer review process.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;User Acceptance Testing&lt;/h3&gt;
&lt;p&gt;While user acceptance testing (UAT) is typically performed as the final phase in the development sprint and prior to software launch, it should also be done throughout the duration of the project. UAT is designed to make sure an application meets the needs of the business, is free of bugs, and functions as intended.&amp;nbsp;See &lt;a href="/success/w/guide/3337/user-acceptance-testing-overview"&gt;User Acceptance Testing Overview&lt;/a&gt;&amp;nbsp;for more.&lt;/p&gt;
&lt;h3&gt;Regression Testing&lt;/h3&gt;
&lt;p&gt;&lt;span style="font-weight:400;"&gt;Regression testing is used to ensure that any changes or updates in the software will not negatively affect the working functionality of the application amidst the new changes.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Exploratory&amp;nbsp;Testing&lt;/h3&gt;
&lt;p&gt;&lt;a href="/success/w/guide/3339/exploratory-testing"&gt;Exploratory testing&lt;/a&gt; is used to identify potential edge cases, i.e. problems that occur only under unique, rare conditions. This type of testing is performed by testers themselves rather than automated scripts. Be sure to incorporate exploratory testing as it&amp;#39;s useful for catching&amp;nbsp;bugs that might otherwise go undetected.&lt;/p&gt;
&lt;h2 id="leading_up_to_go_live"&gt;Leading Up to Go Live&lt;/h2&gt;
&lt;p&gt;Prior to the Go Live, stringent user acceptance testing should be performed at a level of granularity that is appropriate for the scope of work.&lt;/p&gt;
&lt;h2 id="during_hardening"&gt;During Hardening&lt;/h2&gt;
&lt;p&gt;During &lt;a href="/success/w/guide/3338/how-to-undergo-a-hardening-sprint"&gt;Hardening&lt;/a&gt;, the team&amp;rsquo;s time is focused on full end-to-end testing, catching and resolving bugs, and fine tuning application performance. While most major bugs and issues should have already been resolved in prior testing phases, hardening provides an opportunity to catch more minor flaws and UX adjustments, thereby mitigating risk and improving overall confidence in the production release.&lt;/p&gt;
&lt;h3&gt;End to End Testing&lt;/h3&gt;
&lt;p&gt;In end to end testing, the focus is on the entire system&amp;rsquo;s functionality. It&amp;rsquo;s purpose is to ensure the flow of data is maintained and the software works as intended in all environments. End to end testing can be performed/assissted by automated testing tools like &lt;a href="/success/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;Fitnesse for Appian&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Exploratory Testing&lt;/h3&gt;
&lt;p&gt;It&amp;#39;s a good idea to again use exploratory testing during the hardening phase, as edge cases can be hard to find using automated tools.&lt;/p&gt;
&lt;h2 id="deployment"&gt;Deployment&lt;/h2&gt;
&lt;p&gt;Testing during the deployment stage allows the team to evaluate the functionality of the application in the exact environment where it needs to function.&lt;/p&gt;
&lt;h3&gt;Systems Integration Testing&lt;/h3&gt;
&lt;p&gt;After deployment, &lt;a href="/success/w/guide/3341/system-integration-testing"&gt;SIT&lt;/a&gt; is again performed to evaluate the behavior of the entire integrated system and to make sure that all connections have been maintained.&lt;/p&gt;
&lt;h3&gt;Unit Testing&lt;/h3&gt;
&lt;p&gt;When inspection occurs during direct deployment, Appian will check the package for any failing test cases. Review and rerun test cases until the issues are resolved. See&amp;nbsp;&lt;a href="/success/w/guide/3336/functional-testing"&gt;Functional Testing&amp;nbsp;- Unit Testing&lt;/a&gt;&amp;nbsp;for more information.&lt;/p&gt;
&lt;h3&gt;Regression Testing&lt;/h3&gt;
&lt;p&gt;After work completes on development, regression testing should be performed by the QA team to ensure that all components are still functional and work as intended.&lt;/p&gt;
&lt;h3&gt;Health Check&lt;/h3&gt;
&lt;p&gt;Health Check is a process that provides insights into an application. It can identify services and nodes that pose a high risk to the performance of the application, check to make sure that best practices are being followed, and provide graphs detailing historical trends in the environment. See the &lt;a href="https://docs.appian.com/suite/help/23.3/health-check.html"&gt;Health Check&lt;/a&gt; documentation for more.&lt;/p&gt;
&lt;p&gt;Testing is an important step in the development of any application. Tests need to be planned and executed during every stage of software development. By having a proper test plan, you can identify bugs, errors, and missing requirements, which will guarantee the quality of the application.&lt;/p&gt;
&lt;h2 id="downloadables"&gt;Downloadables&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;This one-pager identifies critical testing strategies that should be embedded in every Appian delivery team and recommends others that are dependent upon the client and solution being developed.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;a href="https://community.appian.com/cfs-file/__key/communityserver-wikis-components-files/00-00-00-00-46/Appian_5F00_testing_5F00_one_5F00_pager.pdf"&gt;community.appian.com/.../Appian_5F00_testing_5F00_one_5F00_pager.pdf&lt;/a&gt;&lt;/span&gt;&lt;/p&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>Integrating with Amazon Machine Learning</title><link>https://community.appian.com/success/w/guide/3407/integrating-with-amazon-machine-learning</link><pubDate>Thu, 11 Jun 2026 21:52:43 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:24adb9fb-f09b-49ea-bf49-fa025c853030</guid><dc:creator>joel.larin</dc:creator><description>Current Revision posted to Guide by joel.larin on 6/11/2026 9:52:43 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;table style="background-color:#ed6d6d;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Amazon ML is no longer available to new Amazon customers&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;This article provides information about integrating with Amazon Machine Learning. If you are unfamiliar with machine learning, it is recommended that you read the&amp;nbsp;&lt;a href="/w/article/3392/machine-learning-overview"&gt;Machine Learning Overview&lt;/a&gt;&amp;nbsp;article for information about the technology,&amp;nbsp;different model types and training data guidance.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Amazon offers a plethora of services that all fall under its machine learning arm from translation services (&lt;a href="https://aws.amazon.com/translate/" rel="noopener noreferrer" target="_blank"&gt;Amazon Translate)&lt;/a&gt;&amp;nbsp;to video recognition (Amazon &lt;a href="https://aws.amazon.com/deeplens/" rel="noopener noreferrer" target="_blank"&gt;DeepLens&lt;/a&gt;).&amp;nbsp;Appian can integrate with all of these services; however, this article solely focuses on the Amazon Machine Learning service through the use of the Appian AI Designer. Furthermore, there are many other machine learning offerings available including &lt;a href="https://cloud.google.com/ml-engine/?utm_source=google&amp;amp;utm_medium=cpc&amp;amp;utm_campaign=na-US-all-en-dr-bkws-all-all-trial-p-dr-1003905&amp;amp;utm_content=text-ad-none-any-DEV_c-CRE_214324741092-ADGP_Hybrid+%7C+AW+SEM+%7C+SKWS+%7C+US+%7C+en+%7C+Multi+~+Machine+Learning-KWID_43700032622150006-kwd-101750932&amp;amp;utm_term=KW_machine%20learning-ST_machine+learning&amp;amp;gclid=EAIaIQobChMIiMrj0dXL2wIVggOGCh09tAN1EAAYASAAEgLLx_D_BwE&amp;amp;dclid=CL2p4NPVy9sCFVIEDAodO3UKKw" rel="noopener noreferrer" target="_blank"&gt;Google Cloud&lt;/a&gt; and &lt;a href="https://azure.microsoft.com/en-us/overview/machine-learning/?&amp;amp;OCID=AID631184_SEM_ESwzDWZn&amp;amp;lnkd=Google_Azure_Brand&amp;amp;gclid=EAIaIQobChMIq_iQ2NXL2wIVz1qGCh2cxAQJEAAYAyAAEgJsBvD_BwE&amp;amp;dclid=CJye99rVy9sCFRYIDAodEfoHYg" rel="noopener noreferrer" target="_blank"&gt;Microsoft Azure&lt;/a&gt;.&amp;nbsp;Appian is integration agnostic and&amp;nbsp;has the ability to connect with all of them.&amp;nbsp;&lt;/p&gt;
&lt;h2 id="amazon_machine_learning_models"&gt;Amazon Machine Learning Models&lt;/h2&gt;
&lt;p&gt;Amazon Machine Learning (AML) supports three different type of&amp;nbsp;&lt;a href="https://docs.aws.amazon.com/machine-learning/latest/dg/types-of-ml-models.html" rel="noopener noreferrer" target="_blank"&gt;ML models&lt;/a&gt;. The type of model that Amazon will build depends on the type of target attribute that you want to predict.&lt;/p&gt;
&lt;table style="height:31px;" width="1105"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Prediction Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Performance Metric&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://docs.aws.amazon.com/machine-learning/latest/dg/regression-model-insights.html" rel="noopener noreferrer" target="_blank"&gt;Regression&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;Predicts a numeric value&lt;/td&gt;
&lt;td&gt;&amp;nbsp;Root Mean Square Error (RMSE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://docs.aws.amazon.com/machine-learning/latest/dg/binary-model-insights.html" rel="noopener noreferrer" target="_blank"&gt;Binary Classification&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;Predicts binary values (ex. true or false)&lt;/td&gt;
&lt;td&gt;&amp;nbsp;Area Under the Curve (AUC)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://docs.aws.amazon.com/machine-learning/latest/dg/multiclass-model-insights.html" rel="noopener noreferrer" target="_blank"&gt;Multiclass&amp;nbsp;Classification&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;Predicts values that belong to a limited, predefined set of permissible values&lt;/td&gt;
&lt;td&gt;&amp;nbsp;F1 Score&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="creating_amazon_ml_models_in_appian"&gt;Creating Amazon ML Models in Appian&lt;/h2&gt;
&lt;p&gt;The following steps outline how to create a model using the Appian AI Designer shared component. It is possible to create models directly in the AML admin console. It also possible to interact with models in Appian that already exist or have not been created using the Appian AI Designer (for more information on&amp;nbsp;making predictions see next section).&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create an &lt;a href="https://aws.amazon.com/machine-learning/" rel="noopener noreferrer" target="_blank"&gt;Amazon developer account&lt;/a&gt; and an Amazon S3 bucket to store the data you will use to create your model. A credit card is required and you will be charged to create models and make predictions, but costs are relatively insignificant (see &lt;a href="https://aws.amazon.com/aml/pricing/" rel="noopener noreferrer" target="_blank"&gt;AML pricing&lt;/a&gt;).&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Download &lt;a href="/b/appmarket/posts/appian-ai-designer" rel="noopener noreferrer" target="_blank"&gt;Appian AI Designer&lt;/a&gt;&amp;nbsp;from shared components and follow the deployment instructions.
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Note&lt;/strong&gt;:&amp;nbsp;you will need to have Appian automatically create the database tables by manually publishing the data store after the application import.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Collect data used to create the model and format into csv where one row consists of an observation with multiple features (or attributes) and one target attribute. The more observations (rows in the csv) included, the better the model. Below is a sample set of data for banking customers where the first 9 columns represent features that will be used by the model to recognize patterns and relationships while the last column (y) is the binary target value the&amp;nbsp;model will try to predict. In this case y represents if the banking customer decided to take an offer pitched over the phone.
&lt;table style="height:101px;" width="1070"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;age&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;job&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;marital&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;education&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;default&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;housing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;contact&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;duration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;day_of_w&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;y&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;td&gt;blue-collar&lt;/td&gt;
&lt;td&gt;married&lt;/td&gt;
&lt;td&gt;basic.4y&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;cellular&lt;/td&gt;
&lt;td&gt;210&lt;/td&gt;
&lt;td&gt;thu&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;td&gt;technical&lt;/td&gt;
&lt;td&gt;married&lt;/td&gt;
&lt;td&gt;unknown&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;telephone&lt;/td&gt;
&lt;td&gt;180&lt;/td&gt;
&lt;td&gt;fri&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;management&lt;/td&gt;
&lt;td&gt;single&lt;/td&gt;
&lt;td&gt;university.degree&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;cellular&lt;/td&gt;
&lt;td&gt;465&lt;/td&gt;
&lt;td&gt;mon&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;td&gt;services&lt;/td&gt;
&lt;td&gt;divorced&lt;/td&gt;
&lt;td&gt;high.school&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;cellular&lt;/td&gt;
&lt;td&gt;180&lt;/td&gt;
&lt;td&gt;wed&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;Navigate to: https://&amp;lt;your.server&amp;gt;/suite/sites/aml and follow the sites wizard to create a new model.
&lt;ol&gt;
&lt;li&gt;On the first tab you can select the S3 bucket created earlier.&lt;/li&gt;
&lt;li&gt;If you do not plan on using Amazon&amp;rsquo;s feature transformation formulas than ensure that any data manipulation has done before formatting the data into a csv. See feature transformation below for more information.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="making_predictions"&gt;Making Predictions&lt;/h2&gt;
&lt;p&gt;Once a model is created you can make batch predictions or individual real-time predictions.&amp;nbsp;There are two main ways to make real time predictions within Appian: you can use either the shared component function&amp;nbsp;AML_getRealtimePrediction or you can use the&amp;nbsp;&lt;a title="https://docs.appian.com/suite/help/latest/Connected_System_Template.html" href="https://docs.appian.com/suite/help/21.2/Create_a_Connected_System.html"&gt;connected system object&lt;/a&gt; in Appian versions 18.2 or later. The AML_getRealtimePrediction function&amp;nbsp;takes in a model ID and two parallel arrays that hold attribute names and attribute values. If using this function it is recommended to create a mapping rule that takes in a CDT and converts the CDT values into a text array to be passed into AML_getRealtimePrediction. Before even creating a connected system or&amp;nbsp;creating a rule to call the API you can test out real time predictions from the AML admin console or from the machine learning model record in the Appian AI designer site. It&amp;#39;s recommended to test out the predictions and evaluate the model (more below) before deciding to move forward with an initial model.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Evaluating and Adjusting Model Performance&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Whenever a new model is created there are four objects created in the AML Admin Console: One training data source, one evaluation data source, one model, and one evaluation object. As discussed above, Amazon uses different metrics to quantify performance.&amp;nbsp; In addition, Amazon provides a different performance visualization for each model. To access the performance metric and visualizations navigate to the admin console and select the evaluation object. For binary classification models you are able to adjust output using the dual histogram visualization (pictured below) by raising or lowering the score threshold that is defaulted to 0.5. For example if you would like to automate a process by auto approving likely true values you may want to raise the score threshold to a value closer to 1 in order to limit the false positives (raising the score threshold has the effect of increasing the probability needed for the model to predict a value as true). Inversely, if you would like to flag values that are likely false for further review you may want to lower the score threshold in order to limit the false negatives.&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/490x430/__key/communityserver-wikis-components-files/00-00-00-00-46/2376.Binary-histogram-2.JPG" /&gt;&lt;/div&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/440x280/__key/communityserver-wikis-components-files/00-00-00-00-46/7167.Binary-histogram-example-2.JPG" /&gt;&lt;/div&gt;
&lt;p&gt;Another way to evaluate the model is to take a look at how each feature correlates to the target value. Some values have more of an impact of the predicted outcomes and this is quantified&amp;nbsp;by Amazon (to view these values navigate to either of the data sources in the AML admin console). It is generally&amp;nbsp;a best practice to include as many&amp;nbsp;relevant features as possible in your data set, but noise introduced by including too many variables with little predictive power may negatively impact your models performance.&lt;/p&gt;
&lt;h2 id="best_practices"&gt;Best Practices&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/machine-learning/latest/dg/retraining-models-on-new-data.html" rel="noopener noreferrer" target="_blank"&gt;Retraining Models&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Retraining is the process of providing new data to models in attempt keep your model accurate with the drift of actual outcome distribution over time. Like most application development, implementing a machine learning model is not a one time activity; it is best practice to continuously monitor your model and retrain&amp;nbsp;it if new observations&amp;nbsp;begin to deviate from the original training data distributions.&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;In order to retrain a model in Amazon you will need to create a&amp;nbsp;completely new model with your updated data set. Be sure to avoid hard coding model Ids in your Appian applications so that updating your applications after retraining models will only&amp;nbsp;require updating a single&amp;nbsp;object such as a constant or connected system.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/machine-learning/latest/dg/feature-processing.html" rel="noopener noreferrer" target="_blank"&gt;Feature Transformation&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A key characteristic of good training data is that it is provided in a way that is optimized for learning and generalization. The process of putting together the data in this optimal format is known in the industry as feature transformation.&lt;/li&gt;
&lt;li&gt;Feature transformation can be performed on all types of data (numeric, text, boolean). &amp;nbsp;A simple example of feature transformation is converting all null numeric values to 0, but can also include more complex formulas for the purpose of normalizing data or discovering non-linearity in the variables distribution.&lt;/li&gt;
&lt;li&gt;Feature transformation can take place prior to uploading data in Amazon or you can use built-in transformation recipes within the Amazon machine learning console. Regardless of the method used, the process should be repeatable such that models can be recreated or re-trained easily.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/machine-learning/latest/dg/splitting-types.html" rel="noopener noreferrer" target="_blank"&gt;Splitting Data&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In order to test the accuracy of ML models a percentage of the data provided to Amazon is set aside for evaluation. By default Amazon splits the data such that 70% of it is used to train the model while 30% is used to evaluate it. The split percentage can be altered when creating the model.&lt;/li&gt;
&lt;li&gt;It is important to split the input data such that there is a random distribution of observations between the training and evaluation data sources. If the data for either data source is skewed towards a certain target value the ML model could be skewed and the evaluation model may not be indicative of true performance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/machine-learning/latest/dg/training-parameters.html" rel="noopener noreferrer" target="_blank"&gt;Shuffling Data&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In Amazon ML, you must shuffle your training data. Shuffling mixes up the order of your data so that the &lt;a href="https://docs.aws.amazon.com/machine-learning/latest/dg/learning-algorithm.html" rel="noopener noreferrer" target="_blank"&gt;SGD algorithm&lt;/a&gt; doesn&amp;#39;t encounter one type of data for too many observations in succession.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;When creating a model via the admin console or the Appian AI Designer shared component wizard, you can indicate if you would like Amazon to shuffle your data or if you have already shuffled it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;See Also&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Websites:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/machine-learning/latest/dg/what-is-amazon-machine-learning.html" rel="noopener noreferrer" target="_blank"&gt;AML Developer Guide&lt;/a&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: integrations, Architecture&lt;/div&gt;
</description></item><item><title>Leverage JMeter in Appian Load Testing</title><link>https://community.appian.com/success/w/guide/3325/leverage-jmeter-in-appian-load-testing</link><pubDate>Thu, 11 Jun 2026 21:52:24 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:650c85e5-2fdf-47f2-9168-a7d381b7feb7</guid><dc:creator>joel.larin</dc:creator><description>Current Revision posted to Guide by joel.larin on 6/11/2026 9:52:24 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;p&gt;&lt;a href="http://jmeter.apache.org"&gt;Apache JMeter&lt;/a&gt; is an open source Java performance testing tool which can be used to simulate user load on a web application. This guide explains how to use JMeter to implement and run test scripts for Appian applications as part of the &lt;a href="/w/guide/3215/performance-testing-methodology#configure_the_performance_test_environment"&gt;Appian Performance Testing Methodology&lt;/a&gt;. It is important to note that test script implementation and execution are only two steps in the methodology. A test plan should be defined before starting implementation.&lt;/p&gt;
&lt;h2 id="recording_new_scenarios"&gt;Recording New Scenarios&lt;/h2&gt;
&lt;p&gt;JMeter scripts are created by recording activity in the browser or mobile app using an HTTP(S) Test Script Recorder. Recording and parameterizing test scenarios is the primary task of test implementation.&lt;/p&gt;
&lt;h3&gt;JMeter for Appian&lt;/h3&gt;
&lt;p&gt;It is highly recommended to start by installing the &lt;a href="/b/appmarket/posts/jmeter-for-appian"&gt;JMeter for Appian&lt;/a&gt; utility. This is an add-on for JMeter&amp;#39;s Test Script Recorder that automatically extracts standard dynamic values that are passed back and forth when a user interacts with Appian. This saves a lot of time when parameterizing your recorded scripts.&lt;/p&gt;
&lt;h3 id="pre-recording-proxy-configurations"&gt;JMeter Properties&lt;/h3&gt;
&lt;p&gt;The following properties allow cookies to be stored as variables which allow the JMeter scripts to reference client cookies. Ensure they are set to the below values in the &lt;a href="https://jmeter.apache.org/usermanual/properties_reference.html#introduction"&gt;user.properties&lt;/a&gt; file.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CookieManager.save.cookies=true&lt;/li&gt;
&lt;li&gt;CookieManager.allow_variable_cookies=true&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="pre-recording-proxy-configurations"&gt;Pre-Recording Proxy Configurations&lt;/h3&gt;
&lt;p&gt;Before recording, the JMeter Test Script Recorder must be configured. Several additional configuration elements will make the recorded requests easier to convert into repeatable test scenarios.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Update the URL inclusion regular expression pattern of the HTTP(S) Test Script Recorder to match the domain name or IP of the performance test environment (eg: .*mysite\.com.* - note the escaped periods using \.)
&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/2400x960/__key/communityserver-wikis-components-files/00-00-00-00-46/pastedimage1687975170533v1.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Update the&amp;nbsp;&lt;a href="https://jmeter.apache.org/usermanual/component_reference.html#HTTP_Request_Defaults"&gt;HTTP Request Defaults&lt;/a&gt; to set the fully-qualified domain name or IP of the performance test environment (eg: mysite.com) and scheme (http or https). If the Server Name is left blank in all subsequent HTTP recorders, this will be inherited from the default values which makes it very easy to point the scripts to a different Appian environment.
&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/2400x0/__key/communityserver-wikis-components-files/00-00-00-00-46/pastedimage1687975271499v2.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Start the HTTP(S) Test Script Recorder&lt;/li&gt;
&lt;li&gt;Configure the browser or mobile network proxy settings to point to the JMeter proxy machine and port
&lt;ul&gt;
&lt;li&gt;Browser
&lt;ul&gt;
&lt;li&gt;Open up browser settings and search for &amp;quot;Proxy&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mobile devices
&lt;ul&gt;
&lt;li&gt;The mobile device must have access to the machine running the JMeter proxy (eg: same wireless network, no firewall restrictions)&lt;/li&gt;
&lt;li&gt;Additional steps are needed when using &lt;a href="/w/guide/3325/leverage-jmeter-in-appian-load-testing#recording-ssl-https-traffic-from-mobile-devices"&gt;SSL/HTTPS sites with mobile devices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;iOS: Settings-&amp;gt;Wi-Fi-&amp;gt;(connected network)-&amp;gt;HTTP Proxy-&amp;gt;Manual&lt;/li&gt;
&lt;li&gt;Android: Not recommended due to inconsistent support for proxies and custom SSL certificates (if using SSL/HTTPS)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Considerations for Authentication&lt;/h3&gt;
&lt;p&gt;Once a client authenticates with Appian, a cookie with the name appianCsrfToken is created. Appian requires this token to be passed in as the value of the X-APPIAN-CSRF-TOKEN header during subsequent requests. In order to access the cookie&amp;rsquo;s value, set the value of this header to ${COOKIE___appianCsrfToken} in JMeter. This is automatically done when leveraging the &lt;a href="/b/appmarket/posts/jmeter-for-appian"&gt;JMeter for Appian&lt;/a&gt; utility. If this token is not correctly passed, Appian will return back a 401 - Unauthorized.&lt;/p&gt;
&lt;h3&gt;Working With SAIL Interfaces&lt;/h3&gt;
&lt;p&gt;When scripting user interactions on a SAIL form, certain dynamic values need to be extracted from the previous responses and provided as part of the next request:&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cID - The cID of the component being interacted with&lt;/li&gt;
&lt;li&gt;saveInto - The saveInto identifier of the component being interacted with&lt;/li&gt;
&lt;li&gt;context - An identifier that references the &lt;a href="https://docs.appian.com/suite/help/latest/SAIL_Performance.html#ongoing-context-management"&gt;SAIL context&lt;/a&gt; stored in the application server&lt;/li&gt;
&lt;li&gt;uuid - The unique identifier of the interface instance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Below is an example of a request modeling a user clicking a button widget with all dynamic values parameterized. This is automatically done when leveraging the &lt;a href="/b/appmarket/posts/jmeter-for-appian"&gt;JMeter for Appian&lt;/a&gt; utility.&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/500x0/__key/communityserver-wikis-components-files/00-00-00-00-46/pastedimage1687977121466v1.png" /&gt;&lt;/div&gt;
&lt;h3&gt;Working With Tasks&lt;/h3&gt;
&lt;p&gt;When interacting with an Appian task, the HTTP request path will need to reference its opaque task identifier as outlined below:&lt;/p&gt;
&lt;p&gt;/suite/rest/a/task/latest/&lt;i&gt;${OPAQUE_TASK_ID}&lt;/i&gt;/form&lt;/p&gt;
&lt;p&gt;This can be extracted from the previous HTTP request and parameterized to allow for performance testing playback.&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Special Handling for File Uploads&lt;/h3&gt;
&lt;p&gt;The JMeter proxy server does not capture uploaded files from the HTTP request. Instead it references the file directly from the local filesystem using the path specified in the request. Since most browsers submit just the name of the file (not the full path) the proxy usually can&amp;rsquo;t find the file to send on to the server and the request fails.&lt;/p&gt;
&lt;p&gt;In order to support file uploads when using JMeter, the uploaded file must be located in the directory where JMeter was launched. If JMeter was launched with ApacheJMeter.jar then the uploaded file should be in the same directory as this file. Move or copy files that will be part of the test script to the JMeter launch directory, then select them from that location when choosing the file to upload in the browser.&lt;/p&gt;
&lt;p&gt;When recording a file upload, one request will be created to upload the file to the Appian server and another will be created to place the uploaded file in the interface&amp;rsquo;s appropriate file upload component. The file ID provided in the response of the first request will need to be extracted and referenced in the second request. This is automatically done when leveraging the &lt;a href="/b/appmarket/posts/jmeter-for-appian"&gt;JMeter for Appian&lt;/a&gt; utility.&lt;/p&gt;
&lt;p&gt;More information on handling mobile uploads can be found &lt;a href="/w/guide/3325/leverage-jmeter-in-appian-load-testing#uploading-files-from-mobile-devices"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="running_recorded_scripts"&gt;Running Recorded Scripts&lt;/h2&gt;
&lt;h3 id="smoke-test-using-jmeter-gui"&gt;Using JMeter GUI&lt;/h3&gt;
&lt;p&gt;When tests aren&amp;rsquo;t working or produce unexpected results, run a quick smoke test. While GUI mode is not recommended for full-load test runs (due to performance concerns) the Summary Report and View Results Tree provide an extremely useful visual tool when diagnosing test problems.&lt;/p&gt;
&lt;p&gt;The Summary Report listener aggregates all samples for a given step and can be used to identify steps with a high error rate or with abnormal response times.&lt;/p&gt;
&lt;p&gt;The View Results Tree listener displays the request and response details for each individual sample which allows you to drill down to the root cause of any errors.&lt;/p&gt;
&lt;h3 id="command-line-configuration"&gt;Command Line Configuration&lt;/h3&gt;
&lt;p&gt;Full performance tests (as opposed to test script development or verification) should be run using Command Line mode (&lt;a href="https://jmeter.apache.org/usermanual/get-started.html#non_gui"&gt;CLI mode&lt;/a&gt;).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Parameters are set as program arguments using the syntax -J&amp;lt;name of parameter&amp;gt;=&amp;lt;value&amp;gt;. For example, the following command specifies a duration of 1 hour (3600 seconds), a rampup of 1 minute (60 seconds), and an iteration delay of 1 minute (60000 milliseconds). The test name, user load multiplier, think time delay, and think time deviation will use the values saved in the test script.&lt;/p&gt;
&lt;pre&gt;&lt;pre class="ui-code" data-mode="batchfile"&gt;c:\apache-jmeter-2.9\bin\jmeter -t &amp;quot;RefApp Test Plan.jmx&amp;quot; -n -JTEST_DURATION=3600 -JRAMPUP_PERIOD=60 -JITERATION_DELAY=60000&lt;/pre&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;To run the same test with 10 times the original user load and rampup over 10 minutes, change the values for RAMPUP_PERIOD and USER_MULTIPLIER:&lt;/p&gt;
&lt;pre&gt;&lt;pre class="ui-code" data-mode="batchfile"&gt;c:\apache-jmeter-2.9\bin\jmeter -t &amp;quot;RefApp Test Plan.jmx&amp;quot; -n -JTEST_DURATION=3600 -JRAMPUP_PERIOD=600 -JUSER_MULTIPLIER=10 -JITERATION_DELAY=60000&lt;/pre&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="common-problems"&gt;Common Problems&lt;/h3&gt;
&lt;h4 id="new-test-scenarios-not-captured"&gt;New test scenarios not captured&lt;/h4&gt;
&lt;p&gt;If no activity appears in the View Tree Results listener under the HTTP(S) Test Script Recorder then requests are not being sent to JMeter. Correct the proxy settings in the browser/mobile device.&lt;/p&gt;
&lt;p&gt;If requests appear in the View Tree Results listener but are not captured in the Recording Controller then the URL inclusion regular expression is not matching the target site URL. Correct the regular expression in the URL Patterns to Include settings of the HTTP(S) Test Script Recorder.&lt;/p&gt;
&lt;h4 id="high-error"&gt;High Error %&lt;/h4&gt;
&lt;p&gt;JMeter transactions can fail for several reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Server returned an error response code (eg: 500 Server Error, 404 Not Found)&lt;/li&gt;
&lt;li&gt;Server response timed out&lt;/li&gt;
&lt;li&gt;Response assertion failed (eg: expected &amp;ldquo;Submit Details&amp;rdquo; but got &amp;ldquo;View Details&amp;rdquo;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Errors may indicate a user-facing defect in the application or a problem with the test design. In other cases an error may be expected depending on conditions (eg: empty paging grids return 404 status codes).&lt;/p&gt;
&lt;p&gt;The JMeter Summary Report listener and the JMeter Analysis Worksheet both track the error rate for each transaction.&lt;/p&gt;
&lt;h4 id="too-few-too-many-requests"&gt;Too few/too many requests&lt;/h4&gt;
&lt;p&gt;The test design and test parameters should define a relatively consistent number of requests in any given period of time. If the results deviate significantly from the expected output it is a good sign that something went wrong with the test. Double check the test parameters and consider running a GUI smoke test to find the source of the problem.&lt;/p&gt;
&lt;h4 id="uneven-request-distribution-over-the-test-duration"&gt;Uneven request distribution over the test duration&lt;/h4&gt;
&lt;p&gt;The design of the example script is intended to simulate a random but relatively uniform load over the course of the test period. While some periods of higher than expected load are part of a realistic test, a continuous series of spikes and lulls is unlikely to provide realistic performance results.&lt;/p&gt;
&lt;p&gt;In order to visualize the request distribution, plot requests vs time and look for repeating patterns of high and low load. A longer rampup time may help eliminate uneven distribution.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&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/500x0/__key/communityserver-wikis-components-files/00-00-00-00-46/JMeter_5F00_Troubleshooting_5F00_Even_5F00_Distribution.png" /&gt;&lt;/div&gt;
Even distribution&lt;/td&gt;
&lt;td&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/500x0/__key/communityserver-wikis-components-files/00-00-00-00-46/JMeter_5F00_Troubleshooting_5F00_Uneven_5F00_Distribution.png" /&gt;&lt;/div&gt;
Uneven distribution&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="not-enough-rampup-time"&gt;Not enough rampup time&lt;/h4&gt;
&lt;p&gt;The JMeter Analysis Worksheet automatically filters out results from the rampup period but insufficient rampup time can cause some performance impact to carry over into the test period. The minimum safe rampup time will depend on the speed of the client machine, network, and server. In general, make sure that the rampup time (in seconds) is at least as high as the number of simulated users in the test (eg: a 100 user test should use a rampup time of at least 100 seconds).&lt;/p&gt;
&lt;h4 id="cascading-errors-unexpected-process-flow"&gt;Cascading errors/unexpected process flow&lt;/h4&gt;
&lt;p&gt;Since JMeter simply sends a sequence of scripted requests to the server its ability to adapt to unexpected responses is limited and often results in a series of cascading errors. For example, if a form submission response does not contain the activity id of the next chained form because of an error, the next request will also fail.&lt;/p&gt;
&lt;p&gt;These errors are usually caused by changes in the application being tested. Response assertions can be used to validate responses and identify these situations more clearly. Depending on how significant the change is the affected steps or the entire scenario may need to be re-recorded.&lt;/p&gt;
&lt;h2 id="special_considerations_for_mobile"&gt;Special Considerations for Mobile&lt;/h2&gt;
&lt;h3 id="uploading-files-from-mobile-devices"&gt;Uploading Files from Mobile Devices&lt;/h3&gt;
&lt;p&gt;As described earlier, file uploads require special steps when using the JMeter recorder. The workaround for uploading files is slightly more complex when using a mobile device since the file is on a different device and cannot be easily moved into the JMeter launch directory.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Attempt to upload a file from the mobile form (take a photo, choose a photo, etc)&lt;/li&gt;
&lt;li&gt;The request will be captured by JMeter, but the file upload field will display an error on the mobile form&lt;/li&gt;
&lt;li&gt;In JMeter, note the name of the file in the newly captured request
&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/JMeter_5F00_Mobile_5F00_File_5F00_Upload.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Copy the file from the mobile device to the JMeter proxy machine, or use a placeholder file if the actual content of the file is not important&lt;/li&gt;
&lt;li&gt;Move the file to the JMeter launch directory and rename it to match the name in the captured request&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Submit the mobile form to retry the failed upload&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The upload will succeed and the form will be submitted&lt;/li&gt;
&lt;li&gt;JMeter will record a second file upload request immediately before the form submission request&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remove the second file upload request from the recorded scenario in JMeter (the original request will work when the script is replayed)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="recording-ssl-https-traffic-from-mobile-devices"&gt;Recording SSL/HTTPS Traffic from Mobile Devices&lt;/h3&gt;
&lt;p&gt;The JMeter proxy server uses a self-signed SSL certificate to record HTTPS requests. See the &lt;a href="http://jmeter.apache.org/usermanual/component_reference.html#HTTP_Proxy_Server"&gt;JMeter documentation&lt;/a&gt; for details.&lt;/p&gt;
&lt;p&gt;Most browsers will show a warning message that can be safely ignored in order to proceed with test recording. However, the Appian mobile app doesn&amp;rsquo;t have the same warning/override option as a browser and automatically rejects invalid SSL certificates.&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/JMeter_5F00_Mobile_5F00_SSL_5F00_Proxy.png" /&gt;&lt;/div&gt;
&lt;p&gt;In order to record test scripts with HTTPS sites, a custom proxy certificate must be generated and installed on the JMeter proxy server and the mobile device. This is recommended only for users familiar with SSL/HTTPS and network concepts.&lt;/p&gt;
&lt;h4 id="ios"&gt;iOS&lt;/h4&gt;
&lt;p&gt;These instructions are for Windows users but apply to any OS platform. The Java JDK 7+ must be installed.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Generate a custom SSL certificate using keytool&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open a command window and switch to the &amp;lt;jmeter&amp;gt;/bin directory&lt;/li&gt;
&lt;li&gt;Rename proxyserver.jks to proxyserver.jks.bak&lt;/li&gt;
&lt;li&gt;Run the following command:
&lt;pre&gt;&lt;pre class="ui-code" data-mode="batchfile"&gt;keytool -genkey -keyalg RSA -alias selfsigned -keystore proxyserver.jks -storepass password -validity 999 -keysize 2048 -ext bc&lt;/pre&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Note:&lt;/strong&gt; The -ext parameter was added in Java 7 and is required to create a trusted certificate. This command can be run on any machine with Java 7+ and the resulting .jks file will still work with earlier Java versions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Instead of providing a first and last name, enter the URL of the Appian test environment (eg: www.mysite.com)
&lt;ul&gt;
&lt;li&gt;Use a wildcard to match multiple sites (eg: *.mysite.com)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Answer the remaining questions to generate a self-signed certificate in proxyserver.jks&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install the certificate on the JMeter proxy server&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The previous command automatically generates the certificate in the default location&lt;/li&gt;
&lt;li&gt;Start the JMeter proxy server&lt;/li&gt;
&lt;li&gt;Access the test site in a browser that uses the JMeter proxy&lt;/li&gt;
&lt;li&gt;Confirm that the browser shows a warning with the new certificate details&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install the certificate on the mobile device&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Run the following command:
&lt;pre&gt;&lt;pre class="ui-code" data-mode="batchfile"&gt;keytool -exportcert -keystore proxyserver.jks -alias selfsigned &amp;gt; proxyserver.crt&lt;/pre&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Email proxyserver.crt to your iOS device (or transfer it via another method)&lt;/li&gt;
&lt;li&gt;Open proxyserver.crt and install it as a trusted root profile on the device&lt;/li&gt;
&lt;li&gt;Confirm that the profile is listed and trusted in Settings-&amp;gt;General-&amp;gt;Profiles&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Appian app should now be able to connect to an HTTPS site while using the JMeter proxy server&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If the URL of the test environment changes the generated certificate may no longer be valid. If this happens a new certificate will be needed.&lt;/p&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>Thu, 11 Jun 2026 21:52:04 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/11/2026 9:52:04 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, Architecture&lt;/div&gt;
</description></item><item><title>Automated Testing</title><link>https://community.appian.com/success/w/guide/3310/automated-testing</link><pubDate>Thu, 11 Jun 2026 21:51:45 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:5afa3ef4-f658-45cf-82fe-0c7638bd64b4</guid><dc:creator>joel.larin</dc:creator><description>Current Revision posted to Guide by joel.larin on 6/11/2026 9:51:45 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;p&gt;Automated testing reduces the amount of manual testing necessary in an Appian application and reduces risk at each stage of the application development lifecycle. Automated testing can be used throughout the Appian application development lifecycle to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Test new rules created within an Appian application such as conditional fields, complex business logic, or validations&lt;/li&gt;
&lt;li&gt;Complete functional testing to ensure all requirements are verified and validated&lt;/li&gt;
&lt;li&gt;Regression test the application to ensure that existing functionality is not affected when:
&lt;ul&gt;
&lt;li&gt;Appian application gets promoted to different environments&lt;/li&gt;
&lt;li&gt;New functionality is created&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/article/3280/managing-multiple-concurrent-delivery-teams"&gt;Concurrent development teams&lt;/a&gt; are established&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Fast forward to a particular step in a workflow to perform manual testing from there&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when_should_automated_testing_be_implemented"&gt;When Should Automated Testing Be Implemented&lt;/h2&gt;
&lt;p&gt;Automated testing should be implemented early in a project to prevent buildup of functionality for which test scripts must be written. The longer a team waits to set up automated testing, the more burdensome it can become to do so. Conversely, if test scripts are written for functionality that is highly likely to change, it can be&amp;nbsp;time-consuming to update them to keep up with changing requirements. So, a project team must work together to achieve a balance between these alternatives by determining when and for what purposes to design automated testing scripts.&lt;/p&gt;
&lt;h2 id="how_much_should_automated_testing_cover"&gt;How Much Should Automated Testing Cover&lt;/h2&gt;
&lt;p&gt;It is not recommended to have 100% test coverage of an application through Automated Testing due to the below reasons:&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It is time consuming to plan/implement test scripts and run the tests to cover the entire application.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;We currently do not have a method to gauge completeness of test coverage for an application.&lt;/li&gt;
&lt;li&gt;Some areas of the application may change frequently over time and integrations may depend on external systems.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These factors can make it difficult to get a good return on the time investment put into building test scripts to cover all functionality in an application.Given that 100% of the application cannot reliably be validated through automated testing, the core team (developers, PO, QAs) must collaborate in order to identify highest priority items to be addressed. Teams should consider factors such as level of effort to create new automated tests and level of risk in determining where to focus test coverage. Based on this collaboration, the automated testing suite can be incrementally updated to ensure highest value areas are targeted first.&lt;/p&gt;
&lt;p&gt;Automated testing is not the same as performance testing. To find more information on performance testing best practices and tools such as JMeter and Loadrunner, see &lt;a href="/w/article/3216/performance-and-load-testing"&gt;Performance and Load Testing&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="automated_testing_tools_for_appian_applications"&gt;Automated Testing Tools for Appian Applications&lt;/h2&gt;
&lt;p&gt;The following tools can be used to automate testing for Appian applications. The Tools In Appian section describes automated testing features that come OOTB with Appian, which should be used wherever possible. The External Tools section includes the available tools which were not built for Appian, and the Tools Built for Appian section describes tools built for Appian from external tools to facilitate automated testing in Appian.&lt;/p&gt;
&lt;h3 id="tools_in_appian"&gt;Tools in Appian&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Expression Rule Test Cases:&amp;nbsp;&lt;/strong&gt;Test cases can be configured for expression rules to test outputs with any combination of inputs. These function as automated tests built into the expression rule object. See the &lt;a href="https://docs.appian.com/suite/help/latest/Automated_Testing_for_Expression_Rules.html"&gt;documentation&lt;/a&gt; for more information and instructions on when and how to use expression rule test cases. By importing the &lt;a href="/b/appmarket/posts/automated-rule-testing-application"&gt;Automated Rule Testing&lt;/a&gt;&amp;nbsp;application&amp;nbsp;to an environment, administrators can run all test cases regularly and leverage reporting on failures and successes. This will help identify bugs in expression rules faster, speed up regression testing after rules have changed, and make smoke testing deployments even faster.&lt;/p&gt;
&lt;h3 id="external_tools"&gt;External Tools&lt;/h3&gt;
&lt;p&gt;These should generally only be used when necessary. Otherwise, it is recommended to use &lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;FitNesse For Appian&lt;/a&gt; or &lt;a href="/b/appmarket/posts/appian_2d00_selenium_2d00_api"&gt;Appian&amp;rsquo;s Selenium API&lt;/a&gt; with Cucumber (described in the Tools Built for Appian section below) because these are preconfigured to work for Appian applications.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Selenium:&amp;nbsp;&lt;/strong&gt;Selenium is an automated testing tool that is able to control a web browser. Selenium has two different products: WebDriver and IDE. The WebDriver is a collection of language specific bindings that drive a web browser while the IDE is an add-on to Firefox that is able to record and playback interactions with the web browser.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For more information, see the &lt;a href="http://www.seleniumhq.org/"&gt;Selenium Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;FitNesse:&amp;nbsp;&lt;/strong&gt;FitNesse is automated testing software which uses a wiki language and allows for a low barrier to entry and ease of use. FitNesse test scripts and test suites are created in the wiki language that map out to functions written in a development language that wrap a Selenium Webdriver to perform actions on an Appian application.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For more information, see the &lt;a href="http://www.fitnesse.org/"&gt;FitNesse Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cucumber:&amp;nbsp;&lt;/strong&gt;Cucumber is an automated test tool utilizing Behavior Driven Development (BDD) that allows testers to specify test scenarios in a human readable form. Cucumber can be used to create test scripts in plain language with Gherkin syntax. One benefit of Cucumber is that the Product Owner or business users are able to write test cases without a technical background. These test scripts map to functions in a development language (such as Java or Ruby) that wrap a Selenium Webdriver to perform the specified actions on an Appian application.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For more information, see the &lt;a href="https://cucumber.io/"&gt;Cucumber Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tools_built_for_appian"&gt;Tools Built for Appian&lt;/h2&gt;
&lt;p&gt;Appian has created the following tools to reduce the amount of work required to automate testing of Appian applications.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Appian Selenium API: &lt;/b&gt;The Appian Selenium API allows you to run Appian UI tests directly from a JUnit Test Case, create your own Gherkin steps and step definitions with Cucumber, and run tests from any java based test tool of your choice without having to create the necessary xpath for selenium to interact with Appian. When using Cucumber, it is recommended to use this API to customize step definitions to match the business users&amp;rsquo; phrasing.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/b/appmarket/posts/appian_2d00_selenium_2d00_api"&gt;Download the Appian Selenium API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;FitNesse for Appian:&lt;/strong&gt; Appian has written WebDriver fixtures to leverage Selenium and FitNesse to create FitNesse for Appian. This tool is easier to set up than Fitnesse and provides a faster way to build automated tests for Appian applications. This is complemented by the &lt;a href="/b/appmarket/posts/fit-fam-fitnesse-for-appian-generator"&gt;FitFam application&lt;/a&gt;, which allows users to create FitNesse test scripts for complex interfaces solely by interacting with the interface.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/b/appmarket/posts/fitnesse-for-appian"&gt;Download FitNesse for Appian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;For more information, see the &lt;a href="/w/guide/3310/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;For implementation guidance, see the &lt;a href="/w/guide/3212/fitnesse-for-appian-best-practices#designing_appian_applications_for_fitnesse"&gt;FitNesse for Appian Best Practices&lt;/a&gt; Play&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Cucumber for Appian:&lt;/b&gt; Cucumber for Appian is a client-side tool that provides a sample set of step definitions similar to those provided by &lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;. Note that these step definitions are not application specific. Features and scenarios written with these sample step definitions will not embrace the &lt;a href="https://cucumber.io/docs/bdd/"&gt;Behavior Driven Development (BDD)&lt;/a&gt; aspects of Cucumber. Cucumber for Appian is a good starting point for teams not familiar with Cucumber to get familiar with Cucumber before writing their own cucumber step definitions in Java. Additionally, the sample step definitions will allow testers to write a fairly complete set of tests without needing to know Java.&lt;/p&gt;
&lt;p&gt;Teams experienced in writing automated tests as code might find the sample step definitions provided by Cucumber for Appian limiting. For example, gherkin syntax does not allow for saving variables between steps or looping. We recommend leveraging the &lt;a href="/b/appmarket/posts/appian_2d00_selenium_2d00_api"&gt;Appian Selenium API&lt;/a&gt; to write your own step definitions for testers that want to trade the simplicity of Cucumber for Appian with the power provided by code. Custom Step Definitions in tandem with the Appian Selenium API will allow you to write future proof tests that will work between upgrades and embrace BDD.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download &lt;a href="/b/appmarket/posts/cucumber-for-appian"&gt;Cucumber for Appian&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, see the &lt;a href="/w/guide/3311/automated-testing-with-cucumber-for-appian"&gt;Cucumber for Appian&lt;/a&gt; Playbook Play&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: Delivery, testing, Architecture&lt;/div&gt;
</description></item><item><title>LDAP Synchronization</title><link>https://community.appian.com/success/w/guide/3274/ldap-synchronization</link><pubDate>Thu, 11 Jun 2026 21:51:28 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:68b62263-6536-4392-ab1a-b3603da8e75c</guid><dc:creator>joel.larin</dc:creator><description>Current Revision posted to Guide by joel.larin on 6/11/2026 9:51:28 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Over time, user accounts need to be created, updated, and deactivated. Customers who have an existing user directory can use the &lt;a href="/b/appmarket/posts/ldap-tools"&gt;LDAP Tools&lt;/a&gt; plug-in to automatically mirror these changes to Appian without requiring users to work manually through the web interface or with CSV files.&lt;/p&gt;
&lt;p&gt;Periodically synchronizing users with a directory service ensures that only authorized users have accounts in Appian and that their user profiles are consistent with the system of record. Furthermore, synchronizing users between Appian and the directory service provides Shared Sign On features when using Appian &lt;a href="https://docs.appian.com/suite/help/latest/Appian_Administration_Console.html#ldap-authentication"&gt;native authentication&lt;/a&gt;. Customers can elect to combine LDAP sync with external authentication mechanisms such as SAML or Kerberos to offer true &lt;a href="https://docs.appian.com/suite/help/latest/Authentication.html"&gt;Single Sign On&lt;/a&gt; capability.&lt;/p&gt;
&lt;h2 id="user_profile_synchronization"&gt;User Profile Synchronization&lt;/h2&gt;
&lt;p&gt;There are several ways LDAP can be used to create accounts in Appian. The LDAP Tools plug-in smart service node can be used to update Appian user profiles in bulk from returned LDAP queries. The data that can be synchronized includes all the default user profile fields (e.g., first name, last name, address, phone, supervisor, title, etc.) as well several custom fields. These details can then be used to create and update accounts and modify group membership.&lt;/p&gt;
&lt;p&gt;Another common method to generate user accounts is to have them updated and populated with details from LDAP when a user logs in. Although this approach is useful for customers who don&amp;#39;t have an existing Appian user directory or who don&amp;#39;t want to synchronize users in bulk using LDAP sync, users are not visible in the system and cannot be added to groups (e.g., for task assignment) prior to their initial logon. Furthermore, this create-on-login paradigm does not support user deactivation. This approach requires the use of a custom Java extension to the external system and must be maintained independent of Appian. This is outside the scope of the LDAP tools plug-in.&lt;/p&gt;
&lt;p&gt;It is recommended to use the first approach in a nightly batch process. This handles the issues discussed above and ensures that the authorized user list is up to date. Please refer to the &lt;a href="/b/appmarket/posts/ldap-tools"&gt;LDAP Sync application&lt;/a&gt; included with the plug-in for more information.&lt;/p&gt;
&lt;h3 id="important-considerations"&gt;Important Considerations&lt;/h3&gt;
&lt;p&gt;All operations by the plug-in are driven by &lt;a href="https://social.technet.microsoft.com/wiki/contents/articles/5392.active-directory-ldap-syntax-filters.aspx"&gt;LDAP queries&lt;/a&gt; on &lt;a href="http://www.zytrax.com/books/ldap/ch2/index.html#model"&gt;object classes&lt;/a&gt;, attributes, and &lt;a href="http://www.zytrax.com/books/ldap/ch5/step2.html#step2-groups"&gt;groups&lt;/a&gt;. As such, if you are not familiar with LDAP terminology, please proceed with caution.&lt;/p&gt;
&lt;div class="tip"&gt;&lt;strong&gt;Important:&lt;/strong&gt; When running LDAP sync, it is possible to unintentionally import an entire user directory.&lt;/div&gt;
&lt;p&gt;While the process can facilitate the creation of users in Appian, users accounts can never be deleted, only deactivated. Therefore, it is important to ensure that only the users you expect to be imported is actually imported. In a pre-production environment, test the queries using the &lt;strong&gt;Configure LDAP Synchronization&lt;/strong&gt; action included in the LDAP Sync application.&lt;/p&gt;
&lt;h3 id="prerequisites"&gt;Prerequisites&lt;/h3&gt;
&lt;p&gt;Before attempting to use the LDAP Tools plug-in, identify the following information for your environment:&lt;/p&gt;
&lt;table class="appianTable" width="100%"&gt;
&lt;thead&gt;
&lt;tr class="header"&gt;
&lt;th width="33.81410256410257%"&gt;Item&lt;/th&gt;
&lt;th width="66.18589743589743%"&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Full LDAP Server URL&lt;/td&gt;
&lt;td&gt;ldap://localhost:389&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service Manager Username&lt;/td&gt;
&lt;td&gt;cn=Admin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service Manager Password&lt;/td&gt;
&lt;td&gt;secret&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Narrow LDAP Search Filter&lt;/td&gt;
&lt;td&gt;(&amp;amp;(objectClass=person)(memberof=CN=Finance,OU=Users,DC=appian,DC=com))&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mapping of Attributes to Appian User fields&lt;/td&gt;
&lt;td&gt;&lt;em&gt;uid&lt;/em&gt;, &lt;em&gt;givenName&lt;/em&gt;, &lt;em&gt;sn&lt;/em&gt;, and &lt;em&gt;mail&lt;/em&gt; map to the &lt;em&gt;Username&lt;/em&gt;, &lt;em&gt;First Name&lt;/em&gt;, &lt;em&gt;Last Name&lt;/em&gt;, and &lt;em&gt;Email&lt;/em&gt; address of a created account&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="ldap_sync_application"&gt;LDAP Sync Application&lt;/h2&gt;
&lt;p&gt;The &lt;a href="/b/appmarket/posts/ldap-tools"&gt;LDAP Tools&lt;/a&gt; shared component includes an application that, when configured, synchronizes the directory service users to Appian. The application will also manage Appian group membership.&lt;strong&gt;Note:&lt;/strong&gt; The application only synchronizes users and their group association within Appian, it does not create groups to mimic the directory service structure.&lt;/p&gt;
&lt;p&gt;The process automatically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Creates Appian users that do not exist&lt;/li&gt;
&lt;li&gt;Deactivates Appian users that have been removed from the directory service&lt;/li&gt;
&lt;li&gt;Reactivates previously deactivated Appian users&lt;/li&gt;
&lt;li&gt;Updates Appian users with any changes made to their respective directory service entries&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This process can be run nightly ensuring all authorized users have accounts. If more frequent updates are required, especially when dealing with large group sizes, they can be scheduled during off peak hours to ensure the update process does not overlap with high volume usage.&lt;/p&gt;
&lt;h3 id="use-cases"&gt;Use Cases&lt;/h3&gt;
&lt;p&gt;The following examples demonstrate the cases the nightly synchronization handles.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Case 1&lt;/strong&gt; - A new entry, &lt;em&gt;John Smith&lt;/em&gt;, is added to the directory service. This entry is captured by at least one of the LDAP queries run during the nightly LDAP synchronization process and a new Appian user with the same details is created.&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/ldapCase1.png" /&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Case 2&lt;/strong&gt; - The user added in the previous case is updated. Additionally, &lt;em&gt;Jane Doe&lt;/em&gt;, is removed from the directory service. Both of these changes are captured by the nightly synchronization. In Appian, the first name &lt;em&gt;john.smith&lt;/em&gt; user account is updated to &lt;em&gt;Jonathan&lt;/em&gt;. The &lt;em&gt;jane.doe&lt;/em&gt; account is not returned by any of the LDAP queries and is then deactivated in Appian.&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/ldapCase2.png" /&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Case 3&lt;/strong&gt; - An existing directory service entry is modified so that a user is removed from a directory service group. This results in the none of the LDAP queries returning this user. The user is deactivated and removed from the associated Appian group.&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/ldapCase3.png" /&gt;&lt;/div&gt;
&lt;h3 id="ldap-sync-tutorial"&gt;LDAP Sync Tutorial&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Setup up a directory service. Please skip to Step 2 if you already have a directory service configured. For the purposes of this tutorial, we recommend using &lt;a href="https://backstage.forgerock.com/docs/opendj/3.5"&gt;openDJ&lt;/a&gt;. During the &amp;quot;Directory Data&amp;quot; step of the installation define your Base DN and automatically generate sample data.
&lt;ul&gt;
&lt;li&gt;Define the &lt;strong&gt;Base DN&lt;/strong&gt; as dc=appian, dc=com and create 100 users.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Browse the directory with a third-party client such as &lt;a href="http://jxplorer.org/"&gt;JXplorer&lt;/a&gt; and confirm that the entries to be imported have the minimum &lt;a href="https://docs.appian.com/suite/help/latest/User_Management.html#Creating_a_New_User"&gt;basic user criteria&lt;/a&gt;. Also take note of the expected number of created Appian users as well as any distinguishing attributes that can be used to generate a targeted search filter.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.appian.com/suite/help/latest/Appian_Plug-ins.html"&gt;Deploy&lt;/a&gt; the LDAP Tools plug-in on your Appian instance.&lt;/li&gt;
&lt;li&gt;Import the LDAP Sync application into your environment.&lt;/li&gt;
&lt;li&gt;Set up a &lt;a href="https://docs.appian.com/suite/help/latest/Appian_Administration_Console.html#third-party-credentials"&gt;Secure Credential Store&lt;/a&gt; to include the authentication credentials for the directory service:
&lt;ul&gt;
&lt;li&gt;Navigate to the Administration Console.&lt;/li&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Third-Party Credentials&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enter a &lt;strong&gt;Name&lt;/strong&gt;, this is the secured credential store (SCS) key, e.g., &lt;em&gt;ldap.acme&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;+Add field&lt;/strong&gt; to create a new field named &lt;em&gt;username&lt;/em&gt;, this is the relative distinguished name (RDN) for the ldap administrator, e.g. cn=admin.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;+Add field&lt;/strong&gt; to create a new field named &lt;em&gt;password&lt;/em&gt;, this is the password for the administrator user, e.g., &lt;em&gt;secret&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;em&gt;LDAP Tools&lt;/em&gt; in &lt;strong&gt;Plug-ins&lt;/strong&gt; field.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;In Tempo, click &lt;strong&gt;Actions&lt;/strong&gt;, and then click &lt;strong&gt;Configure LDAP Synchronization&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Fill out the following required fields:
&lt;table class="appianTable" width="100%"&gt;
&lt;thead&gt;
&lt;tr class="header"&gt;
&lt;th width="0%"&gt;Field&lt;/th&gt;
&lt;th width="0%"&gt;Description&lt;/th&gt;
&lt;th width="0%"&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Protocol&lt;/td&gt;
&lt;td&gt;Protocol used to connect to ldap server&lt;/td&gt;
&lt;td&gt;ldap or ldaps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;td&gt;Host running the ldap server&lt;/td&gt;
&lt;td&gt;ldap.server.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Port&lt;/td&gt;
&lt;td&gt;Port used to connect to the ldap server&lt;/td&gt;
&lt;td&gt;389 or 636&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secure Credential Store Key&lt;/td&gt;
&lt;td&gt;Name of third-party credential contains ldap admin details&lt;/td&gt;
&lt;td&gt;ldap.acme&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Connection Type&lt;/td&gt;
&lt;td&gt;Set to ssl if using a non-standard key store&lt;/td&gt;
&lt;td&gt;clear or ssl&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All LDAP Users Group&lt;/td&gt;
&lt;td&gt;If a user is a member of this group, but not returned by any of the LDAP group filters, the user is deactivated&lt;/td&gt;
&lt;td&gt;All Users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User Attribute Mapping&lt;/td&gt;
&lt;td&gt;Mapping of ldap attributes to Appian user profile fields, the following are required: Username, First Name, Last Name, Email&lt;/td&gt;
&lt;td&gt;uid, givenName, sn, mail&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;Create at least one group filter which is used to synchronize the LDAP query results with membership to an Appian group:
&lt;ul&gt;
&lt;li&gt;In the &lt;strong&gt;Group Membership&lt;/strong&gt; section, click &lt;strong&gt;+Add Item&lt;/strong&gt; to add a new &lt;em&gt;Group Filter&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Enter a &lt;strong&gt;Display Name&lt;/strong&gt; for the filter, this is used to name the process instances which synchronize this group.&lt;/li&gt;
&lt;li&gt;Enter the &lt;strong&gt;Base DN&lt;/strong&gt; for the query, if left null the entire directory is searched.&lt;/li&gt;
&lt;li&gt;Enter the LDAP &lt;strong&gt;Filter&lt;/strong&gt; used to query the desired subset of users.&lt;/li&gt;
&lt;li&gt;Enter the &lt;strong&gt;Appian Group&lt;/strong&gt; whose members should be determined by this filter.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Check the box next to the newly created row and click &lt;strong&gt;Test Filter&lt;/strong&gt;.
&lt;ul&gt;
&lt;li&gt;This action returns either the results for the filter or an error and a suggested remedy.&lt;/li&gt;
&lt;li&gt;The fields displayed in the results table correspond the mapped attributes in the &lt;strong&gt;User Attribute Mapping&lt;/strong&gt; section.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Once all filters have been created and tested click &lt;strong&gt;Submit&lt;/strong&gt; to save the settings.&lt;/li&gt;
&lt;li&gt;To turn on nightly sync do the following:
&lt;ul&gt;
&lt;li&gt;Open the &lt;strong&gt;Configure LDAP Synchronization&lt;/strong&gt; action.&lt;/li&gt;
&lt;li&gt;Check the &lt;strong&gt;Enable LDAP Sync&lt;/strong&gt; checkbox.&lt;/li&gt;
&lt;li&gt;Enter the time when the sychronization process should run&lt;strong&gt;Note:&lt;/strong&gt; this requires republishing of the &lt;em&gt;LDAP - Scheduled Job&lt;/em&gt; process model in order to integrate the new start time.&lt;/li&gt;
&lt;li&gt;Verify process runs at appointed time and daily thereafter.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="troubleshooting"&gt;Troubleshooting&lt;/h2&gt;
&lt;p&gt;Below are some of the most common errors encountered when using the plug-in. Confirm with the plug-in&amp;rsquo;s documentation and your directory services&amp;rsquo; manual for more specific information.&lt;/p&gt;
&lt;h4 id="error-code-12"&gt;Error Code 12&lt;/h4&gt;
&lt;p&gt;An error code 12 response is received when using the ldapsearch function in Appian, despite confirming that the directory service is browsable and searchable using third-party tools such as JXplorer:&lt;/p&gt;
&lt;p&gt;LDAP: error code 12 - Unsupport critical control 2.16.840.1.113730.3.4.9&lt;/p&gt;
&lt;p&gt;LDAP: error code 12 - LDAP_UNAVAILABLE_CRITICAL_EXTENSION&lt;/p&gt;
&lt;p&gt;The plug-in presumes that your directory service supports virtual list view request control (VLV). If this is not the case, update the &lt;strong&gt;Virtual List View Control Supported&lt;/strong&gt; field using the &lt;strong&gt;Configure LDAP Synchronization&lt;/strong&gt; action.&lt;/p&gt;
&lt;h4 id="error-code-49"&gt;Error Code 49&lt;/h4&gt;
&lt;p&gt;An error code 49 response is received when using the ldapsearch function in Appian:&lt;/p&gt;
&lt;p&gt;LDAP: error code 49 - Invalid Credentials&lt;/p&gt;
&lt;p&gt;Check the Secure Credential Store and confirm that your logon credentials are correct. Passwords are case sensitive. The username must be entered with its full RDN (for example, cn=admin, not admin).&lt;/p&gt;
&lt;h4 id="unable-to-bind-to-ldap-server"&gt;Unable to Bind to LDAP Server&lt;/h4&gt;
&lt;p&gt;An Unable to bind to LDAP server error is usually returned when the directory service is down. Confirm that the server is operational, has an IP Address, and is not blocked by any firewall before trying again.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: integrations, Architecture&lt;/div&gt;
</description></item><item><title>Integrating with DocuSign</title><link>https://community.appian.com/success/w/guide/3253/integrating-with-docusign</link><pubDate>Thu, 11 Jun 2026 21:51:02 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:3e5e8ebb-fe08-477d-b6b4-cb152a852392</guid><dc:creator>joel.larin</dc:creator><description>Current Revision posted to Guide by joel.larin on 6/11/2026 9:51:02 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;h2 id="key_docusign_concepts"&gt;Key DocuSign Concepts&lt;/h2&gt;
&lt;p&gt;DocuSign provides electronic signature technology and digital transaction management through a web app. In the DocuSign lifecycle, the process ends with a signed, voided, or rejected document.&amp;nbsp; Because of this, it&amp;rsquo;s important to understand how DocuSign structures its documents and maintains signature validity. DocuSign uses the concept of envelopes and documents to allow seamless signing experiences while preserving document independence&lt;/p&gt;
&lt;h3 id="envelope"&gt;Envelope&lt;/h3&gt;
&lt;p&gt;An envelope can contain one or more documents, the fields in the document, recipient info, delivery progress, sender information, security and more.&lt;/p&gt;
&lt;h3 id="document"&gt;Document&lt;/h3&gt;
&lt;p&gt;A document is the lowest-level object on which an intact signature seal can be placed. Multiple documents can be added to an envelope.&amp;nbsp; After signing, these documents can then be extracted individually if needed.&lt;/p&gt;
&lt;h3 id="signature_seal"&gt;Signature Seal&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://support.docusign.com/en/guides/ndse-user-guide-apply-electronic-seals"&gt;Electronic seals&lt;/a&gt; are used to show evidence of origin and integrity of documents. One of the ways DocuSign uses seals is to ensure the validity of an electronic signature on a document and to ensure that no document tampering has been done after signing.&amp;nbsp; If a document is split up or changed in any way after signing, the seals will be broken and the signatures are invalidated. If pages or documents need to be independently extracted post signing, to preserve seal integrity, the items need to be split into &amp;ldquo;documents&amp;rdquo; on the same envelope.&lt;/p&gt;
&lt;h2 id="connectivity_from_appian_to_docusign"&gt;Connectivity from Appian to DocuSign&lt;/h2&gt;
&lt;p&gt;Setup of DocuSign requires admin access on the DocuSign account. For easy production deployment, you will want the sandbox to be configured with an account linked to your Production Account.&lt;/p&gt;
&lt;p&gt;Integration to DocuSign in production requires the promotion of an API key by following &lt;a href="https://developers.docusign.com/esign-rest-api/guides/go-live-steps"&gt;DocuSign&amp;#39;s Go-Live Steps&lt;/a&gt; from each environment. The following guide will highlight setting up a connection for a single Appian environment to send single-document envelopes to a single signer.&lt;/p&gt;
&lt;p&gt;There are three common methods for setting up authentication and authorization between Appian and DocuSign.&lt;/p&gt;
&lt;h3 id="mcetoc_1i5oh6d940"&gt;1. Service Account Integration (JWT Grant)&lt;/h3&gt;
&lt;p&gt;This method uses a single service account DocuSign user. The integration calls to DocuSign are made as this service account user. The first step necessary is to login to the &lt;a href="https://account-d.docusign.com/"&gt;DocuSign account &lt;/a&gt;with Admin privileges that the client wishes to use for their integration and retrieve some key pieces of information.&lt;/p&gt;
&lt;h4&gt;DocuSign Setup Steps for Demo Environment&lt;/h4&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Login to &lt;a href="https://demo.docusign.net/"&gt;https://demo.docusign.net/&lt;/a&gt; with Admin privileges.&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Navigate to the &lt;/span&gt;&lt;b&gt;Settings &lt;/b&gt;&lt;span style="font-weight:400;"&gt;tab.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Click on &lt;strong&gt;Apps and Keys&lt;/strong&gt; (under Integrations in the left navigation).&lt;/span&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/640x480/__key/communityserver-wikis-components-files/00-00-00-00-46/docusign_5F00_1.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Copy the &lt;b&gt;User ID&lt;/b&gt;, &lt;b&gt;API Account ID&lt;/b&gt;, and &lt;b&gt;Account&amp;rsquo;s Base URI&lt;/b&gt; to a location where they&amp;rsquo;ll be easily copied.&lt;/span&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/640x480/__key/communityserver-wikis-components-files/00-00-00-00-46/Screenshot2.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Click &lt;b&gt;Add App / Integration Key.&lt;/b&gt;&lt;/span&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/640x480/__key/communityserver-wikis-components-files/00-00-00-00-46/Screenshot-3.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Add an appropriate &lt;strong&gt;App Name&lt;/strong&gt;, ensuring you keep in mind the number of environments you will be connecting.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Copy the &lt;b&gt;Integration Key&lt;/b&gt; to the same location where the information in Step 4 was stored.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Under &lt;b&gt;Authentication&lt;/b&gt;, select Yes for the question on whether your application can securely store a client secret. (Responding No to this question also works for JWT grant as this method uses the RSA private key as opposed to the client secret key used in the Authorization Code grant method).&lt;/span&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/1760x1190/__key/communityserver-wikis-components-files/00-00-00-00-46/8484.screenshot_5F00_4.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Under &lt;strong&gt;Service Integration&lt;/strong&gt;, click &lt;strong&gt;Generate RSA&lt;/strong&gt;&amp;nbsp;and copy the private key to the same location where the information in Step 4 was stored.&lt;/span&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/526x578/__key/communityserver-wikis-components-files/00-00-00-00-46/Screenshot-5.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Click &lt;b&gt;SAVE&lt;/b&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Follow the &lt;a href="https://developers.docusign.com/platform/auth/consent/obtaining-individual-consent/"&gt;steps&lt;/a&gt; required to obtain individual consent for your application to act on a user&amp;rsquo;s behalf.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Appian Setup Steps&lt;/h4&gt;
&lt;p&gt;The easiest way to interact with DocuSign in Appian is through the use of a Connected System.&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create a &lt;strong&gt;Connected System&lt;/strong&gt; using proper naming conventions.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;DocuSign&lt;/strong&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/800x240/__key/communityserver-wikis-components-files/00-00-00-00-46/6305.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Add an appropriate name and description.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Authentication&lt;/strong&gt;, select &lt;strong&gt;JWT Grant&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Paste the &lt;strong&gt;Instance URL&lt;/strong&gt; (Account&amp;rsquo;s Base URI), the &lt;strong&gt;API Account ID&lt;/strong&gt;, &lt;strong&gt;API Username&lt;/strong&gt;, &lt;strong&gt;Private RSA Key&lt;/strong&gt;, and &lt;strong&gt;Integration Key&lt;/strong&gt;.
&lt;div class="callout-box callout-info"&gt;For the private key, the copied text needs to include &amp;ldquo; -----BEGIN RSA PRIVATE KEY----- &amp;rdquo; at the beginning and &amp;ldquo; ----- END RSA PRIVATE KEY----- &amp;rdquo; at the end.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;TEST CONNECTION&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;When you get a Connection successful alert, click &lt;strong&gt;CREATE&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="per_user_authorization"&gt;2. Per User Authorization (Method 1) - Authorization Code Grant&lt;/h3&gt;
&lt;p&gt;Rather than using a service account to make the calls from Appian to DocuSign, the user authorizes Appian to make calls to DocuSign on their behalf using their DocuSign account. Please note that this method requires providing the user an &lt;a href="https://docs.appian.com/suite/help/latest/authorization_link_component.html"&gt;authorization link&lt;/a&gt; within an Appian SAIL form before making a call on their behalf. If calls on their behalf fail, catch the error, and again provide the user with an authorization link to reauthorize.&amp;nbsp;&lt;/p&gt;
&lt;h4 id="mcetoc_1i5oh6d941"&gt;DocuSign Setup Steps for Demo Environment&lt;/h4&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Follow steps 1-7 from the Basic Authentication section above.&lt;/li&gt;
&lt;li&gt;Under &lt;b&gt;Integration Key&lt;/b&gt;, select &lt;b&gt;Authorization Code Grant.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Add a &lt;b&gt;Secret Key&lt;/b&gt; and copy the value.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="max-height:880px;max-width:595px;" alt=" " src="/resized-image/__size/1190x1760/__key/communityserver-wikis-components-files/00-00-00-00-46/8371.secret_5F00_keys_5F00_1.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Add the &lt;b&gt;[APPIAN_URL]/suite/oauth/callback&lt;/b&gt; URL to the &lt;b&gt;Redirect URIs&lt;/b&gt; list.
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="max-height:460px;max-width:1114px;" alt=" " src="/resized-image/__size/2228x920/__key/communityserver-wikis-components-files/00-00-00-00-46/Screenshot6.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;b&gt;SAVE&lt;/b&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="mcetoc_1i5oh6d942"&gt;Appian Setup Steps&lt;/h4&gt;
&lt;p&gt;The easiest way to interact with DocuSign in Appian is through the use of a Connected System.&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Follow steps 1-3 from the JWT Grant Authentication section above.&lt;/li&gt;
&lt;li&gt;Under &lt;b&gt;Authentication&lt;/b&gt;, select &lt;b&gt;Authorization Code Grant&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;Paste the &lt;b&gt;Instance URL &lt;/b&gt;(Account&amp;rsquo;s Base URI), the &lt;b&gt;API Account ID&lt;/b&gt;, &lt;b&gt;Integration Key, Secret Key &lt;/b&gt;into the Appian setup page then select the &lt;b&gt;DocuSign Environment&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;b&gt;AUTHORIZE &lt;/b&gt;to authorize Appian to make calls on the logged in user&amp;rsquo;s behalf (you may need to enter your DocuSign credentials at this time).&lt;/li&gt;
&lt;li&gt;When you get a Connection successful alert, click &lt;b&gt;CREATE&lt;/b&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="mcetoc_1i5qp205v0"&gt;3. Per User Authorization (Method 2) - JWT Grant with Organizational Consent to Act on Behalf of All Users&lt;/h3&gt;
&lt;p&gt;As in method 1, this method also uses each individual user&amp;rsquo;s Docusign account to make the integration calls, however the user is not required to manually authorize Appian to act on their behalf. A DocuSign admin provides organizational consent for all users. This method requires using the JWT Tools plugin to accomplish the generation of access tokens and cannot use the DocuSign connected system for integrations.&lt;/p&gt;
&lt;p&gt;This approach is often paired with the Service Account Integration method such that certain calls (Send Envelope) use the JWT Tools plugin and others (Download Document) use the Appian Connected System.&lt;/p&gt;
&lt;h4&gt;Docusign Setup&lt;/h4&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Update the account settings on DocuSign by following these steps.&lt;/li&gt;
&lt;li&gt;Follow the steps to implement JWT Grant from the DocuSign documentation.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Appian Setup&lt;/h4&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Download &lt;/span&gt;&lt;a href="/b/appmarket/posts/jwt-web-token-tools"&gt;&lt;span style="font-weight:400;"&gt;JWT Plugin&lt;/span&gt;&lt;/a&gt;&lt;span style="font-weight:400;"&gt; from the app market.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Create a third party credential key via the Admin Console (Admin Console -&amp;gt; Third Party Credentials -&amp;gt; Create).&lt;/span&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;Name&lt;/b&gt;&lt;span style="font-weight:400;"&gt;: Required field, select a unique easy-to-use name.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Key&lt;/b&gt;&lt;span style="font-weight:400;"&gt;: Appian will auto generate it from the name.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Description&lt;/b&gt;&lt;span style="font-weight:400;"&gt;: Optional field, enter an appropriate description.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Plug-ins List&lt;/b&gt;&lt;span style="font-weight:400;"&gt;: Optional field, type &amp;ldquo;&lt;/span&gt;&lt;b&gt;JWT&lt;/b&gt;&lt;span style="font-weight:400;"&gt;&amp;rdquo; (should show up to select).&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;&lt;b&gt;Credentials&lt;/b&gt;: Optional field, add two fields with the following details.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Enter &lt;/span&gt;&lt;b&gt;appianPrivateKey &lt;/b&gt;&lt;span style="font-weight:400;"&gt;as Field Name and value as the DocuSign Admin Account&amp;rsquo;s generated &lt;/span&gt;&lt;b&gt;Private RSA Key&lt;/b&gt;&lt;span style="font-weight:400;"&gt; (note: remember to copy the entire &amp;mdash;begin RSA private key&amp;mdash; to &amp;mdash;end RSA private key). Check the &lt;/span&gt;&lt;b&gt;Mask &lt;/b&gt;&lt;span style="font-weight:400;"&gt;box to hide it from the front end.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Enter &lt;/span&gt;&lt;b&gt;appianPrivateKeyPassword &lt;/b&gt;&lt;span style="font-weight:400;"&gt;as Field Name and leave the value empty.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Test Connection: Optional, leave it blank and click &amp;ldquo;&lt;b&gt;Save&lt;/b&gt;&amp;rdquo;.&lt;/span&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/1024x504/__key/communityserver-wikis-components-files/00-00-00-00-46/1803.third_2D00_party_2D00_credentials.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Generate Admin&amp;rsquo;s Access Token.&lt;/span&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Create an expression rule to generate the &amp;ldquo;Access Token.&amp;rdquo;&lt;/span&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Add a rule input for user ID as this rule will be used to generate JWT for the admin as well as the user to impersonate.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Use function - createdocusignrsajwttoken() provided by the JWT Plug-in.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Note that the plug-in requires you to follow the order of the parameters.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Use guidance from &lt;a href="https://developers.docusign.com/platform/auth/jwt/jwt-get-token/"&gt;DocuSign to generate the JWT&lt;/a&gt;.&amp;nbsp;&lt;/span&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/890x496/__key/communityserver-wikis-components-files/00-00-00-00-46/jwt_5F00_token.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Create an integration to generate the admin access token.&lt;/span&gt;
&lt;ol&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Add a rule input for passing the JWT generated in Step 3a(i)&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Under Request Body select &amp;ldquo;&lt;/span&gt;&lt;b&gt;Content Type&lt;/b&gt;&lt;span style="font-weight:400;"&gt;&amp;rdquo; as Multipart and provide &lt;/span&gt;&lt;b&gt;assertion &lt;/b&gt;&lt;span style="font-weight:400;"&gt;which will the generated Admin JWT and &lt;/span&gt;&lt;b&gt;grant_type&lt;/b&gt;&lt;span style="font-weight:400;"&gt; as &amp;quot;urn:ietf:params:oauth:grant-type:jwt-bearer&amp;quot;&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;For additional guidance, follow the &lt;/span&gt;&lt;a href="https://developers.docusign.com/platform/auth/jwt/jwt-get-token/#:~:text=Step%203.%20Obtain%20the%20access%20token"&gt;&lt;span style="font-weight:400;"&gt;DocuSign documentation&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Parse the access token from the response.&lt;/span&gt;&lt;span style="font-weight:400;"&gt;&lt;/span&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/1030x968/__key/communityserver-wikis-components-files/00-00-00-00-46/request_5F00_body.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Generate Sender&amp;rsquo;s Access Token&lt;/span&gt;
&lt;ol&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;The admin&amp;rsquo;s generated token will be used to retrieve the sender&amp;rsquo;s information (as long as they are part of the Organization in DocuSign)&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Create an integration to retrieve user information (&lt;a href="https://developers.docusign.com/platform/auth/jwt/jwt-get-token/#:~:text=Step%205.%20Use%20the%20access%20token%20to%20make%20an%20API%20call"&gt;DocuSign Documentation&lt;/a&gt;) using their email address registered with DocuSign and the admin access token generated in Step 3a(i).&lt;/span&gt;&lt;/span&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/768x1024/__key/communityserver-wikis-components-files/00-00-00-00-46/headers.png" /&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li style="font-weight:400;"&gt;&lt;b&gt;URL&lt;/b&gt;&lt;span style="font-weight:400;"&gt;: The &amp;ldquo;Account ID&amp;rdquo; will be available in the DocuSign settings, recommended to create a constant to store the value. Note that the URL will vary depending on the environment.&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;b&gt;Query Parameters&lt;/b&gt;&lt;span style="font-weight:400;"&gt;: Add &amp;ldquo;email&amp;rdquo; which will be the user&amp;rsquo;s email address.&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;&lt;b&gt;Headers&lt;/b&gt;: Add &amp;ldquo;Authorization&amp;rdquo; where the value will be (in expression mode) &amp;ldquo;Bearer&amp;rdquo; + the admin&amp;rsquo;s access token.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Parse the &amp;ldquo;userId&amp;rdquo; from the generated response and use it in the rule created in Step 3(a) to retrieve the sender&amp;rsquo;s JWT.&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Use the integration created in Step 3(b) to generate the sender&amp;rsquo;s access token.&lt;/span&gt;
&lt;ol&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;The rule input value will be the sender&amp;rsquo;s generated JWT.&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Parse the access token from the response.&lt;/span&gt;&lt;span style="font-weight:400;"&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;Create integration to send envelope as the user via DocuSign&lt;/span&gt;&lt;span style="font-weight:400;"&gt;&lt;/span&gt;
&lt;ol&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;With the sender&amp;rsquo;s access token, DocuSign integrations can be called to create and send envelopes, etc. Note that we cannot use the out of the box Docusign Connected System for any integrations that need a bearer token.&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;span style="font-weight:400;"&gt;In the Authorization Header for the integration, pass the sender&amp;rsquo;s generated access token.&lt;/span&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/742x1024/__key/communityserver-wikis-components-files/00-00-00-00-46/envelope.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="docusign_integrations"&gt;DocuSign Integrations&lt;/h2&gt;
&lt;p&gt;Connectivity can quickly be validated with a &lt;a href="https://developers.docusign.com/docs/esign-rest-api/reference/Accounts/Accounts/get/"&gt;GET Account call&lt;/a&gt;. This call will retrieve the account&amp;rsquo;s basic information but does require having the API Account ID&lt;/p&gt;
&lt;p&gt;There are a number of actions that a developer can perform on a DocuSign envelope and the documents contained within. An introduction to the concepts of DocuSign&amp;rsquo;s Object model can be found on their &lt;a href="https://developers.docusign.com/docs/esign-rest-api/esign101/concepts/"&gt;eSignature Object Model Overview&lt;/a&gt;. Users of this guide are encouraged to read through DocuSign&amp;rsquo;s documentation to learn more about what is possible when integrating with DocuSign.&lt;/p&gt;
&lt;h2 id="implementing_integrations_in_appian"&gt;Implementing Integrations in Appian&lt;/h2&gt;
&lt;h3 id="create_envelope"&gt;Create Envelope&lt;/h3&gt;
&lt;p&gt;Use the Appian Connected System OOTB operation to &lt;a href="https://docs.appian.com/suite/help/latest/docusign-connected-system.html#create-and-send-envelope"&gt;Create and Send Envelope&lt;/a&gt; which utilizes DocuSign&amp;rsquo;s &lt;a href="https://developers.docusign.com/docs/esign-rest-api/reference/Envelopes/Envelopes/create"&gt;Create Envelope&lt;/a&gt; REST API. The request body is expressionable in Appian and the DocuSign documentation page linked above has great JSON examples of configurations with different numbers of documents, signers, recipients, tabs, etc.&lt;/p&gt;
&lt;p&gt;In Appian, an example expression for a single signer with an embedded signing ceremony might look like this:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="java"&gt;a!toJson(
  {
    /*documents: - handled by Appian Integration Object*/
    /*status: - handled by Appian Integration Object*/
    emailSubject: ri!subject,
    recipients: {
      signers: {
        {
          autoNavigation: true,
          clientUserId: ri!signer.username,
          email: ri!signer.email,
          name: ri!signer.fullName,
          recipientId: ri!signer.recipientId,
          recipientSuppliesTabs: false,
          routingOrder: &amp;quot;1&amp;quot;,
          tabs: {
            dateSignedTabs: {
              {
                anchorString: &amp;quot;today_1_r&amp;quot;,
                anchorXOffset: &amp;quot;0&amp;quot;,
                anchorYOffset: &amp;quot;0&amp;quot;,
                anchorIgnoreIfNotPresent: &amp;quot;true&amp;quot;,
                anchorUnits: &amp;quot;inches&amp;quot;,
                optional: &amp;quot;false&amp;quot;
              }
            },
            initialHereTabs: {
              {
                anchorString: &amp;quot;init_1_r&amp;quot;,
                anchorXOffset: &amp;quot;0&amp;quot;,
                anchorYOffset: &amp;quot;0&amp;quot;,
                anchorIgnoreIfNotPresent: &amp;quot;true&amp;quot;,
                anchorUnits: &amp;quot;inches&amp;quot;,
                optional: &amp;quot;false&amp;quot;
              },
              {
                anchorString: &amp;quot;init_1_o&amp;quot;,
                anchorXOffset: &amp;quot;0&amp;quot;,
                anchorYOffset: &amp;quot;0&amp;quot;,
                anchorIgnoreIfNotPresent: &amp;quot;true&amp;quot;,
                anchorUnits: &amp;quot;inches&amp;quot;,
                optional: &amp;quot;true&amp;quot;
              }
            },
            signHereTabs: {
              {
                anchorString: &amp;quot;sig_1_r&amp;quot;,
                anchorXOffset: &amp;quot;0&amp;quot;,
                anchorYOffset: &amp;quot;0&amp;quot;,
                anchorIgnoreIfNotPresent: &amp;quot;true&amp;quot;,
                anchorUnits: &amp;quot;inches&amp;quot;,
                optional: &amp;quot;false&amp;quot;
              },
              {
                anchorString: &amp;quot;sig_1_o &amp;quot;,
                anchorXOffset: &amp;quot;0&amp;quot;,
                anchorYOffset: &amp;quot;0&amp;quot;,
                anchorIgnoreIfNotPresent: &amp;quot;true&amp;quot;,
                anchorUnits: &amp;quot;inches&amp;quot;,
                optional: &amp;quot;true&amp;quot;
              }
            },
            textTabs: {
              {
                tabLabel: &amp;quot;firstText&amp;quot;,
                anchorString: &amp;quot;text_1_r&amp;quot;,
                anchorXOffset: &amp;quot;0&amp;quot;,
                anchorYOffset: &amp;quot;0&amp;quot;,
                anchorIgnoreIfNotPresent: &amp;quot;true&amp;quot;,
                anchorUnits: &amp;quot;inches&amp;quot;,
                optional: &amp;quot;false&amp;quot;
              },
              {
                tabLabel: &amp;quot;secondText&amp;quot;,
                anchorString: &amp;quot;text_2_r&amp;quot;,
                anchorXOffset: &amp;quot;0&amp;quot;,
                anchorYOffset: &amp;quot;0&amp;quot;,
                anchorIgnoreIfNotPresent: &amp;quot;true&amp;quot;,
                anchorUnits: &amp;quot;inches&amp;quot;,
                optional: &amp;quot;false&amp;quot;
              }
            }            
          }
        }
      }
    }
  }
)&lt;/pre&gt;&lt;/p&gt;
&lt;h3 id="mcetoc_1i5oh6d943"&gt;&lt;span style="font-weight:400;"&gt;Noteworthy Fields&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;clientUserId - &lt;/b&gt;this field should only be populated if the signing ceremony will be embedded in Appian for the &lt;a href="https://developers.docusign.com/docs/esign-rest-api/reference/Envelopes/EnvelopeRecipients/#signer-recipient"&gt;recipient&lt;/a&gt;. Populate using the Appian username.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;recipientId - &lt;/b&gt;this field needs to be unique for the &lt;a href="https://developers.docusign.com/docs/esign-rest-api/reference/Envelopes/EnvelopeRecipients/#signer-recipient"&gt;recipients&lt;/a&gt; within the envelope. If there is only one recipient, use the number 1. If there are multiple, use unique integers for each.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;tabs -&lt;/b&gt; this implementation uses the anchor string method (see other tab creation methods &lt;a href="https://developers.docusign.com/docs/esign-rest-api/esign101/concepts/tabs"&gt;here&lt;/a&gt; and tab types &lt;a href="https://developers.docusign.com/docs/esign-rest-api/reference/Envelopes/EnvelopeRecipientTabs/"&gt;here&lt;/a&gt;) for designating input fields for the end user. For example, the document template has transparent white text on a white background of &amp;ldquo;sig_1_r&amp;rdquo; where a signature is required.&lt;/p&gt;
&lt;h3 id="signing_documents"&gt;Signing Documents&lt;/h3&gt;
&lt;h4&gt;Remote&lt;/h4&gt;
&lt;p&gt;If clientUserId is not populated, the signing ceremony will be remote. The user will receive an email from DocuSign to perform the signing ceremony in DocuSign.&lt;/p&gt;
&lt;h4&gt;Embedded&lt;/h4&gt;
&lt;p&gt;If clientUserId is populated, the signing ceremony must be &lt;a href="https://developers.docusign.com/docs/esign-rest-api/esign101/concepts/embedding"&gt;embedded&lt;/a&gt;. The user will not receive an email nor have the option to perform the signing ceremony in DocuSign, as the application is responsible for the embedded signing experience.&lt;/p&gt;
&lt;p&gt;Use the Appian Connected System OOTB operation to &lt;a href="https://docs.appian.com/suite/help/latest/Connected_System.html#generate-the-recipient-signing-url"&gt;Generate the Recipient Signing URL&lt;/a&gt; which utilizes DocuSign&amp;rsquo;s &lt;a href="https://developers.docusign.com/docs/esign-rest-api/reference/Envelopes/EnvelopeViews/createRecipient/"&gt;Create Embedded Recipient&lt;/a&gt; REST API. Since this operation is a POST call and the DocuSign URL must be used within 5 minutes, the appropriate way to trigger this integration call is on button-click within a SAIL interface each time the user opens the form. It should not be called within a process model since the user may close the task and come back more than 5 minutes later. It cannot be called as part of local variable instantiation since it is a POST call and not a GET call. An example implementation might look like this:&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/800x240/__key/communityserver-wikis-components-files/00-00-00-00-46/8.png" /&gt;&lt;/div&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="java"&gt;rule!APP_CMPT_requestBoxLayout(
  label: &amp;quot;Acknowledgement&amp;quot;,
  contents: {
    a!richTextDisplayField(
      label: &amp;quot;Rich Text&amp;quot;,
      labelPosition: &amp;quot;COLLAPSED&amp;quot;,
      value: {
        a!richTextItem(
          text: { cons!APP_TXT_DS_ACKNOWLEDGEMENT },
          style: { &amp;quot;EMPHASIS&amp;quot; }
        )
      }
    ),
    a!buttonArrayLayout(
      buttons: {
        a!buttonWidget(
          label: &amp;quot;OK&amp;quot;,
          saveInto: rule!APP_INT_DS_genEmbeddedSigningURL(
            envelopeId: ri!envelopeId,
            signer: ri!signer,
            onSuccess: {
              a!save(
                local!embedUrl,
                index(fv!result, &amp;quot;url&amp;quot;, null)
              )
            },
            onError: {
              a!startProcess(
                processModel: cons!APP_PM_INTEGRATION_ERROR_TASK,
                processParameters: {
                  integrationError: fv!error,
                  integrationName: cons!APP_TXT_DS_GEN_URL_INT_NAME,
                  isRetryError: false,
                  request: = &amp;quot;Generate signing URL for envelope &amp;quot; &amp;amp; ri!envelopeId,
                  requestId: ri!requestId,
                  response: fv!result
                }
              ),
              a!save(local!generateUrlError, fv!error)
            }
          ),
          style: &amp;quot;PRIMARY&amp;quot;
        )
      },
      align: &amp;quot;END&amp;quot;
    )
  },
  showWhen: and(
    rule!GBL_isBlank(local!embedUrl),
    rule!GBL_isEmpty(ri!createEnvelopeError),
    rule!GBL_isEmpty(local!generateUrlError)
  ),
  style: &amp;quot;STANDARD&amp;quot;
)&lt;/pre&gt;&lt;/p&gt;
&lt;h3 id="mcetoc_1i5oh6d944"&gt;&lt;span style="font-weight:400;"&gt;Noteworthy Fields&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;Return URL -&lt;/b&gt; this is the URL that shows in the web content field of Appian after the (1) user completes the signature (2) user declines to sign OR (3) embedded DocuSign session times out after 20 minutes of inactivity, which is the DocuSign default. This URL cannot be an Appian URL, therefore the best option is a public URL hosted on the customer network, specifically designed to provide the end user with a useful message after any one of these three events occurs. The single message should cover all three scenarios since it will be displayed regardless of which event occurs.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Recipient User Name -&lt;/b&gt; this field needs to have the same value that you specified in the &amp;ldquo;name&amp;rdquo; field while creating the envelope in the Create and Send Envelope operation.&lt;/p&gt;
&lt;h3 id="mcetoc_1i5oh6d945"&gt;&lt;span style="font-weight:400;"&gt;Design Tips&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;The embedding URL can be placed with Appian&amp;rsquo;s &lt;a href="https://docs.appian.com/suite/help/latest/Web_Content_Component.html"&gt;web content component&lt;/a&gt; on a SAIL form. If you provide an Appian submit button on the SAIL form, there is a risk that the user clicks that Appian button before completing the signing ceremony, which requires clicking a &amp;ldquo;Finish&amp;rdquo; button on the embedded form. To reduce this risk, prevent the user from submitting the form until the DocuSign Connect Webhook (see below) has informed Appian that the signing ceremony is complete by either:&lt;/p&gt;
&lt;p&gt;1. Disabling the &amp;ldquo;Continue&amp;rdquo; button in Appian until DocuSign has called the Appian Web API and the application database is updated with a &amp;ldquo;Signed&amp;rdquo; status&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/800x240/__key/communityserver-wikis-components-files/00-00-00-00-46/9.png" /&gt;&lt;/div&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="java"&gt;a!columnLayout(
  contents: {
    a!richTextDisplayField(
      labelPosition: &amp;quot;COLLAPSED&amp;quot;,
      value: a!richTextItem(
        text: &amp;quot;STEPS&amp;quot;,
        color: &amp;quot;SECONDARY&amp;quot;,
        size: &amp;quot;MEDIUM_PLUS&amp;quot;,
        style: &amp;quot;STRONG&amp;quot;
      )
    ),
    a!forEach(
      items: {
        a!richTextDisplayField(
          labelPosition: &amp;quot;COLLAPSED&amp;quot;,
          value: {
            a!richTextItem(
              text: &amp;quot;Sign&amp;quot;,
              color: &amp;quot;SECONDARY&amp;quot;,
              size: &amp;quot;MEDIUM&amp;quot;,
              style: &amp;quot;STRONG&amp;quot;
            ),
            a!richTextItem(
              text: &amp;quot; the document&amp;quot;,
              color: &amp;quot;SECONDARY&amp;quot;,
              size: &amp;quot;MEDIUM&amp;quot;
            )
          }
        ),
        a!richTextDisplayField(
          labelPosition: &amp;quot;COLLAPSED&amp;quot;,
          value: {
            a!richTextItem(
              text: &amp;quot;Click the&amp;quot;,
              color: &amp;quot;SECONDARY&amp;quot;,
              size: &amp;quot;MEDIUM&amp;quot;
            ),
            a!richTextItem(
              text: &amp;quot; Finish&amp;quot;,
              color: &amp;quot;SECONDARY&amp;quot;,
              size: &amp;quot;MEDIUM&amp;quot;,
              style: &amp;quot;STRONG&amp;quot;
            ),
            a!richTextItem(
              text: &amp;quot; button at the top&amp;quot;,
              color: &amp;quot;SECONDARY&amp;quot;,
              size: &amp;quot;MEDIUM&amp;quot;
            )
          }
        ),
        a!richTextDisplayField(
          labelPosition: &amp;quot;COLLAPSED&amp;quot;,
          value: {
            a!richTextItem(
              text: &amp;quot;Click this&amp;quot;,
              color: &amp;quot;SECONDARY&amp;quot;,
              size: &amp;quot;MEDIUM&amp;quot;
            ),
            a!richTextItem(
              text: &amp;quot; Refresh&amp;quot;,
              color: &amp;quot;SECONDARY&amp;quot;,
              size: &amp;quot;MEDIUM&amp;quot;,
              style: &amp;quot;STRONG&amp;quot;
            ),
            a!richTextItem(
              text: &amp;quot; button until the&amp;quot;,
              color: &amp;quot;SECONDARY&amp;quot;,
              size: &amp;quot;MEDIUM&amp;quot;
            ),
            a!richTextItem(
              text: &amp;quot; Continue&amp;quot;,
              color: &amp;quot;SECONDARY&amp;quot;,
              size: &amp;quot;MEDIUM&amp;quot;,
              style: &amp;quot;STRONG&amp;quot;
            ),
            a!richTextItem(
              text: &amp;quot; button below is enabled&amp;quot;,
              color: &amp;quot;SECONDARY&amp;quot;,
              size: &amp;quot;MEDIUM&amp;quot;
            )
          }
        ),
        a!richTextDisplayField(
          labelPosition: &amp;quot;COLLAPSED&amp;quot;,
          value: {
            a!richTextItem(
              text: &amp;quot;Click the&amp;quot;,
              color: &amp;quot;SECONDARY&amp;quot;,
              size: &amp;quot;MEDIUM&amp;quot;
            ),
            a!richTextItem(
              text: &amp;quot; Continue&amp;quot;,
              color: &amp;quot;SECONDARY&amp;quot;,
              size: &amp;quot;MEDIUM&amp;quot;,
              style: &amp;quot;STRONG&amp;quot;
            ),
            a!richTextItem(
              text: &amp;quot; button below&amp;quot;,
              color: &amp;quot;SECONDARY&amp;quot;,
              size: &amp;quot;MEDIUM&amp;quot;
            )
          }
        )
      },
      expression: {
        a!columnsLayout(
          columns: {
            a!columnLayout(
              contents: a!cardLayout(
                contents: a!richTextDisplayField(
                  labelPosition: &amp;quot;COLLAPSED&amp;quot;,
                  value: a!richTextItem(
                    text: fv!index,
                    color: &amp;quot;SECONDARY&amp;quot;,
                    size: &amp;quot;MEDIUM_PLUS&amp;quot;,
                    style: &amp;quot;STRONG&amp;quot;
                  ),
                  align: &amp;quot;CENTER&amp;quot;
                ),
                style: &amp;quot;STANDARD&amp;quot;
              ),
              width: &amp;quot;EXTRA_NARROW&amp;quot;
            ),
            a!columnLayout(
              contents: a!sideBySideLayout(
                items: {
                  a!sideBySideItem(item: fv!item, width: &amp;quot;MINIMIZE&amp;quot;),
                  a!sideBySideItem(
                    item: a!buttonArrayLayout(
                      buttons: a!buttonWidget(
                        icon: &amp;quot;refresh&amp;quot;,
                        tooltip: &amp;quot;You may need to refresh more than once&amp;quot;,
                        saveInto: [INSERT QUERY HERE],
                        style: &amp;quot;NORMAL&amp;quot;
                      ),
                      marginBelow: &amp;quot;NONE&amp;quot;
                    ),
                    width: &amp;quot;MINIMIZE&amp;quot;,
                    showWhen: fv!index = 3
                  )
                },
                alignVertical: &amp;quot;MIDDLE&amp;quot;
              )
            )
          },
          alignVertical: &amp;quot;MIDDLE&amp;quot;
        )
      }
    )
  },
  width: &amp;quot;MEDIUM&amp;quot;
)&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;2. If there is no subsequent form to activity chain the user to and the signature is the last step in the workflow, one option is to not provide any Appian buttons at all then when the DocuSign Connect Webhook calls the Appian Web API, start a process model that messages the task form to hit an exception flow that ends the task and process model.&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/800x240/__key/communityserver-wikis-components-files/00-00-00-00-46/10.png" /&gt;&lt;/div&gt;
&lt;h3 id="receiving_envelope_status_updates"&gt;Receiving Envelope Status Updates&lt;/h3&gt;
&lt;p&gt;DocuSign has &lt;a href="https://developers.docusign.com/docs/esign-rest-api/esign101/rules-and-limits/"&gt;API rules&lt;/a&gt; for their web services and the most relevant rule is that apps are limited to one GET status request per unique envelope per 15 minutes. This means that process models should NOT have a node (and SAIL interfaces should not have a local variable) that checks the envelope status in DocuSign directly or regularly.&lt;/p&gt;
&lt;p&gt;Instead, set up &lt;a href="https://support.docusign.com/en/guides/ndse-admin-guide-connect"&gt;DocuSign Connect&lt;/a&gt; to call an Appian Web API when a relevant change to an envelope (such as it being signed) has occurred and start an Appian process model to begin post-processing (write the status to the database and download the document) at this time.&lt;/p&gt;
&lt;h3 id="mcetoc_1i5oh6d946"&gt;Setting Up DocuSign Connect&lt;/h3&gt;
&lt;h4&gt;&lt;strong&gt;Appian Setup&lt;/strong&gt;&lt;/h4&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Create an Appian group for APP DocuSign Service Accounts.&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Create an Appian Web API as a POST method.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Sections below will help define the expression for this object.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Give the Appian group viewer rights to the Web API.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Create a Service Account in the Admin Console under Web API Authentication &amp;gt; OAuth 2.0 Clients &amp;gt; Create.&lt;/span&gt;
&lt;div class="callout-box callout-info"&gt;Basic Authentication is possible to use in place of OAuth 2.0, but is not recommended due to poor security and expiring password. OAuth 2.0 is the industry-standard protocol for authorization, and should generally be used when possible.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;Copy the Client ID, Client Secret, and Token Request Endpoint to a secure location where they can be retrieved, as the secret will not be displayed again in the admin console.&lt;/span&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/1024x480/__key/communityserver-wikis-components-files/00-00-00-00-46/client.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight:400;"&gt;&amp;nbsp;Add the service account to the Appian group. Also ensure that the service group has at least &amp;lsquo;Initiator&amp;rsquo; privileges to the process model called in your Appian Web API. &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Since DocuSign Connect supports Basic Authentication but neither the username or password can be null, an Appian basic user account with a username and password must be created from DocuSign Connect to use when calling the Appian Web API&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;DocuSign Setup&lt;/strong&gt;&lt;/h4&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li&gt;Login to the DocuSign with Admin privileges.&lt;/li&gt;
&lt;li&gt;Navigate to the &lt;b&gt;Settings &lt;/b&gt;tab.
&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/500x240/__key/communityserver-wikis-components-files/00-00-00-00-46/11.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Click on &lt;b&gt;Connect &lt;/b&gt;(under Integrations in the left navigation).
&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/320x240/__key/communityserver-wikis-components-files/00-00-00-00-46/12.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Select &lt;b&gt;Add Configuration&lt;/b&gt; &amp;gt;&lt;b&gt; Custom&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;Add the setup details including Web API URL.
&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/800x240/__key/communityserver-wikis-components-files/00-00-00-00-46/13.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Choose the data format (Legacy vs REST V2.1). When the Legacy format is chosen, the message from Docusign is an older XML format whereas the REST v2.1 is a newer JSON format that is easier to process, and is the recommended option for Appian Integrations.
&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/1024x480/__key/communityserver-wikis-components-files/00-00-00-00-46/rest_5F00_legacy.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Select the user envelopes that should trigger the webhook callback. The correct value will depend on the REST API authentication method and customer DocuSign setup.
&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/620x278/__key/communityserver-wikis-components-files/00-00-00-00-46/associated-users.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Select the events that should trigger the webhook callback.
&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/484x480/__key/communityserver-wikis-components-files/00-00-00-00-46/trigger_5F00_events.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Check the box to include OAuth.
&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/1024x612/__key/communityserver-wikis-components-files/00-00-00-00-46/oauth.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;ADD CONFIGURATION&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select the OAUTH 2.0 tab.
&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/1024x200/__key/communityserver-wikis-components-files/00-00-00-00-46/oauth2.0.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Enter in the Client ID, Client Secret, and Authorization Server URL.
&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/1024x466/__key/communityserver-wikis-components-files/00-00-00-00-46/client_5F00_id.png" /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;SAVE&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="mcetoc_1i5rb8ven0"&gt;Parsing the DocuSign Connect Request - (REST v2.1)&lt;/h3&gt;
&lt;p&gt;The webhook body is JSON formatted and can be accessed with standard dot notation or the index() function. You may extract the status and the envelopeId from the body as shown here:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="java"&gt;a!localVariables(
  local!requestBody:a!fromJson( http!request.body),
  local!envelopeDetails: a!map(
    event: index(local!requestBody, &amp;quot;event&amp;quot;, {}),
    envelopeId: index(
      index(local!requestBody, &amp;quot;data&amp;quot;, {}),
      &amp;quot;envelopeId&amp;quot;,
      {}
    ),
    
  ),
  a!startProcess(
    processModel: cons!VT_PM_RECEIVE_ENVELOPE_STATUS,
    processParameters: { envelopeDetails: local!envelopeDetails,
    requestBody:local!requestBody},
    onSuccess: a!httpResponse(
      statusCode: 200,
      headers: {},
      body: &amp;quot;Appian has received the envelope status and saved it.&amp;quot;
    ),
    onError: a!httpResponse(
      statusCode: 302,
      headers: {
        a!httpHeader(
          &amp;quot;referer&amp;quot;,
          http!request.queryParameters.referer
        )
      },
     
    )
  )
)&lt;/pre&gt;&lt;/p&gt;
&lt;h3 id="mcetoc_1i5oh6d947"&gt;Parsing the DocuSign Connect XML (Legacy)&lt;/h3&gt;
&lt;p&gt;The webhook body contains XML information about the envelope event, including the document ID, envelope ID, and envelope status. To be memory efficient, extract these values directly in the Web API expression rather than saving the XML into process variables.&lt;/p&gt;
&lt;p&gt;While the XML can be configured to include the base64 representation of the signed document, &lt;b&gt;DO NOT&lt;/b&gt; send or extract this value and save it into an Appian local variable or process variable since this will have negative impacts to the Appian memory profile. Instead, kick off a process model that downloads the document using the Appian OOTB operation to &lt;a href="https://docs.appian.com/suite/help/latest/Connected_System.html#download-document-from-an-envelope"&gt;Download Document from Envelope&lt;/a&gt; which creates an Appian document in a specified folder, skipping the need to handle the base64 representation in variables.&lt;/p&gt;
&lt;p&gt;If extracting dateTimes out of the XML, make sure to account for the time zone of the value since these can come in the signer&amp;rsquo;s time zone depending on the setup.&lt;/p&gt;
&lt;h4&gt;Using XPath&lt;/h4&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="java"&gt;a!localVariables(
  /*Have to remove namespaces from the XML to be able to use xpath snippet easily */
  local!cleanXML: substitute(
    substitute(
      ri!docusignXML,
      &amp;quot; xmlns:xsd=&amp;quot;&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&amp;quot; xmlns:xsi=&amp;quot;&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;quot; xmlns=&amp;quot;&amp;quot;http://www.docusign.net/API/3.0&amp;quot;&amp;quot;&amp;quot;,
      &amp;quot;&amp;quot;
    ),
    &amp;quot; xsi:nil=&amp;quot;&amp;quot;true&amp;quot;&amp;quot; &amp;quot;,
    &amp;quot;&amp;quot;
  ),
  /* Apply the xpath that you&amp;#39;re looking for based on the values provided. Always returns the first one. */
  &amp;#39;type!{urn:com:appian:types:APP}APP_H_DocuSignEventNotification&amp;#39;(
    docusignDocumentId: xpathsnippet(
      local!cleanXML,
      &amp;quot;/DocuSignEnvelopeInformation/EnvelopeStatus/DocumentStatuses/DocumentStatus/ID/text()&amp;quot;
    ),
    envelopeId: xpathsnippet(
      local!cleanXML,
      &amp;quot;/DocuSignEnvelopeInformation/EnvelopeStatus/EnvelopeID/text()&amp;quot;
    ),
    docusignStatus: lower(
      xpathsnippet(
        local!cleanXML,
        &amp;quot;/DocuSignEnvelopeInformation/EnvelopeStatus/Status/text()&amp;quot;
      )
    )
  )
)&lt;/pre&gt;&lt;/p&gt;
&lt;h4&gt;Using XML Parser Plugin&lt;/h4&gt;
&lt;p&gt;The xmltojson() &lt;a href="/b/appmarket/posts/xml-parser"&gt;plugin function&lt;/a&gt; can also be used in conjunction with a!fromJson() to turn the XML into an Appian dictionary that can be read using the index() function.&lt;/p&gt;
&lt;h3 id="download_signed_document"&gt;Download Signed Document&lt;/h3&gt;
&lt;p&gt;After the XML has been parsed and the status has been verified as &amp;ldquo;completed&amp;rdquo;, use the Appian OOTB operation to &lt;a href="https://docs.appian.com/suite/help/latest/Connected_System.html#download-document-from-an-envelope"&gt;Download Document from Envelope&lt;/a&gt; and utilize the document as needed within the Appian application.&lt;/p&gt;
&lt;h2 id="promoting_docusign_configurations_to_production"&gt;Promoting DocuSign Configurations to Production&lt;/h2&gt;
&lt;h3 id="docusign_integration_key"&gt;DocuSign Integration Key&lt;/h3&gt;
&lt;p&gt;DocuSign integration keys cannot be created directly in production. The key is instead promoted from the demo environment for the customer account to the production environment for the customer account. This includes an automated API review in the demo environment for which a selected day of at least 20 API calls are reviewed to ensure no API violations. Plan for this process in the application deployment guide.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://developers.docusign.com/esign-rest-api/guides/go-live-steps"&gt;DocuSign&amp;#39;s Go-Live Steps&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="docusign_connect"&gt;DocuSign Connect&lt;/h3&gt;
&lt;p&gt;The DocuSign Connect setup is done manually for lower environments and production. Plan for these manual steps in the application deployment guide.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://support.docusign.com/en/guides/ndse-admin-guide-connect"&gt;DocuSign Connect&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: integrations, Architecture&lt;/div&gt;
</description></item><item><title>FitNesse for Appian Best Practices</title><link>https://community.appian.com/success/w/guide/3212/fitnesse-for-appian-best-practices</link><pubDate>Thu, 11 Jun 2026 21:50:39 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:104db12a-b70a-43c6-9fc2-4f327fbcadae</guid><dc:creator>joel.larin</dc:creator><description>Current Revision posted to Guide by joel.larin on 6/11/2026 9:50:39 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;This play includes tips for organizing, writing, and running tests in FitNesse for Appian, as well as designing Appian applications for testing with FitNesse. This is intended to complement the existing documentation that comes with FitNesse for Appian. The existing documentation, the FitNesse for Appian Cheat Sheet, and examples can be accessed from the FitNesse for Appian home page, shown below.&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/800x600/__key/communityserver-wikis-components-files/00-00-00-00-46/2318.Welcome-to-FitNesse.JPG" /&gt;&lt;/div&gt;
&lt;p&gt;It is highly recommended to read the FitNesse for Appian documentation before reading this play to have the necessary context for the best practices described. For more general FitNesse documentation, visit the FitNesse &lt;a href="http://fitnesse.org/FitNesse.FullReferenceGuide"&gt;Full Reference Guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For additional information on Automated Testing with FitNesse, visit the&amp;nbsp;&lt;a href="/w/guide/3310/automated-testing"&gt;Automated Testing&lt;/a&gt; and &lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;Automated Testing with FitNesse for Appian&lt;/a&gt; pages.&lt;/p&gt;
&lt;h2 id="organizing_tests"&gt;Organizing Tests&lt;/h2&gt;
&lt;h3&gt;FitNesse Page Types&lt;/h3&gt;
&lt;p&gt;FitNesse is comprised of Static, Suite, and Test pages.&amp;nbsp; The image below shows examples of each type of page and how they are used. More information on each page type and what they should include can be found in the &amp;ldquo;Organizing Tests&amp;rdquo; page of the FitNesse for Appian documentation and&amp;nbsp;the FitNesse documentation on &lt;a href="http://fitnesse.org/FitNesse.FullReferenceGuide.UserGuide.FitNesseWiki.PageProperties"&gt;page&amp;nbsp;properties&lt;/a&gt;.&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/800x600/__key/communityserver-wikis-components-files/00-00-00-00-46/6574.How-pages-are-used-in-FitNesse.JPG" /&gt;&lt;/div&gt;
&lt;h3&gt;Scenarios&lt;/h3&gt;
&lt;p&gt;Scenarios are reusable test scripts used to reduce the maintenance effort for repetitive tests. Scenarios are to FitNesse what a reusable expression rule is to Appian. If the same test script is repeated on several test pages, this script should be made into a scenario so that any changes to it will be reflected in all of its implementations. Note that scenarios can contain other scenarios.&lt;/p&gt;
&lt;p&gt;A list of scenarios, called a &amp;ldquo;ScenarioLibrary,&amp;rdquo; can be created as a Test Page. This library can then be called by other Test Pages.&amp;nbsp; The ScenarioLibrary Test Page can&amp;nbsp; be located on a Static Page where other utility scripts are called, such as the Set up and Tear Down scripts (as pictured in Fig. 2). The image below demonstrates the structure of the ScenarioLibrary and how a Test Page calls its scenarios within the test flow. For more information on where the ScenarioLibrary is kept and used, refer to the &amp;ldquo;Scenarios&amp;rdquo; and &amp;ldquo;Organizing Tests&amp;rdquo; pages of the FitNesse for Appian documentation and the &lt;a href="http://fitnesse.org/FitNesse.FullReferenceGuide.UserGuide.WritingAcceptanceTests.SliM.ScenarioTable"&gt;Scenario Table page&lt;/a&gt; in the FitNesse documentation.&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/800x600/__key/communityserver-wikis-components-files/00-00-00-00-46/1452.Figure_5F00_2_5F00_How_5F00_Scenarios_5F00_Are_5F00_Used_5F00_within_5F00_FitNesse.png" /&gt;&lt;/div&gt;
&lt;h2 id="writing_tests"&gt;Writing Tests&lt;/h2&gt;
&lt;p&gt;The primary Static page, shown below, is where Test Pages, Scenario Library, and Set Up/Tear Down scripts are located.&amp;nbsp; Users can select Test Pages to edit or execute their tests.&amp;nbsp; Users can select the Scenario Library link to edit the various scenario scripts that will be called from the Test Pages.&amp;nbsp; The Suite Set up, Set Up and Tear Down scripts are used to initialize and cleanup Selenium drivers.&amp;nbsp; Learn more about special pages like SuiteSetUp and SuiteTearDown in the &lt;a href="http://fitnesse.org/FitNesse.FullReferenceGuide.UserGuide.WritingAcceptanceTests.SpecialPages"&gt;FitNesse documentation&lt;/a&gt;.&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/800x600/__key/communityserver-wikis-components-files/00-00-00-00-46/7776.Fig_5F00_2a_5F00_Example_5F00_Static_5F00_Page.png" /&gt;&lt;/div&gt;
&lt;p&gt;Any script that should be executed &lt;b&gt;before &lt;/b&gt;a Test Page should go into SetUp, and every script that should be executed &lt;b&gt;after &lt;/b&gt;every Test Page should go into TearDown. See the figure below to understand how these tables are related to a Test or Suite Page.&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/800x600/__key/communityserver-wikis-components-files/00-00-00-00-46/7651.Figure_5F00_3_5F00_Suite_5F00_Set_5F00_Up_5F00_and_5F00_Tear_5F00_Down.png" /&gt;&lt;/div&gt;
&lt;p&gt;Note: The Suite Set Up script initializes the test by navigating to the desired URL. So, the Suite Set Up script is specific to a single environment and will need to be adjusted for testing in new environments.&lt;/p&gt;
&lt;p&gt;FitNesse for Appian includes a link to &amp;ldquo;&lt;b&gt;FitNesse for Appian Cheat Sheet&lt;/b&gt;&amp;rdquo; at the bottom of the page, as shown in the image below. The Cheat Sheet lists all available methods for writing test scripts with formatting examples.&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/800x600/__key/communityserver-wikis-components-files/00-00-00-00-46/1423.Cheat_5F00_Sheet.png" /&gt;&lt;/div&gt;
&lt;p&gt;Some considerations to take when writing tests:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When the test environment performance is slow or when the script needs to be paused momentarily, an explicit wait time can be added.&amp;nbsp;
&lt;ul&gt;
&lt;li&gt;For example, use explicit waits (&amp;quot;| wait for | 1 minute |&amp;quot;) between form inputs when you know a background process needs to be completed before the next step. In this scenario, not using an explicit wait may result in misleading errors caused by page slowness, not by errors on the interface.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Create test pages so they can be run independently and don&amp;rsquo;t require previous tests to be successful. That way, if any tests fail, the rest can still run.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Avoid hard-coding test data. Hard coded test data requires users to manually locate and update the test values whenever a change is needed. Instead, use variables to allow more flexibility in testing. Using variables keeps test data values in one place at the top of the script and allows testers to easily change test data and will reduce errors when tests need to be updated. The &amp;ldquo;Using Variables&amp;rdquo; section below provides more detail on how to use variables in FitNesse.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="using_variables"&gt;Using Variables&lt;/h2&gt;
&lt;p&gt;In Fitnesse, test data can be substituted with variables when needed.&amp;nbsp;When creating test scripts or scenarios, it is a best practice to avoid hard-coding test data, which&amp;nbsp;requires users to manually locate and update the test values whenever a change is needed. Instead, use variables to keep&amp;nbsp;test data values in one place at the top of the script. Doing so will make changing test data easier and&amp;nbsp;reduce the risk of errors when tests need to be updated.&amp;nbsp;More detailed information on variables in FitNesse for Appian can be found in the &amp;ldquo;Using Variables&amp;rdquo; page of the FitNesse for Appian documentation.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;There are three ways to use variables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Markup Variables&lt;/b&gt;: Used within the Test Page or scenario script for variables that will be referenced throughout the entire script. Only markup variables, created through !define, can be used within expressions. More detailed information on this type of variable can be found in the &lt;a href="http://fitnesse.org/FitNesse.FullReferenceGuide.UserGuide.FitNesseWiki.MarkupLanguageReference.MarkupVariables"&gt;Markup Variables FitNesse documentation&lt;/a&gt;. See the below example:&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/640x480/__key/communityserver-wikis-components-files/00-00-00-00-46/7711.Test_5F00_Page_5F00_1_5F00_Markup_5F00_Variables.png" /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;SLIM Symbols&lt;/b&gt;:&amp;nbsp; Used within a Test Page or Scenario to set random string values. Example:&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/640x480/__key/communityserver-wikis-components-files/00-00-00-00-46/1104.Test_5F00_Page_5F00_1_5F00_SLIM.png" /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Test Variables&lt;/b&gt;: Used with JSON to capture multiple or complex variables at one time. Example:&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/640x480/__key/communityserver-wikis-components-files/00-00-00-00-46/0081.Test_5F00_Page_5F00_1_5F00_Test_5F00_Variables.png" /&gt;&lt;/div&gt;
&lt;h2 id="working_with_test_data"&gt;Working With Test Data&lt;/h2&gt;
&lt;p&gt;If tests rely on data or processes to be in a certain state, it is useful to create the following two web API&amp;#39;s per application: one to set up the test data, and the other one to clean up the test data. Test scripts can call these web APIs using &amp;ldquo;|get web api|&amp;rdquo; syntax which can be found in the FitNesse for Appian Cheat Sheet. Web APIs used for testing purposes should not be deployed to a Production environment.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Web API for Setting Up Test Data&lt;/b&gt;: If a test requires an existing approval task, or a record to be in a certain status before testing can proceed, those will need to be set up ahead of time. Web APIs can be used to generate data and write to tables, or to kick off processes, depending on what is required.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Web API for Cleaning Up Test Data&lt;/b&gt;: After tests are run and test data is no longer needed, a web API can be used to delete test data and clean up any changes in the app.&amp;nbsp;&lt;/p&gt;
&lt;h2 id="running_tests"&gt;Running Tests&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Create test user accounts for your application in all testing environments (Test, UAT, Sandbox as applicable). &lt;i&gt;Do not use your own credentials&lt;/i&gt;. Using test user accounts will ensure that when testing, the logged in user is in the intended groups and has the appropriate permissions.
&lt;ul&gt;
&lt;li&gt;To allow test users to work in FitNesse, you will need to include passwords for their usernames in the FitNesseForAppian/configs/users.properties file&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Logout before logging in at the beginning of each test page. Subsequent tests which begin by logging a user in will fail if the user is already logged in.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Enable error screenshots using &amp;ldquo;|set take error screenshots to | true|&amp;rdquo; in test scripts to easily determine where tests have failed. These screenshots will be saved to the screenshot path folder,&amp;nbsp; as defined by the &amp;ldquo;|set screenshot path to|SCREENSHOT_PATH|&amp;rdquo; method.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="designing_appian_applications_for_fitnesse"&gt;Designing Appian Applications for FitNesse&lt;/h2&gt;
&lt;h3&gt;General Practices:&amp;nbsp;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;If you are using the character &amp;ldquo;|&amp;rdquo; in SAIL component labels or altText, it can only be readable if the value is surrounded by &amp;ldquo;!- &amp;lt;value&amp;gt; -!&amp;rdquo;. For example, if you are trying to use this syntax: &amp;ldquo;|populate field|Field Name|with|value|&amp;rdquo; and the field labeled Field Name has a &amp;ldquo;|&amp;rdquo; character in it, the correct syntax would be &amp;ldquo;|populate field|!-Field Name-!|with|value|&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Because FitNesse for Appian uses SAIL component labels to locate components, it is a best practice to create labels for all components so that test scripts can read those labels, rather than having to rely on the order of&amp;nbsp; components in an interface. If displaying component labels does not make sense, use the labelPosition &amp;ldquo;COLLAPSED&amp;rdquo; option on the component so that the label will not display.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Cards and Rich Text&lt;/h3&gt;
&lt;p&gt;FitNesse for Appian generally utilizes field labels and indexes to identify and populate Appian components. However, more graphical clickable components such as rich text icons and cards do not have labels and are identified by other properties, like link labels, alt text, and accessibility text. Although these properties do not impact what the end user sees, it is a best practice to populate them with values that are intuitive to an end user or tester so that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Applications can be tested using FitNesse for Appian without additional application changes&lt;/li&gt;
&lt;li&gt;Testing teams can write automated tests using the intuitive label for the component and do not have to rely on development teams for information&lt;/li&gt;
&lt;li&gt;The application is more readable by a screen reader&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To achieve the above, follow these guidelines:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;&lt;strong&gt;Cards: &lt;/strong&gt;&lt;/b&gt;When creating&amp;nbsp;cardLayouts, developers should always&amp;nbsp;include accessibilityText which matches any text displayed to the end user. If no text is displayed (the card contains an icon only, for example), use&amp;nbsp;text which&amp;nbsp;is intuitive to testers.&amp;nbsp;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;With Links: &lt;/b&gt;When creating a cardLayout with a link, always&amp;nbsp;include&amp;nbsp;link labels&amp;nbsp;using the same text as would be used for cardLayout accessibilityText, described in the previous bullet.&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Rich Text Icons:&amp;nbsp;&lt;/b&gt;When creating rich text icons, use altText if testers will need to validate what the icon represents. For example, a check icon would have &amp;quot;Check&amp;quot; as its altText so that it can be verified on the UI.
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;With Links: &lt;/b&gt;When using rich text icons with links, always include a caption for each clickable icon that matches the altText.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example FitNesse Script:&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/1000x1000/__key/communityserver-wikis-components-files/00-00-00-00-46/3527.Example_5F00_Form_5F00_for_5F00_Testing.png" /&gt;&lt;/div&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/2000x1600/__key/communityserver-wikis-components-files/00-00-00-00-46/3823.Example_5F00_Test_5F00_Script.png" /&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&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>How to Estimate your Appian Projects</title><link>https://community.appian.com/success/w/guide/3100/how-to-estimate-your-appian-projects</link><pubDate>Thu, 11 Jun 2026 21:50:14 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:0c6309fb-ee18-4a9c-a5ab-f0d547679c4b</guid><dc:creator>joel.larin</dc:creator><description>Current Revision posted to Guide by joel.larin on 6/11/2026 9:50:14 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;h2 id="skills_covered"&gt;Skills Covered&lt;/h2&gt;
&lt;p style="font-size:115%;"&gt;&lt;span style="font-weight:400;"&gt;Accurate project and resource requirements estimation is the cornerstone of any successful Appian project. However, accurate estimation&amp;nbsp;isn&amp;#39;t&amp;nbsp;always easy: understanding which factors drive resourcing requirements and how is key to successful estimation.&lt;/span&gt;&lt;/p&gt;
&lt;p style="font-size:115%;"&gt;&lt;span style="font-weight:400;"&gt;Based on years of experience, this document outlines the methodologies used by Appian Expert Delivery Teams for project estimation as well as the factors that most impact an estimate.&lt;/span&gt;&lt;/p&gt;
&lt;p style="font-size:115%;"&gt;&lt;span style="font-weight:400;"&gt;Skills Checklist:&lt;/span&gt;&lt;/p&gt;
&lt;ul style="font-size:115%;"&gt;
&lt;li style="font-weight:400;"&gt;Balance speed of estimation process with requirements for accuracy.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Identify potential risks and required mitigation steps.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Clarify assumptions and caveats affecting the estimate.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="methodology"&gt;Methodology&lt;/h2&gt;
&lt;p style="font-size:115%;"&gt;&lt;span style="font-weight:400;"&gt;Appian&amp;rsquo;s project estimation approach combines two methods to derive an estimate with an expected variance of -10% to +25%.&lt;/span&gt;&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li style="font-weight:400;"&gt;Analogous Estimation&lt;/li&gt;
&lt;li&gt;Consensus-based Estimation&lt;/li&gt;
&lt;/ol&gt;
&lt;p style="font-size:115%;"&gt;&lt;span style="font-weight:400;"&gt;The approach helps inform project control parameters - cost, time, and resources, during the proposal phase. This approach aligns with Agile delivery methodologies which acknowledge that requirements will change and solution development is an empirical process.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;img alt=" " src="/resized-image/__size/820x546/__key/communityserver-wikis-components-files/00-00-00-00-46/Screen-Shot-2023_2D00_03_2D00_01-at-10.47.08-AM.png" /&gt;&lt;/div&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li style="font-weight:400;"&gt;&lt;strong&gt; Discuss Use Case&lt;/strong&gt; - Gain a concrete understanding of high-level business needs and drivers from the Project Sponsor or Business Subject Matter Expert.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;strong&gt;Collect Estimation Factors&lt;/strong&gt; - Gather details of factors that aect Appian solution complexity and project size.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;strong&gt;Summarize Project&lt;/strong&gt; - Document the use case, sizing factors, volumes and other details in a lightweight format (see template in&lt;br /&gt;example 1).&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;strong&gt;Independent SME Review&lt;/strong&gt; - Request independent review of Project Summary from 3-5 experienced Appian practitioners / Appian&lt;br /&gt;Subject Matter Experts (see note below).&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;strong&gt;Estimation Session&lt;/strong&gt; - A working session (typically 1-1.5 hours) to arrive at a common consensus re: project size, and clarify key&lt;br /&gt;assumptions. The session is conducted by the creator(s) of the Project Summary document and attended by the Appian SMEs&lt;br /&gt;that conducted the independent SME review.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;strong&gt;Finalize Estimate&lt;/strong&gt; - Opportunity to adjust the estimate based on new information or to adjust assumptions or other levers.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;strong&gt;Communicate Estimate&lt;/strong&gt; - Communicate the foundations of the estimate generated from the Estimation Session (5), description of&lt;br /&gt;assumptions and any caveats.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style="font-size:115%;"&gt;&lt;span style="font-weight:400;"&gt;The Estimation Session should be composed of experienced Appian practitioners. A diversity of Appian delivery experience drives better estimates. Indicative examples of project estimates are provided &lt;a href="#estimation_templates"&gt;below&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="estimation_factors"&gt;Estimation Factors&lt;/h2&gt;
&lt;p style="font-size:115%;"&gt;&lt;span style="font-weight:400;"&gt;The complexity of an Appian solution is determined by several factors, outlined below. Understanding these factors is necessary to arrive at accurate estimates of project size.&lt;/span&gt;&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li style="font-weight:400;"&gt;&lt;a href="#records"&gt;Records&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;a href="#processes"&gt;Processes&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;a href="#interfaces"&gt;User Interfaces&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;a href="#reports"&gt;Reports&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;a href="#integrations"&gt;Integrations&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;a href="#sec_require"&gt;Security Requirements&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;a href="#outliers"&gt;Outliers&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p style="font-size:115%;"&gt;&lt;span style="font-weight:400;"&gt;Note that new versions of Appian (released quarterly) may contain features that reduce or even remove the complexity impact of a factor. See the latest &lt;a href="https://docs.appian.com/suite/help/20.1/"&gt;Appian Product Documentation&lt;/a&gt; to keep up on new features.&lt;/span&gt;&lt;/p&gt;
&lt;h3 id="records"&gt;1) Records&lt;/h3&gt;
&lt;p style="font-size:115%;"&gt;&lt;span style="font-weight:400;"&gt;A Record is data that represents a central business concept. &amp;quot;Employee&amp;quot;, &amp;quot;Vehicle&amp;quot;, &amp;quot;Account&amp;quot; are all examples. Records provide a centralized view of a given business function, along with all of its connections to related records.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style="margin-top:30px;"&gt;&lt;strong&gt;Assessment Criteria&lt;/strong&gt;&lt;/h4&gt;
&lt;ul style="font-size:115%;"&gt;
&lt;li style="font-weight:400;"&gt;Simple complexity categorization for Record data:
&lt;ul style="font-size:95%;margin:10px;"&gt;
&lt;li style="font-weight:400;"&gt;Low - Simple fields with minimal interdependence, underlying data from a single data source.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Medium - A few interdependent fields, underlying data from a small number of sources.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;High - Several interdependent fields, data manipulation before saving, underlying data from multiple data sources and integrations.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Volumes of Records processed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style="margin-top:30px;"&gt;&lt;strong&gt;Impact on Estimate&lt;/strong&gt;&lt;/h4&gt;
&lt;ul style="font-size:115%;"&gt;
&lt;li style="font-weight:400;"&gt;Simple complexity categorization for Record data:
&lt;ul style="font-size:95%;margin:15px;"&gt;
&lt;li style="font-weight:400;"&gt;Low - Simple fields with minimal interdependence, underlying data from a single data source.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Medium - A few interdependent fields, underlying data from a small number of sources.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;High - Several interdependent fields, data manipulation before saving, underlying data from multiple data sources and integrations.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Volumes of Records processed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style="margin-top:30px;"&gt;&lt;strong&gt;Common Assumptions&lt;/strong&gt;&lt;/h4&gt;
&lt;ul style="font-size:115%;"&gt;
&lt;li&gt;Out-of-the-box Record List View will meet UX needs and the underlying data for the list comes from a single source.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style="margin-top:30px;"&gt;&lt;strong&gt;Pro Tips&lt;/strong&gt;&lt;/h4&gt;
&lt;ul style="font-size:115%;"&gt;
&lt;li&gt;When specific details about Records are not known, use estimates (e.g. the average number of fields per record).&lt;/li&gt;
&lt;li&gt;Remember: if there are no explicit security constraints on a Record, then all users would be granted access by default.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="processes"&gt;2) Processes&lt;/h3&gt;
&lt;p style="font-size:115%;"&gt;&lt;span style="font-weight:400;"&gt;A Process is a unique workflow consisting of a series of steps that a Record or related element undergoes in order to achieve a business objective.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style="margin-top:30px;"&gt;&lt;strong&gt;Assessment Criteria&lt;/strong&gt;&lt;/h4&gt;
&lt;ul style="font-size:115%;"&gt;
&lt;li style="font-weight:400;"&gt;Level of process complexity:
&lt;ul style="font-size:95%;margin:10px;"&gt;
&lt;li style="font-weight:400;"&gt;Low - 5 to 10 steps in the Process. No data processing loops. Single step exception handling.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Medium - 10 to 20 Process steps with one or two data processing loops, and with multiple sub-processes. Few exception ows with a low number of nodes.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;High - Over 20 Process steps with potentially multiple data processing loops, potentially multiple complex sub-processes or communication between processes. Complex exception ows involving multiple reviewers and subsequent review loops, data changes or integrations to other systems.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Volume of exception flows: The number of flows that handle the outcome of non-ideal events and which must be managed actively and gracefully.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style="margin-top:30px;"&gt;&lt;strong&gt;Impact on Estimate&lt;/strong&gt;&lt;/h4&gt;
&lt;ul style="font-size:115%;"&gt;
&lt;li style="font-weight:400;"&gt;Highly complex workflows require extensive testing to ensure all pathways function as designed.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Complexity and number of exception flows drive the need for additional test data and assessment of all alternate pathways in the process.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;If the Appian out-of-the-box Smart Services are not sufficient, it might be necessary to build new Appian Plugins to meet functional requirements. Creation of new plugins require developers with Java development skills, additional testing and deployment effort will increase overall project size.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style="margin-top:30px;"&gt;&lt;strong&gt;Common Assumptions&lt;/strong&gt;&lt;/h4&gt;
&lt;ul style="font-size:115%;"&gt;
&lt;li style="font-weight:400;"&gt;All exception flows are clearly defined and describable.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style="margin-top:30px;"&gt;&lt;strong&gt;Pro Tips&lt;/strong&gt;&lt;/h4&gt;
&lt;ul style="font-size:115%;"&gt;
&lt;li&gt;Exception paths, especially in earlier Application iterations, can be managed manually/externally to the Appian process. This helps bring the majority of the functionality to the end users quickly with the option of building more automation in subsequent iterations/phases.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="interfaces"&gt;3) User Interfaces&lt;/h3&gt;
&lt;p style="font-size:115%;"&gt;&lt;span style="font-weight:400;"&gt;User Interfaces are pages composed of/configured from various components in the Appian UI components catalog and are the elements of the solution that end-users interact with directly. User Interfaces must be intuitive and compelling to use.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style="margin-top:30px;"&gt;&lt;strong&gt;Impact on Estimate&lt;/strong&gt;&lt;/h4&gt;
&lt;ul style="font-size:115%;"&gt;
&lt;li style="font-weight:400;"&gt;Complex validations, such as:
&lt;ul style="font-size:95%;margin:15px;"&gt;
&lt;li style="font-weight:400;"&gt;Limiting acceptable values for a field based on values present in multiple other fields&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Intelligent numbering that requires complex lookups or algorithms to compose and validate.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Rigid or uncompromising performance guidelines:
&lt;ul style="font-size:95%;margin:15px;"&gt;
&lt;li style="font-weight:400;"&gt;Every page must load in under 200ms.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;File upload must be completed in 500ms.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Rigid or uncompromising UI design requirements:
&lt;ul style="font-size:95%;margin:15px;"&gt;
&lt;li style="font-weight:400;"&gt;Appian provides easily configurable UI components, designed to be visually appealing, modern, and work in many form- factors. It does not, however, allow extremely fine control of visual elements (e.g. positioning with pixel level precision). The vast majority of business users find Appian user interfaces sufficient, and value the ability to rapidly build solutions over the fine control required to position specific UI elements with pixel-level precision.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Attempting to build a legacy system&amp;rsquo;s user experience in Appian:
&lt;ul style="font-size:95%;margin:15px;"&gt;
&lt;li style="font-weight:400;"&gt;Appian is a modern platform and has a multitude of capabilities that legacy systems may lack. Attempting to design an Appian application to match a legacy system&amp;rsquo;s user experience would be a significant under-utilization of the true power and benefits of Appian and could lead to increased effort to build the solution.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Dynamically generating forms:
&lt;ul style="font-size:95%;margin:15px;"&gt;
&lt;li style="font-weight:400;"&gt;A dynamically generated form is one that depends partially or wholly on external data (through a web service, database entries etc) for information on input fields, visual composition and validation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;It is possible to generate forms dynamically in Appian, but the Appian Best Practices team strongly recommends against this approach for several reasons:
&lt;ul style="font-size:95%;margin:15px;"&gt;
&lt;li style="font-weight:400;"&gt;Standard Appian User Interfaces are versioned and therefore convenient to compare versions and identify problems quickly.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Dynamic forms are not versioned in the same manner and identifying defects and fixing is time consuming and difficult.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Any delay in retrieving the form information from a web-service or database is immediately visible to end-users as slow- loading. forms, leading to unpredictable performance.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Testing dynamically generated forms is quite difficult and time-consuming in practice.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style="margin-top:30px;"&gt;&lt;strong&gt;Pro Tips&lt;/strong&gt;&lt;/h4&gt;
&lt;ul style="font-size:115%;"&gt;
&lt;li style="font-weight:400;"&gt;Follow Appian UX recommendations and best practices (&lt;a href="https://docs.appian.com/suite/help/20.1/ux_getting_started.html"&gt;UX Design Guide&lt;/a&gt;).&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Ensure that the development team is empowered to make UI decisions appropriate to the use-cases (i.e. let the experts build the best user experience).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="reports"&gt;4) Reports&lt;/h3&gt;
&lt;p style="font-size:115%;"&gt;&lt;span style="font-weight:400;"&gt;Appian Reports are a sub-category of User Interfaces that share these characteristics:&lt;/span&gt;&lt;/p&gt;
&lt;ul style="font-size:115%;"&gt;
&lt;li style="font-weight:400;"&gt;Displays data in tables or charts (often with filtering capabilities).&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Report interfaces do not allow users to update underlying data.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Common reporting data sources:
&lt;ul style="font-size:95%;margin:15px;"&gt;
&lt;li style="font-weight:400;"&gt;Databases or data sets (e.g tables and views in the Appian database or an external database).&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Process model outputs.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;External data retrieved through integrations.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style="margin-top:30px;"&gt;&lt;strong&gt;Impact on Estimate&lt;/strong&gt;&lt;/h4&gt;
&lt;p style="font-size:115%;"&gt;&lt;span style="font-weight:400;"&gt;These characteristics could increase the effort required to design, build, test and deploy reports&lt;/span&gt;&lt;/p&gt;
&lt;ul style="font-size:115%;"&gt;
&lt;li style="font-weight:400;"&gt;Complex data manipulation.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Aggregation of data from multiple systems&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Complex filters&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style="margin-top:30px;"&gt;&lt;strong&gt;Common Assumptions&lt;/strong&gt;&lt;/h4&gt;
&lt;ul style="font-size:115%;"&gt;
&lt;li style="font-weight:400;"&gt;Standard Appian UI components will be used for charting and display.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style="margin-top:30px;"&gt;&lt;strong&gt;Pro Tips&lt;/strong&gt;&lt;/h4&gt;
&lt;ul style="font-size:115%;"&gt;
&lt;li style="font-weight:400;"&gt;While Appian provides robust reporting and data visualization capabilities, it is not designed to be a replacement for commercial Business Intelligence tools, should that level of functionality be required.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;When details about specific reports are not known or are unavailable, assumptions such as the number of reports and average complexity will simplify your estimation efforts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="integrations"&gt;5) Integrations&lt;/h3&gt;
&lt;p style="font-size:115%;"&gt;&lt;span style="font-weight:400;"&gt;Appian connects to other systems utilizing Appian&amp;rsquo;s integration components.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style="margin-top:30px;"&gt;&lt;strong&gt;Impact on Estimate&lt;/strong&gt;&lt;/h4&gt;
&lt;ul style="font-size:115%;"&gt;
&lt;li style="font-weight:400;"&gt;A large number of system integrations increases the complexity associated with testing and deployment.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Specialized integration requirements frequently cause delays and impact dependent functionality.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;IT network teams need to establish the network connections and authentication mechanisms required for integrations.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style="margin-top:30px;"&gt;&lt;strong&gt;Common Assumptions&lt;/strong&gt;&lt;/h4&gt;
&lt;ul style="font-size:115%;"&gt;
&lt;li style="font-weight:400;"&gt;All integrations use standard Appian integration components.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style="margin-top:30px;"&gt;&lt;strong&gt;Pro Tips&lt;/strong&gt;&lt;/h4&gt;
&lt;ul style="font-size:115%;"&gt;
&lt;li style="font-weight:400;"&gt;Confirm that all integration points and relevant documentation for integration methods are available by the start of the project - Appian development moves quickly and poor planning leads to integration services not being available on time.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Ensure that the appropriate contacts and subject matter experts are assigned and engaged to perform connectivity and integration tests for each system&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Confirm that test environments are available for each system prior to the start of the project.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sec_require"&gt;6) Security Requirements&lt;/h3&gt;
&lt;p style="font-size:115%;"&gt;&lt;span style="font-weight:400;"&gt;Requirements that define the level of access to the system, features and data.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style="margin-top:30px;"&gt;&lt;strong&gt;Impact on Estimate&lt;/strong&gt;&lt;/h4&gt;
&lt;p style="font-size:115%;"&gt;&lt;span style="font-weight:400;"&gt;Extensive security requirements lead to more effort to design, build, test and deploy the solution:.&lt;/span&gt;&lt;/p&gt;
&lt;ul style="font-size:115%;"&gt;
&lt;li style="font-weight:400;"&gt;Complex authorization requirements:
&lt;ul style="font-size:95%;margin:10px;"&gt;
&lt;li style="font-weight:400;"&gt;Maintaining authorization lists external to Appian: for example calling web-services to authorize access to data.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Sourcing permissions from multiple locations or systems.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Complex data access control requirements:
&lt;ul style="font-size:95%;margin:10px;"&gt;
&lt;li style="font-weight:400;"&gt;Requirements to manage access at different object levels: Application, Record Type, Record Instance, Data field level.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Large number of roles and groups required to manage functional access:
&lt;ul style="font-size:95%;margin:10px;"&gt;
&lt;li style="font-weight:400;"&gt;Strict requirements for segregation of duties.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Strict requirements for role level access.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Strict regulatory needs to manage access.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Complex document access controls in Appian document store.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style="margin-top:30px;"&gt;&lt;strong&gt;Common Assumptions&lt;/strong&gt;&lt;/h4&gt;
&lt;ul style="font-size:115%;"&gt;
&lt;li&gt;There is only one Authentication system.&lt;/li&gt;
&lt;li&gt;Document access control can be configured utilizing Appian out-of-the-box functionality.&lt;/li&gt;
&lt;li&gt;Access to the system, data and functionality in Appian are configured through Appian Groups.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style="margin-top:30px;"&gt;&lt;strong&gt;Pro Tips&lt;/strong&gt;&lt;/h4&gt;
&lt;ul style="font-size:115%;"&gt;
&lt;li&gt;If exact details are not known, estimate the number of Roles and/or Groups in order to build the project estimate.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="outliers"&gt;7) Outliers&lt;/h3&gt;
&lt;p style="font-size:115%;"&gt;&lt;span style="font-weight:400;"&gt;Other factors that could affect the size of Appian projects.&lt;/span&gt;&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li style="font-weight:400;"&gt;Delivery Methodology - Agile preferred and recommended.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Self-managed vs Appian cloud - Appian cloud is preferred.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Regulatory Requirements - for example GxP for Pharmaceutical Companies.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;IT Requirements - quality gates, deployment gates, go-live gates and support.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style="margin-top:30px;"&gt;&lt;strong&gt;Impact on Estimate&lt;/strong&gt;&lt;/h4&gt;
&lt;p style="font-size:115%;"&gt;&lt;span style="font-weight:400;"&gt;&lt;strong&gt;Delivery Methodology&lt;/strong&gt; - Agile delivery methodologies are particularly well suited for low-code application development. Other methodologies, such as waterfall, can be utilized successfully, but fail to capitalize on many advantages of the Appian low-code platform, ie. functionally complete and feature rich short build iterations, low cost of change, inherent robustness and fast time to production usage. If non-agile methodologies are utilized to deliver Appian projects, it might be prudent to account for longer delivery timelines for equivalent functionality.&lt;/span&gt;&lt;/p&gt;
&lt;p style="font-size:115%;"&gt;&lt;span style="font-weight:400;"&gt;&lt;strong&gt;Self-managed vs. Appian cloud&lt;/strong&gt; - Self-managed installs of any tool introduces dependence on different internal teams for infrastructure, networking and maintenance. Appian cloud takes away most of these dependencies thereby reducing risk and potentially longer engagements.&lt;/span&gt;&lt;/p&gt;
&lt;p style="font-size:115%;"&gt;&lt;span style="font-weight:400;"&gt;&lt;strong&gt;Regulatory Requirements&lt;/strong&gt; - All parts of a solution meeting regulatory requirements must usually adhere explicitly to the guidelines. This often requires additional functional and performance testing. Not all regulatory requirements negatively impact project size and complexity. Therefore an understanding of the requirements, how they affect architecture, design and testing is important to correctly judge the effect on the estimate.&lt;/span&gt;&lt;/p&gt;
&lt;p style="font-size:115%;"&gt;&lt;span style="font-weight:400;"&gt;&lt;strong&gt;IT Requirements&lt;/strong&gt; - These are non-Appian platform specific requirements such as additional documentation needs, specific gate criteria for quality, specific deployment requirements etc. could have an impact on the overall size of the project. These must be understood and planned for.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style="margin-top:30px;"&gt;&lt;strong&gt;Common Assumptions&lt;/strong&gt;&lt;/h4&gt;
&lt;ul style="font-size:115%;"&gt;
&lt;li style="font-weight:400;"&gt;The solution will be installed on Appian cloud.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;Utilization of Agile delivery methodology, and the engagement of an empowered Product Owner, SMEs and Testers.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;That all regulatory requirements are understood and explicitly communicated to the delivery team.&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;That all IT requirements are understood and explicitly communicated to the delivery team.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="estimation_templates"&gt;Estimation Templates&lt;/h2&gt;
&lt;p style="font-size:115%;"&gt;&lt;span style="font-weight:400;"&gt; Indicative examples of project estimates are provided below. &lt;/span&gt;&lt;/p&gt;
&lt;ol style="font-size:115%;"&gt;
&lt;li style="font-weight:400;"&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-00-46/Project-001-_2D00_-Project-Description-for-ROM-Estimate.docx"&gt;Project 001 - Project Description for ROM Estimate.docx&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;a href="https://community.appian.com/cfs-file/__key/communityserver-wikis-components-files/00-00-00-00-46/Repeatable-Template-_2D00_-Use-Case-Scoping-and-Estimation.docx"&gt;community.appian.com/.../Repeatable-Template-_2D00_-Use-Case-Scoping-and-Estimation.docx&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-weight:400;"&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-00-46/Indicative-Examples-_2D00_-Factors-and-Estimates.xlsx"&gt;Indicative Examples - Factors and Estimates.xlsx&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: Delivery, program management, Project Estimation&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</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/revision/21</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>Revision 21 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></channel></rss>