<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://doc.expecco.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Matilk</id>
	<title>expecco Wiki (Version 25.x) - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://doc.expecco.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Matilk"/>
	<link rel="alternate" type="text/html" href="https://doc.expecco.de/wiki/Spezial:Beitr%C3%A4ge/Matilk"/>
	<updated>2026-04-25T20:20:43Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Release_Notes_24.x&amp;diff=29981</id>
		<title>Release Notes 24.x</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Release_Notes_24.x&amp;diff=29981"/>
		<updated>2025-02-18T15:56:43Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Future Release 24.2 (February 2025) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See also: [[Release Notes 23.x]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Future Release 24.2 (February 2025) ==&lt;br /&gt;
*Feature: WindowsAutomation: &amp;quot;Mouse Wheel Simulation&amp;quot; support&lt;br /&gt;
*Feature: support for &amp;quot;Any&amp;quot; and template typed parameters in testcase (of testplan)&lt;br /&gt;
*Feature: negated [[Testplan_Editor/en#Condition_Variables|condition variable]] check&lt;br /&gt;
*Feature: edit lock when loading a suite from AIDYMO&lt;br /&gt;
*Feature: menu entries to save attachments to disk &lt;br /&gt;
*Feature: support for an external XML editor in Settings-&amp;gt;External Tools and Attachment&lt;br /&gt;
*Feature: [[Testsuite_Editor-Metadata_Editor/en#Include_Flat|flat vs. hierarchical imported menu actions]]&lt;br /&gt;
*Feature: The Mobile Testing Plugin has been migrated to use Appium 2, while Appium 1 is still supported. There is a new version of the [[Mobile_Testing_Plugin#Windows|Mobile Testing Supplement]] with Appium 2.&lt;br /&gt;
*Fix/Feature: severity level limit is passed on in sub-test plans with the option of tightening the severity level per test plan level&lt;br /&gt;
*Fix: Project Difference Viewer showed wrong tab for steps inside the test/demo diagram&lt;br /&gt;
*Fix: exchange connection function of diagram editor left an invisible connection at the pin. Lead to wrong output value forwarding during the current session, but cured itself when saving and reloading.&lt;br /&gt;
*Fix: inconsistent behavior of the Smalltalk &amp;quot;angle&amp;quot; message fixed; now returns degrees from both Complex and Point instances. To get radians, use the &amp;quot;theta&amp;quot; message. This change only affects any elementary action which calls that method.&lt;br /&gt;
*Improvement: function and operation of variable pins ([[Scheme_Editor/en#Variable_Number_of_Pins|Scheme_Editor/Variable_Number_of_Pins]])&lt;br /&gt;
*Improvement: change modification date of the project when shrinkwrapping an imported library&lt;br /&gt;
*Improvement: less memory allocation during ELF generation&lt;br /&gt;
*Improvement: more info in tooltips in browser&#039;s &amp;quot;Errors&amp;quot;, &amp;quot;Style&amp;quot; and &amp;quot;Special&amp;quot; tabs&lt;br /&gt;
*Improvement: stability of websocket connections to AIDYMO/web&lt;br /&gt;
*Improvement: Datatypes: Differently named user types on the same primary type or Any can now be defined and stored in a project, but possibly loosing information when loading in older expecco versions. Reimporting a changed datatype definition doesn&#039;t rely the name primarily.&lt;br /&gt;
&lt;br /&gt;
== Release 24.1 (2Q 2024) ==&lt;br /&gt;
*Feature: [[Expecco_API/en#Global_and_Static_Variables|Static Variables for Python]]&lt;br /&gt;
*Feature: Qt-Testing: Logging with log levels &amp;lt;code&amp;gt;DEBUG&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;INFO&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;WARN&amp;lt;/code&amp;gt; ([[Qt_Inject_Windows/en#Logging|Qt-Logging]])&lt;br /&gt;
*Feature: Qt-Testing: Qt-Connections now use the ConnectionManager like the other Gui test technologies&lt;br /&gt;
*Feature: WindowsAutomation: Native Touch, Tap, Drag &amp;amp; Drop support now in the base WindowsAutomation Library&lt;br /&gt;
*Feature: Show Log and [[Timeline/en|Timeline view]] for testplans&lt;br /&gt;
*Feature: Search and Goto Line menu functions in the activity log view&lt;br /&gt;
*Feature: [[Embedded Systems C Bridge API|C-Bridge]] now supports SSL connections (encryption and authentication using certificates)&lt;br /&gt;
*Feature: [[Testsuite_Editor-ExecutionSettings_Editor/en|Settings for execution]] (thread pool and log activities/pins/info) can now be saved in the test suite settings&lt;br /&gt;
*Feature: CSV test report, values for start time, end time and duration added&lt;br /&gt;
*Feature: Improved refactoring for compound blocks: &amp;quot;Extract (&amp;amp; Replace) New Compound Action&amp;quot;&lt;br /&gt;
*Feature: Enhanced expecco reflection library&lt;br /&gt;
*Feature: Logprocessors can be executed for embedded testplans&lt;br /&gt;
*Feature: Logging of background actions can be individually enabled and disabled for testplans and nested testplans&lt;br /&gt;
*Feature: Support for script actions written in the [[Installing_additional_Frameworks/en#Julia_Installation|Julia]] programming language&lt;br /&gt;
*Feature: Powershell actions: support functions for writing to pins, logging, opening dialogs, etc. &lt;br /&gt;
*Fix: Current temporary testplan settings (like selected testcases, do-not-execute of pre/post action, etc.) don&#039;t get lost anymore when reimporting a library&lt;br /&gt;
*Fix: WindowsAutomation: Fix blocking of applications after &amp;lt;Mouse Button Down&amp;gt;&lt;br /&gt;
*Fix: asynchronous write to an output pin with no wait() in bridged actions are now detected and reported as error (see Example3 in the [[Expecco_API/en#Asynchronous_and_Callback_Functions|NodeJS API Documentation]])&lt;br /&gt;
*Fix: Bridges: Detect (and ignore) invalid requests from forked background bridge threads&lt;br /&gt;
*Fix: Acitivity logs of asynchronous events in background actions are now displayed correctly in the background activity log.&lt;br /&gt;
*Fix: Qt: Drag and drop improved by revising the &amp;quot;Move mouse event&amp;quot; (Windows)&lt;br /&gt;
*Fix: Disabling logs of sub-activities (if successful, if not successful, etc.)&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Release_Notes_24.x&amp;diff=29973</id>
		<title>Release Notes 24.x</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Release_Notes_24.x&amp;diff=29973"/>
		<updated>2025-02-17T09:53:54Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Future Release 24.2 (February 2025) */ Appium 2 support&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See also: [[Release Notes 23.x]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Future Release 24.2 (February 2025) ==&lt;br /&gt;
*Feature: WindowsAutomation: &amp;quot;Mouse Wheel Simulation&amp;quot; support&lt;br /&gt;
*Feature: support for &amp;quot;Any&amp;quot; and template typed parameters in testcase (of testplan)&lt;br /&gt;
*Feature: negated [[Testplan_Editor/en#Condition_Variables|condition variable]] check&lt;br /&gt;
*Feature: edit lock when loading a suite from AIDYMO&lt;br /&gt;
*Feature: menu entries to save attachments to disk &lt;br /&gt;
*Feature: support for an external XML editor in Settings-&amp;gt;External Tools and Attachment&lt;br /&gt;
*Feature: [[Testsuite_Editor-Metadata_Editor/en#Include_Flat|flat vs. hierarchical imported menu actions]]&lt;br /&gt;
*Feature: The Mobile Testing Plugin has been migrated to use Appium 2, while Appium 1 is still supported. There is a new version of the [[Mobile_Testing_Plugin#Windows|Mobile Testing Supplement]] with Appium 2.&lt;br /&gt;
*Fix/Feature: severity level limit is passed on in sub-test plans with the option of tightening the severity level per test plan level&lt;br /&gt;
*Fix: Project Difference Viewer showed wrong tab for steps inside the test/demo diagram&lt;br /&gt;
*Fix: exchange connection function of diagram editor left an invisible connection at the pin. Lead to wrong output value forwarding during the current session, but cured itself when saving and reloading.&lt;br /&gt;
*Fix: inconsistent behavior of the Smalltalk &amp;quot;angle&amp;quot; message fixed; now returns degrees from both Complex and Point instances. To get radians, use the &amp;quot;theta&amp;quot; message. This change only affects any elementary action which calls that method.&lt;br /&gt;
*Improvement: function and operation of variable pins ([[Scheme_Editor/en#Variable_Number_of_Pins|Scheme_Editor/Variable_Number_of_Pins]])&lt;br /&gt;
*Improvement: change modification date of the project when shrinkwrapping an imported library&lt;br /&gt;
*Improvement: less memory allocation during ELF generation&lt;br /&gt;
*Improvement: more info in tooltips in browser&#039;s &amp;quot;Errors&amp;quot;, &amp;quot;Style&amp;quot; and &amp;quot;Special&amp;quot; tabs&lt;br /&gt;
*Improvement: stability of websocket connections to AIDYMO/web&lt;br /&gt;
&lt;br /&gt;
== Release 24.1 (2Q 2024) ==&lt;br /&gt;
*Feature: [[Expecco_API/en#Global_and_Static_Variables|Static Variables for Python]]&lt;br /&gt;
*Feature: Qt-Testing: Logging with log levels &amp;lt;code&amp;gt;DEBUG&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;INFO&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;WARN&amp;lt;/code&amp;gt; ([[Qt_Inject_Windows/en#Logging|Qt-Logging]])&lt;br /&gt;
*Feature: Qt-Testing: Qt-Connections now use the ConnectionManager like the other Gui test technologies&lt;br /&gt;
*Feature: WindowsAutomation: Native Touch, Tap, Drag &amp;amp; Drop support now in the base WindowsAutomation Library&lt;br /&gt;
*Feature: Show Log and [[Timeline/en|Timeline view]] for testplans&lt;br /&gt;
*Feature: Search and Goto Line menu functions in the activity log view&lt;br /&gt;
*Feature: [[Embedded Systems C Bridge API|C-Bridge]] now supports SSL connections (encryption and authentication using certificates)&lt;br /&gt;
*Feature: [[Testsuite_Editor-ExecutionSettings_Editor/en|Settings for execution]] (thread pool and log activities/pins/info) can now be saved in the test suite settings&lt;br /&gt;
*Feature: CSV test report, values for start time, end time and duration added&lt;br /&gt;
*Feature: Improved refactoring for compound blocks: &amp;quot;Extract (&amp;amp; Replace) New Compound Action&amp;quot;&lt;br /&gt;
*Feature: Enhanced expecco reflection library&lt;br /&gt;
*Feature: Logprocessors can be executed for embedded testplans&lt;br /&gt;
*Feature: Logging of background actions can be individually enabled and disabled for testplans and nested testplans&lt;br /&gt;
*Feature: Support for script actions written in the [[Installing_additional_Frameworks/en#Julia_Installation|Julia]] programming language&lt;br /&gt;
*Feature: Powershell actions: support functions for writing to pins, logging, opening dialogs, etc. &lt;br /&gt;
*Fix: Current temporary testplan settings (like selected testcases, do-not-execute of pre/post action, etc.) don&#039;t get lost anymore when reimporting a library&lt;br /&gt;
*Fix: WindowsAutomation: Fix blocking of applications after &amp;lt;Mouse Button Down&amp;gt;&lt;br /&gt;
*Fix: asynchronous write to an output pin with no wait() in bridged actions are now detected and reported as error (see Example3 in the [[Expecco_API/en#Asynchronous_and_Callback_Functions|NodeJS API Documentation]])&lt;br /&gt;
*Fix: Bridges: Detect (and ignore) invalid requests from forked background bridge threads&lt;br /&gt;
*Fix: Acitivity logs of asynchronous events in background actions are now displayed correctly in the background activity log.&lt;br /&gt;
*Fix: Qt: Drag and drop improved by revising the &amp;quot;Move mouse event&amp;quot; (Windows)&lt;br /&gt;
*Fix: Disabling logs of sub-activities (if successful, if not successful, etc.)&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin/en&amp;diff=29972</id>
		<title>Mobile Testing Plugin/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin/en&amp;diff=29972"/>
		<updated>2025-02-17T09:42:58Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Windows */ new supplement&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile_Testing_Plugin|Deutsche Version]] | &#039;&#039;&#039;English Version&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
The &#039;&#039;Mobile Testing Plugin&#039;&#039; adds mechanisms to test and automate Android and iOS devices. This includes both real and emulated devices - it does not matter whether real mobile devices or emulated devices are used. The plugin can (and usually is) used in conjunction with the [[Expecco_GUI_Tests_Extension_Reference|GUI-Browser]], which supports the creation of tests. It can also be used to record test procedures.&lt;br /&gt;
&lt;br /&gt;
[http://appium.io/ Appium] is used to connect to the devices. Appium is a free open source framework for testing and automating mobile applications.&lt;br /&gt;
&lt;br /&gt;
We recommend to go through the [[Mobile_Testing_Tutorial/en|Tutorial]] to familiarize yourself with the Mobile Plugin. This tutorial leads step by step through the creation of a test case using an example and explains the necessary basics.&lt;br /&gt;
&lt;br /&gt;
= Installation and Setup =&lt;br /&gt;
To use the &#039;&#039;Mobile Testing Plugin&#039;&#039;, you must have installed expecco together with the corresponding plugin, and you need the appropriate licenses. expecco communicates with the mobile devices via an Appium server, which either runs on the same computer as expecco, or on a second computer. This must be accessible for expecco.&lt;br /&gt;
&lt;br /&gt;
== Installation Overview ==&lt;br /&gt;
&#039;&#039;&#039;Computer running expecco:&#039;&#039;&#039;&lt;br /&gt;
* Java JDK version 8, 9, 10 or 11&lt;br /&gt;
&#039;&#039;&#039;Computer connected to Android devices :&#039;&#039;&#039;&lt;br /&gt;
* Appium Server, you can install it via the Mobile Testing Supplement (see below), of which we regularly provide a new version&lt;br /&gt;
* Android SDK, you can also get it with the Mobile Testing Supplement&lt;br /&gt;
* Java JDK version 8, 9, 10 or 11&lt;br /&gt;
&#039;&#039;&#039;Computer connected to iOS devices&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
* Appium Server, you can install it via the Mobile Testing Supplement for MacOS (see below), of which we regularly provide a new version&lt;br /&gt;
* Xcode in a version that supports the iOS version used, available from the Apple App Store&lt;br /&gt;
* Java JDK version 8, 9, 10 or 11&lt;br /&gt;
* Apple Developer Certificate incl. matching private key (to sign the WebDriverAgent)&lt;br /&gt;
* Provisioning Profile for the mobile devices to be used&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; Please note that due to the requirements (no connection to non-Apple devices available) iOS devices can only be controlled from a Mac.&lt;br /&gt;
&lt;br /&gt;
Depending on the setup, the above-mentioned computers can also be the same device. expecco can either connect to a remote Appium Server and mobile devices connected to it via the network, or start an Appium Server locally itself and use it with local mobile devices. However, some of expecco&#039;s functions that make it easier to create test cases are only available if the mobile devices are connected to the same computer on which expecco is running. A possible setup may therefore look like the following figure:&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAufbau.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
The following explains how to install Appium and other necessary applications for Windows and Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
The easiest way is to install everything from our Mobile Testing Supplement. However, newer versions do not contain a JDK anymore due to a change in Oracle&#039;s license terms, so you have to install it additionally. Of course, you are free to install Appium directly to use the version you want. However, to then be able to start an Appium server with expecco, a suitable batch file must be available and specified in the [[Mobile_Testing_Plugin/en#Plugin_Configuration|settings]]. However, connections can also be established to other running Appium servers.&lt;br /&gt;
*&#039;&#039;&#039;expecco 24.2&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-24.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 2.0.1.1]&lt;br /&gt;
:Migration to Appium 2. The Appium server starts as default without the path &#039;&#039;wd/hub/&#039;&#039;.&lt;br /&gt;
:Appium 2.11.0&lt;br /&gt;
:Node 20.9.0&lt;br /&gt;
:adb 1.0.41 from platform-tools 35.0.1&lt;br /&gt;
*expecco 24.1: [https://download.exept.de/transfer/h-expecco-24.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.3]&lt;br /&gt;
:Same versions as in the predecessor, but with updated chromedriver versions&lt;br /&gt;
*expecco 23.2: [https://download.exept.de/transfer/h-expecco-23.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.2]&lt;br /&gt;
:Same versions as in the predecessor, but with updated chromedriver versions&lt;br /&gt;
*expecco 23.1: [https://download.exept.de/transfer/h-expecco-23.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.1]&lt;br /&gt;
:Same versions as in the predecessor, but the installer now allows to add Appium to the Autostart.&lt;br /&gt;
*expecco 22.2 and 22.1: [https://download.exept.de/transfer/h-expecco-22.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.2.0]&lt;br /&gt;
:Appium 1.22.3*&lt;br /&gt;
:Node 14.17.5&lt;br /&gt;
:adb 1.0.41 from platform-tools 33.0.2&lt;br /&gt;
:&#039;&#039;* We added the capability&#039;&#039; chromedriverStartTimeout &#039;&#039;to Appium, to get a timeout earlier, if Chromedriver cannot be initialized. (see [[#startChromedriverTimeout|Problems and Solutions]])&#039;&#039;&lt;br /&gt;
*expecco 21.2: [https://download.exept.de/transfer/h-expecco-21.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.12.0.0]&lt;br /&gt;
:Contains Appium version 1.22.0, Node still is version 12.13.1.&lt;br /&gt;
*expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.1.0]&lt;br /&gt;
:Only minor changes compared to the previous version.&lt;br /&gt;
*expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.0.0]&lt;br /&gt;
:Compared to the previous version, Appium was updated to version 1.16.0-rc.1 and node 12 is used. &lt;br /&gt;
*expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.8.1.0]&lt;br /&gt;
:This installs Appium in the version 1.12.0 and now additionally contains build-tools in the version 28.0.3 in the android-sdk. Apart from this, it is the same as the previous version.&lt;br /&gt;
*expecco 18.2: [http://download.exept.de/transfer/h-expecco-18.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.7.3.0]&lt;br /&gt;
:This installs Appium in the version 1.8.1. In addition, an installation of &#039;&#039;Android Debug Bridge&#039;&#039; and &#039;&#039;Google USB Driver&#039;&#039; ([https://gsmusbdrivers.com/download/adb-fastboot-drivers/ adb-setup-1.4.3]) is offered. This covers drivers for a broad range of Android devices, and you won&#039;t have to install an individual driver for each device. A &#039;&#039;&#039;JDK is not contained anymore (due to a change in Oracle&#039;s license terms)&#039;&#039;&#039;, you have to download it on your own, e.g. from [https://www.oracle.com/technetwork/java/javase/downloads/index.html Oracle].&lt;br /&gt;
*expecco 18.1: same procedure as for expecco 2.11&lt;br /&gt;
*expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/MobileTestingSupplement_1.6.0.2_Setup.exe Mobile Testing Supplement 1.6.0.2]&lt;br /&gt;
:This installs a Java JDK Version 8, android-sdk and Appium Version 1.6.4. The supplement also offers a universal adb driver ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]). This driver supports a wide range of Android Devise, and avoids the need to search for individual device-specific drivers.&lt;br /&gt;
*expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_1.5.0.0_Setup.exe Mobile Testing Supplement 1.5.0.0]&lt;br /&gt;
:It installs a Java JDK version 8, android-sdk and Appium version 1.4.16. During the installation the graphical user interface of Appium is started, you can close this window immediately. The supplement also offers a universal adb driver (ClockworkMod). This combines drivers for a wide range of Android devices so that you do not have to search for and install a separate driver for each device.&lt;br /&gt;
&lt;br /&gt;
If expecco has to use mobile devices that are connected to another computer, you have to start an Appium server there. You can do this by using the file &amp;lt;code&amp;gt;appium_standalone.cmd&amp;lt;/code&amp;gt;. The server is then started on default port 4723. If you want to use a different port number, start the server with&lt;br /&gt;
&lt;br /&gt;
 appium_standalone.cmd -p &amp;lt;portnummer&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The server is ready, as soon as the line&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Appium REST http interface listener started on 0.0.0.0:4723&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
is displayed, where you can read the used port number at the end.&lt;br /&gt;
&lt;br /&gt;
If your Android device is connected to a remote machine,&lt;br /&gt;
you may want to see the live screen locally using a tool like&lt;br /&gt;
[https://github.com/Genymobile/scrcpy scrcpy].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When Appium is started for the first time – either standalone or by expecco – it may happen that the Windows firewall blocks access to the node server. Allow the access or Appium cannot be started.&lt;br /&gt;
&lt;br /&gt;
== Mac OS ==&lt;br /&gt;
Note: the following can be ignored if you do not plan to test iOS (iPhone) devices. The Mac setup is not needed for Android devices.&lt;br /&gt;
&lt;br /&gt;
=== Xcode ===&lt;br /&gt;
Automation with iOS devices needs [https://developer.apple.com/xcode/ Xcode]. You can install it from the App Store. Please make sure that the version matches the tested iOS versions.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;iOS&#039;&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp;  &lt;br /&gt;
|&#039;&#039;&#039;Xcode&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;macOS&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|10.x&lt;br /&gt;
|8.x&lt;br /&gt;
|10.12 (Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|11.x&lt;br /&gt;
|9.x&lt;br /&gt;
|10.13 (High Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|12.x&lt;br /&gt;
|10.x&lt;br /&gt;
|10.14 (Mojave)&lt;br /&gt;
|-&lt;br /&gt;
|13.x&lt;br /&gt;
|11.x&lt;br /&gt;
|10.15 (Catalina)&lt;br /&gt;
|-&lt;br /&gt;
|14.x&lt;br /&gt;
|12.x&lt;br /&gt;
|11.0 (Big Sur)&lt;br /&gt;
|-&lt;br /&gt;
|15.x&lt;br /&gt;
|13.x&lt;br /&gt;
|12.0 (Monterey)&lt;br /&gt;
|-&lt;br /&gt;
|16.x&lt;br /&gt;
|14.x&lt;br /&gt;
|12.5 (Monterey)&lt;br /&gt;
|}&lt;br /&gt;
This table is only a simplified overview, better see [https://xcodereleases.com/ Xcode releases] or [https://en.wikipedia.org/wiki/Xcode#Version_comparison_table Xcode versions] for the exact versions. For new iOS minor versions, there is usually also a new release of Xcode, e.g. for iOS 10.2 you need at least Xcode 8.2, for iOS 10.3 at least Xcode 8.3, etc. So if you are upgrading to a newer iOS version, you will usually need a newer Xcode version as well. Newer versions of Xcode may not run on older operating systems, which in turn may require an operating system upgrade. If you also want to test older iOS versions, it can be useful to install the corresponding Xcode versions in parallel.&lt;br /&gt;
&lt;br /&gt;
=== Appium ===&lt;br /&gt;
You can install Appium either as command-line tool or use it with [https://github.com/appium/appium-desktop Appium Desktop], which provides a GUI to start the server. Meanwhile there is also Appium 2.0, which is not tested with expecco yet and therefore not recommended to use.&lt;br /&gt;
&lt;br /&gt;
==== Appium Desktop ====&lt;br /&gt;
Download the newest version of [https://github.com/appium/appium-desktop/releases/ Appium Desktop]. For the Mac, it is best to take the dmg file and install it to the applications. When starting &#039;&#039;Appium Server GUI&#039;&#039; you will probably get the error message, that it is not possible for security reasons. In this case, open the context menu of the app file (right click or Ctrl + click) and choose &#039;&#039;Open&#039;&#039; there. Then confirm that you really want to open the application. From now on you can open the application normally.&lt;br /&gt;
&lt;br /&gt;
[[Datei:OpenAppiumServerGUI1.png|text-top]] [[Datei:OpenAppiumServerGUI2.png|text-top]]&lt;br /&gt;
&lt;br /&gt;
Since Xcode 14 there are problems with signing the WebDriverAgent, which Appium loads on the device for the automation. This means that no connection is possible with version 1.22.3-4 of Appium Desktop. In newer versions of WebDriverAgent, this problem is solved, but currently there is no version of Appium Desktop using such a new version (as of November 2022). However, you can manually download a new version (e.g. 4.10.2) and replace the files in Appium. To do this, download one of the two archive files (zip or tar.gz) containing the source code from the [https://github.com/appium/WebDriverAgent/releases/ WebDriverAgent download page]. Then open and extract this file. Copy the contents of the folder &#039;&#039;WebDriverAgent-4.10.2&#039; to&lt;br /&gt;
&lt;br /&gt;
 /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
If you navigate there by Finder, make a context click (right click or Ctrl + click) on the application and choose &#039;&#039;Show Package Contents&#039;&#039; from the menu. Replace all files that are already present with the same name.&lt;br /&gt;
&lt;br /&gt;
==== Install Appium using npm ====&lt;br /&gt;
You can install Appium using npm (Node Package Manager) as well. To do this, you have to install node/npm first. This can be done using [https://github.com/nvm-sh/nvm nvm] (Node Version Manager), which you can get on Github. If the following installation instructions should not work for you, you will find detailed information in the [https://github.com/nvm-sh/nvm#readme Readme] there.&lt;br /&gt;
&lt;br /&gt;
Open a Terminal window. Then clone the Github repository of nvm&lt;br /&gt;
 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash&lt;br /&gt;
and load it&lt;br /&gt;
 export NVM_DIR=&amp;quot;$([ -z &amp;quot;${XDG_CONFIG_HOME-}&amp;quot; ] &amp;amp;&amp;amp; printf %s &amp;quot;${HOME}/.nvm&amp;quot; || printf %s &amp;quot;${XDG_CONFIG_HOME}/nvm&amp;quot;)&amp;quot; [ -s &amp;quot;$NVM_DIR/nvm.sh&amp;quot; ] &amp;amp;&amp;amp; \. &amp;quot;$NVM_DIR/nvm.sh&amp;quot; # This loads nvm&lt;br /&gt;
&lt;br /&gt;
Then execute&lt;br /&gt;
 command -v nvm&lt;br /&gt;
to see if it works. It should print &#039;&#039;nvm&#039;&#039;. If there is no response, execute&lt;br /&gt;
 touch ~/.zshrc&lt;br /&gt;
and try again.&lt;br /&gt;
&lt;br /&gt;
Now you can install node with the following command.&lt;br /&gt;
 nvm install 16.15.1&lt;br /&gt;
As there are problems installing Appium using the newest version of node, we recommend this version.&lt;br /&gt;
&lt;br /&gt;
After node is installed, you can use it to install Appium:&lt;br /&gt;
 npm install -g appium&lt;br /&gt;
&lt;br /&gt;
The Appium server now simply can be started with the command&lt;br /&gt;
 appium&lt;br /&gt;
The output will then be written directly to the terminal.&lt;br /&gt;
&lt;br /&gt;
This version also has problems with signing the WebDriverAgent, like explained in [[#Appium_Desktop | Appium Desktop]]. Therefore download a newer version of WebDriverAgent in this case as well and replace the old files. You will find them at&lt;br /&gt;
 /Users/&amp;lt;user&amp;gt;/.nvm/versions/16.15.1/lib/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
==== Mobile Testing Supplement ====&lt;br /&gt;
We provide older versions of Appium via the Mobile Testing Supplement for Mac OS, with which you can easily install it:&lt;br /&gt;
* &#039;&#039;&#039;expecco 20.2&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-20.2.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement for Mac OS (1.2.2)]&lt;br /&gt;
:Contains Appium version 1.18.3 and uses node 14.&lt;br /&gt;
&lt;br /&gt;
* expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement for Mac OS (1.2.0)]&lt;br /&gt;
:Only a few changes compared to the previous version.&lt;br /&gt;
&lt;br /&gt;
* expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement_for_MacOS.tar.bz2 Mobile Testing Supplement for Mac OS (1.1.98)]&lt;br /&gt;
:Appium is updated to version 1.16.0-rc.1 and node 12 is used.&lt;br /&gt;
&lt;br /&gt;
* expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.96.tar.bz2 Mobile Testing Supplement for Mac OS (1.1.96)]&lt;br /&gt;
:This version contains Appium 1.12.0.&lt;br /&gt;
&lt;br /&gt;
* expecco 18.1: [http://download.exept.de/transfer/h-expecco-18.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.94.tar.bz2 Mobile Testing Supplement for Mac OS (1.1.94)]&lt;br /&gt;
:This version contains Appium 1.8.0.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.11:[http://download.exept.de/transfer/h-expecco-2.11.1/Mobile_Testing_Supplement_for_Mac_OS_1.0.94.tar.bz2 Mobile Testing Supplement for Mac OS (1.0.94)]&lt;br /&gt;
:This version contains Appium 1.6.4.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_for_Mac_OS_1.0.tar.bz2 Mobile Testing Supplement for Mac OS]&lt;br /&gt;
:Diese Version entält Appium 1.4.16.&lt;br /&gt;
&lt;br /&gt;
After you have downloaded the supplement, you can move it to a directory of your choice (e.g. your home directory) and unpack it there. A suitable command in a shell could look like this, adjust the version number accordingly:&lt;br /&gt;
&lt;br /&gt;
 tar -xvpf Mobile_Testing_Supplement_for_Mac_OS_1.1.98.tar.bz2&lt;br /&gt;
&lt;br /&gt;
If your default Xcode installation is the one you want to use, you can start Appium directly from the file in the &#039;&#039;bin&#039;&#039; directory with the appropriate version number:&lt;br /&gt;
&lt;br /&gt;
 Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
If you want to use another Xcode than the one configured as default, you have to tell Appium the corresponding path by using the environment variable &#039;&#039;DEVELOPER_DIR&#039;&#039;. For example, if you have installed Xcode in &#039;&#039;/Applications/Xcode-11.3.app&#039;&#039;, you can start Appium this way:&lt;br /&gt;
&lt;br /&gt;
 DEVELOPER_DIR=&amp;quot;/Applications/Xcode-11.3.app/Contents/Developer&amp;quot; Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
To find out what is set as the default Xcode installation on your system, use this command:&lt;br /&gt;
&lt;br /&gt;
 xcode-select -p&lt;br /&gt;
&lt;br /&gt;
If Appium cannot find your Xcode installation, a message like this appears:&lt;br /&gt;
&#039;&#039;&amp;lt;blockquote&amp;gt;org.openqa.selenium.SessionNotCreatedException - A new session could not be created. (Original error: Could not find path to Xcode, environment variable DEVELOPER_DIR set to: /Applications/Xcode.app but no Xcode found)&amp;lt;/blockquote&amp;gt;&#039;&#039;&lt;br /&gt;
In such a case, restart Appium by specifying a valid &#039;&#039;DEVELOPER_DIR&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Signing WebDriverAgent ====&lt;br /&gt;
For automation, Appium installs an App called WebDriverAgent on the device and therefore has to be able to sign it. You need an Apple account and a respective certificate for this. For evaluation you can use a free account. This has the disadvantage that created profiles are only valid for one week and must be recreated afterwards. Also be careful when sharing the account, as certificates may be revoked or invalidated by automatic generation. As a result, apps that have already been signed can no longer be used.&lt;br /&gt;
&lt;br /&gt;
If you already have a respective certificate and its associated private key in your keychain on the Mac, you can have the WebDriverAgent automatically signed. If not, it is recommended to set and manage the signing using Xcode.&lt;br /&gt;
&lt;br /&gt;
First, connect the device you want to use to your Mac via USB. Make sure both the Mac and the device are in the same network or there will be problems when connection with Appium. Start Xcode and open &#039;&#039;Preferences&#039;&#039;. Go to the Accounts page and create an entry with your account. You can then click on &#039;&#039;Manage Certificates...&#039;&#039; to see the certificates that belong to that account. To run tests, you need an iOS Development Certificate and the associated private key. If you do not already have one, create one. If you already have one, but it is not in your keychain (indicated by &amp;quot;Not in Keychain&amp;quot;), you can import it. You can do that by the [https://support.apple.com/en-us/guide/keychain-access/welcome/mac keychain access] on your Mac, if you have exported it previously from the keychain, where it is stored. The certificate with the associated key should be in the keychain &#039;&#039;Login&#039;&#039;. It can be exported from there as PKCS#12 file (typical ending .p12). To import a certificate into your keychain, select the option &#039;&#039;Import objects&#039;&#039; from the &#039;&#039;File&#039;&#039; menu. If you don&#039;t know where the certificate is stored, you can also revoke it in Xcode and recreate it in your keychain. However, only do this if you know that the old certificate is no longer in use because it can no longer be used afterwards. Now the keychain should contain an iOS development certificate.&lt;br /&gt;
&amp;lt;!--(Den folgenden Teil braucht man wohl nicht mehr, wenn es in Xcode eingestellt ist)From the right-click menu, select Information. Under the details of the certificate you will find the Team ID, which is referred to here as the Organizational Unit. Enter it in the Team ID field of the plug-in&#039;s settings, see [[#Plugin_Configuration|Plugin Configuration]].--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now open the WebDriverAgent project in Xcode. If you have installed the Mobile Testing Supplement, you will find it in this directory at&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
If you have installed Appium Desktop, you will find it at&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;/Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You can use the Finder to navigate to the Xcode project file and open it by double clicking. Note, that you have to perform a context click (right click or Ctrl + click) on the Appium Server GUI app and select &#039;&#039;Show Package Contents&#039;&#039; in the menu, to get to its subdirectory.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingWebDriverAgentXcode.png]]&lt;br /&gt;
&lt;br /&gt;
Select &#039;&#039;WebDriverAgentLib&#039;&#039; and the page &#039;&#039;Signing &amp;amp; Capabilities&#039;&#039;. In the section &#039;&#039;Signing&#039;&#039; set the option &#039;&#039;Automatically manage signing&#039;&#039; and then select a team. Now switch to &#039;&#039;WebDriverAgentRunner&#039;&#039; and do the same there.&lt;br /&gt;
&amp;lt;!-- (The following seems to not be relevant anymore.) Here you should see errors indicating that no Provisioning Profiles have been created or found. Therefore, go to the &#039;&#039;Build Settings&#039;&#039; page and look for the entry &#039;&#039;Product Bundle Identifier&#039;&#039; in the &#039;&#039;Packaging&#039;&#039; section. Change this from com.facebook.WebDriverAgentRunner to something Xcode accepts by changing the prefix. Xcode can now generate a matching Provisioning Profile and the errors on the General page should disappear. After that you can quit Xcode. --&amp;gt;&lt;br /&gt;
By setting the team, the errors showing up for WebDriverAgentRunner should disappear. If Xcode should not be able to create a Provisioning Profile matching the Bundle ID &#039;&#039;com.facebook.WebDriverAgentRunner&#039;&#039;, you can edit the latter so that it fits your certificate. After that you can quit Xcode or you can, like explained further below, directly start the build in Xcode, so the project will be already built when Appium wants to use it.&lt;br /&gt;
&lt;br /&gt;
If you now connect to your device from expecco, the WebDriverAgent will be installed and started on it and then switch to the app to be tested. You may still have to trust the execution of the WebDriverAgent on the device. It maybe a sign that you have to do this, if the app WebDriverAgent first appears on the device and tries to start, but then is uninstalled again. To trust the execution, open the settings during the connection setup on the device and then the entry &#039;&#039;Device management&#039;&#039; under &#039;&#039;General&#039;&#039;. This entry is only visible if a developer app is installed on the device. You may therefore have to wait until the WebDriverAgent is installed before the entry appears. Select the entry of your Apple account and trust it. Since the WebDriverAgent will be uninstalled again if the start did not work, you have to do this during the connection setup. If this is too hectic for you, you can also execute the following code:&lt;br /&gt;
&lt;br /&gt;
 xcodebuild -project Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
 xcodebuild -project /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&lt;br /&gt;
&lt;br /&gt;
This installs the WebDriverAgent on the device without deleting it again.&lt;br /&gt;
&lt;br /&gt;
If there are problems while installing the WebDriverAgent, you can also try and start the build in Xcode. Make sure the right target &#039;&#039;WebDriverAgent&#039;&#039; is selected. Error messages in Xcode might indicate easier what the problem is about. Sometimes it even helps to try for a second time, if it took too long for the first time and got aborted. It may occur, that you are asked several times during the build to enter the password for the keychain.&lt;br /&gt;
&lt;br /&gt;
[[Datei:WebDriverAgentCodesign.png]]&lt;br /&gt;
&lt;br /&gt;
Read also the documentation of Appium on [https://github.com/appium/appium-xcuitest-driver/blob/master/docs/real-device-config.md Setting up tests with iOS devices]. Refer to the [https://support.apple.com/en-us/HT204460 Apple documentation] for details on installing and trusting of apps.&lt;br /&gt;
&lt;br /&gt;
Once the WebDriverAgent is installed on the device, it will be reused for later connections und connecting should work faster. The signed version is then already on your Mac as well and doesn&#039;t have to be built again. This should speed up the connect with other devices as well. If you know, that the connect has to build and sign the WebDriverAgent first, it is advisable to set the capability &#039;&#039;wdaLaunchTimeout&#039;&#039;. This timeout specifies how long Appium waits for the WebDriverAgents to start up on the device and is per default set to 60000&amp;amp;nbsp;ms. Building often takes a little longer than one minute, so the connect attempt will be canceled. A value of 120000 will be more reliable here.&lt;br /&gt;
&lt;br /&gt;
== Plugin Configuration ==&lt;br /&gt;
Before you start, please check the settings of the Mobile Testing Plugin and adjust them if necessary. Select the menu item &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Extensions&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot; (see fig.). By default, these paths are found automatically (1). To adjust a path manually, deactivate the corresponding check mark at the right. You&#039;ll see a drop-down list with some paths to choose from. If an entered path is wrong or cannot be found, the field is marked red and a message appears. Make sure that all paths are specified correctly.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingEinstellungen.png | thumb | 400px | Plugin Configuration]]&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;appium&#039;&#039;&#039;: Enter the path to the executable file with which Appium can be started in the command line. Under Windows this file will usually be called &amp;quot;&amp;lt;code&amp;gt;appium.cmd&amp;lt;/code&amp;gt;&amp;quot;. This path is used when expecco starts an Appium server.&lt;br /&gt;
*&#039;&#039;&#039;node&#039;&#039;&#039;: Enter the path to the executable that starts Node (also called (also called &amp;quot;Node.js&amp;quot;). This path is passed to Appium when a server is started so that Appium can find it independently of the PATH variable. Under Windows this file is usually called &amp;quot;&amp;lt;code&amp;gt;node.exe&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;JAVA_HOME&#039;&#039;&#039;: Enter the path to a JDK (Java Development Kit)here. This path is passed to each Appium server. Leave the field blank to use the value from the environment variable. To specify which Java should be used by expecco, set this path in the Java Bridge settings.&lt;br /&gt;
*&#039;&#039;&#039;ANDROID_HOME&#039;&#039;&#039;: Enter the path to an Android SDK here. This path is passed to each Appium server. Leave the field blank to use the value from the environment variable.&lt;br /&gt;
*&#039;&#039;&#039;adb&#039;&#039;&#039;: The path to the adb command. Under Windows the file is called &amp;quot;&amp;lt;code&amp;gt;adb.exe&amp;lt;/code&amp;gt;&amp;quot;. This file is used by expecco, for example, to get the list of connected devices. This path should be selected automatically, if the command is found in the ANDROID_HOME directory. This is also used by Appium. If expecco and Appium use different versions of adb, conflicts may occur.&lt;br /&gt;
*&#039;&#039;&#039;android.bat&#039;&#039;&#039;: This file is only needed to start the AVD and the SDK Manager, which deal with phone emulators. The file in the ANDROID_HOME directory will be selected automatically, if present there.&lt;br /&gt;
*&#039;&#039;&#039;aapt&#039;&#039;&#039;: The path to the &amp;quot;aapt&amp;quot; command here. Under Windows this file is called &amp;quot;&amp;lt;code&amp;gt;aapt.exe&amp;lt;/code&amp;gt;&amp;quot;. expecco uses &amp;quot;aapt&amp;quot; only in the connection editor to read the package and activities of an &amp;quot;apk&amp;quot; file. The file in the ANDROID_HOME directory will be selected automatically, if present there.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingJavaBridgeEinstellungen.png | thumb | 400px | JDK Configuration]]&lt;br /&gt;
&lt;br /&gt;
Starting with expecco 2.11, there is an additional field called &#039;&#039;Team ID&#039;&#039;. If you run iOS tests, enter the Team ID of your certificate here. This is used for every iOS connection, unless you change the value in the connection settings in individual cases. For information on how to obtain the team ID, please refer to the section on [[#Signing| signing]] for installations on Mac OS. With expecco 2.10 and older, you can only enter the Team ID as capability for each connection setting separately. However, you must use the [[#Extended_View|extended view]] to do this. Enter the capability &#039;&#039;xcodeOrgId&#039;&#039; here and set the Team ID of the certificate as value.&lt;br /&gt;
&lt;br /&gt;
The server address setting at the bottom of the page refers to the behavior of the connection editor. It checks at the end whether the server address ends in &#039;&#039;/wd/hub&#039;&#039; as this is the usual form. If not, a dialog asks how to react. The defined behavior can be viewed and changed here.&lt;br /&gt;
&lt;br /&gt;
Also switch to the entry &#039;&#039;Java Bridge&#039;&#039; (see figure). Here you have to specify the path to your Java installation, which is used by expecco. Enter a JDK here. If you want to use the one from the Mobile Testing Supplement under Windows, the path is&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;C:\Program Files (x86)\exept\Mobile Testing Supplement\jdk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can also use the system settings.&lt;br /&gt;
&lt;br /&gt;
== Prepare Android Device ==&lt;br /&gt;
If you connect an Android device under Windows, you may still need an adb driver for the device. You can usually find a suitable driver on the manufacturer&#039;s website. If you have installed the universal driver from the Mobile Testing Supplement, everything should already work for most devices. In some cases, Windows will automatically try to install a driver when you connect the device for the first time. &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Attention&#039;&#039;&#039;: Before you can control a mobile device with the Appium plugin, you have to allow this debugging!&lt;br /&gt;
&lt;br /&gt;
For Android devices, you can find this option in the settings under &#039;&#039;[https://developer.android.com/studio/debug/dev-options Developer Options]&#039;&#039; called &#039;&#039;USB-Debugging&#039;&#039;. If the developer options are not displayed, you can unlock them by tapping Build Number seven times in About the Phone.&lt;br /&gt;
&lt;br /&gt;
Also enable the &#039;&#039;Stay awake&#039;&#039; feature to prevent the device from turning off the screen during test creation or execution.&lt;br /&gt;
&lt;br /&gt;
For security reasons, USB debugging must be allowed for each computer individually. When connecting the device to the PC via USB, you must agree to the connection on the device. If you haven&#039;t done this for your computer yet, but no corresponding dialog appears on the device, it may help to unplug and reconnect the device. This can happen especially if you have installed the ADB driver while the device was already connected via USB. If this doesn&#039;t help either, open the notifications by dragging them from the top of the screen. There you will find the USB connection and you can open the options. Select another type of connection; usually MTP or PTP should work.&lt;br /&gt;
&lt;br /&gt;
You can also test on an emulator. It does not need to be prepared separately, as it is already designed for USB debugging. It is even possible to start an emulator at the beginning of the test.&lt;br /&gt;
&lt;br /&gt;
To check if a device you have connected to your computer can be used, open the [[#Connection_Editor|connection editor]]. The device should be displayed there.&lt;br /&gt;
&lt;br /&gt;
=== Connection via WLAN ===&lt;br /&gt;
It is possible to connect to Android devices via Wireless LAN. For devices using Android 11 or newer, this can be done wirelessly, else you have to connect initially via USB. Since expecco 22.1, WiFi connections can be established using the [[Mobile_Testing_Plugin/en#Connection_Editor|Connection Editor]]. It is also possible to do this using a command window.&lt;br /&gt;
==== Wireless Connect (Android 11) ====&lt;br /&gt;
In the developer options of your device, enable wireless debugging and open its options. You initially have to pair your machine with the device. To do this, choose &amp;quot;&#039;&#039;Pair device with pairing code&#039;&#039;&amp;quot; to get a pairing code and an IP address with port. Then open a command window (terminal window) on your machine and enter:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb pair &amp;lt;Device IP Address&amp;gt;:&amp;lt;Pairing Port&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
where &amp;lt;tt&amp;gt;&amp;lt;Device IP Address&amp;gt;:&amp;lt;Pairing Port&amp;gt;&amp;lt;/tt&amp;gt; is the IP address and port as shown on the device. After that, you will be asked for the pairing code. If everything went right, the popup on the device should have closed and your machine is added to the list of paired devices. Then enter at the command window:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;Device IP Address&amp;gt;:&amp;lt;Debugging Port&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The IP address is the same as for pairing, but the port is different. Both are shown as IP address &amp;amp; Port on the device. The device should now be connected via WLAN and can be used in the same way as with a USB connection. You can check this by entering &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; or open the connection dialog in expecco. In the list, the device appears with its IP address and port. Remember that the WLAN connection no longer exists when the ADB server or the device is restarted. Restarting the device often disables wireless debugging and the used port is changed. The pairing, however, is permanent and has not to be done again the next time you connect.&lt;br /&gt;
==== Start via USB ====&lt;br /&gt;
First, connect your device via USB. Then open a command window (terminal window) and enter:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The device listens for a TCP/IP connection on port 5555. If you have several devices connected or emulators running, you have to specify which device you mean. Enter in this case:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb devices -l&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
to get a list of all devices, where the first column gives the device&#039;s ID.&lt;br /&gt;
Then, enter:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb -s &amp;lt;deviceID&amp;gt; tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
with the device identification of the desired device. You can now disconnect the USB connection.&amp;lt;br&amp;gt;Now you have to find out the IP address of your device. You can usually find it somewhere in the device&#039;s settings, for example in the Status or WLAN settings of the phone. Then type in:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP address of device&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The device should now be connected via WLAN and can be used in the same way as with a USB connection. You can check this by entering &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; again or open the connection dialog in expecco. In the list, the device appears with its IP address and port. Remember that the WLAN connection no longer exists when the ADB server or the device is restarted.&lt;br /&gt;
&lt;br /&gt;
== Preparing an iOS-Device and App ==&lt;br /&gt;
Control of iOS devices is only possible via a Mac. Please also read the section [[#Mac_OS|Installation under Mac OS]].&lt;br /&gt;
&lt;br /&gt;
Before you can control a mobile device with the Mobile Testing Plugin, you must allow debugging for iOS devices with iOS 8 or higher. Activate the option &amp;quot;&#039;&#039;Enable UI Automation&#039;&#039;&amp;quot; under the &amp;quot;&#039;&#039;Developer&#039;&#039;&amp;quot; menu in the device settings.&amp;lt;br&amp;gt;If you cannot find the &amp;quot;&#039;&#039;Developer&#039;&#039;&amp;quot; entry in the settings, proceed as follows: Connect the device to the Mac via USB. If necessary, you must still agree to the connection on the device. Start Xcode and then select &amp;quot;&#039;&#039;Devices&#039;&#039;&amp;quot; from the menu bar at the top of the screen in the &amp;quot;&#039;&#039;Window&#039;&#039;&amp;quot; menu. A window opens in which a list of the connected devices is displayed. Select your device there. Then the entry &amp;quot;&#039;&#039;Developer&#039;&#039;&amp;quot; should appear in the settings on the device. You may have to exit the settings and restart.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Alert.png | thumb | 270px | Alert unter iOS]]&lt;br /&gt;
It is not possible to establish a connection to the device as long as it shows certain alerts. Such an alert may appear if FaceTime is activated (by displaying a message about SMS charges as shown in the screenshot). Be sure to configure the device so that it does not show such alerts when idle.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.11 and later ===&lt;br /&gt;
You can test any app which is executable or already installed on the device used. If the app is available as a development build, the UDID of the device must be stored in the app. In any case, the WebDriverAgent must be signed for the device. Please read the section about [[#Signing|signing]] under Mac OS.&lt;br /&gt;
&lt;br /&gt;
If you want to use the Home button in a test, you must activate &amp;quot;AssistiveTouch&amp;quot; on the device. You will find this option in the settings under &amp;quot;&#039;&#039;General&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;Operating Help&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;AssistiveTouch&#039;&#039;&amp;quot;. Then place the menu in the middle of the upper edge of the screen. You can then record pressing the Home button with the corresponding menu entry in the recorder or use the &amp;quot;&#039;&#039;Press Home Button&#039;&#039;&amp;quot; block directly.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.10 ===&lt;br /&gt;
The app you want to use must be available as a development build. The UDID of the device must also be stored in the app.&lt;br /&gt;
&lt;br /&gt;
=== Sign the development build ===&lt;br /&gt;
A development build of an app is only allowed for a limited number of devices and cannot be started on other devices. However, it is possible to exchange the certificate and the usable devices in a development build.&lt;br /&gt;
&lt;br /&gt;
* Evaluation with demo app of eXept:&lt;br /&gt;
:We will be happy to provide you with a demo app which is available as a development build and which we can sign for your device. Please send the UDID of your device to your eXept contact person. How to determine the UDID of your device is described in the following section.&lt;br /&gt;
&lt;br /&gt;
* Using your own app for your test device:&lt;br /&gt;
:If you receive a development build (IPA file) from the app developers that is approved for your test device, you can use it directly. To do this, you must tell the developers the UDID of your device so they can enter it. &#039;&#039;&#039;You can use Xcode to read the UDID of a device&#039;&#039;&#039;. Start Xcode and select &#039;&#039;Devices&#039;&#039; from the menu bar at the top of the screen in the &#039;&#039;Window&#039;&#039; menu. A window opens in which a list of the connected devices is displayed. Select your device and search for the &#039;&#039;Identifier&#039;&#039; entry in Properties. The UDID is a 40-digit hexadecimal number.&lt;br /&gt;
&lt;br /&gt;
* Externally developed app for your test device:&lt;br /&gt;
:You can also re-sign apps to make them run on other devices. However, this process is complicated and requires access to an Apple Developer account. A documentation on the procedure is currently in preparation.&lt;br /&gt;
&lt;br /&gt;
:For the evaluation we will gladly support you with the re-signing of your app..&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Log in to the [https://developer.apple.com/ Apple-Webinterface]. Navigate to &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039;. If necessary, create a Developer Certificate and a Provisioning Profile for your device here and download both. If you don&#039;t have a Developer Account yet, create one here: https://developer.apple.com/enroll/. For this you have to register with an Apple-ID.&lt;br /&gt;
&lt;br /&gt;
# Find out Team ID (&#039;&#039;Membership&#039;&#039; -&amp;gt; &#039;&#039;Team ID&#039;&#039;)&lt;br /&gt;
# Under &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039; select development certificate (under &#039;&#039;+&#039;&#039; create, if not available) and download&lt;br /&gt;
# Under &#039;&#039;App ID&#039;&#039; create Wildcard App ID, if not present. Note App ID (AppID = Prefix.ID)&lt;br /&gt;
# Add device, find out UDID (or &#039;&#039;Identifier&#039;&#039;) of the device (&#039;&#039;Xcode&#039;&#039; -&amp;gt; &#039;&#039;Window&#039;&#039; (above in menu bar) -&amp;gt; &#039;&#039;Devices&#039;&#039;)&lt;br /&gt;
# Create commission profiles: &#039;&#039;iOS App Development&#039;&#039; -&amp;gt; Select &#039;&#039;AppID&#039;&#039; -&amp;gt; Select certificate -&amp;gt; Select device -&amp;gt; Create profile name -&amp;gt; Download provisioning profiles.&lt;br /&gt;
# Import the downloaded certificate (&#039;&#039;Downloads&#039;&#039; -&amp;gt; Certificate (.cer)&lt;br /&gt;
# Copy SHA1 fingerprint. Right click on Certificate -&amp;gt; &#039;&#039;Information&#039;&#039;, then scroll to the bottom of the page).&lt;br /&gt;
# Create Entitlements.plist (&#039;&#039;Open Terminal&#039; -&amp;gt; Downloads/Mobile_Testing_Supplement/bin/gen-entitlements_plist &#039;Team-ID&#039; &#039;App ID&#039; Downloads/Mobile_Testing_Supplement/bin/re-sign-ipa &amp;lt;path to ipa (z.B. Downloads/expeccoMobileDemo.ipa)&amp;gt; \&lt;br /&gt;
&amp;quot;&amp;lt;Zertifikat (SHA1-Fingerabdruck, z.B. 76 E8 4B E8 78 D5 D7 F9 2E 09 8B D7 E8 FB CE 30 0C F5 D0 EF)&amp;gt;&amp;quot; \&lt;br /&gt;
&amp;lt;Path to Commission Profile (e.g. /Users/exept_test/Downloads/dut.mobileprovision)&amp;gt; \&lt;br /&gt;
&amp;lt;Path for the result ipa (z.B. Downloads/expeccoMobileDemo_re-signed.ipa)&amp;gt; \&lt;br /&gt;
[Pfad zur entitlements.plist] (z.B. /Users/exept_test/entitlements.plist)&lt;br /&gt;
&lt;br /&gt;
To re-sign, you can use the corresponding script from the Mobile Testing Supplement for Mac OS or any other tool (e.g. isign).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more information about using iOS devices, see also the &lt;br /&gt;
[http://appium.io/slate/en/master/?java#appium-on-real-ios-devices Appium documentation].&lt;br /&gt;
&lt;br /&gt;
=== Native iOS-Apps ===&lt;br /&gt;
You can also use apps that are already natively present on the device. To do this, you must know their bundle ID and then enter it in the connection settings. Here is a small selection of common apps:&lt;br /&gt;
{| style=&amp;quot;text-align:left&amp;quot;&lt;br /&gt;
! App&lt;br /&gt;
!&lt;br /&gt;
! Bundle-ID&lt;br /&gt;
|-&lt;br /&gt;
| App Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.AppStore&lt;br /&gt;
|-&lt;br /&gt;
| Calculator&lt;br /&gt;
| &lt;br /&gt;
| com.apple.calculator&lt;br /&gt;
|-&lt;br /&gt;
| Calendar&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilecal&lt;br /&gt;
|-&lt;br /&gt;
| Camera&lt;br /&gt;
| &lt;br /&gt;
| com.apple.camera&lt;br /&gt;
|-&lt;br /&gt;
| Contacts&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileAddressBook&lt;br /&gt;
|-&lt;br /&gt;
| iTunes Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileStore&lt;br /&gt;
|-&lt;br /&gt;
| Mail&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilemail&lt;br /&gt;
|-&lt;br /&gt;
| Maps&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Maps&lt;br /&gt;
|-&lt;br /&gt;
| Messages&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileSMS&lt;br /&gt;
|-&lt;br /&gt;
| Phone&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilephone&lt;br /&gt;
|-&lt;br /&gt;
| Photos&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobileslideshow&lt;br /&gt;
|-&lt;br /&gt;
| Settings&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Preferences&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
You can find further Bundle-IDs [https://github.com/joeblau/apple-bundle-identifiers here].&lt;br /&gt;
&lt;br /&gt;
= Examples =&lt;br /&gt;
In the demo test suites for expecco you will also find examples for tests with the Mobile Testing Plugin. To do this, select the option &amp;quot;&#039;&#039;Example from File&#039;&#039;&amp;quot; on the start screen and open the folder named &amp;quot;&#039;&#039;mobile&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;TestsuiteMobileTestingDemo&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m01_MobileTestingDemo.ets --&amp;gt;&amp;lt;/span&amp;gt; &#039;&#039;m01_MobileTestingDemo.ets&#039;&#039; ==&lt;br /&gt;
The test suite contains two simple test plans: &amp;quot;&#039;&#039;Simple CalculatorTest&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Complex Calculator and Messaging Test&#039;&#039;&amp;quot;. Both tests use an Android emulator, which you must start before starting. The apps used in the test are part of the basic equipment of the emulator and therefore no longer need to be installed. Since the apps may differ under every Android version, it is important that your emulator runs under Android 6.0. In addition, the language must be set to English.&lt;br /&gt;
&lt;br /&gt;
; Simple CalculatorTest&lt;br /&gt;
: This test connects to the calculator and enters the formula &#039;&#039;2+3&#039;&#039;. The result of the calculator is compared with the expected value &#039;&#039;5&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; Complex Calculator and Messaging Test&lt;br /&gt;
: This test connects to the calculator and then opens the message service. There it waits for an incoming message from the number &#039;&#039;15555215556&#039;&#039;, in which a formula to be calculated is sent. The message is generated before via a socket at the emulator. When the message arrives, it is opened by the test and its contents are read. Then the calculator is opened again, the received formula is entered and the result is read. The test then switches back to the message service and sends the result as an answer.&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;m02_expeccoMobileDemo.ets&#039;&#039; und &#039;&#039;m03_expeccoMobileDemoIOS.ets&#039;&#039; ==&lt;br /&gt;
These are part of the tutorial for the Mobile Testing Plugin. The included test case is incomplete and will be added during the tutorial. Please read the section [[#Tutorial|Tutorial]].&lt;br /&gt;
&lt;br /&gt;
= Tutorial =&lt;br /&gt;
There is a tutorial describing the basic procedure for creating tests with the Mobile Testing Plugin. It is based on a supplied example consisting of a simple app and an expecco test suite.&lt;br /&gt;
&lt;br /&gt;
You find it on the page [[Mobile_Testing_Tutorial/en|Mobile Testing Tutorial]] in two versions for Android and iOS devices.&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsAndroid&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m02_expeccoMobileDemo.ets --&amp;gt;&amp;lt;/span&amp;gt; [[Mobile_Testing_Tutorial/en#First_steps_with_Android|First steps with Android]]&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsIOS&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m03_expeccoMobileDemoIOS.ets --&amp;gt;&amp;lt;/span&amp;gt; [[Mobile_Testing_Tutorial/en#First_steps_with_iOS|First steps with iOS]]&lt;br /&gt;
&lt;br /&gt;
= Dialogs of the Mobile Testing Plugin =&lt;br /&gt;
== Connection Editor ==&lt;br /&gt;
You can use the Connection Editor to quickly define, change, or establish connections. Depending on the task, the dialog has small differences and is opened differently:&lt;br /&gt;
*If you want to establish a connection, access the dialog in the GUI browser by clicking on &#039;&#039;Connect&#039;&#039; and then selecting &#039;&#039;Mobile Testing&#039;&#039;.&lt;br /&gt;
*To change or copy an existing connection in the GUI browser, select it, right-click and select &#039;&#039;Edit Connection&#039;&#039; or &#039;&#039;Copy Connection&#039;&#039; from the context menu.&lt;br /&gt;
*If you do not want to create connection settings for the GUI browser but for use in a test, choose &#039;&#039;Create Connection Settings&#039;&#039; from the Mobile Testing Plugin menu.... This only allows you to create the settings for a connection without creating a connection in the GUI browser.&lt;br /&gt;
&lt;br /&gt;
The Connection Editor menu has several buttons, some of which are only visible when creating connection settings:&lt;br /&gt;
[[Datei:MobileTestingVerbindungseditorMenu.png]]&lt;br /&gt;
#&#039;&#039;Delete Settings&#039;&#039;: Resets all entries. (Only visible when creating settings.)&lt;br /&gt;
#&#039;&#039;Load settings from file&#039;&#039;: Allows to open a saved settings file (*.csf). Its settings are transferred to the dialog. Entries already made without conflict are retained.&lt;br /&gt;
#&#039;&#039;Load settings from attachment&#039;&#039;: Allows you to open an attachment with connection settings from an open project. These settings are applied to the dialog. Entries already made without conflict are retained.&lt;br /&gt;
#&#039;&#039;Save settings to file&#039;&#039; and&lt;br /&gt;
#&#039;&#039;Save settings to attachment&#039;&#039;: Here you can save the entered settings to a file (*.csf) or create them as an attachment in an open project. Both options have a delayed menu in which you can choose to save only a certain part of the settings. (Only visible when creating settings.)&lt;br /&gt;
#&#039;&#039;Advanced View&#039;&#039;: Allows you to switch to the advanced view to make additional settings. Read more about this at the end of this chapter. (Only visible when creating settings.)&lt;br /&gt;
#&#039;&#039;Help&#039;&#039;: A help text for the respective step is shown or hidden on the right side.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The dialog is divided into three steps. In the first step you select the device you want to use, in the second step you select which App should be used and in the last step the settings for the Appium server are made.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep1&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Step 1: Select Device ===&lt;br /&gt;
In the upper part you will see a list of all connected Appium devices that are detected. With the checkbox below you can hide devices that are detected but not ready. If you want to enter a device that is not connected, you can create it with the corresponding button &#039;&#039;Enter Android device&#039;&#039; or &#039;&#039;Enter iOS device&#039;&#039;. However, you need to know the required properties of your device. The device is then created in a second device list and can be selected there. If no list with connected elements can be displayed, various messages are displayed instead:&lt;br /&gt;
*No devices found&lt;br /&gt;
*:expecco could not find any Android devices.&lt;br /&gt;
*:To automatically configure a connection to a device, make sure&lt;br /&gt;
*:*it is connected&lt;br /&gt;
*:*it is turned on&lt;br /&gt;
*:*that it has an appropriate adb driver installed&lt;br /&gt;
*:*it is enabled for debugging (see below).&lt;br /&gt;
*No available devices found&lt;br /&gt;
*:expecco could not find any available Android devices. But not available ones were found, e.g. with the status &amp;quot;unauthorized&amp;quot;.&lt;br /&gt;
*:To configure a connection to a device automatically, make sure that &lt;br /&gt;
*:*it is connected&lt;br /&gt;
*:*it is turned on&lt;br /&gt;
*:*that it has an appropriate adb driver installed&lt;br /&gt;
*:*it is enabled for debugging (see below).&lt;br /&gt;
*:To view unavailable devices, enable this option below.&lt;br /&gt;
*Connection lost&lt;br /&gt;
*:expecco has lost the connection to the adb server. Try to re-establish the connection by clicking on the button.&lt;br /&gt;
*Connection failed&lt;br /&gt;
*:expecco could not connect to the adb server. Possibly it is not running or the specified path is not correct.&lt;br /&gt;
*:Check the adb configuration in the settings and try to start the adb server and establish a connection by clicking on the button.&lt;br /&gt;
*Connect ...&lt;br /&gt;
*:expecco connects to the adb server. This may take a few seconds.&lt;br /&gt;
*Start adb-Server ...&lt;br /&gt;
*:expecco starts the adb-Server. This may take a few seconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--With &#039;&#039;Automation by&#039;&#039; you can specify, which automation engine is to be used. If you leave the setting at &#039;&#039;(Default)&#039;&#039; the corresponding capability is not set at all. Otherwise Appium, Selendroid and from expecco 2.11 XCUITest are available. Selendroid is usually only used for Android devices prior to version 4.1.--&amp;gt;With &#039;&#039;Next&#039;&#039; you get to the next step. If you enter settings for the GUI browser, this is only possible once a device has been selected.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;UnlockingDeveloperOptions&amp;quot;&amp;gt;Note on unlocking&amp;lt;/span&amp;gt;: In newer Android versions the developer options are no longer offered in the settings at first. If your Android device does not show an entry for &amp;quot;&#039;&#039;Developer options&#039;&#039;&amp;quot; in the settings, first select the entry &amp;quot;&#039;&#039;Phone info&#039;&#039;&amp;quot;, then &amp;quot;&#039;&#039;SoftwareVersionsInfo&#039;&#039;&amp;quot; and click on the entry &amp;quot;&#039;&#039;BuildVersion&#039;&#039;&amp;quot; several times.&lt;br /&gt;
&lt;br /&gt;
==== Manage Chromedrivers ====&lt;br /&gt;
If the App you want to automate uses WebViews with Chrome, Appium needs to have access to an appropriate Chromedriver. If you have selected a device in the list, you can use &amp;quot;&#039;&#039;Manage Chromedrivers&#039;&#039;&amp;quot; to see, which Chrome versions are installed on the device and which Chromedriver versions are provided by expecco. With this dialog you can also download required Chromedriver versions. Beware that there may be several Chrome versions on the device. An App doesn&#039;t have to use the version of the installed Chrome browser for its WebViews. The Chromedriver you use should fit your app for everything to work properly. You can also change the path to the Chromedriver in the capabilities generated at the end of the connection editor.&lt;br /&gt;
&lt;br /&gt;
==== Connect WiFi Android Device ====&lt;br /&gt;
&lt;br /&gt;
You can connect to Android devices using WiFi as well. In this case, the device has to be connected to ADB first, see [[Mobile_Testing_Plugin/en#Connection_via_WLAN|Connection via WLAN]]. Since expecco 22.1, the connection editor provides a dialog helping to set this up, which can be used instead of the command window. For devices using Android 11 or newer, you can pair the device with your machine here by specifying the appropriate parameters and then establish the connection by specifying the IP address and port. You can also use this to establish a wireless connection for devices that are connected via USB. When you select the corresponding device in the list, the required information is read out automatically.&lt;br /&gt;
&lt;br /&gt;
Note that establishing a wireless connection is not part of the connection settings. If you want to establish a new connection with the generated settings, you must make sure that the device is connected to ADB with the specified IP address and port so that it can be found. The ADB connection will be lost if the ADB server or the device are restarted. The permission for wireless debugging is also often reset when the device is restarted and the debug port can then change. Therefore, a wireless connection must always be established manually.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep2&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Step 2: Select App===&lt;br /&gt;
Here you can enter information about the app to be tested. You can decide if you want to use an app that is already installed on the device or if you want to install an app for the test. Select the appropriate tab above. Depending on whether you selected an Android or an iOS device in the previous step, the required input will change.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Android&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App on Device&#039;&#039;&lt;br /&gt;
**:If you have selected a connected device in the first step, the packages of all installed apps are automatically retrieved and you can select from the drop-down lists. The installed apps are divided into third-party packages and system packages; select the appropriate package list. This selection does not belong to the settings, but only provides the corresponding package list. You can use the filter to further narrow down the list and then select the desired package. The activities of the selected package are also automatically retrieved and made available as a drop-down list. Select the activity you want to start. As a rule, an activity is automatically entered from the list. If you are not using a connected device, you must enter the package and the activity manually.&lt;br /&gt;
**&#039;&#039;Install App&#039;&#039;&lt;br /&gt;
**:Under &#039;&#039;App&#039;&#039;, enter the path to an app. The path must be valid for the Appium server being used. You can also specify a URL. If you are using a local Appium server, you can use the right button to navigate to the App installation file and enter this path. If possible, the corresponding package and the activity are also entered in the fields below. However, this entry is not necessary.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;iOS&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App on Device&#039;&#039;&lt;br /&gt;
**:Specify the bundle ID of an installed app. You can find out the IDs of the installed apps using Xcode, for example. Start Xcode and select &#039;&#039;Devices&#039;&#039; from the menu bar at the top of the screen in the &#039;&#039;Window&#039;&#039; menu. A window will open displaying a list of connected devices. If you select your device, you will see a list of the apps you have installed in the overview.&lt;br /&gt;
**&#039;&#039;Install App&#039;&#039;&lt;br /&gt;
**:Under &#039;&#039;App&#039;&#039;, enter the path to an app. The path must be valid for the Appium server being used. You can also specify a URL. For the requirements of apps for real devices, please read the section  [[#iOS-Ger.C3.A4t_and_App_Preparing|Preparing an iOS-Device and App]].&lt;br /&gt;
&lt;br /&gt;
In the lower part you can specify whether the app should be reset or uninstalled when the connection is terminated, and whether it should be reset initially. Again, the corresponding capability is not set if you select &#039;&#039;(Default)&#039;&#039;. With &#039;&#039;Next&#039;&#039; you get to the next step.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep3&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Step 3: Server Settings===&lt;br /&gt;
In the last step, a list of all the capabilities that result from your entries in the previous steps is first displayed in the upper part. If you are familiar with Appium and want to set additional capabilities that are not covered by the connection editor, you can click on &#039;&#039;Edit&#039;&#039; to open the extended view. See the section below for more information.&lt;br /&gt;
&lt;br /&gt;
If you enter settings for the GUI browser, you can enter the &#039;&#039;Connection name&#039;&#039; with which the connection is displayed. This is also the name under which devices can use this connection when it is established. If you leave the field blank, a name will be generated. If the box &amp;quot;&#039;&#039;Managed by expecco&#039;&#039;&amp;quot; is checked, expecco will start a local Appium server on a free port, or use a free server that has already been started. To use your own server, turn this feature off and enter the appropriate address. You will get the local default address and already used addresses to choose from.&lt;br /&gt;
&lt;br /&gt;
In older expecco versions the box is labeled &amp;quot;&#039;&#039;Start on demand&#039;&#039;&amp;quot;. In this case, you must also enter an address if you want expecco to start the server. expecco then tries to start an Appium server at the given address when connecting, if none is running there yet. This server will then also be shut down when the connection is terminated. This only works for local addresses. Make sure that you only use port numbers that are free. It is best to only use odd port numbers from the standard port 4723. The following port number is also used when establishing a connection, which could otherwise lead to conflicts.&lt;br /&gt;
&lt;br /&gt;
Depending on how you opened the dialog, there are now different buttons to close it. In any case you have the option to save. This opens a dialog where you can either select an open project to save the settings there as an attachment, or choose to save it to a file that you can then specify. Saving does not close the dialog, allowing you to select another option.&lt;br /&gt;
&lt;br /&gt;
If you have opened the editor for establishing a connection, you can finally click on &#039;&#039;Connect&#039;&#039; or &#039;&#039;Start and connect server&#039;&#039;, depending on whether the check mark for server start is set. For changing or copying a connection in the GUI Browser, this option is called &#039;&#039;Apply&#039;&#039;, since in this case only the connection entry is changed or created, but the connection setup is not started. If necessary, you can do this afterwards via the context menu. If you have changed capabilities of an existing connection, a dialog then prompts you to decide whether these changes should be applied directly by closing the connection and establishing the new connection or not. In this case, the changes only take effect after you reestablish the connection.&lt;br /&gt;
&lt;br /&gt;
To use the connection editor, also read the corresponding section in the respective tutorial in step 1. (Android: [[Mobile_Testing_Tutorial/en#Step_1:_Run_Demo|Run Demo]], iOS: [[Mobile_Testing_Tutorial/en#Step_1:_Run_Demo_2|Run Demo]]).&lt;br /&gt;
&lt;br /&gt;
===Extended View===&lt;br /&gt;
The extended view of the connection editor can be obtained either by clicking on &#039;&#039;Edit&#039;&#039; in the third step or at any time via the corresponding menu item if you have started the editor via the plugin menu. This view displays a list of all configured Appium Capabilities. You can add, change or remove further entries to this list. To add a capability, select it from the drop-down list of the input field. In this list all known capabilities are sorted into the categories &#039;&#039;Common&#039;&#039;, &#039;&#039;Android&#039;&#039; and &#039;&#039;iOS&#039;&#039;. If you have selected a capability, a short information text is displayed. You can also enter a capability manually in the field. Then click on &#039;&#039;Add&#039;&#039; to add the capability to the list. There you can set the value in the right column. To delete an entry, select it and click on &#039;&#039;Remove&#039;&#039;. With &#039;&#039;Back&#039;&#039; you leave the extended view.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingErweiterteAnsicht.png]]&lt;br /&gt;
&lt;br /&gt;
== Running Appium Servers ==&lt;br /&gt;
In the menu of the Mobile Testing Plugin you will find the entry &#039;&#039;Appium-Server...&#039;&#039;. This opens a window with an overview of all Appium servers started by expecco and on which port they are running. By clicking on the icon in the column &#039;&#039;Show Log&#039;&#039; you can view the logfile of the corresponding server. This is deleted when the server is shut down. With the icons in the column &#039;&#039;Exit&#039;&#039; the corresponding server can be terminated. However, this is prevented if expecco still has an open connection via this server. The rightmost column shows for which connection the server is in use. If it reads &#039;&#039;&amp;lt;idle&amp;gt;&#039;&#039;, the server is currently not used by expecco.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAppiumServer.png]]&lt;br /&gt;
&lt;br /&gt;
When opening the editor to start an Appium connection, an Appium server is started immediately to speed up the connection process. For this purpose, expecco always keeps one idle running Appium server. Additional running servers however, which are not in use anymore, will be terminated automatically after a while.&lt;br /&gt;
&lt;br /&gt;
In the menu of the Mobile Testing Plugin you will also find the entry &#039;&#039;Close all Connections and Servers&#039;&#039;. This is intended for cases where connections or servers cannot be terminated in any other way. If possible, always terminate connections in the GUI browser or by executing a corresponding block. Servers that you have started in the server overview should be terminated there; servers that were started with a connection are automatically terminated with this connection.&lt;br /&gt;
&lt;br /&gt;
Note that only servers started and managed by expecco are listed in the overview. Possible other Appium servers that were started in a different way are not recognized.&lt;br /&gt;
&lt;br /&gt;
== Recorder ==&lt;br /&gt;
If the GUI browser is connected to a device, the integrated recorder can be used to record a test section with that device. To start the recorder, select the appropriate connection in the GUI browser and click the Record button. A new window opens for the recorder. The recorded actions are created in the GUI browser work area. It is therefore possible to edit the recorded data in parallel.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingRecorder.png|caption|]]&lt;br /&gt;
&lt;br /&gt;
====Components of the Recorder Window====&lt;br /&gt;
#&#039;&#039;&#039;Continue/Pause Recording&#039;&#039;&#039;: You can pause the recording by clicking the right icon. You will then see a large pause sign in the view. All actions that you perform now in the recorder are executed, but no blocks are recorded. You can switch back to normal recording mode by clicking the left icon.&lt;br /&gt;
#&#039;&#039;&#039;Stop Recording&#039;&#039;&#039;: Stops the recording and closes the recorder window.&lt;br /&gt;
#&#039;&#039;&#039;Update&#039;&#039;&#039;: Gets the current image and element tree from the device. This is necessary if the device takes longer to execute an action or if something changes without being triggered by the recorder. Since expecco 21.2, there is an additional submenu here that can be used to enable automatic update by checking for changes in the background (see also &#039;&#039;Automatic Update&#039;&#039; further below).&lt;br /&gt;
#&#039;&#039;&#039;Follow Mouse&#039;&#039;&#039;: Select the element under the mouse pointer in the GUI browser.&lt;br /&gt;
#&#039;&#039;&#039;Element Highlighting&#039;&#039;&#039;: The element under the mouse is outlined in red.&lt;br /&gt;
#&#039;&#039;&#039;Show Elements&#039;&#039;&#039;: Show the borders of all elements in the view.&lt;br /&gt;
#&#039;&#039;&#039;Tools&#039;&#039;&#039;: Selection, which  tool is used for recording. The selected action is triggered with each click on the view. The following actions are available:&lt;br /&gt;
#*Element Actions:&lt;br /&gt;
#**Click: Short click on the element under cursor. To determine more precisely which element is used, use the Follow Mouse or Element Highlighting function.&lt;br /&gt;
#**Tap with Duration (Element): Similar to click, except that the duration of the click will be recorded as well. This allows the recording of long clicks.&lt;br /&gt;
#**Tap with Position (Element): Similar to click, but additionally records the position inside the element. The position can be recorded relative to the element size or, when pressing Ctrl while clicking, as absolute position from the upper left corner of the element.&lt;br /&gt;
#**Set Text: Allows to set the text of an input field.&lt;br /&gt;
#**Clear Text: Clears the text of an input field.&lt;br /&gt;
#*Device Actions:&lt;br /&gt;
#**Tap (Screen): Triggers a click at the screen position.&lt;br /&gt;
#**Tap with Duration (Screen): Triggers a click at the screen position, which also considers the duration.&lt;br /&gt;
#**Swipe: Swipe in a straight line from the point where you press the mouse button until you release it. The duration is also recorded.&lt;br /&gt;
#:Please note for this actions that the result may differ on different devices, e.g. with different screen resolutions.&lt;br /&gt;
#*Test Flow Blocks&lt;br /&gt;
#**Check Attribute: Compares the value of a specified attribute of the element with a predefined value. The result triggers the corresponding output.&lt;br /&gt;
#**Assert Attribut: Compares the value of a specified attribute of the element with a predefined value. If the values are not equal, the test fails.&lt;br /&gt;
#**Get Attribute: Gets the current value of a specified attribute of the element.&lt;br /&gt;
#*Auto&lt;br /&gt;
#:If the Auto tool is selected, you can use all actions by specific input methods: &#039;&#039;Click&#039;&#039;, &#039;&#039;Tap Element&#039;&#039; and &#039;&#039;Swipe&#039;&#039; still work by clicking, but are distinguished by the duration and movement of the cursor. To trigger a &#039;&#039;Tap&#039;&#039;, hold down Ctrl while clicking. The remaining actions are available in a context menu by right-clicking on the element.&lt;br /&gt;
#&#039;&#039;&#039;Context Actions&#039;&#039;&#039;: Here you can record actions concerning contexts:&lt;br /&gt;
#*Switch to Context: Shows a list of all currently available contexts and you can select to which one you want to switch.&lt;br /&gt;
#*Get Current Context: Gets the handle of the current context.&lt;br /&gt;
#*Get Context Handles: Gets a list of all currently available contexts.&lt;br /&gt;
#&#039;&#039;&#039;Softkeys&#039;&#039;&#039;: Only for Android. Simulates pressing the buttons Back, Home, Menu and Power.&lt;br /&gt;
#&#039;&#039;&#039;Home Button&#039;&#039;&#039;: Only for iOS since expecco 2.11. Allows pressing the Home button.Prior to expecco 19.2, it only works if AssistiveTouch is activated and the menu is located in the middle of the upper screen border. From expecco 19.2 on, the function no longer uses AssistiveTouch.&lt;br /&gt;
#&#039;&#039;&#039;Help&#039;&#039;&#039;: Opens this online documentation on the general page about [[GuiBrowser_Recorder/en|GUI Browser recorders]].&lt;br /&gt;
#&#039;&#039;&#039;View&#039;&#039;&#039;: Shows a screenshot of the device. Actions are triggerd by mouse depending on the selected tool. If a new action can be recorded, the window has a green frame, else it is red.&lt;br /&gt;
#&#039;&#039;&#039;Resize Window to Image&#039;&#039;&#039;: Resizes the recorder window so that the screenshot can be displayed completely.&lt;br /&gt;
#&#039;&#039;&#039;Resize Image to Window&#039;&#039;&#039;: Scales the screenshot to a size that makes use of the full size of the window.&lt;br /&gt;
#&#039;&#039;&#039;Adjust Display&#039;&#039;&#039;: Opens a dialog to adjust the displayed image, if expecco does not show it right. You can correct the scaling or rotate the image by 90°.&lt;br /&gt;
#&#039;&#039;&#039;Correct Orientation&#039;&#039;&#039;: Corrects the image if it is upside down. Using the arrow to the right, the image can also be rotated by 90°, if this should ever be necessary. Since expecco 19.1 you find this functionality under &#039;&#039;Adjust Display&#039;&#039;. The orientation of the image is irrelevant for the functionality of the recorder, it only works on the elements it receives.&lt;br /&gt;
#&#039;&#039;&#039;Scaling&#039;&#039;&#039;: Changes the scaling of the screenshots.&lt;br /&gt;
#&#039;&#039;&#039;Messages&#039;&#039;&#039;: Shows the path of the current selected element or other messages. It has a context menu to show a list of previous messages.&lt;br /&gt;
&lt;br /&gt;
====Usage====&lt;br /&gt;
Each click in the window triggers an action and is recorded in the workspace of the GUI browser. There you can run, edit, or create a new block from what you have recorded. You find the actions to trigger softkeys directly in the menu bar (see above). To record actions on elements, either change the selection of the tool in the menu bar (see above) and then click on the element or select the corresponding action from the context menu by right-clicking on the corresponding element. For text input it is also possible to place the cursor over the element and enter the text. This opens the input dialog for this action. On how to use the recorder, see also step 2 in the tutorial ([[Mobile_Testing_Tutorial/en#Step_2:_Creating_a_Block_with_the_Recorder|Android]] resp. [[Mobile_Testing_Tutorial/en#Step_2:_Creating_a_block_with_the_Recorder_2|iOS]]).&lt;br /&gt;
&lt;br /&gt;
====Hide elements====&lt;br /&gt;
Since expecco 21.2 it is also possible to hide the selected element in the recorder from the context menu. This means that this element cannot be selected from now on. This function is useful for ignoring elements that are in the foreground to be able to access elements below them. To undo this state, you have to find the corresponding element in the tree of the GUI browser, which also has such an entry in the context menu.&lt;br /&gt;
&lt;br /&gt;
====Automatic Update====&lt;br /&gt;
The recorder doesn&#039;t show a live image of the device, but only a snapshot. Therefore an update is needed after changes to match what is displayed on the device. The recorder updates automatically after executing an action. Since expecco 20.2 there are further automatic updates possible. You can enable the, in the menu &amp;quot;View&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
One option is, to check after an action has been executed, if there are further changes after the first update. If so, a second update is triggered. This shall fix the problem, that the recorder is not up to date after an action, because the update has been done too early.&lt;br /&gt;
&lt;br /&gt;
The second option is to enable a periodical update. After a set interval the recorder is automatically updated if there are changes. Thereby the recorder view is mostly up to date, but this causes an overhead regarding the communication to the device.&lt;br /&gt;
&lt;br /&gt;
== AVD Manager und SDK Manager ==&lt;br /&gt;
AVD Manager und SDK Manager sind beides Anwendungen von Android. Im Menü des Mobile Testing Plugins bietet expecco die Möglichkeit, diese zu starten. Ansonsten finden Sie diese Programme bei Ihrer Android-Installation. Mit dem AVD Manager können Sie AVDs, also Konfigurationen für Emulatoren, erstellen, bearbeiten und starten. Mit dem SDK Manager erhalten Sie einen Überblick über Ihre Android-Installation und können diese bei Bedarf erweitern.&lt;br /&gt;
&lt;br /&gt;
= Hybrid Apps and WebViews =&lt;br /&gt;
&#039;&#039;&#039;!!! IMPORTANT NOTICE - If you have problems switching to the webview, please set the &amp;quot;Default Application - Browser App&amp;quot; in Android Settings to &amp;quot;Chrome&amp;quot; !!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hybrid apps contain platform native elements as well as other elements that are integrated in a WebView. These elements can also be used, but you first have to switch to the corresponding context. With the block &#039;&#039;Get Current Context&#039;&#039; you get the current context. Initially this is &#039;&#039;NATIVE_APP&#039;&#039;, i.e. the context of the native elements. With the block &#039;&#039;Get Context Handles&#039;&#039; you get a collection of all existing contexts. If there is a WebView context, it is called &#039;&#039;WEBVIEW_1&#039;&#039; or &#039;&#039;WEBVIEW_&amp;lt;package&amp;gt;&#039;&#039; with the package of the WebView. Several WebView contexts are also possible. For each WebView context, there is a corresponding WebView element in the native context. You can use the &#039;&#039;Switch to Context&#039;&#039; block to switch to such a context and from now on only have access to the elements in this context.&lt;br /&gt;
&lt;br /&gt;
In the GUI browser, the existing contexts are displayed at the top of the tree as well as the tree of a context is inserted below the corresponding WebView element.&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span id=&amp;quot;Customizing XPath using the GUI Browsers&amp;quot;&amp;gt;&amp;lt;!-- name before 01.10.2020--&amp;gt;&amp;lt;/span&amp;gt;Customizing XPath using the GUI Browser=&lt;br /&gt;
Bausteine, die auf einem Gerät fehlerfrei funktionieren, tun dies auf anderen Geräten möglicherweise nicht. Auch können kleine Änderungen der App dazu führen, dass ein Baustein nicht mehr den gewünschten Effekt hat. Man sollte einen Baustein daher so robust formulieren, dass er für eine Vielzahl von Geräten verwendet werden kann und kleine Anpassungen an der App verkraftet. Dazu muss man das grundlegende Funktionsprinzip der Adressierung verstehen. Dies wird im Folgenden am Beispiel der App aus dem Tutorial erläutert.&lt;br /&gt;
&lt;br /&gt;
Die Ansicht der App setzt sich aus einzelnen Elementen zusammen. Dazu gehören die Schaltflächen &#039;&#039;GTIN-13 (EAN-13)&#039;&#039; und &#039;&#039;Verify&#039;&#039;, das Eingabefeld der Zahl &#039;&#039;4006381333986&#039;&#039; und das Ergebnisfeld, in dem OK erscheint, wie auch alle anderen auf der Anzeige sichtbaren Dinge. Diese sichtbaren Elemente sind in unsichtbare Strukturelemente eingebettet. Alle Elemente zusammen sind in einer zusammenhängenden Hierarchie, dem Elementbaum, organisiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingGUIBrowser.png | frame | left | Abb. 1: Funktionen des GUI-Browsers]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
Sie können sich diesen Baum im GUI-Browser ansehen. Wechseln Sie dazu in den GUI-Browser (Abb. 1) und starten Sie eine beliebige Verbindung. Sobald die Verbindung aufgebaut ist, können Sie den gesamten Baum aufklappen (1) (Klick bei gedrückter Strg-Taste). Er enthält alle Elemente der aktuellen Seite der App.&lt;br /&gt;
&lt;br /&gt;
Ein Baustein, der nun ein bestimmtes Element verwendet, muss dieses eindeutig angeben, indem er dessen Position im Elementbaum mit einem Pfad im XPath-Format beschreibt. Dieses Format ist ein verbreiteter Web-Standard für XML-Dokumente und -Datenbanken, eignet sich aber genauso für Pfade im Elementbaum.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie ein Element im Baum auswählen, wird unten der von expecco automatisch generierte XPath (2) für das Element angezeigt, der auch beim Aufzeichnen verwendet wird. Oberhalb davon in der Mitte des Fensters befindet sich eine Liste der Eigenschaften (3) des ausgewählten Elements. Man nennt diese Eigenschaften auch Attribute. Sie beschreiben das Element näher wie beispielsweise seinen Typ, seinen Text oder andere Informationen zu seinem Zustand. Links unten können Sie zur besseren Orientierung im Baum die &#039;&#039;Vorschau&#039;&#039; (4) aktivieren, um sich den Bildausschnitt des Elements anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Der Elementbaum für gleiche Ansicht einer App kann sich je nach Gerät unterscheiden. Es sind diese Unterschiede, die verhindern, eine Aufnahme von einem Gerät unverändert auch auf allen anderen Geräten abzuspielen: Ein XPath, der im einen Elementbaum ein bestimmtes Element identifiziert, beschreibt nicht unbedingt das gleiche Element im Elementbaum auf einem anderen Gerät. Es kann stattdessen passieren, dass der XPath auf kein Element, auf ein falsches Element oder auf mehrere Elemente passt. Dann schlägt der Test fehl oder er verhält sich unerwartet.&lt;br /&gt;
&lt;br /&gt;
Man könnte natürlich für jedes Gerät einen eigenen Testfall schreiben. Das brächte aber unverhältnismäßigen Aufwand bei Testerstellung und -wartung mit sich. Das Problem lässt sich auch anders lösen, da ein jeweiliges Element nicht nur durch genau einen XPath beschrieben wird. Vielmehr erlaubt der Standard mithilfe verschiedener Merkmale unterschiedliche Beschreibungen für ein und dasselbe Element zu formulieren. Das Ziel ist daher, einen Pfad zu finden, der auf allen für den Test verwendeten Geräten funktioniert und überall eindeutig zum richtigen Element führt.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel besteht die Verbindung zur Android-App aus dem Tutorial und der Eintrag des GTIN-13-Buttons ist ausgewählt (5). Dessen automatisch generierter XPath (2) kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[@resource id=&#039;android:id/content&#039;]/android.widget.RelativeLayout/android.widget.Button[@resource-id=&#039;de.exept.expeccomobiledemo:id/gtin_13&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Er ist offensichtlich lang und unübersichtlich. Der sehr viel kürzere Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@text=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
führt zum selben Element.&lt;br /&gt;
&lt;br /&gt;
Für die iOS-App lautet der automatisch generierte XPath für diesen Button beispielsweise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/XCUIElementTypeApplication/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/UIAApplication/UIAWindow[1]/UIAButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und kann kürzer als&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@name=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Sie können den Pfad entsprechend im GUI-Browser ändern und durch &#039;&#039;Pfad überprüfen&#039;&#039; (6) feststellen, ob er weiterhin auf das ausgewählte Element zeigt, was expecco mit &#039;&#039;Verify Path: OK&#039;&#039; (7) bestätigen sollte. Der erste, sehr viel längere Pfad, beschreibt den gesamten Weg vom obersten Element des Baumes bis hin zum gesuchten Button. Der zweite Pfad hingegen wählt mit * zunächst sämtliche Elemente des Baumes und schränkt die Auswahl dann auf genau die Elemente ein, die ein &#039;&#039;text&#039;&#039;- bzw. &#039;&#039;name&#039;&#039;-Attribut mit dem Wert &#039;&#039;GTIN-13 (EAN-13)&#039;&#039; besitzen, in unserem Fall also genau der eine Button, den wir suchen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden Android-ähnliche Pfade zur Veranschaulichung verwendet. Die Elemente in iOS-Apps heißen zwar anders, wodurch andere Pfade entstehen; das Prinzip ist jedoch das gleiche.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum1.png | frame | Abb. 2: Elementbaum einer fiktiven App]]&lt;br /&gt;
&lt;br /&gt;
Sie können solche Pfade mit Hilfe weniger Regeln selbst formulieren. Sehen Sie sich den einfachen Baum einer fiktiven Android-App in Abb. 2 an: Die Einrückungen innerhalb des Baumes geben die Hierarchie der Elemente wieder. Ein Element ist ein &#039;&#039;Kind&#039;&#039; eines anderen Elementes, wenn jenes andere Element das nächsthöhere Element mit einem um eins geringeren Einzug ist. Jenes Element ist das &#039;&#039;Elternelement&#039;&#039; des Kindes. Sind mehrere untereinander stehende Elemente gleich eingerückt, so sind sie also alle Kinder desselben Elternelements.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad durch alle Ebenen der Hierarchie zum TextView-Element ist nun:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Elemente sind mit Schrägstrichen voneinander getrennt. Es fällt auf, dass der Name des ersten Elements nicht mit dem im Baum übereinstimmt. Das oberste Element in der Hierarchie heißt immer &#039;&#039;hierarchy&#039;&#039; (für iOS wäre es &#039;&#039;AppiumAUT&#039;&#039;), expecco zeigt im Baum stattdessen den Namen der Verbindung an, damit man mehrere Verbindungen voneinander unterscheiden kann. Die weiteren Elemente tragen jeweils das Präfix &#039;&#039;android.widget.&#039;&#039;, das im Baum zur besseren Übersicht nicht angezeigt wird. Bei IOS gibt es kein Präfix, das durch einen Punkt abgetrennt wäre, expecco 2.11 blendet aber entsprechend &#039;&#039;XCUIElementType&#039;&#039; am Anfang aus. Mit jedem Schrägstrich führt der Pfad über eine Eltern-Kind-Beziehung in eine tiefere Hierarchie-Ebene, d. h. &#039;&#039;FrameLayout&#039;&#039; ist ein Kindelement von &#039;&#039;hierarchy&#039;&#039;, &#039;&#039;LinearLayout&#039;&#039; ist ein Kind von &#039;&#039;FrameLayout&#039;&#039; usw. Die in eckigen Klammern geschriebenen Wörter dienen nur als Orientierungshilfe im Baum. Sie gehören nicht zum Typ.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad muss nicht beim Element &#039;&#039;hierarchy&#039;&#039; beginnen. Man kann den Pfad beginnend mit einem beliebigen Element des Baumes bilden. Man kann also verkürzt auch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
schreiben. Der Pfad führt zum selben &#039;&#039;TextView&#039;&#039;-Element, da es nur ein Element dieses Typs gibt. Anders verhält es sich bei dem Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da es zwei Elemente vom Typ &#039;&#039;Button&#039;&#039; gibt, passt dieser Pfad auf zwei Elemente, nämlich den Button, der mit &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; markiert ist, und den &#039;&#039;Button&#039;&#039;, der mit &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; markiert ist. Es würde an dieser Stelle aber auch nicht helfen den langen Pfad von &#039;&#039;hierarchy&#039;&#039; aus beginnend anzugeben. Um einen mehrdeutigen Pfad weiter zu differenzieren, kann man explizit ein Element aus einer Menge wählen, indem man den numerischen Index in eckigen Klammern dahinter schreibt. Der Pfad aus dem obigen Beispiel lässt sich damit so anpassen, dass er eindeutig auf den &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; weist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[1].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ihnen fällt sicher auf, dass der Index eine 1 ist obwohl das zweite Element gemeint ist. Das kommt daher, dass die Zählung bei 0 beginnt. Der Button mit der Markierung &amp;quot;An&amp;quot; hat also die Nummer 0 und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Nummer 1.&lt;br /&gt;
&lt;br /&gt;
Dieser Ansatz, einen expliziten Index zu verwenden, hat zwei Nachteile: Zum einen lässt sich an dem Pfad nur schwer ablesen welches Element gemeint ist, zum andern ist der Pfad sehr empfindlich schon gegenüber kleinsten Änderungen, wie zum Beispiel dem Vertauschen der beiden &#039;&#039;Button&#039;&#039;-Elemente oder dem Einfügen eines weiteren &#039;&#039;Button&#039;&#039;-Elements in der App.&lt;br /&gt;
&lt;br /&gt;
Es wäre daher wünschenswert, das gemeinte Element über eine ihm charakteristische Eigenschaft wie einen Attributwert, zu adressieren. Für Android-Apps eignet sich hierfür häufig das Attribut &#039;&#039;resource-id&#039;&#039;. Im Idealfall muss bei der Entwicklung der App darauf geachtet werden, dass jedes Element eine eindeutige Id erhält. Die &#039;&#039;resource-id&#039;&#039; hat den großen Vorteil, dass sie unabhängig vom Text des Elements oder der Spracheinstellung des Geräts ist. Für iOS-Apps kann entsprechend das Attribut &#039;&#039;name&#039;&#039; verwendet werden, wenn es von der App sinnvoll gesetzt wird. Der XPath-Standard erlaubt solche Auswahlbedingungen zu einem Element anzugeben. Angenommen, der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Eigenschaft &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;off&#039;&#039; und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; hat als &#039;&#039;resource-id&#039;&#039; den Wert &#039;&#039;on&#039;&#039;, dann kann man als eindeutigen Pfad für den &amp;quot;Aus&amp;quot;-&#039;&#039;Button&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[@resource-id=&#039;off&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
formulieren. Wie an dem Beispiel zu sehen werden solche Bedingungen wie ein Index in eckigen Klammern an den Elementtyp angehängt. Der Name eines Attributes wird mit einem @ eingeleitet und der Wert mit einem = in Anführungszeichen angehängt. Ist der Attributwert global eindeutig, kann man den vorausgehenden Pfad sogar durch den globalen Platzhalter * ersetzen, der auf jedes Element passt. Das obige Beispiel mit dem GTIN-13-&#039;&#039;Button&#039;&#039; war ein solcher Fall.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum2.png | frame | Abb. 3: Elementbaum einer fiktiven App mit Erweiterungen]]&lt;br /&gt;
&lt;br /&gt;
Abb. 3 zeigt eine Erweiterung des Beispiels aus Abb. 2. Die App hat nun ein weiteres, nahezu identisches &#039;&#039;LinearLayout&#039;&#039; bekommen. Die &#039;&#039;Buttons&#039;&#039; sind in ihren Attributen jeweils ununterscheidbar. Deshalb funktioniert der vorige Ansatz nicht, einen eindeutigen Pfad nur mithilfe eines Attributwerts zu formulieren. Offensichtlich unterscheiden sich aber ihre benachbarten &#039;&#039;TextViews&#039;&#039;. Es ist möglich die jeweilige &#039;&#039;TextView&#039;&#039; in den Pfad mit aufzunehmen, um einen &#039;&#039;Button&#039;&#039; dennoch eindeutig zu adressieren. Ein Pfad zum &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; unterhalb der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; kann dabei wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView[@resource-id=&#039;push&#039;]/../android.widget.Button[@resource-id=&#039;on&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Teil beschreibt den Pfad zu der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; und der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;push&#039;&#039;. Danach folgt ein Schrägstrich gefolgt von zwei Punkten. Die zwei Punkte sind eine spezielle Elementbezeichnung, die nicht ein Kindelement benennt, sondern zum Elternelement wechselt, in diesem Fall also das &#039;&#039;LinearLayout&#039;&#039;, in dem die &#039;&#039;TextView&#039;&#039; eingebettet ist. Im Kontext dieses &#039;&#039;LinearLayout&#039;&#039; ist der restliche Pfad, nämlich der &#039;&#039;Button&#039;&#039; mit der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;on&#039;&#039;, eindeutig.&lt;br /&gt;
&lt;br /&gt;
Der XPath-Standard bietet noch sehr viel mehr Ausdrucksmittel. Mit der hier knapp vorgestellten Auswahl ist es aber bereits möglich für die meisten praktischen Testfälle gute Pfade zu formulieren. Eine vollständige Einführung in XPath ginge über den Umfang dieser Einführung weit hinaus. Sie finden zahlreiche weiterführende Dokumentationen im Web und in Büchern.&lt;br /&gt;
&lt;br /&gt;
Eine universelle Strategie zum Erstellen guter XPaths gibt es nicht, da sie von den Testanforderungen abhängt. In der Regel ist es sinnvoll, den XPath kurz und dennoch eindeutig zu halten. Häufig lassen sich Elemente über Eigenschaften identifizieren wie beispielsweise ihren Text. Will man aber gerade den Text eines Elements auslesen, kann dieser natürlich nicht im Pfad verwendet werden, da er vorher nicht bekannt ist. Ebenso wird der Text variieren, wenn die App mit verschiedenen Sprachen gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Jeder Baustein, der auf einem Element arbeitet, hat einen Eingangspin für den XPath. Im GUI-Browser finden Sie in der Mitte oben eine Liste von Bausteinen mit Aktionen, die Sie auf das ausgewählte Element anwenden können. Suchen Sie den Baustein &#039;&#039;Click&#039;&#039; (8) im Ordner Elements und wählen Sie ihn aus (Abb. 1). Er wird im rechten Teil unter &#039;&#039;Test&#039;&#039; eingefügt, der Pin für den XPath ist mit dem automatisch generierten Pfad des Elements vorbelegt (9). Sie können den Baustein hier auch ausführen. Die Ansicht wechselt dann auf &#039;&#039;Lauf&#039;&#039;. Ändert sich durch die Aktion der Zustand Ihrer App, müssen Sie den Baum anschließend aktualisieren (10).&lt;br /&gt;
&lt;br /&gt;
Wenn Sie in der unteren Liste eine Eigenschaft auswählen, wechselt die Anzeige der Bausteine zu &#039;&#039;Eigenschaften&#039;&#039;, wo Sie die eigenschaftsbezogenen Bausteine finden. Wie bei den Aktionen können Sie auch hier einen Baustein auswählen, der dann rechts in Test mit dem Pfad des Elements und der ausgewählten Eigenschaft eingetragen wird, sodass Sie ihn direkt ausführen können.&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span id=&amp;quot;troubleshooting&amp;quot;&amp;gt;&amp;lt;!-- Referenced by error dialog on connection error --&amp;gt;&amp;lt;/span&amp;gt;Problems and Solutions=&lt;br /&gt;
== Locators depend on the version or are variable ==&lt;br /&gt;
In this case consider to either store the locators (xPath) in a variable or to define a locator mapping inside a screenplay attachment. It is also possible to store just parts of an locator (e.g. locator path of a parent or attribute value) in a variable and add them in the freeze value of the locator pin by &amp;quot;&#039;&#039;$(varName)&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Invisible UI Elements ==&lt;br /&gt;
Note that the [[#Recorder|Recorder]] also considers items that you cannot see on the screen. Therefore, turn on element highlighting or use the follow mouse function and the element tree in the GUI browser to determine if the correct element is used. It can happen, that invisible elements are in front of other elements and cover them, so that the desired element cannot be selected in the recorder. See section [[#Hide_elements|Hide elements]] for a solution to this.&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;org.openqa.selenium.StaleElementReferenceException&#039;&#039;==&lt;br /&gt;
The error &amp;lt;code&amp;gt;org.openqa.selenium.StaleElementReferenceException&amp;lt;/code&amp;gt; occurs whenever an element is used that is no longer there. If that happens during your test and the element should have been there, try using the locator (xPath) instead to fetch the element again.&lt;br /&gt;
&lt;br /&gt;
In some cases this error can also occur even if you already use a locator at the action block. This is because the locator is always resolved first and the corresponding element is fetched and the action is then executed with this element. If the app refreshes the element exactly between the resolving and fetching part and the execution, creating a new element, this error occurs. If it happens at a specific point in your test, your best option is to catch the error and retry.&lt;br /&gt;
&lt;br /&gt;
== iOS: Cable not certified ==&lt;br /&gt;
In some cases, when connecting an iOS device via USB, a message appears indicating that the cable used is not certified. In this case, replacing the respective cable is the only solution.&lt;br /&gt;
&lt;br /&gt;
== iOS: Alerts when connecting ==&lt;br /&gt;
Make sure that no alerts are open when connecting to an iOS device. Otherwise the connection will fail because the app cannot be brought to the foreground. See also [[#Preparing_an_iOS-Device_and_App|Preparing an iOS-Device and App]].&lt;br /&gt;
&lt;br /&gt;
== iOS: .ipa cannot be installed ==&lt;br /&gt;
Note that on iOS simulators no &#039;&#039;.ipa&#039;&#039; files can be installed but only &#039;&#039;.app&#039;&#039; files.&lt;br /&gt;
&lt;br /&gt;
==iOS: First Connect is not working==&lt;br /&gt;
If there is not already a signed build of the WebDriverAgent on your Mac, it has to be created during the first connect. Usually, this can take a little longer than one minute. Per default Appium uses a timeout of 60000&amp;amp;nbsp;ms to wait for the WebDriverAgent to start on the device, so the connect will be canceled in that case. You can set this timeout with the capability &#039;&#039;wdaLaunchTimeout&#039;&#039;, e.g. to &#039;&#039;120000&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Moreover, the signing settings have to be correct. In our experience, the most reliable solution is to set automatic signing in the WebDriverAgent Xcode project an selecting the team there. See the explanation in section [[#Signing_WebDriverAgent|Signing WebDriverAgent]] for that. In this case you should &#039;&#039;&#039;not&#039;&#039;&#039; use the capabilities &#039;&#039;xcodeConfigFile&#039;&#039; resp. &#039;&#039;xcodeOrgId&#039;&#039; and &#039;&#039;xcodeSigningId&#039;&#039;, as they could cause a conflict. Caution: If you have set a Team ID in the Mobile Testing settings, expecco will automatically set this as &#039;&#039;xcodeOrgId&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
Pay attention to your device during the first connect. You might have to agree to the installation by entering your password. On the Mac you might need to enter the password to allow access to the key chain for signing, often several times.&lt;br /&gt;
&lt;br /&gt;
== Android: Device not visible in the connect editor ==&lt;br /&gt;
If an Android device connected via USB does not appear in the connection editor, try changing the USB connection type. Usually MTP or PTP should work. Check again, if &amp;quot;USB Debugging&amp;quot; is enabled in the developer options on the device (these options are disabled on some devices and have to be enabled first using a trick.) See also [[#Prepare_Android_Device|Prepare Android Device]].&lt;br /&gt;
&lt;br /&gt;
== Android: Truncated Elements at Bottom ==&lt;br /&gt;
For Android devices that automatically show and hide the navigation bar/softkeys, the recorder may cut off elements in the lower area that would be hidden by the softkeys, even if they are not displayed at this time. In this case it is advisable to set the softkeys so that they are permanently displayed.&lt;br /&gt;
&lt;br /&gt;
For newer Android versions there usually is no such option. Even if the controls are visible all the time, they don&#039;t have their own space, but are on top of the content of the app. Therefore, there is an area on the lower part of the screen, which cannot be automated, because it is not counted to the active area of the app. Appium will then truncate the elements there. This area can even be larger then the needed by the controls. This is a known issue for Samsung devices with Android 11. Since the information about the size of the app area is already provided on Android level, we cannot offer a solution for this, but can only hope that the problem will be fixed by the manufacturer. You may try to get better results by setting the control to gestures, but this bears the same issue.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;waitForIdleTimeout&amp;quot;&amp;gt;&amp;lt;!-- Referenced by expecco--&amp;gt;&amp;lt;/span&amp;gt; Android: Test Hangs While Finding an Element==&lt;br /&gt;
The block &#039;&#039;Find Element by XPath&#039;&#039; and all element blocks wait until an element is present for the given path. The timeout for this can be set either directly at the block or in the environment variables. However, if the element should already be present, but the test doesn&#039;t continue anyway, the reason could be in the UIAutomator/UIAutomator2. It waits for the app to go to the idle state before it even starts to search for the element. This may take longer, if the app e.g. runs an animation in the background or executes other kinds of actions. Fetching the page source, e.g. when updating in the GUI browser or in the recorder, can also take longer for this reason. There is a default timeout of 10 seconds after which it no longer waits for the idle state. This timeout can be set in Appium (waitForIdleTimeout). If you want to change the value of this timeout, you can do this since expecco 21.2 by executing the Smalltalk code &amp;lt;code&amp;gt;AppiumTestRunner::TestRunConnection waitForIdleTimeout:2000&amp;lt;/code&amp;gt; before the test. The timeout is given in milliseconds, so the example sets it to 2 seconds.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;startChromedriverTimeout/&amp;gt;Android: Updating the Tree or Switching to Webview Context takes too long==&lt;br /&gt;
Especially with older devices it can happen that newer Chromedriver cannot be initialized. This makes it impossible to switch to the webview context. However, this is only detected over a timeout by Appium, which is 4 minutes by default. Since expecco also tries to switch to the webview context when building the tree in the GUI browser, this can lead to very long loading times. Since there is no way to decrease this timeout in Appium, we have added a corresponding capability to the version we provide in the MobileTestingSupplement. Starting with version 1.13.1.0 of the [[#Windows|MobileTestingSupplement]], &#039;&#039;chromedriverStartTimeout&#039;&#039; can be used to set the timeout in milliseconds. The switch still doesn&#039;t work then, but expecco doesn&#039;t take as long to update the tree and the context switch module fails faster. The connection dialog adds this capability automatically starting with expecco 22.1. &lt;br /&gt;
&lt;br /&gt;
== No Action on Click ==&lt;br /&gt;
The block to click on an element is successful, but no action was performed on the device.&lt;br /&gt;
:This can happen if the element is hidden by another element and therefore clicking on the element is not possible. In this case, Appium does not throw an error, but simply nothing happens. If you would like to make a click at the position of the element anyways, even if it is hidden, use the block &#039;&#039;Tap&#039;&#039; instead and pass the location of the element to it (&#039;&#039;Get Location&#039;&#039;). If instead you want to check before a click whether the element is hidden at this moment, try whether the properties &#039;&#039;Is Displayed&#039;&#039; or &#039;&#039;Is Enabled&#039;&#039; might help you.&lt;br /&gt;
&lt;br /&gt;
== No Update After Action ==&lt;br /&gt;
An action was triggered on the recorder and a block has been recorded, but the recorder still shows the old image.&lt;br /&gt;
:The recorder doesn&#039;t show a live image of the device, but only a snapshot. After an action has been executed, the recorder will update automatically. However, it can happen, that the image has already been updated before the effects of the action are fully completed on the device. In this case you should update the recorder by hand using the icon with the blue arrows. Since expecco 20.2 you can also enable automatic updates for this case. See also the description for the [[#Recorder|recorder]].&lt;br /&gt;
&lt;br /&gt;
== Attribute &amp;quot;clickable&amp;quot; is wrong ==&lt;br /&gt;
An element has for the attribute/property &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; the value &amp;quot;&#039;&#039;false&#039;&#039;&amp;quot;, but is actually clickable.&lt;br /&gt;
:The attribute &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; has to be set explicitly by the app developer and does not affect the behavior of the app. You should generally disregard this attribute in your tests. Unfortunately, many apps exist where the programmer was &amp;quot;lazy&amp;quot; about this.&lt;br /&gt;
&lt;br /&gt;
==Connecting Fails==&lt;br /&gt;
If the connection to the Appium server fails, you will receive an error message in expecco similar to the one shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:MobileTestingVerbindungsfehler.png]]&lt;br /&gt;
&lt;br /&gt;
Here you can see the type of error that has occurred. Click on &amp;quot;&#039;&#039;Details&#039;&#039;&amp;quot; to get more information. Possible errors are:&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.remote.UnreachableBrowserException&#039;&#039;&lt;br /&gt;
:The specified server is not running or is not reachable. Check the server address.&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.WebDriverException&#039;&#039;&lt;br /&gt;
:Read the message after &#039;&#039;Original Error&#039;&#039; in the first line of the details:&lt;br /&gt;
:*&#039;&#039;Unknown device or simulator UDID&#039;&#039;&lt;br /&gt;
::Either the device is not connected properly or the udid is not correct.&lt;br /&gt;
:*&#039;&#039;Unable to launch WebDriverAgent because of xcodebuild failure: xcodebuild failed with code 65&#039;&#039;&lt;br /&gt;
::This error can have various causes. Either the WebDriverAgent could actually not be built because the signing settings are wrong or the appropriate provisioning profile is missing. Please read the section about [[#Signing|Signing]].  It is also possible that the WebDriverAgent cannot be started on the device, for example because an alert is in the foreground or you did not trust the developer.&lt;br /&gt;
:*&#039;&#039;Could not install app: &#039;Command &#039;ios-deploy [...] exited with code 253&#039;&#039;&#039;&lt;br /&gt;
::The specified app cannot be installed on the iOS device because it is not entered in the app&#039;s Provisioning Profile.&lt;br /&gt;
:*&#039;&#039;Bad app: [...] App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name.&#039;&#039;&lt;br /&gt;
::The path to the app is wrong. Make sure that the file is located in the specified path on your Mac.&lt;br /&gt;
:*&#039;&#039;packageAndLaunchActivityFromManifest failed.&#039;&#039;&lt;br /&gt;
::The specified &#039;&#039;apk&#039;&#039; file is probably broken.&lt;br /&gt;
:*&#039;&#039;Could not find app apk at [...]&#039;&#039;&lt;br /&gt;
::The path to the app is wrong. Make sure that the &#039;&#039;apk&#039;&#039; file is located in the specified path.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the error is not due to one of the causes listed above, the automation applications on the device may no longer function properly. In this case it helps to uninstall them from the mobile device. They are then automatically reinstalled the next time a connection is established.&lt;br /&gt;
&lt;br /&gt;
*For iOS devices, this is the WebDriverAgent, which you can simply uninstall from the home screen. This usually solves problems caused by changing the used Mac or the Xcode version.&lt;br /&gt;
&lt;br /&gt;
*For Android devices, it is the UIAutomator2; here, a problem occurs sporadically on some devices, the cause is currently unknown to us. To uninstall, on the device, navigate to &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;Applications&#039;&#039;&amp;quot;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; and search the list for the following entries:&lt;br /&gt;
    Appium Settings&lt;br /&gt;
    io.appium.uiautomator2.server&lt;br /&gt;
    io.appium.uiautomator2.server.test&lt;br /&gt;
:Click on the respective application and then on &amp;quot;&#039;&#039;Uninstall&#039;&#039;&amp;quot;.&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&#039;&#039;The corresponding entry may have a slightly different name on some devices.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If this doesn&#039;t help, check the output of the Appium server. For a server started by expecco, you can find the log in the list of [[#Running_Appium_Servers|Running Appium Servers]].&lt;br /&gt;
&lt;br /&gt;
==I do not have a Mac==&lt;br /&gt;
Maybe this site will help you: [https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10 https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin&amp;diff=29971</id>
		<title>Mobile Testing Plugin</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin&amp;diff=29971"/>
		<updated>2025-02-17T09:39:52Z</updated>

		<summary type="html">&lt;p&gt;Matilk: new supplement&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Deutsche Version&#039;&#039;&#039; | [[Mobile_Testing_Plugin/en|English Version]]&lt;br /&gt;
&lt;br /&gt;
= Einleitung =&lt;br /&gt;
Mit dem &#039;&#039;Mobile Testing Plugin&#039;&#039; können Anwendungen auf Android- und iOS-Geräten getestet werden. Dabei ist es egal, ob reale mobile Endgeräte oder emulierte Geräte verwendet werden. Das Plugin kann (und wird üblicherweise) zusammen mit dem [[Expecco_GUI_Tests_Extension_Reference|GUI-Browser]] verwendet werden, der das Erstellen von Tests unterstützt. Zudem ist damit das Aufzeichnen von Testabläufen möglich.&lt;br /&gt;
&lt;br /&gt;
Zur Verbindung mit den Geräten wird [http://appium.io/ Appium] verwendet. Appium ist ein freies Open-Source-Framework zum Testen und Automatisieren von mobilen Anwendungen.&lt;br /&gt;
&lt;br /&gt;
Zur Einarbeitung in das Mobile Plugin empfehlen wir das [[Mobile_Testing_Tutorial|Tutorial]] zu bearbeiten. Dieses führt anhand eines Beispiels Schritt für Schritt durch die Erstellung eines Testfalls und erklärt die nötigen Grundlagen.&lt;br /&gt;
&lt;br /&gt;
= Installation und Aufbau =&lt;br /&gt;
Zur Verwendung des Mobile Testing Plugins müssen Sie expecco inkl. des Plugins Mobile Testing installiert haben und Sie benötigen die entsprechenden Lizenzen. expecco kommuniziert mit den Mobilgeräten über einen Appium-Server, der entweder auf demselben Rechner wie expecco läuft, oder auf einem zweiten Rechner. Dieser muss für expecco erreichbar sein.&lt;br /&gt;
&lt;br /&gt;
==Installationsübersicht==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rechner, auf dem expecco läuft:&#039;&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rechner, an dem Android-Geräte angeschlossen sind:&#039;&#039;&#039;&lt;br /&gt;
* Appium-Server&#039;&#039;, diesen können Sie über das Mobile Testing Supplement installieren (s.u.), von dem wir regelmäßig einen neue Version zur Verfügung stellen&#039;&#039;&lt;br /&gt;
* Android SDK&#039;&#039;, dieses erhalten Sie ebenfalls mit dem Mobile Testing Supplement&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rechner, an dem iOS-Geräte angeschlossen sind&amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
* Appium-Server&#039;&#039;, diesen können Sie über das Mobile Testing Supplement für Mac OS installieren (s.u.), von dem wir regelmäßig einen neue Version zur Verfügung stellen&#039;&#039;&lt;br /&gt;
* Xcode &#039;&#039;in einer Version, die die verwendete iOS-Version unterstützt, erhältlich über den Apple App Store&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
* Apple-Entwickler-Zertifikat mit zugehörigem privaten Schlüssel &#039;&#039;(zum Signieren des WebDriverAgents)&#039;&#039;&lt;br /&gt;
* Provisioning Profile mit den verwendeten Mobilgeräten&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Je nach Aufbau können die oben genannten Rechner auch das selbe Gerät sein. expecco kann sich sowohl über das Netzwerk mit einem entfernten Appium-Server und dort angeschlossenen Mobilgeräten verbinden, als auch lokal selbst einen Appium-Server starten und diesen mit lokalen Mobilgeräten verwenden. Einige Funktionen von expecco, die die Erstellung von Testfällen erleichtern, sind jedoch nur verfügbar, wenn die Mobilgeräte am selben Rechner angeschlossen sind, auf dem auch expecco läuft. Ein möglicher Aufbau kann daher wie in folgender Abbildung aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAufbau.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird die Installation von Appium und anderer nötiger Programme für Windows und Mac OS erklärt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;: Zum Zeitpunkt der Erstellung dieses Dokuments wurden Versionen bis 11 auf Funktion verifiziert. Neuere Versionen sollten - sofern nicht grundlegende Änderungen von Oracle vorgenommen wurden, ebenfalls funktionieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;: Beachten Sie, dass aufgrund der Voraussetzungen (keine Anbindung an nicht-Apple Geräte verfügbar) iOS-Geräte nur von einem Mac aus angesteuert werden können. Sie benötigen also einen Mac als &amp;quot;Vermittler&amp;quot; (siehe auch unten: [[#Ich habe keinen Mac | &amp;quot;Ich habe keinen Mac&amp;quot;]])&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
Am einfachsten installieren Sie alles mit unserem Mobile Testing Supplement&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;. In neueren Versionen ist allerdings aufgrund geänderter Lizenzbedingungen seitens Oracle kein JDK mehr enthalten, sodass sie dieses zusätzlich installieren müssen. Sie können natürlich Appium auch direkt installieren, um die Version zu verwenden, die Sie möchten. Um dann einen Appium-Server mit expecco starten zu können, muss allerdings eine entsprechende Batchdatei vorhanden sein und in den [[Mobile_Testing_Plugin#Konfiguration_des_Plugins|Einstellungen]] angegeben werden. Verbindungen können aber auch zu anderen laufenden Appium-Servern aufgebaut werden.&lt;br /&gt;
*&#039;&#039;&#039;expecco 24.2&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-24.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 2.0.1.1]&lt;br /&gt;
:Umstieg auf Appium 2. Der Appium-Server startet standardmäßig ohne den Path &#039;&#039;wd/hub/&#039;&#039;.&lt;br /&gt;
:Appium 2.11.0&lt;br /&gt;
:Node 20.9.0&lt;br /&gt;
:adb 1.0.41 aus platform-tools 35.0.1&lt;br /&gt;
*expecco 24.1: [https://download.exept.de/transfer/h-expecco-24.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.3]&lt;br /&gt;
:Im Vergleich zum Vorgänger aktualisierte Chromedriver Versionen.&lt;br /&gt;
*expecco 23.2: [https://download.exept.de/transfer/h-expecco-23.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.2]&lt;br /&gt;
:Im Vergleich zum Vorgänger aktualisierte Chromedriver Versionen.&lt;br /&gt;
*expecco 23.1: [https://download.exept.de/transfer/h-expecco-23.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.1]&lt;br /&gt;
:Gleiche Versionen wie der Vorgänger, aber der Installer erlaubt nun, Appium zum Autostart hinzuzufügen.&lt;br /&gt;
*expecco 22.2 und 22.1: [https://download.exept.de/transfer/h-expecco-22.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.2.0]&lt;br /&gt;
:Appium 1.22.3*&lt;br /&gt;
:Node 14.17.5&lt;br /&gt;
:adb 1.0.41 aus platform-tools 33.0.2&lt;br /&gt;
:&#039;&#039;* Wir haben Appium um die Capability&#039;&#039; chromedriverStartTimeout &#039;&#039;erweitert, um schneller einen Timeout zu bekommen, wenn der Chromedriver nicht gestartet werden kann. (siehe [[#startChromedriverTimeout|Probleme und Lösungen]])&#039;&#039;&lt;br /&gt;
*expecco 21.2: [https://download.exept.de/transfer/h-expecco-21.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.12.0.0]&lt;br /&gt;
:Enthält die Appium-Version 1.22.0, Node ist weiterhin in der Version 12.13.1.&lt;br /&gt;
*expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.1.0]&lt;br /&gt;
:Nur kleine Änderungen im Vergleich zur vorigen Version.&lt;br /&gt;
*expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.0.0]&lt;br /&gt;
:Im Vergleich zur vorigen Version wurde Appium auf die Version 1.16.0-rc.1 aktualisiert und node 12 verwendet. &lt;br /&gt;
*expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.8.1.0]&lt;br /&gt;
:Dieses installiert Appium in der Version 1.12.0 und enthält nun zusätzlich build-tools der Version 28.0.3 im android-sdk. Ansonsten ist es gleich wie die vorige Version.&lt;br /&gt;
*expecco 18.2: [http://download.exept.de/transfer/h-expecco-18.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.7.3.0]&lt;br /&gt;
:Dieses installiert Appium in der Version 1.8.1. Außerdem bietet das Supplement auch an, &#039;&#039;Android Debug Bridge&#039;&#039; und &#039;&#039;Google USB Driver&#039;&#039; ([https://gsmusbdrivers.com/download/adb-fastboot-drivers/ adb-setup-1.4.3]) zu installieren. Damit sind Treiber für ein breites Spektrum an Android-Geräten abgedeckt, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen. Ein &#039;&#039;&#039;JDK ist (aufgrund geänderter Lizenzbedingungen seitens Oracle) nicht mehr enthalten&#039;&#039;&#039;, dieses müssen Sie selbst herunterladen, z.B. von [https://www.oracle.com/technetwork/java/javase/downloads/index.html Oracle].&lt;br /&gt;
*expecco 18.1: wie expecco 2.11&lt;br /&gt;
*expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/MobileTestingSupplement_1.6.0.2_Setup.exe Mobile Testing Supplement 1.6.0.2]&lt;br /&gt;
:Dieses installiert ein Java JDK der Version 8, android-sdk und Appium in der Version 1.6.4. Außerdem bietet das Supplement auch einen universellen adb-Treiber ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]) an. Dieser vereint Treiber für ein breites Spektrum an Android-Geräten, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen.&lt;br /&gt;
*expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_1.5.0.0_Setup.exe Mobile Testing Supplement 1.5.0.0]&lt;br /&gt;
:Dieses installiert ein Java JDK der Version 8, android-sdk und Appium in der Version 1.4.16. Während der Installation wird die grafische Oberfläche von Appium gestartet, dieses Fenster können Sie sofort wieder schließen. Außerdem bietet das Supplement auch einen universellen adb-Treiber ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]) an. Dieser vereint Treiber für ein breites Spektrum an Android-Geräten, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen.&lt;br /&gt;
&lt;br /&gt;
Wenn expecco Mobilgeräte verwenden soll, die an einem anderen Rechner angeschlossen sind, müssen Sie dort einen Appium-Server starten. Dies können Sie mit der Datei &amp;lt;code&amp;gt;appium_standalone.cmd&amp;lt;/code&amp;gt; tun. Der Server wird dann mit dem Standard-Port 4723 gestartet. Falls Sie eine andere Portnummer verwenden wollen, starten Sie den Server mit&lt;br /&gt;
&lt;br /&gt;
 appium_standalone.cmd -p &amp;lt;portnummer&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Server ist bereit, sobald die Zeile&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Appium REST http interface listener started on 0.0.0.0:4723&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
angezeigt wird, wobei Sie am Ende die verwendete Portnummer ablesen können.&lt;br /&gt;
&lt;br /&gt;
Beim ersten Starten von Appium – sowohl im Standalone als auch gestartet von expecco – kann es vorkommen, dass die Windows-Firewall den Node-Server blockiert. Lassen Sie den Zugriff zu, sonst kann Appium nicht gestartet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;) Sie können natürlich auch die Command Line Tools (adb, sdkmanager, avdmanager etc.) einer vorhandenen Android Studio Version verwenden, sowie Appium separat installieren.&lt;br /&gt;
Da sich diese Tools regelmäßig ändern, und es in der Vergangenheit zu Inkompatibilitäten und Fehlern nach Releasewechseln kam, empfehlen wir zu Beginn, das mitgelieferte Paket zu verwenden. Dies ist möglicherweise nicht das aktuellste, wurde aber auf Lauffähigkeit getestet.&lt;br /&gt;
&lt;br /&gt;
Falls das Android Mobilgerät an einem entfernen Rechner angeschlossen ist,&lt;br /&gt;
können Sie den aktuellen Bildschirminhalt z.B. mit dem [https://github.com/Genymobile/scrcpy scrcpy] tool live mitverfolgen.&lt;br /&gt;
&lt;br /&gt;
== Mac OS (nicht erforderlich für Android-Tests)==&lt;br /&gt;
Hinweis: Wenn Sie nicht vorhaben, iOS-Geräte (iPhone, iPad, etc.) zu testen, können Sie das Folgende ignorieren. &#039;&#039;&#039;Der Apple-Rechner sowie das Mac-Setup werden für Android-Geräte nicht benötigt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Xcode ===&lt;br /&gt;
Zur Automatisierung mit iOS-Geräten wird [https://developer.apple.com/xcode/ Xcode] benötigt. Sie erhalten dieses über den App Store. Dabei ist darauf zu achten, dass die Version zu den getesteten iOS-Versionen passt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;iOS&#039;&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp;  &lt;br /&gt;
|&#039;&#039;&#039;Xcode&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;macOS&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|10.x&lt;br /&gt;
|8.x&lt;br /&gt;
|10.12 (Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|11.x&lt;br /&gt;
|9.x&lt;br /&gt;
|10.13 (High Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|12.x&lt;br /&gt;
|10.x&lt;br /&gt;
|10.14 (Mojave)&lt;br /&gt;
|-&lt;br /&gt;
|13.x&lt;br /&gt;
|11.x&lt;br /&gt;
|10.15 (Catalina)&lt;br /&gt;
|-&lt;br /&gt;
|14.x&lt;br /&gt;
|12.x&lt;br /&gt;
|11.0 (Big Sur)&lt;br /&gt;
|-&lt;br /&gt;
|15.x&lt;br /&gt;
|13.x&lt;br /&gt;
|12.0 (Monterey)&lt;br /&gt;
|-&lt;br /&gt;
|16.x&lt;br /&gt;
|14.x&lt;br /&gt;
|12.5 (Monterey)&lt;br /&gt;
|}&lt;br /&gt;
Diese Tabelle gibt nur eine vereinfachte Übersicht, lesen Sie besser unter [https://xcodereleases.com/ Xcode Releases] oder [https://en.wikipedia.org/wiki/Xcode#Version_comparison_table Xcode-Versionen] welche Version Sie brauchen. Für neue iOS Minor-Versionen gibt es in der Regel auch ein Update für Xcode, z.B. brauchen Sie für iOS 10.2 mindestens Xcode 8.2, für iOS 10.3 mindestens Xcode 8.3 usw. &lt;br /&gt;
Wenn Sie also auf eine neuere iOS-Version wechseln, benötigen Sie in der Regel auch eine neuere Xcode-Version. Neuere Versionen von Xcode laufen möglicherweise nicht auf älteren Betriebssystemen, was wiederum eine Aktualisierung des Betriebssystems erforderlich machen kann. Falls Sie auch ältere iOS-Versionen testen wollen kann es sinnvoll sein, die entsprechenden Xcode-Versionen parallel zu installieren.&lt;br /&gt;
&lt;br /&gt;
=== Appium ===&lt;br /&gt;
Der Appium-Server kann entweder als Kommandozeilen-Anwendung installiert werden oder über [https://github.com/appium/appium-desktop Appium Desktop] verwendet werden, welcher den Server über ein GUI zur Verfügung stellt. Mittlerweile gibt es auch Appium 2.0, was wir aber bisher noch nicht mit expecco getestet haben und daher nicht empfehlen.&lt;br /&gt;
&lt;br /&gt;
==== Appium Desktop ====&lt;br /&gt;
Laden Sie die neueste Version von [https://github.com/appium/appium-desktop/releases/ Appium Desktop] herunter. Für den Mac nehmen Sie am besten die dmg-Datei und installieren sie in den Anwendungen. Beim Starten der Anwendung &#039;&#039;Appium Server GUI&#039;&#039; erhalten Sie wahrscheinlich eine Fehlermeldung, dass es aus Sicherheitsgründen nicht möglich ist. Öffnen Sie dann das Kontextmenü auf der Anwendungsdatei (Rechtsklick bzw. Strg + Klick) und wählen Sie dort &#039;&#039;Öffnen&#039;&#039; aus. Bestätigen Sie dann, dass Sie die Anwendung wirklich öffnen wollen. Fortan können Sie die Anwendung normal öffnen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:OpenAppiumServerGUI1.png|text-top]] [[Datei:OpenAppiumServerGUI2.png|text-top]]&lt;br /&gt;
&lt;br /&gt;
Ab Xcode 14 gibt es Probleme beim Signieren des WebDriverAgents, den Appium zur Automatisierung auf das Gerät spielt. Dadurch ist mit der Version 1.22.3-4 von Appium Desktop kein Verbindungsaufbau möglich. Das Problem ist in neueren Versionen des WebDriverAgents behoben, es gibt aber aktuell noch keine Version von Appium Desktop, die eine solche Version enthält (Stand November 2022). Sie können aber manuell eine neue Version herunterladen (z.B. 4.10.2)  und die Dateien in Appium ersetzen. Laden Sie dazu von der [https://github.com/appium/WebDriverAgent/releases/ WebDriverAgent Download-Seite] eine der beiden Archivdateien (zip oder tar.gz) mit dem Source Code herunter. Öffnen und entpacken Sie dann diese Datei. Den Inhalt des Ordners WebDriverAgent-4.10.2 müssen Sie nun nach&lt;br /&gt;
&lt;br /&gt;
 /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
kopieren. Wenn Sie über den Finder dorthin navigieren, machen Sie auf die Anwendung &#039;&#039;Appium Server GUI&#039;&#039; einen Kontextklick (Rechtsklick bzw. Strg + Klick) und wählen Sie im Menü &#039;&#039;Paketinhalt anzeigen&#039;&#039;. Ersetzen Sie alle Dateien, die bereits mit gleichem Namen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
==== Appium über npm installieren ====&lt;br /&gt;
Sie können Appium auch über npm (Node Package Manager) installieren. Dazu müsen Sie erst node/npm installieren. Das geht mit [https://github.com/nvm-sh/nvm nvm] (Node Version Manager) was Sie von Github bekommen. Falls die folgende Installationsanleitung bei Ihnen nicht funktionieren sollte, finden Sie dort ausführlichere Informationen im [https://github.com/nvm-sh/nvm#readme Readme].&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie ein Terminal-Fenster. Klonen Sie dann das Github-Repository von nvm&lt;br /&gt;
 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash&lt;br /&gt;
und laden Sie es&lt;br /&gt;
 export NVM_DIR=&amp;quot;$([ -z &amp;quot;${XDG_CONFIG_HOME-}&amp;quot; ] &amp;amp;&amp;amp; printf %s &amp;quot;${HOME}/.nvm&amp;quot; || printf %s &amp;quot;${XDG_CONFIG_HOME}/nvm&amp;quot;)&amp;quot; [ -s &amp;quot;$NVM_DIR/nvm.sh&amp;quot; ] &amp;amp;&amp;amp; \. &amp;quot;$NVM_DIR/nvm.sh&amp;quot; # This loads nvm&lt;br /&gt;
&lt;br /&gt;
Führen Sie danach&lt;br /&gt;
 command -v nvm&lt;br /&gt;
aus, um zu testen, ob es funktioniert hat. Es sollte &#039;&#039;nvm&#039;&#039; ausgegeben werden. Kommt keine Antwort, führen Sie&lt;br /&gt;
 touch ~/.zshrc&lt;br /&gt;
aus, und versuchen Sie es erneut.&lt;br /&gt;
&lt;br /&gt;
Nun können Sie node mit dem folgenden Befehl installieren.&lt;br /&gt;
 nvm install 16.15.1&lt;br /&gt;
Da es mit der aktuellen Version von node Probleme beim Installieren von Appium gibt, empfehlen wir diese Version.&lt;br /&gt;
&lt;br /&gt;
Nachdem node installiert ist, können Sie Appium darüber installieren:&lt;br /&gt;
 npm install -g appium&lt;br /&gt;
&lt;br /&gt;
Den Appium-Server können Sie nun einfach über den Befehl&lt;br /&gt;
 appium&lt;br /&gt;
starten. Die Ausgabe erfolgt dann direkt im Terminal.&lt;br /&gt;
&lt;br /&gt;
Auch bei dieser Version gibt es das Problem bei der Signierung des WebDriverAgents, wie bei [[#Appium_Desktop | Appium Desktop]] beschrieben. Laden Sie also auch in diesem Fall eine neuere Version des WebDriverAgents herunter und ersetzen Sie die alten Dateien. Diese finden Sie unter&lt;br /&gt;
 /Users/&amp;lt;user&amp;gt;/.nvm/versions/16.15.1/lib/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
==== Mobile Testing Supplement ====&lt;br /&gt;
Ältere Appium-Versionen stellen wir Ihnen über das Mobile Testing Supplement für Mac OS zur Verfügung, mit dem Sie es einfach installieren können:&lt;br /&gt;
* &#039;&#039;&#039;expecco 20.2&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-20.2.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement für Mac OS (1.2.2)]&lt;br /&gt;
:Enthält Appium Version 1.18.3 und verwendet node 14.&lt;br /&gt;
&lt;br /&gt;
* expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement für Mac OS (1.2.0)]&lt;br /&gt;
:Nur wenige Änderungen im Vergleich zur vorigen Version.&lt;br /&gt;
&lt;br /&gt;
* expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement_for_MacOS.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.98)]&lt;br /&gt;
:Im Vergleich zur vorigen Version wurde Appium auf die Version 1.16.0-rc.1 aktualisiert und es wird node 12 verwendet. &lt;br /&gt;
&lt;br /&gt;
* expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.96.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.96)]&lt;br /&gt;
:Diese Version enthält Appium 1.12.0. &lt;br /&gt;
&lt;br /&gt;
* expecco 18.1: [http://download.exept.de/transfer/h-expecco-18.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.94.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.94)]&lt;br /&gt;
:Diese Version enthält Appium 1.8.0.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/Mobile_Testing_Supplement_for_Mac_OS_1.0.94.tar.bz2 Mobile Testing Supplement für Mac OS (1.0.94)]&lt;br /&gt;
:Diese Version enthält Appium 1.6.4.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_for_Mac_OS_1.0.tar.bz2 Mobile Testing Supplement für Mac OS]&lt;br /&gt;
:Diese Version entält Appium 1.4.16.&lt;br /&gt;
&lt;br /&gt;
Nachdem Herunterladen des Supplements, können Sie es in ein Verzeichnis Ihrer Wahl (z. B. Ihr Home-Verzeichnis) verschieben und dort entpacken. Ein geeigneter Befehl in einer Shell könnte wie folgt aussehen, passen Sie dabei die Versionsnummer entsprechend an:&lt;br /&gt;
&lt;br /&gt;
 tar -xvpf Mobile_Testing_Supplement_for_Mac_OS_1.1.98.tar.bz2&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Ihre Standard-Xcode-Installation verwenden wollen, können Sie Appium direkt über die Datei im &#039;&#039;bin&#039;&#039;-Verzeichnis mit der entsprechenden Versionsnummer starten:&lt;br /&gt;
&lt;br /&gt;
 Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
Falls Sie ein anderes Xcode als das als Standard konfigurierte verwenden wollen, müssen Sie Appium den entsprechenden Pfad über die Umgebungsvariable &#039;&#039;DEVELOPER_DIR&#039;&#039; angeben. &lt;br /&gt;
Wenn Sie Xcode z. B. in &#039;&#039;/Applications/Xcode-11.3.app&#039;&#039; installiert haben, müssten Sie Appium so starten:&lt;br /&gt;
&lt;br /&gt;
 DEVELOPER_DIR=&amp;quot;/Applications/Xcode-11.3.app/Contents/Developer&amp;quot; Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
Was als Standard-Xcode-Installation gesetzt ist, zeigt der Befehl:&lt;br /&gt;
&lt;br /&gt;
 xcode-select -p&lt;br /&gt;
&lt;br /&gt;
Wenn Appium Ihre Xcode-Installation nicht findet, erscheint beim Verbinden eine Fehlermeldung in der Art:&lt;br /&gt;
&#039;&#039;&amp;lt;blockquote&amp;gt;org.openqa.selenium.SessionNotCreatedException - A new session could not be created. (Original error: Could not find path to Xcode, environment variable DEVELOPER_DIR set to: /Applications/Xcode.app but no Xcode found)&amp;lt;/blockquote&amp;gt;&#039;&#039;&lt;br /&gt;
Starten Sie in diesem Fall Appium erneut, unter Angabe eines gültigen &#039;&#039;DEVELOPER_DIR&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== WebDriverAgent-Signierung ====&lt;br /&gt;
Zur Automatisierung lädt Appium eine App namens WebDriverAgent auf das Gerät und muss sie dafür signieren können. Dazu brauchen Sie einen Apple-Account und ein entsprechendes Zertifikat. Zur Evaluierung können Sie einen kostenlosen Account verwenden. Dieser hat den Nachteil, dass erstellte Profile nur eine Woche gültig sind und danach neu erstellt werden müssen. Seien Sie auch vorsichtig, wenn Sie sich den Account teilen, da es vorkommen kann, dass Zertifikate widerrufen werden oder durch automatische Generierung ungültig werden. Als Folge können bereits signierte Apps nicht mehr verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie bereits ein entsprechendes Zertifikat mit dem zugehörigen privaten Schlüssel in Ihrer [https://support.apple.com/de-de/guide/keychain-access/welcome/mac Schlüsselbundverwaltung] auf dem Mac haben, können Sie den WebDriverAgent automatisch signieren lassen. Ansonsten empfiehlt es sich, die Signierung über Xcode einzustellen und zu verwalten.&lt;br /&gt;
&lt;br /&gt;
Schließen Sie zuerst das Gerät, das Sie verwenden möchten, über USB an den Mac an. Stellen Sie sicher, dass sich der Mac und das Gerät im selben Netzwerk befinden, ansonsten kann es beim Verbindungsaufbau mit Appium zu Problemen kommen. Starten Sie Xcode und öffnen Sie &#039;&#039;Preferences&#039;&#039;. Wechseln Sie zur Seite der Accounts und legen Sie einen Eintrag mit Ihrem Account an. Anschließend können Sie auf &#039;&#039;Manage Certificates...&#039;&#039; klicken, um die Zertifikate zu sehen, die zu diesem Account gehören. Zum Ausführen von Tests benötigen Sie ein iOS-Development-Zertifikat und den dazugehörigen privaten Schlüssel. Wenn Sie noch keines besitzen, erstellen Sie eines. Wenn Sie bereits eines haben, aber es nicht in Ihrem Schlüsselbund vorhanden ist (erkennbar an dem Hinweis &amp;quot;Not in Keychain&amp;quot;), können Sie es importieren. Das können Sie über die [https://support.apple.com/de-de/guide/keychain-access/welcome/mac Schlüsselbundverwaltung] auf dem Mac machen, wenn Sie es zuvor aus dem Schlüsselbund exportiert haben, in dem es sich befindet. Das Zertifikat mit dem zugehörigen Schlüssel sollte sich im Schlüsselbund &#039;&#039;Anmeldung&#039;&#039; befinden. Dort kann es als PKCS#12-Datei (Endung typischerweise .p12) exportiert werden. Um ein Zertifikat in Ihren Schlüsselbund zu importieren, wählen Sie im Menü &#039;&#039;Ablage&#039;&#039; die Option &#039;&#039;Objekte importieren&#039;&#039;. Falls Sie nicht wissen, wo das Zertifikat gespeichert ist, können Sie es in Xcode auch widerrufen und in Ihrem Schlüsselbund neu anlegen. Machen Sie das jedoch nur, wenn Sie wissen, dass das alte Zertifikat nicht mehr in Verwendung ist, da es danach nicht mehr benutzt werden kann. Nun sollte Ihr Schlüsselbund ein iOS-Development-Zertifikat enthalten.&lt;br /&gt;
&amp;lt;!---(Ich habe den folgenden Teil mal rausgenommen. Man braucht das nicht, wenn es in Xcode eingestellt ist.) Wählen Sie im Rechtsklick-Menü den Punkt &#039;&#039;Informationen&#039;&#039; aus. Unter den Details des Zertifikats finden Sie die Team-ID, die hier als Organisationseinheit bezeichnet wird. Tragen Sie diese in den Einstellungen des Plugins im Feld &#039;&#039;Team-ID&#039;&#039; ein, siehe [[#Konfiguration_des_Plugins|Konfiguration des Plugins]].--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie nun das WebDriverAgent-Projekt in Xcode. Wenn Sie das Mobile Testing Supplement installiert haben, finden Sie es in dessen Verzeichnis unter&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
Wenn Sie Appium Desktop installier haben, finden Sie es unter&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;/Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
Sie können einfach im Finder zu der Xcode-Project-Datei navigieren und Sie über einen Doppelklick öffnen. Beachten Sie dabei, dass Sie dabei auf die Anwendung Appium Server GUI einen Kontextklick (Rechtsklick bzw. Strg + Klick) machen und im Menü &#039;&#039;Paketinhalt anzeigen&#039;&#039; auswählen müssen, um in deren Unterverzeichnis zu gelangen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingWebDriverAgentXcode.png]]&lt;br /&gt;
&lt;br /&gt;
Wählen Sie &#039;&#039;WebDriverAgentLib&#039;&#039; und die Seite &#039;&#039;Signing &amp;amp; Capabilities&#039;&#039; aus. Setzen Sie dort im Abschnitt &#039;&#039;Signing&#039;&#039; die Option &#039;&#039;Automatically manage signing&#039;&#039; und wählen Sie dann ein Team aus. Wechseln Sie nun zu &#039;&#039;WebDriverAgentRunner&#039;&#039; und tun Sie dort dasselbe.&lt;br /&gt;
&amp;lt;!--(Das Folgende scheint nicht mehr aktuell zu sein.) Es sollten an dieser Stelle Fehler angezeigt werden, dass kein Provisioning Profile angelegt oder gefunden wurde. Wechseln Sie deshalb zur Seite &#039;&#039;Build Settings&#039;&#039; und suchen Sie hier im Abschnitt &#039;&#039;Packaging&#039;&#039; den Eintrag &#039;&#039;Product Bundle Identifier&#039;&#039;. Ändern Sie diesen von com.facebook.WebDriverAgentRunner zu etwas, das von Xcode akzeptiert wird, indem Sie den Präfix ändern. Xcode kann nun ein passendes Provisioning Profile generieren und die Fehler auf der General-Seite sollten verschwinden. Danach können Sie Xcode beenden. --&amp;gt;&lt;br /&gt;
Durch das Setzen des Teams sollten die Fehler für den WebDriverAgentRunner verschwinden. Sollte Xcode kein passendes Provisioning Profile für die Bundle ID &#039;&#039;com.facebook.WebDriverAgentRunner&#039;&#039; erstellen können, können Sie diese anpassen, dass sie zu Ihrem Zertifikat passt. Danach können Sie Xcode beenden oder auch, wie weiter unten beschrieben, direkt den Build über Xcode starten, damit das Projekt bereits gebaut ist, wenn Appium es verwenden möchte.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie sich nun von expecco eine Verbindung zu Ihrem Gerät aufbauen, wird der WebDriverAgent darauf installiert und gestartet, um anschließend zur zu testenden App zu wechseln. Eventuell muss auf dem Gerät muss der Ausführung des WebDriverAgents vertraut noch werden. Ein Anzeichnen dafür kann sein, dass die App WebDriverAgent zwar auf dem Gerät erscheint und zu starten versucht, danach aber wieder deinstalliert wird. Öffnen Sie dazu während des Verbindungsaufbaus auf dem Gerät in die Einstellungen und dort unter &#039;&#039;Allgemein&#039;&#039; den Eintrag &#039;&#039;Geräteverwaltung&#039;&#039;. Dieser Eintrag ist nur sichtbar, wenn eine Entwickler-App auf dem Gerät installiert ist. Sie müssen daher möglicherweise warten, bis der WebDriverAgent installiert ist, bevor der Eintrag erscheint. Wählen Sie dort den Eintrag Ihres Apple-Accounts und vertrauen Sie ihm. Da der WebDriverAgent wieder deinstalliert wird, wenn der Start nicht funktioniert hat, müssen Sie dies während des Verbindungsaufbaus tun. Falls Ihnen das zu hektisch ist, können Sie auch folgenden Code ausführen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;xcodebuild -project Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
  xcodebuild -project /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&lt;br /&gt;
&lt;br /&gt;
Damit wird der WebDriverAgent auf dem Gerät installiert ohne dass er wieder gelöscht wird.&lt;br /&gt;
&lt;br /&gt;
Wenn es Probleme beim Installieren des WebDriverAgents gibt, können Sie auch versuchen, den Build über Xcode zu starten. Stellen Sie sicher, dass das richtige Target &#039;&#039;WebDriverAgent&#039;&#039; ausgewählt ist. Fehlermeldungen in Xcode zeigen vielleicht einfacher, wo das Problem liegt. Manchmal hilft es auch, es ein zweites Mal zu versuchen, weil es möglicherweise beim ersten Mal zu lange gedauert hat und abgebrochen wurde. Es kann sein, dass Sie während des Builds mehrmals aufgefordert werden, das Passwort für Ihren Schlüsselbund anzugeben.&lt;br /&gt;
&lt;br /&gt;
[[Datei:WebDriverAgentCodesign.png]]&lt;br /&gt;
&lt;br /&gt;
Lesen Sie auch die Dokumentation von Appium zum [https://github.com/appium/appium-xcuitest-driver/blob/master/docs/real-device-config.md Aufsetzen von Tests mit iOS-Geräten]. In der [https://support.apple.com/en-us/HT204460 Dokumentation von Apple] finden Sie nähere Informationen zum Installieren und Vertrauen von Apps.&lt;br /&gt;
&lt;br /&gt;
Ist der WebDriverAgent einmal auf dem Gerät installiert, wird er für spätere Verbindungen wieder verwendet und der Verbindungsaufbau sollte schneller funktionieren. Ebenso liegt dann die signierte Version bereits auf Ihrem Mac und muss nicht erneut gebaut werden, was die Verbindung zu weiteren Geräten ebenfalls beschleunigt. Wenn Sie wissen, dass bei Ihrem Verbindungsaufbau der WebDriverAgent erst noch signiert und gebaut werden muss, ist es ratsam, die Capability &#039;&#039;wdaLaunchTimeout&#039;&#039; zu setzen. Dieser Timeout, wie lange auf den Start der WebDriverAgents auf dem Gerät gewartet werden soll, liegt standardmäßig bei 60000$nbsp;ms. Der Build dauert aber häufig über eine Minute, sodass der Versuch zum Verbindungsaufbau dann abgebrochen wird. Ein Wert von 120000 hat sich hier als besser erwiesen.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration des Plugins ==&lt;br /&gt;
Bevor Sie loslegen, sollten Sie die Einstellungen des Mobile Testing Plugins überprüfen und ggf. anpassen.&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie im Menü den Punkt &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; und dort unter &amp;quot;&#039;&#039;Erweiterungen&#039;&#039;&amp;quot; den Eintrag &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot; (s. Abb.). Standardmäßig werden diese Pfade automatisch gefunden (1). Um einen Pfad manuell anzupassen, deaktivieren Sie den entsprechenden Haken rechts davon. Sie erhalten in einer Drop-down-Liste einige Pfade zur Auswahl. Ist ein eingetragener Pfad falsch oder kann er nicht gefunden werden, wird das Feld rot markiert und es erscheint ein diesbezüglicher Hinweis. Stellen Sie sicher, dass alle Pfade richtig angegeben sind.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingEinstellungen.png | thumb | 400px | Konfiguration des Plugins]]&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;appium&#039;&#039;&#039;: Geben Sie hier den Pfad zur ausführbaren Datei an mit der Appium in der Kommandozeile gestartet werden kann. Unter Windows wird diese Datei in der Regel &amp;quot;&amp;lt;code&amp;gt;appium.cmd&amp;lt;/code&amp;gt;&amp;quot; heißen. Dieser Pfad wird benutzt, wenn expecco einen Appium-Server startet.&lt;br /&gt;
*&#039;&#039;&#039;node&#039;&#039;&#039;: Geben Sie hier den Pfad zur ausführbaren Datei an, die Node (auch &amp;quot;Node.js&amp;quot;) startet. Dieser Pfad wird beim Starten eines Servers an Appium weitergegeben, damit Appium ihn unabhängig von der PATH-Variablen findet. Unter Windows heißt diese Datei in der Regel &amp;quot;&amp;lt;code&amp;gt;node.exe&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;JAVA_HOME&#039;&#039;&#039;: Geben Sie hier den Pfad zu einem JDK an. Dieser Pfad wird an jeden Appium-Server weitergegeben. Lassen Sie das Feld frei, um den Wert aus der Umgebungsvariablen zu verwenden. Um einzustellen, welches Java von expecco verwendet werden soll, setzen Sie diesen Pfad in den Einstellungen für die Java Bridge.&lt;br /&gt;
*&#039;&#039;&#039;ANDROID_HOME&#039;&#039;&#039;: Geben Sie hier den Pfad zu einem SDK von Android an. Dieser Pfad wird an jeden Appium-Server weitergegeben. Lassen Sie das Feld frei, um den Wert aus der Umgebungsvariablen zu verwenden.&lt;br /&gt;
*&#039;&#039;&#039;adb&#039;&#039;&#039;: Hier steht der Pfad zum adb-Befehl. Unter Windows heißt die Datei adb.exe. Diese wird von expecco beispielsweise verwendet, um die Liste der angeschlossenen Geräte zu erhalten. Diesen Pfad sollten Sie automatisch wählen lassen, da dann der Befehl im ANDROID_HOME-Verzeichnis verwendet wird. Dieser wird auch von Appium verwendet. Falls expecco und Appium jedoch verschiedene Versionen von adb verwenden kann es zu Konflikten kommen.&lt;br /&gt;
*&#039;&#039;&#039;android.bat&#039;&#039;&#039;: Diese Datei wird nur benötigt, um damit den AVD und den SDK Manager zu starten. Automatisch wird hier die Datei im ANDROID_HOME-Verzeichnis gesucht.&lt;br /&gt;
*&#039;&#039;&#039;aapt&#039;&#039;&#039;: Geben Sie hier den Pfad zum aapt-Befehl an. Unter Windows heißt diese Datei &#039;&#039;aapt.exe&#039;&#039;. expecco verwendet aapt nur im Verbindungseditor, um das Paket und die Activities einer apk-Datei zu lesen. Automatisch wird hier die Datei im ANDROID_HOME-Verzeichnis gesucht.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingJavaBridgeEinstellungen.png | thumb | 400px | Konfiguration des JDKs]]&lt;br /&gt;
&lt;br /&gt;
Ab expecco 2.11 gibt es das Feld &#039;&#039;Team-ID&#039;&#039;. Wenn Sie iOS-Tests ausführen, tragen Sie hier die Team-ID Ihres Zertifikats ein. Diese wird für jede iOS-Verbindung verwendet, außer Sie setzen den Wert im Einzelfall in den Verbindungseinstellungen um. Wie Sie die Team-ID erhalten, lesen Sie im Abschnitt zur [[#Signierung|Signierung]] ber der Installation auf Mac OS. Mit expecco 2.10 können Sie die Team-ID nur für jede Verbindungseinstellung extra als Capability eintragen. Dazu müssen Sie jedoch die [[#Erweiterte_Ansicht|erweiterte Ansicht]] verwenden. Geben Sie hier die Capability &#039;&#039;xcodeOrgId&#039;&#039; an und setzen Sie als Wert die Team-ID des Zertifikats.&lt;br /&gt;
&lt;br /&gt;
Die Einstellung zur Serveradresse unten auf der Seite bezieht sich auf das Verhalten des Verbindungseditors. Dieser prüft am Ende, ob die Serveradresse auf &#039;&#039;/wd/hub&#039;&#039; endet, da dies die übliche Form ist. Falls nicht, wird in einem Dialog gefragt, wie darauf reagiert werden soll. Das festgelegte Verhalten kann hier eingesehen und verändert werden.&lt;br /&gt;
&lt;br /&gt;
Wechseln Sie ebenfalls zum Eintrag &#039;&#039;Java Bridge&#039;&#039; (s. Abb.). Hier muss der Pfad zu Ihrer Java-Installation angegeben werden, die von expecco benutzt wird. Tragen Sie hier ein JDK ein. Falls Sie unter Windows das aus dem Mobile Testing Supplement verwenden möchten, lautet der Pfad&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;C:\Program Files (x86)\exept\Mobile Testing Supplement\jdk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Sie können auch die Systemeinstellungen verwenden.&lt;br /&gt;
&lt;br /&gt;
== Android-Gerät vorbereiten ==&lt;br /&gt;
Wenn Sie ein Android-Gerät unter Windows anschließen benötigen Sie möglicherweise noch einen adb-Treiber für das Gerät. Einen passenden Treiber finden Sie üblicherweise auf der jeweiligen Webseite des Herstellers. Haben Sie den Universal-Treiber aus dem Mobile Testing Supplement installiert, sollte für die meisten Geräte bereits alles funktionieren. In einigen Fällen versucht auch Windows automatisch einen Treiber zu installieren, wenn Sie das Gerät zum ersten mal anschließen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===USB-Debugging Einschalten===&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Bevor Sie ein Mobilgerät mit dem Appium-Plugin ansteuern können, müssen Sie für dieses Debugging erlauben!&lt;br /&gt;
&lt;br /&gt;
Für Android-Geräte finden Sie diese Option in den Einstellungen unter &#039;&#039;[https://www.droidwiki.org/wiki/Entwickleroptionen Entwickleroptionen]&#039;&#039; mit dem Namen &#039;&#039;[https://www.droidwiki.org/USB-Debugging USB-Debugging]&#039;&#039;. Falls die Entwickleroptionen nicht angezeigt werden, können Sie diese freischalten, indem Sie unter &amp;quot;&#039;&#039;Über das Telefon&#039;&#039;&amp;quot; siebenmal auf &amp;quot;&#039;&#039;Build-Nummer&#039;&#039;&amp;quot; tippen.&lt;br /&gt;
&lt;br /&gt;
===Wach bleiben Aktivieren===&lt;br /&gt;
Aktivieren Sie auch die Funktion &#039;&#039;Wach bleiben&#039;&#039;, damit das Gerät nicht während der Testerstellung oder -ausführung den Bildschirm abschaltet.&lt;br /&gt;
&lt;br /&gt;
Aus Sicherheitsgründen muss USB-Debugging für jeden Computer einzeln zugelassen werden. Beim Verbinden des Geräts mit dem PC über USB müssen Sie dabei am Gerät der Verbindung zustimmen. Falls Sie dies für Ihren Computer noch nicht getan haben, aber auf dem Gerät kein entsprechender Dialog erscheint, kann es helfen, das Gerät aus- und wieder einzustecken. Das kann insbesondere dann passieren, wenn Sie den ADB-Treiber installiert haben während das Gerät bereits über USB angeschlossen war. Falls auch das nicht hilft, öffnen Sie die Benachrichtigungen, indem Sie sie vom oberen Bildschirmrand herunter ziehen. Dort finden Sie die USB-Verbindung und Sie können die Optionen dazu öffnen. Wählen Sie einen anderen Verbindungstypen aus; in der Regel sollten MTP oder PTP funktionieren.&lt;br /&gt;
&lt;br /&gt;
Sie können auch auf einem Emulator testen. Dieser muss nicht gesondert vorbereitet werden, da er bereits für USB-Debugging ausgelegt ist. Es ist sogar möglich, einen Emulator bei Testbeginn zu starten.&lt;br /&gt;
&lt;br /&gt;
Um zu überprüfen, ob ein Gerät, das Sie an Ihren Rechner angeschlossen haben, verwendet werden kann, öffnen Sie den [[#Verbindungseditor|Verbindungseditor]]. Das Gerät sollte dort angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Verbindung über WLAN ===&lt;br /&gt;
Es ist auch möglich, Android-Geräte über WLAN zu verbinden. Für Geräte mit Android 11 oder neuer ist dies direkt über WLAN möglich, im anderen Fall müssen Sie das Gerät zuerst über USB verbinden. Ab expecco 22.1 können Sie eine WLAN-Verbindung über den [[Mobile Testing Plugin#Verbindungseditor|Verbindungseditor]] aufbauen. Ansonsten ist es auch über die Eingabeaufforderung möglich.&lt;br /&gt;
==== Drahtlos verbinden über die Eingabeaufforderung mit expecco Versionen vor 22.1 (ab Android 11) ====&lt;br /&gt;
Mit expecco ab Version 22.1 funktioniert das einfacher über den Verbindungseditor.&lt;br /&gt;
&lt;br /&gt;
Erlauben Sie in den Entwickleroptionen des Geräts Debugging über WLAN und öffnen Sie dessen Optionen. Sie müssen zuerst das Gerät mit dem  Rechner koppeln. Wählen Sie dazu &amp;quot;&#039;&#039;Gerät mit einem Kopplungscode koppeln&#039;&#039;&amp;quot;, um einen Kopplungscode und eine IP-Adresse mit Port zu erhalten. Öffnen Sie dann auf dem Rechner die Eingabeaufforderung und geben Sie dort ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb pair &amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Kopplungsport&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
wobei Sie &amp;lt;tt&amp;gt;&amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Kopplungsport&amp;gt;&amp;lt;/tt&amp;gt; durch die auf dem Gerät angezeigte IP-Adresse &amp;amp; Port ersetzen. Danach werden Sie aufgefordert, den Kopplungscode einzugeben. Wenn alles geklappt hat, sollte sich das Popup auf dem Gerät schließen und der Rechner als gekoppeltes Gerät angezeigt werden. Geben Sie dann in der Eingabeaufforderung ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Debug-Port&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die IP-Adresse ist hier noch die gleiche wie beim Koppeln, aber der Port ist ein anderer. Beides wird als IP-Adresse &amp;amp; Port auf dem Gerät angezeigt. Damit sollte das Gerät nun über WLAN verbunden sein und kann genauso verwendet werden, wie mit USB-Verbindung. Sie können dies überprüfen, indem Sie entweder &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; eingeben oder in expecco den Verbindungsdialog öffnen. In der Liste taucht das Gerät mit seiner IP-Adresse und dem Port auf. Bedenken Sie, dass die WLAN-Verbindung nicht mehr besteht, wenn der ADB-Server oder das Gerät neu gestartet werden. Häufig wird beim Neustart des Geräts auch die Erlaubnis für das Debugging über WLAN wieder zurückgesetzt und der verwendete Port ändert sich. Die Kopplung bleibt aber bestehen und muss beim nächsten Verbinden nicht noch einmal durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==== WLAN Verbindung über USB starten (Android 10 und früher) ====&lt;br /&gt;
Verbinden Sie zunächst das Gerät über USB mit dem Rechner. Öffnen Sie dann die Eingabeaufforderung und geben Sie dort ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit lauscht das Gerät auf eine TCP/IP-Verbindung an Port 5555. Sollten Sie mehrere Geräte angeschlossen oder Emulatoren laufen haben, müssen Sie genauer angeben, welches Gerät Sie meinen. Geben Sie in diesem Fall ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb devices -l&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Sie erhalten eine Liste aller Geräte, wobei die erste Spalte deren Kennung ist. Schreiben Sie dann stattdessen&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb -s &amp;lt;Gerätekennung&amp;gt; tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
mit der Gerätekennung des gewünschten Geräts. Sie können die USB-Verbindung nun trennen. Jetzt müssen Sie die IP-Adresse Ihres Gerätes in Erfahrung bringen. Sie finden diese üblicherweise irgendwo in den Einstellungen des Geräts, beispielsweise beim Status oder in den WLAN-Einstellungen. Geben Sie dann ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP-Adresse des Geräts&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit sollte das Gerät nun über WLAN verbunden sein und kann genauso verwendet werden, wie mit USB-Verbindung. Sie können dies überprüfen, indem Sie wieder &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; eingeben oder in expecco den Verbindungsdialog öffnen. In der Liste taucht das Gerät mit seiner IP-Adresse und dem Port auf. Bedenken Sie, dass die WLAN-Verbindung nicht mehr besteht, wenn der ADB-Server oder das Gerät neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
=== Verbindung zu einem Emulator ===&lt;br /&gt;
Sie benötigen dazu den Emulator selbst, sowie mindestens ein AVD (Android Virtual Device). Hinweise zu Installation finden Sie in der [https://developer.android.com/studio/run/emulator Android Studio Dokumentation].&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Android Studio bereits mit den Defaulteinstellungen installiert haben &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;, sollte der Emulator bereits mitinstalliert sein. Falls nicht, wählen Sie in Android Studio &amp;quot;&#039;&#039;Configure&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;SDK Manager&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Android SDK&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;SDK Tools&#039;&#039;&amp;quot; - &#039;&#039;Android Emulator&#039;&#039;&amp;quot;, sowie dort die &amp;quot;&#039;&#039;Platform Tools&#039;&#039;&amp;quot;.&lt;br /&gt;
Alternativ geht das auch über die Kommandzeile mit dem &amp;quot;sdkmanager&amp;quot; Kommando.&lt;br /&gt;
&lt;br /&gt;
Als nächstes benötigen Sie mindestens ein AVD; auch dies geht am einfachsten über den Dialog in Android Studio:&lt;br /&gt;
wählen sie &amp;quot;&#039;&#039;Configure&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;AVD Manager&#039;&#039;&amp;quot; und folgen den Anweisungen (Deviceauswahl, Platform und Android Version).  &lt;br /&gt;
&lt;br /&gt;
Auch wenn Sie den Emulator automatisieren benötigen sie Appium; installieren Sie dieses entweder mit dem Mobile Testing Supplement, oder direkt von der Appium homepage (https://github.com/appium/appium-desktop/releases).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;Android Studio selbst wird nicht von expecco benötigt; es bietet aber kompfortable Dialoge zum Installieren von Paketen und AVDs.&lt;br /&gt;
&lt;br /&gt;
== iOS-Gerät und App vorbereiten ==&lt;br /&gt;
Das Ansteuern von iOS-Geräten ist nur über einen Mac möglich. Lesen Sie daher auch den Abschnitt zur [[#Mac_OS|Installation unter Mac OS]].&lt;br /&gt;
&lt;br /&gt;
Bevor Sie ein Mobilgerät mit dem Mobile Testing Plugin ansteuern können, müssen Sie für iOS-Geräte ab iOS 8 Debugging erlauben. Aktivieren Sie dazu die Option &#039;&#039;Enable UI Automation&#039;&#039; unter dem Menüpunkt &#039;&#039;Entwickler&#039;&#039; in den Einstellungen des Geräts. Falls Sie den Eintrag &#039;&#039;Entwickler&#039;&#039; in den Einstellungen nicht finden, gehen Sie wie folgt vor: Schließen Sie das Gerät über USB an den Mac an. Dabei müssen Sie ggf. am Gerät noch der Verbindung zustimmen. Starten Sie Xcode und wählen Sie dann in der Menüleiste am oberen Bildschirmrand im Menü &#039;&#039;Window&#039;&#039; den Eintrag &#039;&#039;Devices&#039;&#039;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wählen Sie dort Ihr Gerät aus. Danach sollte der Eintrag &#039;&#039;Entwickler&#039;&#039; in den Einstellungen auf dem Gerät auftauchen. Dazu müssen Sie möglicherweise die Einstellungen beenden und neu starten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Alert.png | thumb | 270px | Beispiel für einen Alert unter iOS]]&lt;br /&gt;
Ein Verbindungsaufbau zu dem Gerät ist nicht möglich solange es bestimmte Alerts zeigt. Ein solcher Alert kann z.&amp;amp;#x202f;B. erscheinen wenn FaceTime aktiviert ist, indem ein Hinweis auf anfallende SMS-Gebühren angezeigt wird (siehe Screenshot). Achten Sie darauf, das Gerät so zu konfigurieren, dass es im Leerlauf keine solchen Alerts zeigt.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.11 und später ===&lt;br /&gt;
Sie können beliebige Apps testen, die auf dem verwendeten Gerät lauffähig oder bereits installiert sind. Wenn die App als Development-Build vorliegt, muss die UDID des Geräts in der App hinterlegt sein. In jedem Fall muss der WebDriverAgent für das Gerät signiert werden. Lesen Sie dazu den Abschnitt zur [[#Signierung|Signierung]] unter Mac OS.&lt;br /&gt;
&lt;br /&gt;
Falls Sie in einem Test den Home-Button verwenden wollen, müssen Sie auf dem Gerät AssistiveTouch aktivieren. Sie finden diese Option in den Einstellungen unter &#039;&#039;Allgemein&#039;&#039; &amp;gt; &#039;&#039;Bedienungshilfen&#039;&#039; &amp;gt; &#039;&#039;AssistiveTouch&#039;&#039;. Platzieren Sie dann das Menü in der Mitte des oberen Bildschirmrands. Sie können das Drücken des Home-Buttons dann mit dem entsprechenden Menüeintrag im Recorder aufzeichnen oder direkt den Baustein &#039;&#039;Press Home Button&#039;&#039; benutzen.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.10 ===&lt;br /&gt;
Die App, die Sie verwenden wollen, muss als Development-Build vorliegen. Außerdem muss die UDID des Geräts in der App hinterlegt sein.&lt;br /&gt;
&lt;br /&gt;
=== Development-Build signieren ===&lt;br /&gt;
Ein Development-Build einer App ist nur für eine begrenzte Zahl von Geräten zugelassen und kann auf anderen Geräten nicht gestartet werden. Es ist aber möglich, das Zertifikat und die verwendbaren Geräte in einem Development-Build auszutauschen.&lt;br /&gt;
&lt;br /&gt;
* Evaluierung mit Demo-App von eXept:&lt;br /&gt;
:Gerne stellen wir Ihnen eine Demo-App zur Verfügung, die als Development-Build vorliegt und die wir für Ihr Gerät signieren können. Senden Sie dazu bitte Ihrem eXept-Ansprechpartner die UDID Ihres Gerätes zu. Wie Sie die UDID Ihres Gerätes ermitteln können, ist im folgenden Abschnitt beschrieben.&lt;br /&gt;
&lt;br /&gt;
* Eigene App für Ihr Testgerät verwenden:&lt;br /&gt;
:Wenn Sie von den App-Entwicklern einen Development-Build (IPA-Datei) erhalten, der für Ihr Testgerät zugelassen ist, können Sie diesen direkt verwenden. Dazu müssen Sie den Entwicklern die UDID Ihres Geräts mitteilen, damit sie diese eintragen können. &#039;&#039;&#039;Sie können die UDID eines Gerätes mithilfe von Xcode auslesen&#039;&#039;&#039;. Starten Sie dazu Xcode und wählen Sie in der Menüleiste am oberen Bildschirmrand im Menü &#039;&#039;Window&#039;&#039; den Eintrag &#039;&#039;Devices&#039;&#039;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wählen Sie Ihr Gerät aus und suchen Sie in Eigenschaften den Eintrag &#039;&#039;Identifier&#039;&#039;. Die UDID ist eine 40-stellige Hexadezimalzahl.&lt;br /&gt;
&lt;br /&gt;
* Extern entwickelte App für Ihr Testgerät umsignieren:&lt;br /&gt;
:Es können auch Apps umsigniert werden, damit Sie auf anderen Geräten lauffähig sind. Dieser Vorgang ist jedoch kompliziert und setzt insbesondere einen Zugang zu einem Apple-Developer-Account voraus. Eine Dokumentation zur Vorgehensweise ist derzeit in Vorbereitung.&lt;br /&gt;
&lt;br /&gt;
:Für die Evaluierung unterstützen wir Sie gerne beim Umsignieren Ihrer App.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Melden Sie sich beim [https://developer.apple.com/ Apple-Webinterface] an. Navigieren Sie zu &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039;. Erzeugen Sie hier ggf. ein Developer-Zertifikat und ein Provisioning Profile für Ihr Gerät und laden Sie beide herunter. Sollten Sie noch keinen Developer Account haben, erstellen Sie hier einen: https://developer.apple.com/enroll/. Hierzu müssen Sie sich mit einer Apple-ID anmelden.&lt;br /&gt;
&lt;br /&gt;
# Team-ID herausfinden (&#039;&#039;Membership&#039;&#039; -&amp;gt; &#039;&#039;Team ID&#039;&#039;)&lt;br /&gt;
# Unter &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039; Development-Zertifikat auswählen (unter &#039;&#039;+&#039;&#039; anlegen, falls nicht vorhanden) und herunterladen.&lt;br /&gt;
# Unter &#039;&#039;App ID&#039;&#039; Wildcard-App-ID erzeugen, falls nicht vorhanden. App-ID notieren (AppID = Prefix.ID)&lt;br /&gt;
# Gerät hinzufügen, dazu UDID (bzw. &#039;&#039;Identifier&#039;&#039;) des Geräts herausfinden (&#039;&#039;Xcode&#039;&#039; -&amp;gt; &#039;&#039;Window&#039;&#039; (oben in Menüleiste) -&amp;gt; &#039;&#039;Devices&#039;&#039;)&lt;br /&gt;
# Provisionen Profile erstellen: &#039;&#039;iOS App Development&#039;&#039; -&amp;gt; &#039;&#039;AppID&#039;&#039; auswählen -&amp;gt; Zertifikat wählen -&amp;gt; Gerät auswählen -&amp;gt; Profilname anlegen -&amp;gt; Provisioning Profile herunterladen.&lt;br /&gt;
# Das heruntergeladene Zertifikat importieren (&#039;&#039;Downloads&#039;&#039; -&amp;gt; Zertifikat (.cer)&lt;br /&gt;
# SHA1-Fingerabdruck kopieren. Dazu Rechtsklick auf Zertifikat -&amp;gt; &#039;&#039;Information&#039;&#039;, anschließend bis zum Ende der Seite scrollen).&lt;br /&gt;
# Entitlements.plist erstellen (&#039;&#039;Terminal&#039; öffnen -&amp;gt; Downloads/Mobile_Testing_Supplement/bin/gen-entitlements_plist &#039;Team-ID&#039; &#039;App ID&#039; Downloads/Mobile_Testing_Supplement/bin/re-sign-ipa &amp;lt;Pfad zum ipa (z.B. Downloads/expeccoMobileDemo.ipa)&amp;gt; \&lt;br /&gt;
&amp;quot;&amp;lt;Zertifikat (SHA1-Fingerabdruck, z.B. 76 E8 4B E8 78 D5 D7 F9 2E 09 8B D7 E8 FB CE 30 0C F5 D0 EF)&amp;gt;&amp;quot; \&lt;br /&gt;
&amp;lt;Pfad zum Provisionen Profile (z.B. /Users/exept_test/Downloads/dut.mobileprovision)&amp;gt; \&lt;br /&gt;
&amp;lt;Pfad für das Ergebnis-ipa (z.B. Downloads/expeccoMobileDemo_re-signed.ipa)&amp;gt; \&lt;br /&gt;
[Pfad zur entitlements.plist] (z.B. /Users/exept_test/entitlements.plist)&lt;br /&gt;
&lt;br /&gt;
Zum Umsignieren können Sie das entsprechende Skript aus dem Mobile Testing Supplement für Mac OS oder jedes beliebige andere Tool (z.B. isign) verwenden.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zur Verwendung von iOS-Geräten finden Sie auch in der [http://appium.io/slate/en/master/?java#appium-on-real-ios-devices Dokumentation von Appium].&lt;br /&gt;
&lt;br /&gt;
=== Native iOS-Apps ===&lt;br /&gt;
Sie können auch Apps verwenden, die bereits nativ auf dem Gerät vorhanden sind. Dazu müssen Sie deren Bundle-ID kennen und diese dann in die Verbindungseinstellungen eintragen. Hier eine kleine Auswahl gängiger Apps:&lt;br /&gt;
{| style=&amp;quot;text-align:left&amp;quot;&lt;br /&gt;
! App&lt;br /&gt;
!&lt;br /&gt;
! Bundle-ID&lt;br /&gt;
|-&lt;br /&gt;
| App Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.AppStore&lt;br /&gt;
|-&lt;br /&gt;
| Calculator&lt;br /&gt;
| &lt;br /&gt;
| com.apple.calculator&lt;br /&gt;
|-&lt;br /&gt;
| Calendar&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilecal&lt;br /&gt;
|-&lt;br /&gt;
| Camera&lt;br /&gt;
| &lt;br /&gt;
| com.apple.camera&lt;br /&gt;
|-&lt;br /&gt;
| Contacts&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileAddressBook&lt;br /&gt;
|-&lt;br /&gt;
| iTunes Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileStore&lt;br /&gt;
|-&lt;br /&gt;
| Mail&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilemail&lt;br /&gt;
|-&lt;br /&gt;
| Maps&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Maps&lt;br /&gt;
|-&lt;br /&gt;
| Messages&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileSMS&lt;br /&gt;
|-&lt;br /&gt;
| Phone&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilephone&lt;br /&gt;
|-&lt;br /&gt;
| Photos&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobileslideshow&lt;br /&gt;
|-&lt;br /&gt;
| Settings&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Preferences&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Weitere Bundle-IDs finden Sie [https://github.com/joeblau/apple-bundle-identifiers hier].&lt;br /&gt;
&lt;br /&gt;
= Beispiele =&lt;br /&gt;
Bei den Demo-Testsuiten für expecco finden Sie auch Beispiele für Tests mit dem Mobile Testing Plugin. Wählen Sie dazu auf dem Startbildschirm die Option &amp;quot;&#039;&#039;Beispiel aus Datei&#039;&#039;&amp;quot; und öffnen Sie den Ordner &amp;quot;&#039;&#039;mobile&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;TestsuiteMobileTestingDemo&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m01_MobileTestingDemo.ets --&amp;gt;&amp;lt;/span&amp;gt; &#039;&#039;m01_MobileTestingDemo.ets&#039;&#039; ==&lt;br /&gt;
Die Testsuite enthält zwei einfache Testpläne: &amp;quot;&#039;&#039;Simple CalculatorTest&#039;&#039;&amp;quot; und &amp;quot;&#039;&#039;Complex Calculator and Messaging Test&#039;&#039;&amp;quot;. Beide Tests verwenden einen Android-Emulator, den Sie vor Beginn starten müssen. Die Apps, die im Test verwendet werden, gehören zur Grundausstattung des Emulators und müssen daher nicht mehr installiert werden. Da sich die Apps unter jeder Android-Version unterscheiden können, ist es wichtig, dass Ihr Emulator unter Android 6.0 läuft. Außerdem muss die Sprache auf Englisch gestellt sein.&lt;br /&gt;
&lt;br /&gt;
; Simple CalculatorTest&lt;br /&gt;
: Dieser Test verbindet sich mit dem Taschenrechner und gibt die Formel &#039;&#039;2+3&#039;&#039; ein. Das Ergebnis des Rechners wird mit dem erwarteten Wert &#039;&#039;5&#039;&#039; verglichen.&lt;br /&gt;
&lt;br /&gt;
; Complex Calculator and Messaging Test&lt;br /&gt;
: Dieser Test verbindet sich mit dem Taschenrechner und öffnet anschließend den Nachrichtendienst. Dort wartet er auf eine einkommende Nachricht von der Nummer &#039;&#039;15555215556&#039;&#039;, in der eine zu berechnende Formel gesendet wird. Die Nachricht wird zuvor über einen Socket beim Emulator erzeugt. Nach dem Eintreffen der Nachricht wird diese vom Test geöffnet und deren Inhalt gelesen. Danach wird wieder der Taschenrechner geöffnet, die erhaltene Formel eingegeben und das Ergebnis gelesen. Anschließend wechselt der Test wieder zum Nachrichtendienst und sendet das Ergebnis als Antwort.&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;m02_expeccoMobileDemo.ets&#039;&#039; und &#039;&#039;m03_expeccoMobileDemoIOS.ets&#039;&#039; ==&lt;br /&gt;
Diese sind Bestandteil des Tutorials zum Mobile Testing Plugin. Der jeweils enthaltene Testfall ist unvollständig und wird im Zuge des Tutorials ergänzt. Lesen Sie dazu den Abschnitt [[#Tutorial|Tutorial]].&lt;br /&gt;
&lt;br /&gt;
= Tutorial =&lt;br /&gt;
Es gibt ein Tutorial, das das grundsätzliche Vorgehen zur Erstellung von Tests mit dem Mobile Testing Plugin beschreibt. Grundlage dafür ist ein mitgeliefertes Beispiel, bestehend aus einer einfachen App und einer expecco-Testsuite.&lt;br /&gt;
&lt;br /&gt;
Sie finden es auf der Seite [[Mobile_Testing_Tutorial|Mobile Testing Tutorial]] in zwei Versionen für Android und für iOS.&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsAndroid&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m02_expeccoMobileDemo.ets --&amp;gt;&amp;lt;/span&amp;gt;[[Mobile_Testing_Tutorial#Erste_Schritte_mit_Android|Erste Schritte mit Android]]&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsIOS&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m03_expeccoMobileDemoIOS.ets --&amp;gt;&amp;lt;/span&amp;gt;[[Mobile_Testing_Tutorial#Erste_Schritte_mit_iOS|Erste Schritte mit iOS]]&lt;br /&gt;
&lt;br /&gt;
= Dialoge des Mobile Testing Plugins =&lt;br /&gt;
== Verbindungseditor ==&lt;br /&gt;
Mithilfe des Verbindungseditors können Sie schnell Verbindungen definieren, ändern oder aufbauen. Je nach Aufgabe weist der Dialog kleine Unterschiede auf und wird unterschiedlich geöffnet:&lt;br /&gt;
*Um eine Verbindung aufzubauen, klicken Sie im GUI-Browser auf &amp;quot;&#039;&#039;Verbinden&#039;&amp;quot;&#039; klicken und wählen dann &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot;.&lt;br /&gt;
*Um eine bestehende Verbindung im GUI-Browser zu ändern oder zu kopieren, wählen Sie diese aus, machen einen Rechtsklick und wählen im Kontextmenü &amp;quot;&#039;&#039;Verbindung bearbeiten&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;Verbindung kopieren&#039;&#039;&amp;quot; aus.&lt;br /&gt;
*Wollen Sie Verbindungseinstellungen nicht für den GUI-Browser sondern zur Verwendung in einem Test erstellen, wählen Sie im Menü des Mobile Testing Plugins den Punkt &amp;quot;&#039;&#039;Verbindungseinstellungen erstellen...&#039;&#039;&amp;quot;. Darüber können nur die Einstellungen für eine Verbindung erstellt werden, ohne dass eine Verbindung tatsächlich angelegt wird.&lt;br /&gt;
&lt;br /&gt;
Einige der Schaltflächen sind nur beim Erstellen von Verbindungseinstellungen sichtbar:&lt;br /&gt;
[[Datei:MobileTestingVerbindungseditorMenu.png]]&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen löschen&#039;&#039;&amp;quot;: Setzt alle Einträge zurück. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen aus Datei laden&#039;&#039;&amp;quot;: Erlaubt das Öffnen einer gespeicherten Einstellungsdatei (*.csf). Deren Einstellungen werden in den Dialog übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen aus Anhang laden&#039;&#039;&amp;quot;: Erlaubt das Öffnen eines Anhangs mit Verbindungseinstellungen aus einem geöffneten Projekt. Diese Einstellungen werden in den Dialog übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen in Datei speichern&#039;&#039;&amp;quot; sowie&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen in Anhang speichern&#039;&#039;&amp;quot;: Hier können Sie die eingetragenen Einstellungen in eine Datei (*.csf) speichern oder als Anhang in einem geöffneten Projekt anlegen. Beide Optionen besitzen ein verzögertes Menü, in dem Sie auswählen können, nur einen bestimmten Teil der Einstellungen zu speichern. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Erweiterte Ansicht&#039;&#039;&amp;quot;: Damit können Sie in die erweiterte Ansicht wechseln, um zusätzliche Einstellungen vorzunehmen. Lesen Sie dazu mehr am Ende des Kapitels. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Hilfe&#039;&#039;&amp;quot;: An der rechten Seite wird ein Hilfetext zum jeweiligen Schritt ein- oder ausgeblendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Dialog ist in drei Schritte unterteilt. Im ersten Schritt wählen Sie das Gerät, das Sie verwenden möchten, im zweiten Schritt wählen Sie aus, welche App verwendet werden soll und im letzten Schritt erfolgen die Einstellungen zum Appium-Server.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep1&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 1: Gerät auswählen===&lt;br /&gt;
Im oberen Teil erhalten Sie eine Liste aller angeschlossenen Appium-Geräte, die erkannt werden. Mit der Checkbox darunter können Sie die Geräte ausblenden, die zwar erkannt werden, aber nicht bereit sind. Falls Sie ein Gerät eintragen wollen, das nicht angeschlossen ist, können Sie dies mit dem entsprechenden Knopf &amp;quot;&#039;&#039;Android-Gerät eingeben&#039;&#039;&amp;quot; bzw. &amp;quot;&#039;&#039;iOS-Gerät eingeben&#039;&#039;&amp;quot; anlegen. Dazu müssen Sie jedoch die benötigten Eigenschaften Ihres Geräts kennen. Das Gerät wird dann in einer zweiten Geräteliste angelegt und kann dort ausgewählt werden. Wenn keine Liste mit angeschlossenen Elementen angezeigt werden kann, werden stattdessen verschiedene Meldungen angezeigt:&lt;br /&gt;
*Keine Geräte gefunden&lt;br /&gt;
*:expecco konnte kein Android-Geräte finden.&lt;br /&gt;
*:Um eine Verbindung zu einem Gerät automatisch zu konfigurieren, stellen Sie sicher, dass es&lt;br /&gt;
*:*angeschlossen ist&lt;br /&gt;
*:*eingeschaltet ist&lt;br /&gt;
*:*einen passenden adb-Treiber installiert hat&lt;br /&gt;
*:*für Debugging freigeschaltet ist (siehe unten).&lt;br /&gt;
*Keine verfügbaren Geräte gefunden&lt;br /&gt;
*:expecco konnte keine verfügbaren Android-Geräte finden. Es wurden aber nicht verfügbare gefunden, z.B. mit dem Status &amp;quot;unauthorized&amp;quot;.&lt;br /&gt;
*:Um eine Verbindung zu einem Gerät automatisch zu konfigurieren, stellen Sie sicher, dass es&lt;br /&gt;
*:*angeschlossen ist&lt;br /&gt;
*:*eingeschaltet ist&lt;br /&gt;
*:*einen passenden adb-Treiber installiert hat&lt;br /&gt;
*:*für Debugging freigeschaltet ist (siehe unten).&lt;br /&gt;
*:Um nicht verfügbare Geräte anzuzeigen, aktivieren Sie unten diese Option.&lt;br /&gt;
*Verbindung verloren&lt;br /&gt;
*:expecco hat die Verbindung zum adb-Server verloren. Versuchen Sie die Verbindung wieder herzustellen, indem Sie auf den Button klicken.&lt;br /&gt;
*Verbindung fehlgeschlagen&lt;br /&gt;
*:expecco konnte sich nicht mit dem adb-Server verbinden. Möglicherweise läuft er nicht oder der angegebene Pfad stimmt nicht.&lt;br /&gt;
*:Überprüfen Sie die adb-Konfiguration in den Einstellungen und versuchen Sie den adb-Server zu starten und eine Verbindung herzustellen indem Sie auf den Knopf klicken.&lt;br /&gt;
*Verbinden ...&lt;br /&gt;
*:expecco verbindet sich mit dem adb-Server. Dies kann einige Sekunden dauern.&lt;br /&gt;
*adb-Server starten ...&lt;br /&gt;
*:expecco startet den adb-Server. Dies kann einige Sekunden dauern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Bei &amp;quot;&#039;&#039;Automatisierung durch&#039;&#039;&amp;quot; können Sie angeben, welche Automation-Engine verwendet werden soll. Lassen Sie die Einstellung auf &amp;quot;&#039;&#039;(Default)&#039;&#039;&amp;quot; wird die entsprechende Capability gar nicht gesetzt. Ansonsten stehen Appium, Selendroid und ab expecco 2.11 XCUITest zur Verfügung. In der Regel wird Selendroid nur für Android-Geräte vor Version 4.1 gebraucht.--&amp;gt;Mit &amp;quot;&#039;&#039;Weiter&#039;&#039;&amp;quot; gelangen Sie zum nächsten Schritt. Wenn Sie Einstellungen für den GUI-Browser eingeben, ist das erst möglich, wenn ein Gerät ausgewählt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;UnlockingDeveloperOptions&amp;quot;&amp;gt;Anmerkung zum Freischalten&amp;lt;/span&amp;gt;: In jüngeren Android Versionen werden die Entwickleroptionen zunächst nicht mehr in den Einstellungen angeboten. Falls ihr Android Gerät in den Einstellungen keinen Eintrag zu &amp;quot;&#039;&#039;Entwickleroptionen&#039;&#039;&amp;quot; zeigt, wählen Sie zunächst den Eintrag &amp;quot;&#039;&#039;Telefoninfo&#039;&#039;&amp;quot;, dann &amp;quot;&#039;&#039;SoftwareVersionsInfo&#039;&#039;&amp;quot; und klicken darin mehrfach auf den Eintrag &amp;quot;&#039;&#039;BuildVersion&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Chromedriver verwalten ====&lt;br /&gt;
Wenn die App, die Sie bedienen wollen, WebViews mit Chrome benutzt, benötigt Appium Zugriff auf einen passenden Chromedriver. Wenn Sie ein Gerät in der Liste auswählen, können Sie über &amp;quot;&#039;&#039;Chromedriver verwalten&#039;&#039;&amp;quot; sehen, welche Chrome-Versionen auf dem Gerät vorhanden sind und welche Chromedriver-Versionen durch expecco zur Verfügung stehen. Über diesen Dialog können Sie auch benötigte Chromedriver-Versionen herunterladen. Beachten Sie, dass auf dem Gerät verschiedene Chrome-Versionen vorhanden sein können, da die Apps in ihren WebViews nicht die gleiche Chrome-Version verwenden müssen, wie die als Browser installierte. Damit alles funktioniert, sollte der verwendete Chromedriver zur entsprechenden App passen. Sie können den Pfad zum Chromedriver auch am Ende des Verbindungsdialogs in den erstellten Capabilities ändern.&lt;br /&gt;
&lt;br /&gt;
==== WLAN-Android-Geräte verbinden ====&lt;br /&gt;
Sie können sich auch über WLAN zu Android-Geräten verbinden. Dazu muss das Gerät zunächst mit adb verbunden werden, siehe [[Mobile_Testing_Plugin#Verbindung_.C3.BCber_WLAN|Verbindung über WLAN]]. Ab expecco 22.1 bietet der Verbindungseditor hierfür einen Dialog, der Ihnen dabei hilft und den Sie anstatt der Eingabeaufforderung verwenden können. Für Geräte mit Android 11 oder höher können Sie hier das Gerät mit dem Rechner zu koppeln, indem Sie die entsprechenden Parameter angeben und anschließend die Verbindung unter Angabe von IP-Adresse und Port aufbauen. Sie können damit auch für Geräte, die über USB verbunden sind, eine WLAN-Verbindung aufbauen. Wenn Sie das entsprechende Gerät in der Liste auswählen, werden die benötigten Angaben automatisch ausgelesen.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass der Aufbau einer WLAN-Verbindung nicht Teil der Verbindungseinstellungen ist. Wenn Sie mit den erzeugten Einstellungen eine neue Verbindung aufbauen wollen, müssen Sie sicherstellen, dass das Gerät über mit der angegebenen IP-Adresse und dem Port mit adb verbunden ist, damit es gefunden wird. Die ADB-Verbindung geht verloren, wenn der ADB-Server oder das Gerät neu gestartet werden. Die Erlaubnis für das WLAN-Debugging wird beim Neustart des Geräts auch häufig zurückgesetzt und der Debug-Port kann dann wechseln. Daher muss eine WLAN-Verbindung immer manuell hergestellt werden.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep2&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 2: App auswählen===&lt;br /&gt;
Hier können Sie Angaben zur App machen, die getestet werden soll. Dabei können Sie entscheiden, ob Sie eine App verwenden wollen, die bereits auf dem Gerät installiert ist, oder ob für den Test eine App installiert werden soll. Wählen Sie oben den entsprechenden Reiter aus. Je nachdem, ob Sie im vorigen Schritt ein Android- oder ein iOS-Gerät ausgewählt haben, ändert sich die erforderte Eingabe.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Android&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App auf dem Gerät&#039;&#039;&lt;br /&gt;
**:Wenn Sie im ersten Schritt ein angeschlossenes Gerät ausgewählt haben, werden die Pakete aller installierten Apps automatisch abgerufen und Sie können die Auswahl aus den Drop-down-Listen treffen. Die installierten Apps sind in Fremdpakete und Systempakete unterteilt; wählen Sie die entsprechende Paketliste aus. Diese Auswahl gehört nicht zu den Einstellungen, sondern stellt nur die entsprechende Paketliste zur Verfügung. Sie können den Filter benutzen, um die Liste weiter einzuschränken und dann das gewünschte Paket auswählen. Die Activities des ausgwählten Pakets werden ebenfalls automatisch abgerufen und als Drop-down-Liste zur Verfügung gestellt. Wählen Sie die Activity aus, die gestartet werden soll. In der Regel wird automatisch eine Activity aus der Liste eingetragen. Falls Sie kein verbundenes Gerät verwenden, müssen Sie die Eingabe des Pakets und der Activity von Hand vornehmen.&lt;br /&gt;
**&#039;&#039;App installieren&#039;&#039;&lt;br /&gt;
**:Geben Sie bei &amp;quot;&#039;&#039;App&#039;&#039;&amp;quot; den Pfad zu einer App an. Der Pfad muss für den Appium-Server gültig sein, der verwendet wird. Sie können auch eine URL angeben. Benutzen Sie einen lokalen Appium-Server, können Sie den rechten Butten benutzen, um zu der Installationsdatei der App zu navigieren und diesen Pfad einzutragen. Wenn möglich werden dabei auch das entsprechende Paket und die Activity in den Feldern darunter eingetragen. Diese Angabe ist aber nicht notwendig.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;iOS&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App auf dem Gerät&#039;&#039;&lt;br /&gt;
**:Geben Sie die Bundle-ID einer installierten App an. Sie können die IDs der installierten Apps bspw. mithilfe von Xcode erfahren. Starten Sie dazu Xcode und wählen Sie in der Menüleiste am oberen Bildschirmrand im Menü &amp;quot;&#039;&#039;Window&#039;&#039;&amp;quot; den Eintrag &amp;quot;&#039;&#039;Devices&#039;&#039;&amp;quot;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wenn Sie Ihr Gerät auswählen, sehen Sie in der Übersicht eine Auflistung der von Ihnen installierten Apps.&lt;br /&gt;
**&#039;&#039;App installieren&#039;&#039;&lt;br /&gt;
**:Geben Sie bei &amp;quot;&#039;&#039;App&#039;&#039;&amp;quot; den Pfad zu einer App an. Der Pfad muss für den Appium-Server gültig sein, der verwendet wird. Sie können auch eine URL angeben. Zu den Vorraussetzungen an Apps für reale Geräte lesen Sie bitte den Abschnitt [[#iOS-Ger.C3.A4t_und_App_vorbereiten|iOS-Geräte und App vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
Im unteren Teil können Sie festlegen, ob die App beim Verbindungsabbau zurückgesetzt bzw. deinstalliert werden soll, und ob sie initial zurückgesetzt werden soll. Auch hier wird die entsprechende Capability gar nicht gesetzt, wenn Sie &amp;quot;&#039;&#039;(Default)&#039;&#039;&amp;quot; auswählen. Mit &amp;quot;&#039;&#039;Weiter&#039;&#039;&amp;quot; gelangen Sie zum nächsten Schritt.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep3&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 3: Servereinstellungen===&lt;br /&gt;
Im letzten Schritt befindet sich zunächst im oberen Teil eine Liste aller Capabilities, die sich aus Ihren Angaben der vorigen Schritte ergeben. Wenn Sie sich mit Appium auskennen und noch zusätzliche Capabilities setzen möchten, die der Verbindungseditor nicht abdeckt, können Sie durch Klicken auf &amp;quot;&#039;&#039;Bearbeiten&#039;&#039;&amp;quot; in die erweiterte Ansicht gelangen. Lesen Sie dazu den Abschnitt weiter unten.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Einstellungen für den GUI-Browser eingeben, können Sie den &#039;&#039;Verbindungsnamen&#039;&#039; eintragen, mit dem die Verbindung angezeigt wird. Dies ist auch der Name unter dem Bausteine diese Verbindung verwenden können, wenn sie aufgebaut ist. Wenn Sie das Feld frei lassen, wird ein Name generiert. Wenn der Haken für &amp;quot;&#039;&#039;Von expecco gesteuert&#039;&#039;&amp;quot; gesetzt ist, wird expecco einen lokalen Appium-Server an einem freien Port starten, oder einen bereits gestarteten freien Server verwenden. Um einen eigenen Server zu verwenden, schalten Sie diese Funktion ab und geben Sie die entsprechende Adresse ein. Sie erhalten die lokale Standard-Adresse und bereits verwendete Adressen zur Auswahl.&lt;br /&gt;
&lt;br /&gt;
In älteren expecco-Versionen ist der Haken mit &amp;quot;&#039;&#039;Bei Bedarf starten&#039;&#039;&amp;quot; beschriftet. In diesem Fall müssen Sie auch eine Adresse angeben, wenn expecco den Server starten soll. expecco versucht dann beim Verbinden einen Appium-Server an der angegebenen Adresse zu starten, wenn dort noch keiner läuft. Dieser Server wird dann beim Beenden der Verbindung ebenfalls heruntergefahren. Dies funktioniert nur für lokale Adressen. Achten Sie darauf, nur Portnummern zu verwenden, die auch frei sind. Verwenden Sie am besten nur ungerade Portnummern ab dem Standardport 4723. Beim Verbindungsaufbau wird ebenfalls die folgende Portnummer verwendet, wodurch es sonst zu Konflikten kommen könnte. &lt;br /&gt;
&lt;br /&gt;
Je nachdem, wie Sie den Dialog geöffnet haben, gibt es nun verschiedene Schaltflächen um ihn abzuschließen. In jedem Fall haben Sie die Option zu speichern. Dabei öffnet sich ein Dialog, indem Sie entweder ein geöffnet Projekt auswählen können, um die Einstellungen dort als Anhang zu speichern, oder auswählen es in einer Datei zu speichern, die Sie anschließend angeben können. Durch das Speichern wird der Dialog nicht beendet, wodurch Sie anschließend noch eine andere Option auswählen könnten.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie den Editor zum Verbindungsaufbau geöffnet haben, können Sie abschließend auf &amp;quot;&#039;&#039;Verbinden&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;Server starten und verbinden&#039;&#039;&amp;quot; klicken, je nachdem, ob der Haken für den Serverstart gesetzt ist. Für das Ändern oder Kopieren einer Verbindung im GUI-Brower heißt diese Option &amp;quot;&#039;&#039;Übernehmen&#039;&#039;&amp;quot;, da in diesem Fall nur der Verbindungseintrag geändert bzw. neu angelegt wird, der Verbindungsaufbau aber nicht gestartet wird. Das können Sie bei Bedarf anschließend über das Kontextmenü tun. Falls Sie Capabilities einer bestehenden Verbindung geändert haben, fordert Sie anschließend ein Dialog auf zu entscheiden, ob diese Änderungen direkt übernommen werden sollen, indem die Verbindung abgebaut und mit den neuen Verbindungen aufgebaut wird, oder nicht. In diesem Fall werden die Änderungen erst wirksam, nachdem Sie die Verbindung neu aufbauen.&lt;br /&gt;
&lt;br /&gt;
Zur Verwendung des Verbindungseditors lesen Sie auch den entsprechenden Abschnitt im jeweiligen Tutorial in Schritt 1 (Android: [[Mobile_Testing_Tutorial#Schritt_1:_Demo_ausf.C3.BChren|Demo ausführen]], iOS: [[Mobile_Testing_Tutorial#Schritt_1:_Demo_ausf.C3.BChren_.28iOS.29|Demo ausführen (iOS)]]).&lt;br /&gt;
&lt;br /&gt;
===Erweiterte Ansicht===&lt;br /&gt;
Die erweiterte Ansicht des Verbindungseditors erhalten Sie entweder durch Klicken auf &amp;quot;&#039;&#039;Bearbeiten&#039;&#039;&amp;quot; im dritten Schritt oder jederzeit über den entsprechenden Menüeintrag, wenn Sie den Editor über das Plugin-Menü gestartet haben. In dieser Ansicht erhalten Sie eine Liste aller eingestellten Appium-Capabilities. Zu dieser können Sie weitere hinzufügen, Einträge ändern oder entfernen. Um eine Capability hinzuzufügen, wählen Sie diese aus der Drop-down-Liste des Eingabefelds aus. In dieser befinden sich alle bekannten Capabilities sortiert in die Kategorien &#039;&#039;Common&#039;&#039;, &#039;&#039;Android&#039;&#039; und &#039;&#039;iOS&#039;&#039;. Haben Sie eine Capability ausgewählt, wird ein kurzer Informationstext dazu angezeigt. Sie können in das Feld auch von Hand eine Capability eingeben. Klicken Sie dann auf &amp;quot;&#039;&#039;Hinzufügen&#039;&#039;&amp;quot;, um die Capabilitiy in die Liste einzutragen. Dort können Sie in der rechten Spalte den Wert setzen. Um einen Entrag zu löschen, wählen Sie diesen aus und klicken Sie auf &amp;quot;&#039;&#039;Entfernen&#039;&#039;&amp;quot;. Mit &amp;quot;&#039;&#039;Zurück&#039;&#039;&amp;quot; verlassen Sie die erweiterte Ansicht.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingErweiterteAnsicht.png]]&lt;br /&gt;
&lt;br /&gt;
== Laufende Appium-Server ==&lt;br /&gt;
Im Menü des Mobile Testing Plugins finden Sie den Eintrag &amp;quot;&#039;&#039;Appium-Server...&#039;&#039;&amp;quot;. Mit diesem öffnen Sie ein Fenster mit einer Übersicht aller Appium-Server, die von expecco gestartet wurden und auf welchem Port diese laufen. Durch Klicken auf das Icon in der Spalte &amp;quot;&#039;&#039;Log anzeigen&#039;&#039;&amp;quot; können Sie das Logfile des entsprechenden Servers anschauen. Dieses wird beim Beenden des Servers wieder gelöscht. Mit den Icons in der Spalte &amp;quot;&#039;&#039;Beenden&#039;&#039;&amp;quot; kann der entsprechenden Server beendet werden. Allerdings wird dies verhindert, wenn expecco über diesen Server noch eine offene Verbindung hat. Für welche Verbindung ein Server verwendet wird, sehen Sie in der rechten Spalte. Steht dort &#039;&#039;&amp;lt;idle&amp;gt;&#039;&#039; wird er zur Zeit nicht von expecco verwendet.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAppiumServer.png]]&lt;br /&gt;
&lt;br /&gt;
Beim Öffnen des Editors um eine Appium-Verbindung aufzubauen, wird direkt ein Appium-Server gestartet, um den folgenden Verbindungsaufbau zu beschleunigen. Zu diesem Zweck hält sich expecco auch immer einen freien Appium-Server offen. Weitere laufende Server, die nicht mehr verwendet werden, werden jedoch nach einiger Zeit automatisch beendet.&lt;br /&gt;
&lt;br /&gt;
Im Menü des Mobile Testing Plugins finden Sie auch den Eintrag &amp;quot;&#039;&#039;Alle Verbindungen und Server beenden&#039;&#039;&amp;quot;. Dies ist für den Fall gedacht, dass Verbindungen oder Server auf andere Weise nicht beendet werden können. Beenden Sie Verbindungen wenn möglich immer im GUI-Browser oder durch Ausführen eines entsprechenden Bausteins. Server, die Sie in der Server-Übersicht gestartet haben, beenden Sie dort; Server, die mit einer Verbindung gestartet wurden, werden automatisch mit dieser beendet.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass in der Übersicht nur Server aufgelistet sind, die von expecco gestartet und verwaltet werden. Mögliche andere Appium-Server, die auf andere Art gestartet wurden, werden nicht erkannt.&lt;br /&gt;
&lt;br /&gt;
== Recorder ==&lt;br /&gt;
Besteht im GUI-Browser eine Verbindung zu einem Gerät, kann der integrierte Recorder verwendet werden, um mit diesem Gerät einen Testabschnitt aufzunehmen. Sie starten den Recorder, indem Sie im GUI-Browser die entsprechende Verbindung auswählen und dann auf den Aufnahme-Knopf klicken. Für den Recorder öffnet sich ein neues Fenster. Die aufgezeichneten Aktionen werden im Arbeitsbereich des GUI-Browsers angelegt. Daher ist es möglich, das Aufgenommene parallel zu editieren.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingRecorder.png|caption|]]&lt;br /&gt;
&lt;br /&gt;
====Komponenten des Recorderfensters====&lt;br /&gt;
#&#039;&#039;&#039;Aufnahme fortsetzen/pausieren&#039;&#039;&#039;: Über das rechte Symbol können Sie die Aufnahme pausieren. Sie sehen dann ein großes Pause-Symbol in der Anzeige. Alle Aktionen, die Sie währenddessen im Recorder machen werden zwar ausgeführt, es werden aber keine Bausteine aufgezeichnet. Über das linke Symbol können Sie dann wieder in den normalen Aufnahmemodus wechseln.&lt;br /&gt;
#&#039;&#039;&#039;Aufnahme stoppen&#039;&#039;&#039;: Stoppt die Aufnahme und schließt das Recorderfenster.&lt;br /&gt;
#&#039;&#039;&#039;Aktualisieren&#039;&#039;&#039;: Holt das aktuelle Bild und den aktuellen Elementbaum vom Gerät. Dies wird nötig, wenn das Gerät zur Ausführung einer Aktion länger braucht oder sich etwas ohne das Anstoßen durch den Recorder ändert. Seit expecco 21.2 gibt es hier zusätzlich ein Untermenü, mit dem automatisches Aktualisieren angeschaltet werden kann, indem im Hintergrund auf Änderungen geprüft wird (siehe auch &#039;&#039;Automatisches Aktualisieren&#039;&#039; weiter unten).&lt;br /&gt;
#&#039;&#039;&#039;Follow-Mouse&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird im GUI-Browser ausgewählt.&lt;br /&gt;
#&#039;&#039;&#039;Element-Highlighting&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird rot umrandet.&lt;br /&gt;
#&#039;&#039;&#039;Elemente einzeichnen&#039;&#039;&#039;: Die Rahmen aller Elemente der Ansicht werden angezeigt.&lt;br /&gt;
#&#039;&#039;&#039;Werkzeuge&#039;&#039;&#039;: Auswahl, mit welchem Werkzeug aufgenommen werden soll. Die gewählte Aktion wird bei einem Klick auf die Anzeige ausgelöst. Dabei stehen folgende Aktionen zur Verfügung:&lt;br /&gt;
#*Aktionen auf Elemente:&lt;br /&gt;
#**Klicken: Kurzer Klick auf das Element, über dem der Cursor steht. Zur genaueren Bestimmung, welches Element verwendet wird, benutzen Sie die Funktion Follow-Mouse oder Element-Highlighting.&lt;br /&gt;
#**Antippen mit Dauer (Element): Ähnlich zum Klicken, nur dass zusätzlich die Dauer des Klicks aufgezeichnet wird. Dadurch sind auch längere Klicks möglich.&lt;br /&gt;
#**Antippen mit Position (Element): Ähnlich zum Klicken, aber zusätzlich wird die Position innerhalb des Elements aufgenommen. Die Position kann relativ zur Größe des Elements aufgenommen werden oder, wenn Sie dabei Strg gedrückt halten, absolut zur linken oberen Ecke des Elements.&lt;br /&gt;
#**Text setzen: Ermöglicht das Setzen eines Textes in Eingabefelder.&lt;br /&gt;
#**Text löschen: Löscht den Text eines Eingabefelds.&lt;br /&gt;
#*Aktionen auf das Gerät:&lt;br /&gt;
#**Antippen (Bildschirm): Löst einen Klick auf die Bildschirmposition aus.&lt;br /&gt;
#**Antippen mit Dauer (Bildschirm): Löst einen Klick auf die Bildschirmposition aus, bei dem auch die Dauer berücksichtigt wird.&lt;br /&gt;
#**Wischen: Wischen in einer geraden Linie vom Punkt des Drückens des Mausknopfes bis zum Loslassen. Die Dauer wird ebenfalls aufgezeichnet.&lt;br /&gt;
#:Beachten Sie bei diesen Aktionen, dass das Ergebnis sich auf verschiedenen Geräten unterscheiden kann, bspw. bei verschiedenen Bildschirmauflösungen.&lt;br /&gt;
#*Erstellen von Testablauf-Bausteinen&lt;br /&gt;
#**Attribut prüfen: Vergleicht den Wert eines festgelegten Attributs des Elements mit einem vorgegebenen Wert. Das Ergebnis triggert den entsprechenden Ausgang.&lt;br /&gt;
#**Attribut zusichern: Vergleicht den Wert eines festgelegten Attributs des Elements mit einem vorgegebenen Wert. Bei Ungleichheit schlägt der Test fehl.&lt;br /&gt;
#**Attribut holen: Liest den aktuellen Wert eines Attributs aus.&lt;br /&gt;
#*Automatisch&lt;br /&gt;
#:Ist das Auto-Werkzeug ausgewählt, können alle Aktionen durch spezifische Eingabeweise benutzt werden: &#039;&#039;Klicken&#039;&#039;, &#039;&#039;Element antippen&#039;&#039; und &#039;&#039;Wischen&#039;&#039; funktionieren weiterhin durch Klicken, wobei sie anhand der Dauer und der Bewegung des Cursors unterschieden werden. Um ein &#039;&#039;Antippen&#039;&#039; auszulösen, halten Sie beim Klicken Strg gedrückt. Die übrigen Aktionen erhalten Sie durch einen Rechtsklick auf das Element in einem Kontextmenü.&lt;br /&gt;
#&#039;&#039;&#039;Kontext-Aktionen&#039;&#039;&#039;: Hier können Sie Aktionen aufzeichnen, die Kontexte betreffen:&lt;br /&gt;
#*Zu Kontext wechseln: Bietet eine Liste der aktuell verfügbaren Kontexte und Sie können auswählen, zu welchem gewechselt werden soll.&lt;br /&gt;
#*Aktuellen Kontext holen: Holt den Handle des aktuellen Kontexts.&lt;br /&gt;
#*Kontext-Handles holen: Holt eine Liste aller aktuell verfügbaren Kontext-Handles.&lt;br /&gt;
#&#039;&#039;&#039;Softkeys&#039;&#039;&#039;: Nur unter Android. Simuliert das Drücken der Knöpfe Zurück, Home, Fensterliste und Power.&lt;br /&gt;
#&#039;&#039;&#039;Home-Button&#039;&#039;&#039;: Nur unter iOS ab expecco 2.11. Ermöglicht das Drücken des Home-Buttons. Vor expecco 19.2 funktioniert es nur, wenn AssistiveTouch aktiviert ist und sich das Menü in der Mitte des oberen Bildschirmrands befindet. Ab expecco 19.2 verwendet die Funktion kein AssistiveTouch mehr.&lt;br /&gt;
#&#039;&#039;&#039;Hilfe&#039;&#039;&#039;: Öffnet diese Online-Dokumentation auf der allgemeinen Seite zu [[GuiBrowser_Recorder|GUI-Browser Recordern]].&lt;br /&gt;
#&#039;&#039;&#039;Anzeige&#039;&#039;&#039;: Zeigt einen Screenshot des Geräts. Aktionen werden mit der Maus je nach Werkzeug ausgelöst. Wenn eine neue Aktion eingegeben werden kann, hat das Fenster einen grünen Rahmen, sonst ist er rot.&lt;br /&gt;
#&#039;&#039;&#039;Fenster an Bild anpassen&#039;&#039;&#039;: Ändert die Größe des Fensters so, dass der Screenshot vollständig angezeigt werden kann.&lt;br /&gt;
#&#039;&#039;&#039;Bild an Fenster anpassen&#039;&#039;&#039;: Skaliert den Screenshot auf eine Größe, mit der er die volle Größe des Fensters ausnutzt.&lt;br /&gt;
#&#039;&#039;&#039;Ansicht anpassen&#039;&#039;&#039;: Öffnet einen Dialog um die Ansicht anzupassen, falls expecco das Bild nicht richtig darstellt. Sie können die Skalierung anpassen oder das Bild um 90° drehen.&lt;br /&gt;
#&#039;&#039;&#039;Ausrichtung anpassen&#039;&#039;&#039;: Korrigiert das Bild, falls dieses auf dem Kopf stehen sollte. Über den Pfeil rechts daneben kann das Bild auch um 90° gedreht werden, falls dies einmal nötig sein sollte. Ab expecco 19.1 finden Sie diese Funktion in &#039;&#039;Ansicht anpassen&#039;&#039;. Die Ausrichtung des Bildes ist für die Funktion des Recorders unerheblich, dieser arbeitet ausschließlich auf den erhaltenen Elementen.&lt;br /&gt;
#&#039;&#039;&#039;Skalierung&#039;&#039;&#039;: Ändert die Skalierung des Screenshots.&lt;br /&gt;
#&#039;&#039;&#039;Meldungen&#039;&#039;&#039;: Zeigt den Pfad des ausgewählten Elements oder andere Meldungen an. Es gibt ein Kontextmenü, um eine Liste der vorigen Meldungen zu sehen.&lt;br /&gt;
&lt;br /&gt;
====Verwendung====&lt;br /&gt;
Mit jedem Klick im Fenster wird eine Aktion ausgelöst und im Arbeitsbereich des GUI-Browsers aufgezeichnet. Dort können Sie das Aufgenommene abspielen, editieren oder daraus einen neuen Baustein erstellen.&lt;br /&gt;
Aktionen zum Auslösen von Sofkeys finden Sie direkt in der Menüleiste (s.o.). Um Aktionen auf Elemente aufzuzeichen, ändern Sie entweder die Auswahl des Werkzeugs in der Menüleiste (s.o.) und klicken dann auf das Element oder wählen Sie die entsprechende Aktion aus dem Kontextmenü durch einen Rechtsklick auf das entsprechende Element aus. Für Texteingabe ist es zudem möglich, den Cursor über dem Element zu platzieren und den Text einzugeben. Dabei öffnet sich der Eingabedialog für diese Aktion.&lt;br /&gt;
Zur Verwendung des Recorders lesen Sie auch Schritt 2 im Tutorial ([[Mobile_Testing_Tutorial#Schritt_2:_Einen_Baustein_mit_dem_Recorder_erstellen|Android]] bzw. [[Mobile_Testing_Tutorial#Schritt_2:_Einen_Baustein_mit_dem_Recorder_erstellen_.28iOS.29|iOS]]).&lt;br /&gt;
&lt;br /&gt;
====Elemente verbergen====&lt;br /&gt;
Ab expecco 21.2 gibt es im Kontextmenü außerdem die Möglichkeit, das ausgewählte Element im Recorder zu verbergen. Das bedeutet, dass dieses Element fortan nicht mehr ausgewählt werden kann. Diese Funktion eignet sich dazu, Elemente zu ignorieren, die im Vordergrund liegen, um auf Elemente darunter zugreifen zu können. Um diesen Zustand wieder rückgängig zu machen, müssen Sie das entsprechende Element im Baum des GUI-Browsers finden, dort gibt es im Kontextmenü ebenfalls einen solchen Eintrag.&lt;br /&gt;
&lt;br /&gt;
====Automatisches Aktualisieren====&lt;br /&gt;
Der Recorder zeigt kein Livebild des Geräts sondern nur eine Momentaufnahme. Um mit der Anzeige auf dem Gerät übereinzustimmen muss daher nach Änderungen aktualisiert werden. Der Recorder aktualisiert sich automatisch, nachdem er eine Aktion ausgeführt hat. Ab expecco 20.2 sind zudem weitere automatische Updates möglich. Sie können Sie im Menü &#039;&#039;Fenster&#039;&#039; aktivieren.&lt;br /&gt;
&lt;br /&gt;
Zum einen kann kurze Zeit nach dem Ausführen einer Aktion überprüft werden, ob es noch Änderungen nach der ersten Aktualisierung gegeben hat, damit in diesem Fall eine zweite Aktualisierung stattfinden kann. Dies soll das Problem beheben, dass der Recorder nach einer Aktion nicht aktuell ist, weil die Aktualisierung zu früh stattgefunden hat.&lt;br /&gt;
&lt;br /&gt;
Zum anderen kann eine periodische Aktualisierung eingeschaltet werden. Nach einem einstellbaren Interval wird der Recorder automatisch aktualisiert, sollte es Änderungen geben. Dadurch ist die Anzeige im Recorder immer weitgehend aktuell, allerdings entsteht dadurch auch ein Mehraufwand was die Kommunikation mit dem Gerät betrifft.&lt;br /&gt;
&lt;br /&gt;
== AVD Manager und SDK Manager ==&lt;br /&gt;
AVD Manager und SDK Manager sind beides Anwendungen von Android. Im Menü des Mobile Testing Plugins bietet expecco die Möglichkeit, diese zu starten. Ansonsten finden Sie diese Programme bei Ihrer Android-Installation. Mit dem AVD Manager können Sie AVDs, also Konfigurationen für Emulatoren, erstellen, bearbeiten und starten. Mit dem SDK Manager erhalten Sie einen Überblick über Ihre Android-Installation und können diese bei Bedarf erweitern.&lt;br /&gt;
&lt;br /&gt;
= Hybrid-Apps und WebViews =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;!!! WICHTIGER HINWEIS - Wenn Sie Probleme haben, auf den Webview zu wechseln, geben Sie bitte unter den Android Einstellungen - Apps -Standard Apps &amp;quot;Chrome&amp;quot; als &amp;quot;Browser-App&amp;quot; an !!!&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hybrid-Apps enthalten neben den Plattform-nativen Elementen weitere Elemente, die in einen WebView eingebunden sind. Diese Elemente können ebenfalls bedient werden, allerdings muss zuvor in den entsprechenden Kontext gewechselt werden. Mit dem Baustein &amp;quot;&#039;&#039;Get Current Context&#039;&#039;&amp;quot; erhalten Sie den aktuellen Kontext. Zu Beginn ist dies &amp;quot;&#039;&#039;NATIVE_APP&#039;&#039;&amp;quot;, also der Kontext der nativen Elemente. Mit dem Baustein &amp;quot;&#039;&#039;Get Context Handles&#039;&#039;&amp;quot; bekommen Sie eine Collection aller vorhandenen Kontexte. Gibt es einen WebView-Kontext, so heißt dieser &amp;quot;&#039;&#039;WEBVIEW_1&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;WEBVIEW_&amp;lt;package&amp;gt;&#039;&#039;&amp;quot; mit dem Paket des WebViews. Es kann auch mehrere WebView-Kontexte geben. Zu jedem WebView-Kontext gibt es im nativen Kontext ein entsprechendes WebView-Element. Mit dem Baustein &amp;quot;&#039;&#039;Switch to Context&#039;&#039;&amp;quot; können Sie in einen solchen Kontext wechseln und haben fortan nur Zugriff auf die Elemente in diesem Kontext.&lt;br /&gt;
&lt;br /&gt;
Im GUI-Browser werden zum einen oben im Baum die vorhandenen Kontexte angezeigt, zum anderen wird der Baum eines Kontexts unterhalb des entsprechenden WebView-Elements eingefügt.&lt;br /&gt;
&lt;br /&gt;
= XPath anpassen mithilfe des GUI-Browsers =&lt;br /&gt;
Bausteine, die auf einem Gerät fehlerfrei funktionieren, tun dies auf anderen Geräten möglicherweise nicht. Auch können kleine Änderungen der App dazu führen, dass ein Baustein nicht mehr den gewünschten Effekt hat. Man sollte einen Baustein daher so robust formulieren, dass er für eine Vielzahl von Geräten verwendet werden kann und kleine Anpassungen an der App verkraftet. Dazu muss man das grundlegende Funktionsprinzip der Adressierung verstehen. Dies wird im Folgenden am Beispiel der App aus dem Tutorial erläutert.&lt;br /&gt;
&lt;br /&gt;
Die Ansicht der App setzt sich aus einzelnen Elementen zusammen. Dazu gehören die Schaltflächen &amp;quot;&#039;&#039;GTIN-13 (EAN-13)&#039;&#039;&amp;quot; und &amp;quot;&#039;&#039;Verify&#039;&#039;&amp;quot;, das Eingabefeld der Zahl &amp;quot;&#039;&#039;4006381333986&#039;&#039;&amp;quot; und das Ergebnisfeld, in dem OK erscheint, wie auch alle anderen auf der Anzeige sichtbaren Dinge. Diese sichtbaren Elemente sind in unsichtbare Strukturelemente eingebettet. Alle Elemente zusammen sind in einer zusammenhängenden Hierarchie, dem Elementbaum, organisiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingGUIBrowser.png | frame | left | Abb. 1: Funktionen des GUI-Browsers]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
Sie können sich diesen Baum im GUI-Browser ansehen. Wechseln Sie dazu in den GUI-Browser (Abb. 1) und starten Sie eine beliebige Verbindung. Sobald die Verbindung aufgebaut ist, können Sie den gesamten Baum aufklappen (1) (Klick bei gedrückter Strg-Taste). Er enthält alle Elemente der aktuellen Seite der App.&lt;br /&gt;
&lt;br /&gt;
Ein Baustein, der nun ein bestimmtes Element verwendet, muss dieses eindeutig angeben, indem er dessen Position im Elementbaum mit einem Pfad im XPath-Format beschreibt. Dieses Format ist ein verbreiteter Web-Standard für XML-Dokumente und -Datenbanken, eignet sich aber genauso für Pfade im Elementbaum.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie ein Element im Baum auswählen, wird unten der von expecco automatisch generierte XPath (2) für das Element angezeigt, der auch beim Aufzeichnen verwendet wird. Oberhalb davon in der Mitte des Fensters befindet sich eine Liste der Eigenschaften (3) des ausgewählten Elements. Man nennt diese Eigenschaften auch Attribute. Sie beschreiben das Element näher wie beispielsweise seinen Typ, seinen Text oder andere Informationen zu seinem Zustand. Links unten können Sie zur besseren Orientierung im Baum die &#039;&#039;Vorschau&#039;&#039; (4) aktivieren, um sich den Bildausschnitt des Elements anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Der Elementbaum für gleiche Ansicht einer App kann sich je nach Gerät unterscheiden. Es sind diese Unterschiede, die verhindern, eine Aufnahme von einem Gerät unverändert auch auf allen anderen Geräten abzuspielen: Ein XPath, der im einen Elementbaum ein bestimmtes Element identifiziert, beschreibt nicht unbedingt das gleiche Element im Elementbaum auf einem anderen Gerät. Es kann stattdessen passieren, dass der XPath auf kein Element, auf ein falsches Element oder auf mehrere Elemente passt. Dann schlägt der Test fehl oder er verhält sich unerwartet.&lt;br /&gt;
&lt;br /&gt;
Man könnte natürlich für jedes Gerät einen eigenen Testfall schreiben. Das brächte aber unverhältnismäßigen Aufwand bei Testerstellung und -wartung mit sich. Das Problem lässt sich auch anders lösen, da ein jeweiliges Element nicht nur durch genau einen XPath beschrieben wird. Vielmehr erlaubt der Standard mithilfe verschiedener Merkmale unterschiedliche Beschreibungen für ein und dasselbe Element zu formulieren. Das Ziel ist daher, einen Pfad zu finden, der auf allen für den Test verwendeten Geräten funktioniert und überall eindeutig zum richtigen Element führt.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel besteht die Verbindung zur Android-App aus dem Tutorial und der Eintrag des &amp;quot;&#039;&#039;GTIN-13&#039;&#039;&amp;quot;-Buttons ist ausgewählt (5). Dessen automatisch generierter XPath (2) kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[@resource id=&#039;android:id/content&#039;]/android.widget.RelativeLayout/android.widget.Button[@resource-id=&#039;de.exept.expeccomobiledemo:id/gtin_13&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Er ist offensichtlich lang und unübersichtlich. Der sehr viel kürzere Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@text=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
führt zum selben Element.&lt;br /&gt;
&lt;br /&gt;
Für die iOS-App lautet der automatisch generierte XPath für diesen Button beispielsweise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/XCUIElementTypeApplication/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/UIAApplication/UIAWindow[1]/UIAButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und kann kürzer als&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@name=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Sie können den Pfad entsprechend im GUI-Browser ändern und durch &amp;quot;&#039;&#039;Pfad überprüfen&#039;&#039;&amp;quot; (6) feststellen, ob er weiterhin auf das ausgewählte Element zeigt, was expecco mit &amp;quot;&#039;&#039;Verify Path: OK&#039;&#039;&amp;quot; (7) bestätigen sollte. Der erste, sehr viel längere Pfad, beschreibt den gesamten Weg vom obersten Element des Baumes bis hin zum gesuchten Button. Der zweite Pfad hingegen wählt mit &amp;quot;*&amp;quot; zunächst sämtliche Elemente des Baumes und schränkt die Auswahl dann auf genau die Elemente ein, die ein &#039;&#039;text&#039;&#039;- bzw. &#039;&#039;name&#039;&#039;-Attribut mit dem Wert &amp;quot;&#039;&#039;GTIN-13 (EAN-13)&#039;&#039;&amp;quot; besitzen, in unserem Fall also genau der eine Button, den wir suchen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden Android-ähnliche Pfade zur Veranschaulichung verwendet. Die Elemente in iOS-Apps heißen zwar anders, wodurch andere Pfade entstehen; das Prinzip ist jedoch das gleiche.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum1.png | frame | Abb. 2: Elementbaum einer fiktiven App]]&lt;br /&gt;
&lt;br /&gt;
Sie können solche Pfade mit Hilfe weniger Regeln selbst formulieren. Sehen Sie sich den einfachen Baum einer fiktiven Android-App in Abb. 2 an: Die Einrückungen innerhalb des Baumes geben die Hierarchie der Elemente wieder. Ein Element ist ein &#039;&#039;Kind&#039;&#039; eines anderen Elementes, wenn jenes andere Element das nächsthöhere Element mit einem um eins geringeren Einzug ist. Jenes Element ist das &#039;&#039;Elternelement&#039;&#039; des Kindes. Sind mehrere untereinander stehende Elemente gleich eingerückt, so sind sie also alle Kinder desselben Elternelements.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad durch alle Ebenen der Hierarchie zum TextView-Element ist nun:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Elemente sind mit Schrägstrichen voneinander getrennt. Es fällt auf, dass der Name des ersten Elements nicht mit dem im Baum übereinstimmt. Das oberste Element in der Hierarchie heißt immer &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot; (für iOS wäre es &amp;quot;&#039;&#039;AppiumAUT&#039;&#039;&amp;quot;), expecco zeigt im Baum stattdessen den Namen der Verbindung an, damit man mehrere Verbindungen voneinander unterscheiden kann. Die weiteren Elemente tragen jeweils das Präfix &amp;quot;&#039;&#039;android.widget.&#039;&#039;&amp;quot;, das im Baum zur besseren Übersicht nicht angezeigt wird. Bei IOS gibt es kein Präfix, das durch einen Punkt abgetrennt wäre, expecco 2.11 blendet aber entsprechend &amp;quot;&#039;&#039;XCUIElementType&#039;&#039;&amp;quot; am Anfang aus. Mit jedem Schrägstrich führt der Pfad über eine Eltern-Kind-Beziehung in eine tiefere Hierarchie-Ebene, d. h. &amp;quot;&#039;&#039;FrameLayout&#039;&#039;&amp;quot; ist ein Kindelement von &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot;, &amp;quot;&#039;&#039;LinearLayout&#039;&#039;&amp;quot; ist ein Kind von &amp;quot;&#039;&#039;FrameLayout&#039;&#039;&amp;quot; usw. Die in eckigen Klammern geschriebenen Wörter dienen nur als Orientierungshilfe im Baum. Sie gehören nicht zum Typ.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad muss nicht beim Element &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot; beginnen. Man kann den Pfad beginnend mit einem beliebigen Element des Baumes bilden. Man kann also verkürzt auch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
schreiben. Der Pfad führt zum selben &amp;quot;&#039;&#039;TextView&#039;&#039;&amp;quot;-Element, da es nur ein Element dieses Typs gibt. Anders verhält es sich bei dem Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da es zwei Elemente vom Typ &amp;quot;&#039;&#039;Button&#039;&#039;&amp;quot; gibt, passt dieser Pfad auf zwei Elemente, nämlich den Button, der mit &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; markiert ist, und den &#039;&#039;Button&#039;&#039;, der mit &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; markiert ist. Es würde an dieser Stelle aber auch nicht helfen den langen Pfad von &#039;&#039;hierarchy&#039;&#039; aus beginnend anzugeben. Um einen mehrdeutigen Pfad weiter zu differenzieren, kann man explizit ein Element aus einer Menge wählen, indem man den numerischen Index in eckigen Klammern dahinter schreibt. Der Pfad aus dem obigen Beispiel lässt sich damit so anpassen, dass er eindeutig auf den &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; weist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[1].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ihnen fällt sicher auf, dass der Index eine 1 ist obwohl das zweite Element gemeint ist. Das kommt daher, dass die Zählung bei 0 beginnt. Der Button mit der Markierung &amp;quot;An&amp;quot; hat also die Nummer 0 und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Nummer 1.&lt;br /&gt;
&lt;br /&gt;
Dieser Ansatz, einen expliziten Index zu verwenden, hat zwei Nachteile: Zum einen lässt sich an dem Pfad nur schwer ablesen welches Element gemeint ist, zum andern ist der Pfad sehr empfindlich schon gegenüber kleinsten Änderungen, wie zum Beispiel dem Vertauschen der beiden &#039;&#039;Button&#039;&#039;-Elemente oder dem Einfügen eines weiteren &#039;&#039;Button&#039;&#039;-Elements in der App.&lt;br /&gt;
&lt;br /&gt;
Es wäre daher wünschenswert, das gemeinte Element über eine ihm charakteristische Eigenschaft wie einen Attributwert, zu adressieren. Für Android-Apps eignet sich hierfür häufig das Attribut &amp;quot;&#039;&#039;resource-id&#039;&#039;&amp;quot;. Im Idealfall muss bei der Entwicklung der App darauf geachtet werden, dass jedes Element eine eindeutige Id erhält. Die &#039;&#039;resource-id&#039;&#039; hat den großen Vorteil, dass sie unabhängig vom Text des Elements oder der Spracheinstellung des Geräts ist. Für iOS-Apps kann entsprechend das Attribut &amp;quot;&#039;&#039;name&#039;&#039;&amp;quot; verwendet werden, wenn es von der App sinnvoll gesetzt wird. Der XPath-Standard erlaubt solche Auswahlbedingungen zu einem Element anzugeben. Angenommen, der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Eigenschaft &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;off&#039;&#039; und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; hat als &#039;&#039;resource-id&#039;&#039; den Wert &#039;&#039;on&#039;&#039;, dann kann man als eindeutigen Pfad für den &amp;quot;Aus&amp;quot;-&#039;&#039;Button&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[@resource-id=&#039;off&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
formulieren. Wie an dem Beispiel zu sehen werden solche Bedingungen wie ein Index in eckigen Klammern an den Elementtyp angehängt. Der Name eines Attributes wird mit einem &amp;quot;@&amp;quot; eingeleitet und der Wert mit einem &amp;quot;=&amp;quot; in Anführungszeichen angehängt. Ist der Attributwert global eindeutig, kann man den vorausgehenden Pfad sogar durch den globalen Platzhalter * ersetzen, der auf jedes Element passt. Das obige Beispiel mit dem GTIN-13-&#039;&#039;Button&#039;&#039; war ein solcher Fall.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum2.png | frame | Abb. 3: Elementbaum einer fiktiven App mit Erweiterungen]]&lt;br /&gt;
&lt;br /&gt;
Abb. 3 zeigt eine Erweiterung des Beispiels aus Abb. 2. Die App hat nun ein weiteres, nahezu identisches &#039;&#039;LinearLayout&#039;&#039; bekommen. Die &#039;&#039;Buttons&#039;&#039; sind in ihren Attributen jeweils ununterscheidbar. Deshalb funktioniert der vorige Ansatz nicht, einen eindeutigen Pfad nur mithilfe eines Attributwerts zu formulieren. Offensichtlich unterscheiden sich aber ihre benachbarten &#039;&#039;TextViews&#039;&#039;. Es ist möglich die jeweilige &#039;&#039;TextView&#039;&#039; in den Pfad mit aufzunehmen, um einen &#039;&#039;Button&#039;&#039; dennoch eindeutig zu adressieren. Ein Pfad zum &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; unterhalb der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; kann dabei wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView[@resource-id=&#039;push&#039;]/../android.widget.Button[@resource-id=&#039;on&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Teil beschreibt den Pfad zu der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; und der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;push&#039;&#039;. Danach folgt ein Schrägstrich gefolgt von zwei Punkten. Die zwei Punkte sind eine spezielle Elementbezeichnung, die nicht ein Kindelement benennt, sondern zum Elternelement wechselt, in diesem Fall also das &#039;&#039;LinearLayout&#039;&#039;, in dem die &#039;&#039;TextView&#039;&#039; eingebettet ist. Im Kontext dieses &#039;&#039;LinearLayout&#039;&#039; ist der restliche Pfad, nämlich der &#039;&#039;Button&#039;&#039; mit der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;on&#039;&#039;, eindeutig.&lt;br /&gt;
&lt;br /&gt;
Der XPath-Standard bietet noch sehr viel mehr Ausdrucksmittel. Mit der hier knapp vorgestellten Auswahl ist es aber bereits möglich für die meisten praktischen Testfälle gute Pfade zu formulieren. Eine vollständige Einführung in XPath ginge über den Umfang dieser Einführung weit hinaus. Sie finden zahlreiche weiterführende Dokumentationen im Web und in Büchern.&lt;br /&gt;
&lt;br /&gt;
Eine universelle Strategie zum Erstellen guter XPaths gibt es nicht, da sie von den Testanforderungen abhängt. In der Regel ist es sinnvoll, den XPath kurz und dennoch eindeutig zu halten. Häufig lassen sich Elemente über Eigenschaften identifizieren wie beispielsweise ihren Text. Will man aber gerade den Text eines Elements auslesen, kann dieser natürlich nicht im Pfad verwendet werden, da er vorher nicht bekannt ist. Ebenso wird der Text variieren, wenn die App mit verschiedenen Sprachen gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Jeder Baustein, der auf einem Element arbeitet, hat einen Eingangspin für den XPath. Im GUI-Browser finden Sie in der Mitte oben eine Liste von Bausteinen mit Aktionen, die Sie auf das ausgewählte Element anwenden können. Suchen Sie den Baustein &#039;&#039;Click&#039;&#039; (8) im Ordner Elements und wählen Sie ihn aus (Abb. 1). Er wird im rechten Teil unter &amp;quot;&#039;&#039;Test&#039;&#039;&amp;quot; eingefügt, der Pin für den XPath ist mit dem automatisch generierten Pfad des Elements vorbelegt (9). Sie können den Baustein hier auch ausführen. Die Ansicht wechselt dann auf &amp;quot;&#039;&#039;Lauf&#039;&#039;&amp;quot;. Ändert sich durch die Aktion der Zustand Ihrer App, müssen Sie den Baum anschließend aktualisieren (10).&lt;br /&gt;
&lt;br /&gt;
Wenn Sie in der unteren Liste eine Eigenschaft auswählen, wechselt die Anzeige der Bausteine zu &amp;quot;&#039;&#039;Eigenschaften&#039;&#039;&amp;quot;, wo Sie die eigenschaftsbezogenen Bausteine finden. Wie bei den Aktionen können Sie auch hier einen Baustein auswählen, der dann rechts in Test mit dem Pfad des Elements und der ausgewählten Eigenschaft eingetragen wird, sodass Sie ihn direkt ausführen können.&lt;br /&gt;
&lt;br /&gt;
== Weitere Locator-Strategien ==&lt;br /&gt;
Appium bietet neben XPath noch weitere Strategien zur Adressierung von Elementen an. Einige davon stehen Ihnen &#039;&#039;&#039;ab Version 20.1&#039;&#039;&#039; ebenfalls mit expecco zur Verfügung. Diese sind nicht ganz so mächtig wie XPath, dafür aber häufig schneller bei der Auflösung auf dem Gerät. Insbesondere bei der Verwendung mit iPhones, wo die Hierarchie bei jeder XPath-Auflösung erst aufgebaut werden muss, bieten alternative Strategien einen Vorteil für die Laufzeit.&lt;br /&gt;
&lt;br /&gt;
XPath ist weiterhin der Standard, das heißt alle Locator ohne besondere Angabe werden als XPath interpretiert. Um eine der anderen Strategien zu verwenden, schreiben Sie diese mit einem Gleichzeichen vor den gewünschten Locator. Diese Technik können Sie sowohl an den Blöcken verwenden, als auch im GUI-Browser testen.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | AccessibilityId || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Wert des Elements, der dazu dient, die App barrierefrei zu machen. Für iOS ist das das Attribut &#039;&#039;&#039;Accessibility-id&#039;&#039;&#039;, für Android das Attribut &#039;&#039;&#039;content-descr&#039;&#039;&#039;. &#039;&#039;Beispiel: accessibilityId=Löschen&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | className || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Namen der Klasse des Elements. &#039;&#039;Beispiel: className=android.widget.FrameLayout&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | id || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet die Kennung des Elements. Für iOS ist das das Attribut &#039;&#039;&#039;name&#039;&#039;&#039;, für Android das Attribut &#039;&#039;&#039;resource-id&#039;&#039;&#039;. &#039;&#039;Beispiel: id=android:id/text1&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | iOSClassChain&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet die Hierarchie der Elemente ähnlich wie bei XPath. Eine Erklärung zum Aufbau finden Sie [https://github.com/facebookarchive/WebDriverAgent/wiki/Class-Chain-Queries-Construction-Rules hier]. &#039;&#039;Beispiel: iOSClassChain=XCUIElementTypeWindow/XCUIElementTypeButton[`label == &amp;quot;Ok&amp;quot;`]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; padding-right:1em&amp;quot; | iOSNsPredicateString&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet einfache Kriterien, wie Attribute, die auch kombiniert werden können. &#039;&#039;Beispiel: iOSNsPredicateString=type == &#039;XCUIElementTypeButton&#039; AND name == &#039;Weiter&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | name&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Namen des Elements. &#039;&#039;Beispiel: name=Bestätigen&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &#039;&#039;nur für iOS&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Um eine direkte Beschleunigung mit iOS zu erzielen, ohne dass Sie Ihre bisherigen Pfade anpassen müssen, wandelt expecco zudem Pfade, die nur aus einem Element mit Klasse und name-Attribut bestehen, zur Laufzeit automatisch in einen entsprechenden Locator der Strategie iOSNsPredicateString um. Wenn Sie einen Pfad explizit als XPath markieren, wird diese Anpassung nicht vorgenommen.&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span id=&amp;quot;troubleshooting&amp;quot;&amp;gt;&amp;lt;!-- Referenced by error dialog on connection error --&amp;gt;&amp;lt;/span&amp;gt;Probleme und Lösungen=&lt;br /&gt;
== Locator sind versionsabhängig oder variabel ==&lt;br /&gt;
Dann sollten Sie die Locator (xPath) entweder in einer Variablen halten oder ein Locator-Mapping in einem Screenplay Anhang definieren. Es ist auch möglich, lediglich Teile des Locators (z.B. Locator-Pfad eines Elternelements oder Attributwert) in einer Variable zu halten und im Freezevalue des Locator-Pins mit &amp;quot;&#039;&#039;$(varName)&#039;&#039;&amp;quot; einzufügen.&lt;br /&gt;
&lt;br /&gt;
==Unsichtbare UI-Elemente==&lt;br /&gt;
Beachten Sie, dass im [[#Recorder|Recorder]] auch Elemente berücksichtigt werden, die Sie auf dem Bildschirm nicht sehen. Schalten Sie daher das Element-Highlighting an oder nutzen Sie die Follow-Mouse-Funktion und den Elementbaum im GUI-Browser, um festzustellen, ob das richtige Element verwendet wird. Es kann vorkommen, dass unsichtbare Elemente vor anderen Elementen liegen und diese verdecken, so dass die gewünschten Elemente im Recorder nicht ausgewählt werden können. Lesen Sie dazu den Abschnitt [[#Elemente_verbergen|Elemente verbergen]].&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;org.openqa.selenium.StaleElementReferenceException&#039;&#039;==&lt;br /&gt;
Der Fehler &amp;lt;code&amp;gt;org.openqa.selenium.StaleElementReferenceException&amp;lt;/code&amp;gt; tritt immer dann auf, wenn ein Element verwendet wird, das nicht mehr da ist. Wenn das in Ihrem Test passiert und das Element eigentlich da sein sollte, verwenden Sie an der Stelle stattdessen den Locator (XPath), um das Element neu zu holen.&lt;br /&gt;
&lt;br /&gt;
In manchen Fällen kann dieser Fehler auch dann auftreten, wenn Sie am Baustein bereits Locator angegeben haben. Das liegt daran, dass immer zuerst der Locator aufgelöst und das entsprechende Element geholt wird und dann die Aktionen mit dem Element ausgeführt wird. Wenn die App das Element genau zwischen dem Zeitpunkt des Auflösens und Holens und der Ausführung der Aktion aktualisiert und dabei ein neues Element erzeugt, kommt es zu diesem Fehler. Passiert das an einer bestimmten Stelle in Ihrem Test, bleibt nichts anderes als den Fehler abzufangen und es erneut zu versuchen.&lt;br /&gt;
&lt;br /&gt;
==iOS: Kabel nicht zertifiziert==&lt;br /&gt;
In manchen Fällen erscheint beim Verbinden eines iOS-Geräts über USB der Hinweis, das verwendete Kabel sei nicht zertifiziert. In diesem Fall hilft es nur, das entsprechende Kabel auszutauschen.&lt;br /&gt;
==iOS: Alerts beim Verbindungsaufbau==&lt;br /&gt;
Stellen Sie sicher, dass beim Verbindungsaufbau mit einem iOS-Gerät keine Alerts geöffnet sind. Der Aufbau schlägt sonst fehl, da die App nicht in den Vordergrund kommen kann. Siehe auch [[#iOS-Ger.C3.A4t_und_App_vorbereiten|iOS-Gerät und App vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
==iOS: .ipa installieren nicht möglich==&lt;br /&gt;
Beachten Sie, dass auf iOS-Simulatoren keine &#039;&#039;.ipa&#039;&#039;-Dateien sondern nur &#039;&#039;.app&#039;&#039;-Dateien installiert werden können.&lt;br /&gt;
&lt;br /&gt;
==iOS: Erster Verbindungsaufbau funktioniert nicht==&lt;br /&gt;
Wenn auf Ihrem Mac noch kein signierter Build des WebDriverAgents liegt, muss dieser beim ersten Verbindungsaufbau erst erzeugt werden. Das kann in der Regel etwas länger als eine Minute dauern. Standardmäßig verwendet Appium aber einen Timeout von 60000&amp;amp;nbsp;ms um zu warten bis der WebDriverAgent auf dem Gerät startet, so dass der Aufbau in diesen Fällen abgebrochen wird. Sie können den Timeout mit der Capability &#039;&#039;wdaLaunchTimeout&#039;&#039; setzen, z.B. auf &#039;&#039;120000&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Außerdem müssen die Einstellungen für die Signierung passen. Am zuverlässigsten funktioniert das nach unserer Erfahrung, wenn man im Xcode-Projekt des WebDriverAgents auf automatische Signierung stellt und das Team setzt. Siehe dazu die Erklärung im Abschnitt [[#WebDriverAgent-Signierung|WebDriverAgent-Signierung]]. In diesem Fall sollten Sie die Capabilities &#039;&#039;xcodeConfigFile&#039;&#039; bzw. &#039;&#039;xcodeOrgId&#039;&#039; und &#039;&#039;xcodeSigningId&#039;&#039; &#039;&#039;&#039;nicht&#039;&#039;&#039; verwenden, da es sonst zu Konflikten kommen kann. Achtung: Wenn Sie eine Team-ID in den Mobile-Testing-Einstellungen gesetzt haben, setzt expecco diese automatisch als &#039;&#039;xcodeOrgId&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
Achten Sie beim ersten Verbindungsaufbau außerdem auf Ihr Gerät, da Sie dort möglicherweise der Installation per Passwort zustimmen müssen. Auf dem Mac kann die Eingabe des Passworts zur Freigabe des Schlüsselbunds für die Signierung nötig werden, häufig auch mehrmals.&lt;br /&gt;
&lt;br /&gt;
==Android: Gerät nicht im Verbindungsdialog==&lt;br /&gt;
Wenn ein über USB angeschlossenes Android-Gerät nicht im Verbindungsdialog auftaucht, versuchen Sie, den USB-Verbindungstyp zu ändern. In der Regel sollten MTP oder PTP funktionieren. Prüfen Sie nochmal, ob &amp;quot;USB Debugging&amp;quot; in den Entwicklereinstellungen des Geräts aktiviert ist (diese Einstellungen sind bei manchen Geräten zunächst unsichtbar, und müssen durch einen Trick zugänglich gemacht werden). Siehe auch [[#Android-Ger.C3.A4t_vorbereiten|Android-Gerät vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
==Android: Abgeschnittene Elemente unten==&lt;br /&gt;
Bei Android-Geräten, die die Steuerungsleiste bzw. Softkeys automatisch ein- und ausblenden, kann es vorkommen, dass der Recorder im unteren Bereich Elemente abschneidet, die durch die Softkeys verdeckt würden, auch wenn sie zu diesem Zeitpunkt gar nicht angezeigt werden. In diesem Fall hift es, die Softkeys so einzustellen, dass sie in einer permanenten Leiste angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
Bei neueren Android-Versionen gibt es eine solche Einstellung in der Regel nicht. Auch wenn die Steuerelemente permanent eingeblendet sind, liegen sie auf keiner extra Leiste, sondern vor dem Inhalt der App. Es gibt dann im unteren Teil einen Bereich, der nicht bedient werden kann, weil er nicht zum aktiven Bereich der App gezählt wird, weshalb die Elemente von Appium abgeschnitten werden. Dieser Bereich kann auch größer sein als von den Steuerungselementen beansprucht. Bekannt ist dies für Samsung-Geräte mit Android 11. Da die Information über die Größe des App-Bereichs bereits auf Android-Ebene so geliefert wird, können wir hierfür keine Lösung anbieten, sondern können nur hoffen, dass das Problem vom Hersteller behoben wird. Sie können versuchen, ob Sie mit der Einstellung von Gestensteuerung bessere Ergebnisse bekommen, allerdings gibt es hier das gleiche Problem.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;waitForIdleTimeout&amp;quot;&amp;gt;&amp;lt;!-- Referenced by expecco--&amp;gt;&amp;lt;/span&amp;gt; Android: Test hängt beim Suchen eines Elements==&lt;br /&gt;
Der Baustein &#039;&#039;Find Element by XPath&#039;&#039; und alle Element-Bausteine warten bis ein Element zum angegebenen Pfad auftaucht. Den Timeout dafür kann man entweder am Baustein direkt oder in den Umgebungsvariablen ändern. Wenn das Element aber bereits da sein sollte und es dennoch sehr lange dauert, bis der Test weitergeht, kann das am UIAutomator/UIAutomator2 liegen. Dieser wartet, bis die App in den Idle-Zustand geht, bevor er überhaupt nach Elementen sucht. Dies kann länger dauern, wenn die App z.B. im Hintergrund noch Animationen abspielt oder andere Aktionen ausführt. Auch das Holen des Page-Sources z.B. beim Aktualisieren im GUI-Browser oder im Recorder kann dadurch länger dauern. Standardmäßig gibt es hierfür einen Timeout von 10 Sekunden, nach dem nicht weiter auf den Idle-Zustand gewartet wird. Dieser Timeout lässt sich durch eine Einstellung in Appium anpassen (waitForIdleTimeout). Falls Sie einen anderen Wert für diesen Timeout setzen möchten, ist dies ab expecco 21.2 möglich, indem Sie vor dem Test den Smalltalk-Code &amp;lt;code&amp;gt;AppiumTestRunner::TestRunConnection waitForIdleTimeout:2000&amp;lt;/code&amp;gt; ausführen. Der Timeout wird in Millisekunden angegeben, das Beispiel setzt ihn also auf 2 Sekunden.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;startChromedriverTimeout/&amp;gt;Android: Aktualisieren des Trees oder Wechseln zum Webview-Kontext braucht zu lange==&lt;br /&gt;
Speziell mit älteren Geräten kann es vorkommen, dass neuere Chromedriver nicht initialisiert werden können. Das führt dann dazu, dass nicht in den Webview-Kontext gewechselt werden kann. Dies wird von Appium allerdings nur über einen Timeout festgestellt, der standardmäßig bei 4 Minuten liegt. Da expecco auch beim Aufbauen des Trees im GUI-Browser versucht in den Webview-Kontext zu wechseln, kann das zu sehr langen Ladezeiten führen. Da es in Appium keine Möglichkeit gibt, diesen Timeout herunter zu setzen, haben wir die Version, die wir im MobileTestingSupplement bereitstellen, um eine entsprechende Capability erweitert. Ab der Version 1.13.1.0 des [[#Windows|MobileTestingSupplements]] kann mit &#039;&#039;chromedriverStartTimeout&#039;&#039; der Timeout in Millisekunden gesetzt werden. Der Wechsel funktioniert dadurch zwar trotzdem nicht, aber expecco braucht dann nicht mehr so lange beim Aktualisieren des Trees und der Baustein zum Wechseln des Kontextes schlägt schneller fehl. Der Verbindungsdialog fügt diese Capability ab expecco 22.1 automatisch hinzu.&lt;br /&gt;
&lt;br /&gt;
==Keine Aktion bei Klick==&lt;br /&gt;
Der Baustein zum Klicken auf ein Element ist erfolgreich, aber auf dem Gerät wurde keine Aktion ausgeführt.&lt;br /&gt;
:Dies kann vorkommen, wenn das Element von einem anderen Element verdeckt ist und ein Klick auf das Element deshalb nicht möglich ist. In diesem Fall wird von Appium kein Fehler geworfen, sondern es passiert einfach nichts. Wenn Sie dennoch einen Klick an der Position des Elements machen möchten, auch wenn es verdeckt ist, benutzen Sie stattdessen den Baustein &#039;&#039;Tap&#039;&#039; und übergeben Sie diesem die Position des Elements (&#039;&#039;Get Location&#039;&#039;). Wenn Sie stattdessen vor einem Klick prüfen möchten, ob das Element zu diesem Zeitpunkt verdeckt ist, versuchen Sie, ob Ihnen die Eigenschaften &#039;&#039;Is Displayed&#039;&#039; oder &#039;&#039;Is Enabled&#039;&#039; weiterhelfen.&lt;br /&gt;
&lt;br /&gt;
==Kein Update nach Aktion==&lt;br /&gt;
Über den Recorder wurde eine Aktion ausgeführt, für die auch ein Baustein aufgezeichnet wurde, der Recorder zeigt aber immer noch das alte Bild.&lt;br /&gt;
:Der Recorder zeigt kein Livebild des Geräts, sondern immer nur eine Momentaufnahme. Nachdem eine Aktion ausgeführt wurde, aktualisiert sich der Recorder automatisch. Es kann aber vorkommen, dass das Bild schon aktualisiert wurde, bevor die Auswirkungen der Aktion auf dem Gerät vollständig abgeschlossen sind. In diesem Fall sollten Sie den Recorder von Hand aktualisieren über das Symbol mit den blauen Pfeilen. Ab expecco 20.2 können Sie für diesen Fall auch automatisches Aktualisieren einstellen. Siehe auch Beschreibung zum [[#Recorder|Recorder]].&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;clickable&amp;quot; Attribut falsch==&lt;br /&gt;
Ein Element hat im &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; Attribut/Property den Wert &amp;quot;&#039;&#039;false&#039;&#039;&amp;quot;, ist aber dennoch anklickbar.&lt;br /&gt;
:Das &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; Attribute muss explizit vom App-Programmierer gesetzt werden, und hat tatsächlich keine Relevanz für das tatsächliche Verhalten der App. Sie sollten dieses Attribut i.A. in Ihren Tests nicht beachten.&amp;lt;br&amp;gt;Leider existieren viele Apps, bei denen der Programmierer hier &amp;quot;lazy&amp;quot; war.&lt;br /&gt;
&lt;br /&gt;
==Verbindungsaufbau schlägt fehl==&lt;br /&gt;
Schlägt der Verbindungsaufbau mit dem Appium-Server fehl, erhalten Sie in expecco eine Fehlermeldung ähnlicher der unten abgebildeten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingVerbindungsfehler.png]]&lt;br /&gt;
&lt;br /&gt;
Hier sehen Sie die Art des aufgetretenen Fehlers. Klicken Sie auf &amp;quot;&#039;&#039;Details&#039;&#039;&amp;quot; um nähere Informationen zu erhalten. Mögliche Fehler sind:&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.remote.UnreachableBrowserException&#039;&#039;&lt;br /&gt;
:Der angegebene Server läuft nicht oder ist nicht erreichbar. Überprüfen Sie die Serveradresse.&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.WebDriverException&#039;&#039;&lt;br /&gt;
:Lesen Sie in den Details in der ersten Zeile die Meldung hinter &#039;&#039;Original Error&#039;&#039;:&lt;br /&gt;
:*&#039;&#039;Unknown device or simulator UDID&#039;&#039;&lt;br /&gt;
::Entweder ist das Gerät nicht richtig angeschlossen oder die udid stimmt nicht.&lt;br /&gt;
:*&#039;&#039;Unable to launch WebDriverAgent because of xcodebuild failure: xcodebuild failed with code 65&#039;&#039;&lt;br /&gt;
::Dieser Fehler kann verschiedene Ursachen haben. Entweder konnte tatsächlich der WebDriverAgent nicht gebaut werden, weil die Signierungseinstellungen falsch sind oder das passende Provisioning Profile fehlt. Lesen Sie dazu den Abschnitt zur [[#Signierung|Signierung]]. Es kann auch sein, dass der WebDriverAgent auf dem Gerät nicht gestartet werden kann, weil sich beispielsweise ein Alert im Vordergrund befindet oder Sie dem Entwickler nicht vertraut haben.&lt;br /&gt;
:*&#039;&#039;Could not install app: &#039;Command &#039;ios-deploy [...] exited with code 253&#039;&#039;&#039;&lt;br /&gt;
::Die angegebene App kann nicht auf dem iOS-Gerät installiert werden, weil es nicht im Provisioning Profile der App eingetragen ist.&lt;br /&gt;
:*&#039;&#039;Bad app: [...] App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name.&#039;&#039;&#039;&lt;br /&gt;
::Der Pfad zur App ist falsch. Stellen Sie sicher, dass sich die Datei unter dem angegebenen Pfad auf dem Mac befindet.&lt;br /&gt;
:*&#039;&#039;packageAndLaunchActivityFromManifest failed.&#039;&#039;&lt;br /&gt;
::Die angegebene &#039;&#039;apk&#039;&#039;-Datei ist vermutlich kaputt.&lt;br /&gt;
:*&#039;&#039;Could not find app apk at [...]&#039;&#039;&lt;br /&gt;
::Der Pfad zur App ist falsch. Stellen Sie sicher, dass sich die &#039;&#039;apk&#039;&#039;-Datei am angegebenen Pfad befindet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Falls der Fehler nicht durch eine der oben gelisteten Ursachen bedingt ist, kann es sein, dass die auf dem Gerät befindlichen Automation-Anwendungen nicht mehr richtig funktionieren. Hier hilft es, diese vom Mobilgerät zu deinstallieren. Beim nächsten Verbindungsaufbau werden sie dann automatisch neu installiert.&lt;br /&gt;
&lt;br /&gt;
*Für iOS-Geräte ist das der WebDriverAgent, den Sie einfach vom Home-Screen deinstallieren können. Dies behebt in der Regel Probleme durch den Wechsel des verwendeten Macs oder der Xcode-Version.&lt;br /&gt;
&lt;br /&gt;
*Für Android-Geräte ist es der UIAutomator2; hier tritt auf einigen Geräten sporadisch ein Problem auf, die Ursache dafür ist uns z.Z. noch nicht bekannt. Zur Deinstallation navigieren Sie auf dem Gerät zu &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;Anwendungen&#039;&#039;&amp;quot;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; und suchen in der Liste nach folgenden Einträgen:&lt;br /&gt;
    Appium Settings&lt;br /&gt;
    io.appium.uiautomator2.server&lt;br /&gt;
    io.appium.uiautomator2.server.test&lt;br /&gt;
:Klicken Sie auf die jeweilige Anwendung und dann auf &amp;quot;&#039;&#039;Deinstallieren&#039;&#039;&amp;quot;.&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&#039;&#039;Der entsprechende Eintrag heißt auf manchen Geräten möglicherweise etwas anders.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Falls dies nicht hilft, kann eventuell die Ausgabe des Appium-Servers weiterhelfen. Für einen von expecco gestarteten Server finden Sie das Log in der Liste der [[#Laufende_Appium-Server|laufenden Appium-Server]].&lt;br /&gt;
&lt;br /&gt;
==Ich habe keinen Mac==&lt;br /&gt;
Vielleicht hilft Ihnen diese Webseite weiter: [https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10 https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Release_Notes_24.x&amp;diff=29869</id>
		<title>Release Notes 24.x</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Release_Notes_24.x&amp;diff=29869"/>
		<updated>2024-12-19T16:31:01Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Future Release 24.2 (4Q 2024) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See also: [[Release Notes 23.x]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Future Release 24.2 (January 2025) ==&lt;br /&gt;
*Feature: WindowsAutomation: &amp;quot;Mouse Wheel Simulation&amp;quot; support&lt;br /&gt;
*Feature: Any and template typed parameters in testcase (of testplan)&lt;br /&gt;
*Feature: Negated [[Testplan_Editor/en#Condition_Variables|condition variable]] check&lt;br /&gt;
*Fix: Project Difference Viewer showed wrong tab for steps inside the test/demo diagram&lt;br /&gt;
*Fix: Exchange connection function of diagram editor left an invisible connection at the pin. Lead to wrong output value forwarding during the current session, but cured itself when saving and reloading.&lt;br /&gt;
*Improving the function and operation of variable pins ([[Scheme_Editor/en#Variable_Number_of_Pins|Scheme_Editor/Variable_Number_of_Pins]])&lt;br /&gt;
*Fix/Feature: Severity level limit is passed on in sub-test plans with the option of tightening the severity level per test plan level&lt;br /&gt;
*Improvement: Change modification date of the project when shrink wrapping an imported library&lt;br /&gt;
&lt;br /&gt;
== Release 24.1 (2Q 2024) ==&lt;br /&gt;
*Feature: [[Expecco_API/en#Global_and_Static_Variables|Static Variables for Python]]&lt;br /&gt;
*Feature: Qt-Testing: Logging with log levels &amp;lt;code&amp;gt;DEBUG&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;INFO&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;WARN&amp;lt;/code&amp;gt; ([[Qt_Inject_Windows/en#Logging|Qt-Logging]])&lt;br /&gt;
*Feature: Qt-Testing: Qt-Connections now use the ConnectionManager like the other Gui test technologies&lt;br /&gt;
*Feature: WindowsAutomation: Native Touch, Tap, Drag &amp;amp; Drop support now in the base WindowsAutomation Library&lt;br /&gt;
*Feature: Show Log and [[Timeline/en|Timeline view]] for testplans&lt;br /&gt;
*Feature: Search and Goto Line menu functions in the activity log view&lt;br /&gt;
*Feature: [[Embedded Systems C Bridge API|C-Bridge]] now supports SSL connections (encryption and authentication using certificates)&lt;br /&gt;
*Feature: [[Testsuite_Editor-ExecutionSettings_Editor/en|Settings for execution]] (thread pool and log activities/pins/info) can now be saved in the test suite settings&lt;br /&gt;
*Feature: CSV test report, values for start time, end time and duration added&lt;br /&gt;
*Feature: Improved refactoring for compound blocks: &amp;quot;Extract (&amp;amp; Replace) New Compound Action&amp;quot;&lt;br /&gt;
*Feature: Enhanced expecco reflection library&lt;br /&gt;
*Feature: Logprocessors can be executed for embedded testplans&lt;br /&gt;
*Feature: Logging of background actions can be individually enabled and disabled for testplans and nested testplans&lt;br /&gt;
*Feature: Support for script actions written in the [[Installing_additional_Frameworks/en#Julia_Installation|Julia]] programming language&lt;br /&gt;
*Feature: Powershell actions: support functions for writing to pins, logging, opening dialogs, etc. &lt;br /&gt;
*Fix: Current temporary testplan settings (like selected testcases, do-not-execute of pre/post action, etc.) don&#039;t get lost anymore when reimporting a library&lt;br /&gt;
*Fix: WindowsAutomation: Fix blocking of applications after &amp;lt;Mouse Button Down&amp;gt;&lt;br /&gt;
*Fix: asynchronous write to an output pin with no wait() in bridged actions are now detected and reported as error (see Example3 in the [[Expecco_API/en#Asynchronous_and_Callback_Functions|NodeJS API Documentation]])&lt;br /&gt;
*Fix: Bridges: Detect (and ignore) invalid requests from forked background bridge threads&lt;br /&gt;
*Fix: Acitivity logs of asynchronous events in background actions are now displayed correctly in the background activity log.&lt;br /&gt;
*Fix: Qt: Drag and drop improved by revising the &amp;quot;Move mouse event&amp;quot; (Windows)&lt;br /&gt;
*Fix: Disabling logs of sub-activities (if successful, if not successful, etc.)&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Selenium_WebDriver_Plugin/en&amp;diff=29685</id>
		<title>Selenium WebDriver Plugin/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Selenium_WebDriver_Plugin/en&amp;diff=29685"/>
		<updated>2024-08-22T15:16:05Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* FAQ */ Firefox after Update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Selenium_WebDriver_Plugin|Deutsche Version]] | &#039;&#039;&#039;English Version&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Use the &#039;&#039;Selenium WebDriver Plugin&#039;&#039; to test or automate interactions of applications running in a web-browser (*). The plugin can be (and usually is) used with the [[Expecco_GUI_Tests_Extension_Reference|GUI Browser]], which helps in the creation of tests. Moreover, the GUI Browser can record UI sessions, which can later be customised or refactored as required.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Selenium WebDriver Plugin&#039;&#039; replaces the previous [[Selenium_Web_Test_Plugin|Selenium Web Test Plugin]], which was based on the now outdated Selenium RC framework.&amp;lt;br&amp;gt;&lt;br /&gt;
The new web driver uses the [https://www.seleniumhq.org/projects/webdriver/ Selenium WebDriver] for automation, and replaces the previous interface.&lt;br /&gt;
(see https://www.guru99.com/introduction-webdriver-comparison-selenium-rc.html  for background information and a description of the differences.)&lt;br /&gt;
Read [[#Transferring_Old_Selenium_Tests|this section]] for information how to transfer testsuites using the old plugin.&lt;br /&gt;
&lt;br /&gt;
(*) actually, there exists WebDriver interfaces to control Windows or OS X desktop applications. Thus, this plugin can be used in a number of additional scenarios.&lt;br /&gt;
&lt;br /&gt;
=Settings=&lt;br /&gt;
This plugin uses the Java bridge and therefore needs a Java installation. You can specify it in the settings under &#039;&#039;Plugins&#039;&#039; -&amp;gt; &#039;&#039;Java Bridge&#039;&#039;. The important field is &#039;&#039;Java Installation Path&#039;&#039;, where you can set a JDK or JRE. If nothing is set, expecco tries to find java in the PATH.&lt;br /&gt;
&lt;br /&gt;
[[Datei:JDKPfadEinstellungen.png|600px]]&lt;br /&gt;
&lt;br /&gt;
There are settings for the Selenium WebDriver Plugin itself as well. You find them under &#039;&#039;Plugins&#039;&#039; -&amp;gt; &#039;&#039;Webtest (Selenium WebDriver)&#039;&#039;. There you can for example set the address of a remote running Selenium server or another Jar file for Selenium. The settings for the different browser types are divided into the two subpages &#039;&#039;Most Popular Browsers&#039;&#039; and &#039;&#039;Other Browsers&#039;&#039;. There you can set the path to the browser executable or to the webdriver to use. You can leave all these fields empty and expecco will search for them automatically&lt;br /&gt;
&lt;br /&gt;
=Browser Support=&lt;br /&gt;
This plugin supports (among others) the Chrome/Chromium, Edge, Firefox, Internet Explorer  and Opera browsers. &lt;br /&gt;
&amp;lt;br&amp;gt;Safari under OSX must be at least version 10, and OSX must be at least El Capitan.&lt;br /&gt;
The plugin uses the WebDriver interface for communication; therefore, browsers running both on the local or on a remote machine can be tested and/or controlled.&lt;br /&gt;
In addition, many other browsers, UIs and devices support the WebDriver protocol, and can thus be automated/tested with expecco.&lt;br /&gt;
&lt;br /&gt;
==Update WebDriver==&lt;br /&gt;
Each browser has a driver (&amp;quot;&#039;&#039;WebDriver&#039;&#039;&amp;quot;) for opening and controlling a browser window. &lt;br /&gt;
Usually, the driver is a separate program which translates WebDriver requests into browser-specific interface calls. However, there are also browsers and programs which have the WebDriver protocol already built in (eg. Safari).&lt;br /&gt;
&lt;br /&gt;
The expecco installation package includes current driver versions for common browsers. However, as the browsers are updated continuously, sometimes even automatically, you sooner or later may have to download a new driver version. In that case put it in the folder inside your expecco installation directory where the other versions are stored as well, at:&lt;br /&gt;
 &amp;lt;code&amp;gt;packages/exept/expecco/plugin/seleniumWebDriver/lib/XXX&amp;lt;/code&amp;gt;&lt;br /&gt;
(of course, with &amp;quot;\”s instead of &amp;quot;/&amp;quot;s on Microsoft Windows operating systems), where &amp;quot;XXX&amp;quot; denotes the operating system (Windows, Linux, OSX etc.).&lt;br /&gt;
&amp;lt;!--To use a different driver, check the &amp;quot;Advanced&amp;quot; toggle in the connection dialog and add the driver&#039;s path to the settings (see below).--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the connection dialog, expecco may show a warning, that the driver version is incompatible with the browser version. In some cases this may only be due to the fact, that this version was not known at the time of delivery. Some combinations may work despite the warning, but we cannot guarantee that for each individual case.&lt;br /&gt;
&lt;br /&gt;
Therefore you can always check the &amp;quot;&#039;&#039;Do not show this warning again&#039;&#039;&amp;quot; toggle, if such a warning is shown, to have expecco remember that combination as &amp;quot;compatible&amp;quot; in your settings, and not warn again. You should only do that, if you are sure that your tests will still be executed correctly. As we sometimes get compatibility problems ourselves and cannot always immediately find the reason, we advice you, to update the driver.&lt;br /&gt;
&lt;br /&gt;
For Chrome and Microsoft Edge, where each new browser version comes with a new driver version, you find a button in the connection dialog, to download matching driver versions by expecco.&lt;br /&gt;
&lt;br /&gt;
You find new driver versions at the following addresses:&lt;br /&gt;
{|&lt;br /&gt;
|Chrome/Chromium&lt;br /&gt;
|[https://sites.google.com/chromium.org/driver/ ChromeDriver]&lt;br /&gt;
|-&lt;br /&gt;
|Edge&lt;br /&gt;
|[https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ Microsoft WebDriver]&lt;br /&gt;
|-&lt;br /&gt;
|Firefox&lt;br /&gt;
|[https://github.com/mozilla/geckodriver/releases GeckoDriver]&lt;br /&gt;
|-&lt;br /&gt;
|Internet Explorer&lt;br /&gt;
|[https://selenium-release.storage.googleapis.com/index.html IEDriverServer]&lt;br /&gt;
|-&lt;br /&gt;
|Opera&lt;br /&gt;
|[https://github.com/operasoftware/operachromiumdriver/releases Opera driver]&lt;br /&gt;
|-&lt;br /&gt;
|Safari&lt;br /&gt;
|[https://webkit.org/blog/6900/webdriver-support-in-safari-10 Safari Support]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Download a suitable version and place it at an appropriate location in the above mentioned directory. expecco will then find and use it. &amp;lt;!-- You can extend the file name to have multiple versions in parallel. --&amp;gt; Alternatively, you can set the path to a driver either in the [[#Advanced_Settings | connection editor]] or in the [[#Plugin_Settings | plugin settings]].&lt;br /&gt;
&lt;br /&gt;
[[Datei:bulb.png|20px]]Please verify that the driver&#039;s version is compatible with the browser version. If in doubt, consult the version history (e.g. for Chrome: https://chromedriver.storage.googleapis.com/2.25/notes.txt).&lt;br /&gt;
&lt;br /&gt;
[[Datei:bulb.png|20px]]Notice: For Internet Explorer, &amp;quot;&amp;lt;code&amp;gt;Protected Mode&amp;lt;/code&amp;gt;&amp;quot; settings must be set to the same value for all zones, to be able to start a connection.  (in the Internet Explorer, open &amp;quot;Settings&amp;quot; - &amp;quot;Internet Options&amp;quot; - &amp;quot;Security&amp;quot;, and set the value of &amp;quot;protected mode&amp;quot; to the same in all 4 zones; otherwise, you&#039;ll get error- and warning dialogs when connecting). See also the [https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver#required-configuration required configuration] to use InternetExplorerDriver.&lt;br /&gt;
&lt;br /&gt;
[[Datei:bulb.png|20px]]Also notice: the plugin uses JavaScript for some advanced functions, and those functions require that JavaScript is enabled in the browser. This is especially needed to use the GUI browser and the recorder. Test execution may be possible without JavaScript, as long as no actions are used which rely on JavaScript.&lt;br /&gt;
If you get an error like &amp;lt;code&amp;gt;&amp;quot;org.openqa.selenium.JavascriptException: Error executing JavaScript&amp;quot;&amp;lt;/code&amp;gt;,&lt;br /&gt;
make sure that JavaScript is enabled in the browser and that the versions of the browser and the associated driver are compatible.&lt;br /&gt;
&lt;br /&gt;
=Additional Uses=&lt;br /&gt;
{|&lt;br /&gt;
|[https://github.com/appium/appium-for-mac AppiumForMac]&lt;br /&gt;
|WebDriver to control OS X apps (i.e. also non-Browsers)&lt;br /&gt;
|-&lt;br /&gt;
|[https://github.com/microsoft/WinAppDriver WinAppDriver]&lt;br /&gt;
|WebDriver to control Windows Desktops&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Notice, that these interfaces usually provide a subset of the functionality provided by special plugins, such as Java-GUI or WindowsAutomation plugins. Usually, they are ok to manipulate the top level window or to confirm simple dialogs, but less usable for more complex UI tests.&lt;br /&gt;
&lt;br /&gt;
= Quick Start =&lt;br /&gt;
== Open Browser / Connecting ==&lt;br /&gt;
* Start expecco&lt;br /&gt;
* Click on &amp;quot;&#039;&#039;New Testsuite&#039;&#039;&amp;quot;&lt;br /&gt;
* Click on the GUI-Browser symbol ([[Datei:GUIBrowser.png|24px]])&lt;br /&gt;
* A new Tab appears, containing the GUI-Browser&lt;br /&gt;
* Click on &amp;quot;&#039;&#039;Connect&#039;&#039;&amp;quot; and choose &amp;quot;&#039;&#039;Selenium Testing&#039;&#039;&amp;quot;. The  [[#Connection Editor | Connection Dialog]] appears (see details below)&lt;br /&gt;
* Choose the type of browser (eg. &amp;quot;&amp;lt;code&amp;gt;firefox&amp;lt;/code&amp;gt;&amp;quot; and enter the URL of the tested web site (eg. &amp;quot;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://www.myHost.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;quot;) and )&lt;br /&gt;
* Click on &amp;quot;Connect&amp;quot;&lt;br /&gt;
* A browser is started automatically, and the page is shown&lt;br /&gt;
* As soon as the connection is established,  the page&#039;s elements are shown in the GUIBrowser&#039;s left tree view&lt;br /&gt;
&lt;br /&gt;
== Start a Recording ==&lt;br /&gt;
* After a connection has been established, click on the record icon ([[Datei:Recording.png|16px]]) in the GUIBrowser.&lt;br /&gt;
&lt;br /&gt;
== Inspecting Elements ==&lt;br /&gt;
* Select an element in the browser&#039;s element-tree, or move the mouse over it in &amp;quot;follow-mouse mode&amp;quot;. If your browser does not support this &amp;quot;follow-mouse&amp;quot; mode, try opening a recorder, and move the mouse there.&lt;br /&gt;
The element&#039;s attributes are shown in the lower-center attribute/property list.&lt;br /&gt;
== Manually adding Actions and Checks ==&lt;br /&gt;
* In addition to recording, actions and checks can also be selected from the upper-centre action list. Select one there and either try it immediately or add it to the recording sequence via the add-action button at the top far right.&lt;br /&gt;
&lt;br /&gt;
=Connecting=&lt;br /&gt;
==&amp;lt;span id=&amp;quot;Verbindungsdialog&amp;quot;&amp;gt;Connection Editor==&lt;br /&gt;
The connection editor defines, changes or starts a connection. Open the GUI browser, click on &amp;quot;&#039;&#039;Connect&#039;&#039;&amp;quot; and select &amp;quot;&#039;&#039;Selenium Testing (WebDriver)&#039;&#039;&amp;quot;. You can also create attachments or files containing connection parameters (&amp;quot;&#039;&#039;connection settings&#039;&#039;&amp;quot;) without actually connecting to/opening a new browser connection via the &amp;quot;&#039;&#039;Save Connection Settings&#039;&#039;&amp;quot; menu item.&lt;br /&gt;
&lt;br /&gt;
When opened, the connection editor presents a number of fields and load/save buttons in its toolbar menu:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:SeleniumWebDriverConnectDialog.png]]&lt;br /&gt;
&lt;br /&gt;
#&#039;&#039;Load settings from attachment&#039;&#039;: Open an attachment containing connection settings from an open project. This settings will be added to the editor. Already entered inputs that are not conflicting will remain unchanged.&lt;br /&gt;
#&#039;&#039;Load settings from file&#039;&#039;: Open a saved settings file (*.csf). Its settings will be added to the editor. Already entered inputs that are not conflicting will remain unchanged.&lt;br /&gt;
#&#039;&#039;Save settings as attachment&#039;&#039;: Save all entered settings as attachment in an open project.&lt;br /&gt;
#&#039;&#039;Save settings as JSON attachment&#039;&#039;: Save all entered settings in JSON format as attachment in an open project.&lt;br /&gt;
#&#039;&#039;Save settings to file&#039;&#039;: Save all entered settings to a file (*.csf).&lt;br /&gt;
#&#039;&#039;Version info&#039;&#039;: Opens a window showing the used versions of the Selenium server, the selected browser and its driver.&lt;br /&gt;
#&#039;&#039;Online documentation&#039;&#039;: Open this online documentation page.&lt;br /&gt;
#&#039;&#039;Connection name&#039;&#039;: Enter the name of the connection used to show it in the GUI browser. (Optional)&lt;br /&gt;
#&#039;&#039;Browser type&#039;&#039;: Choose the type of browser to use. Ensure it is installed and the version of the used driver is compatible with the browser version.&lt;br /&gt;
#&#039;&#039;URL&#039;&#039;: Enter the URL to open at startup. To open an empty browser window, leave this field empty. To open a local file use the &amp;quot;&amp;lt;code&amp;gt;file://&amp;lt;/code&amp;gt;&amp;quot; scheme, e.g. &amp;quot;&amp;lt;code&amp;gt;file:///C:/Users/admin/Desktop/index.html&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
#&#039;&#039;Advanced view&#039;&#039;: Toggle the view to enter [[#Advanced Settings|advanced settings]].&lt;br /&gt;
#&#039;&#039;Information on the selected browser&#039;&#039;: Here, the selected browser type is shortly characterized.&lt;br /&gt;
#&#039;&#039;Information on the settings&#039;&#039;: It shows which Selenium, browser and driver version will be used regarding the current settings. If you have set [[#Advanced Settings|advanced settings]], they will also be displayed here.&lt;br /&gt;
&lt;br /&gt;
===Advanced Settings===&lt;br /&gt;
Besides the used browser and the start URL, more settings and possibly &amp;quot;&#039;&#039;capabilities&#039;&#039;&amp;quot; may be required. To see click on the &amp;quot;Advanced&amp;quot; toggle. Depending on the selected browser type you get different entry fields.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Remote Server&#039;&#039;: To open a browser on a remote host, start a Selenium server there and set this field to its address. You can also enter a local address if you do not want the Selenium server to start automatically or if it is already running. See the next section [[#Remote Connections|Remote Connections]] on how to start a Selenium server.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Headless&#039;&#039;: to open the browser in &amp;quot;headless&amp;quot; mode, i.e. without a window. Not all browsers/drivers support this mode.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Binary&#039;&#039;: Enter the path to the binary of the selected browser. Use this if the browser cannot be found automatically by Selenium, or if you have another browser version installed or to be tested against.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Driver&#039;&#039;: For each browser, a particular driver is needed for automation. New browser versions often also need a new driver version. If you don&#039;t want or cannot use the driver provided by expecco, set its path here.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Command Line Options&#039;&#039;: arguments passed to the browser-command. For example the chrome browser supports a &amp;quot;--disable-extensions&amp;quot; command line argument, firefox supports &amp;quot;--safe-mode&amp;quot; and &amp;quot;--profile&amp;quot;. These options are browser- and possibly browser-version specific. Most browsers allow for a &amp;quot;--help&amp;quot; argument, which you may try in a shell window to find out.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Firefox Profile&#039;&#039;: For Firefox, it is possible to set a &#039;&#039;Firefox Profile&#039;&#039;, containing specific settings. If no profile is set, each connection will use a new empty one.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Capabilities&#039;&#039;: Selenium connections can use several capabilities to define the connection&#039;s behavior. To add specific capabilities, set them in this field. Write &amp;quot;&#039;&#039;&amp;lt;capability name&amp;gt;: &amp;lt;value&amp;gt;&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;&amp;lt;capability name&amp;gt; = &amp;lt;value&amp;gt;&#039;&#039;&amp;quot;, one entry per line.&amp;lt;p&amp;gt;The set of capabilities needed or supported are browser- and driver specific. Please refer to the concrete driver&#039;s documentation as found via the driver links above. Common capabilities are: &amp;quot;app&amp;quot; or &amp;quot;application&amp;quot;, &amp;quot;url&amp;quot;, etc. For drivers which communicate with mobile devices, the capabilities also select which device to use and/or wether an emulator should be started.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;You can also set properties for the Firefox browser - for this, use the same syntax as for capabilities, but add a leading &#039;&#039;$&#039;&#039; to the property name.&amp;lt;/p&amp;gt;Properties used by expecco internally (such as browser type, url or remote host) are prefixed by a &amp;quot;#&amp;quot;-character.&lt;br /&gt;
&lt;br /&gt;
==Remote Connections==&lt;br /&gt;
To start a browser on a remote computer, copy the Selenium server and the required driver to that computer. You find the files in your expecco installation at &amp;quot;&amp;lt;code&amp;gt;packages\exept\expecco\plugin\seleniumWebDriver\lib&amp;lt;/code&amp;gt;&amp;quot;. Start the Selenium server (on the remote host) with:&lt;br /&gt;
 java -jar selenium-server-standalone-3.6.0.jar&lt;br /&gt;
By default, the server will listen on port 4444. To use another port, set it with the &amp;quot;&amp;lt;code&amp;gt;-port &amp;amp;lt;nr&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;quot; command line argument. To connect to that server, set the &amp;quot;&#039;&#039;remote server&#039;&#039;&amp;quot; parameter of the connection to &amp;quot;&#039;&#039;&amp;lt;Server-Address&amp;gt;:4444/wd/hub&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Check and possibly configure your firewall to allow transmission through the port.&lt;br /&gt;
&lt;br /&gt;
== Headless Browsing ==&lt;br /&gt;
&amp;quot;&#039;&#039;Headless Browsing&#039;&#039;&amp;quot; means: &amp;quot;&#039;&#039;without a window&#039;&#039;&amp;quot;,  and is useful to test web-pages for reachability, performance and structure. You can either use the HTMLUnit browser type, which simulates a browser, or run against one of the real browsers in headless mode. Notice, that not all browsers support this headless mode - we recommend using &amp;quot;firefox&amp;quot; or &amp;quot;chrome&amp;quot; for this.&lt;br /&gt;
&lt;br /&gt;
Also notice, that in order to verify that a web page&#039;s interaction with a browser works correctly, you should test against real browsers.&lt;br /&gt;
For an introduction on what &amp;quot;headless browsing&amp;quot; means, see for example [https://www.guru99.com/selenium-with-htmlunit-driver-phantomjs.html https://www.guru99.com/selenium-with-htmlunit-driver-phantomjs.html].&lt;br /&gt;
&lt;br /&gt;
Notice: the HTMLUnit driver has been removed from the latest selenium distribution and is also no longer supplied with expecco (it was not a good test tool anyway, as it behaved differently from real browsers).&lt;br /&gt;
&amp;lt;br&amp;gt;If required, download from [https://github.com/SeleniumHQ/htmlunit-driver https://github.com/SeleniumHQ/htmlunit-driver].&lt;br /&gt;
&lt;br /&gt;
==Connection Blocks==&lt;br /&gt;
SeleniumWebDriverLibrary offers a number of blocks to start a Selenium connection within a testrun. The &#039;&#039;connection name&#039;&#039; identifies the connection during the run, if the test uses multiple connections and switches between them (eg. if multiple browser windows are open simultaneously). To start a connection with predefined settings, save them in the connection dialog (as attachment), and use the &amp;quot;[&#039;&#039;Connect From File&#039;&#039;]&amp;quot; action block.&lt;br /&gt;
&lt;br /&gt;
=Plugin Settings=&lt;br /&gt;
To use certain browser installations or drivers as default, for every connection, set them in the settings dialog of the plugin (&amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Plugins&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Selenium WebDriver Extension&#039;&#039;&amp;quot;). Settings for specific browsers can be found under &amp;quot;&#039;&#039;Most Popular Browsers&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Other Browsers&#039;&#039;&amp;quot;. The settings there are used as default, unless overwritten by an individual connection configuration.&lt;br /&gt;
&lt;br /&gt;
===Execution Delay for Chrome===&lt;br /&gt;
In some cases it can happen when using the Chrome browser that blocks with element actions, for example a click, run successfully in the test, but the actual action was not executed at all. This is a known bug [https://github.com/MPDL/imeji-gui-testing/issues/37], [https://github.com/SeleniumHQ/selenium/issues/4075] that needs to be fixed by Selenium or Chromedriver. The error can be prevented by either calling the click via JavaScript&amp;amp;nbsp;– to do this, set &#039;&#039;invokeDirectly&#039;&#039; to &#039;&#039;true&#039;&#039; at the click block&amp;amp;nbsp;– or wait briefly before the action. Execution via JavaScript has the disadvantage that it is less close to the click of a real user and, for example, clicks on elements work even if they are hidden by other elements. In general, blocks with element actions automatically wait until the corresponding element is available. In the cases described here, however, this is not sufficient. Therefore you will find the setting &#039;&#039;execution delay&#039;&#039; in the plugin settings for Chrome. During execution, the system waits accordingly long between each action. If you experience the described error, you can increase its value. Of course, a higher value has an effect on the test run executio times.&lt;br /&gt;
&lt;br /&gt;
=Recorder=&lt;br /&gt;
The following description applies to all GUI technologies which support remote recording in the integrated expecco recorder: the behaviour of the recorder is (apart from small differences due to technology-specific limitations) the same across different connections.&lt;br /&gt;
&lt;br /&gt;
Use of this recorder has some advantages over direct recording in the browser:&lt;br /&gt;
* it can be used with remote machines/connections/mobil devices&amp;lt;br&amp;gt;especially for mobile devices, which may be all located in a separate (server-) room&lt;br /&gt;
* it provides precise control over which event is to be recorded.&amp;lt;br&amp;gt;For example, for clicks, there are alternative ways to record: as &amp;quot;press-release&amp;quot;, as &amp;quot;click&amp;quot;, as &amp;quot;move-then-click&amp;quot;, as &amp;quot;move-then-press-delay-release&amp;quot;. Depending on the page&#039;s underlying event handling (typically done in JavaScript), either one may be required.&lt;br /&gt;
&lt;br /&gt;
Once connected to a browser, the integrated recorder can be used to record a test case. Start the recorder by selecting the appropriate connection in the GUI browser&#039;s left tree and click the &#039;&#039;record&#039;&#039; button. The recorder opens a new window. Each click in the window records an action. More actions are available in the menu. Recorded actions are added to the &#039;&#039;workspace&#039;&#039; of the GUI browser to form a sequence of interactions. This sequence can be edited, parametrized or replayed immediately. When finished, it should be saved into the suite as a new &amp;quot;Test Action&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
General actions can be found either directly in the menu bar or there in the Browser Tools menu (see below). To record actions on elements, either change the selection of the element tool in the menu bar (see below) and click on the element or select the corresponding action from the context menu by right-clicking on the element. For text input, you can also place the cursor over the element and enter the text. The input dialog for this action opens. It is also possible to record the imputs &#039;&#039;backspace&#039;&#039;, &#039;&#039;return&#039;&#039; and &#039;&#039;tab&#039;&#039; that way.&lt;br /&gt;
&lt;br /&gt;
[[Datei:SeleniumWebDriverRecorder.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Components of the recorder window&#039;&#039;&#039;&lt;br /&gt;
#&#039;&#039;&#039;Pause recording&#039;&#039;&#039;: If the control lamp is red, the recorder is in &amp;quot;&#039;&#039;recording&#039;&#039;&amp;quot;-mode. Pause the recording by clicking on this lamp. The lamp will turn to grey. In this state you can execute actions with the recorder, but they are not recorded. Click again to resume the recording.&lt;br /&gt;
#&#039;&#039;&#039;Update&#039;&#039;&#039;: Update the screenshot on the element tree. Necessary if the recorder view does not fit the browser content.&lt;br /&gt;
#&#039;&#039;&#039;Follow-Mouse&#039;&#039;&#039;: The element under the cursor is selected in the GUI browser.&lt;br /&gt;
#&#039;&#039;&#039;Element Highlighting&#039;&#039;&#039;: The element under the cursor gets a red frame.&lt;br /&gt;
#&#039;&#039;&#039;Element Tools&#039;&#039;&#039;: Select which tool to use for recording. You can choose between all actions that use a certain element. The selected action is triggered by each click in the view and the element is determined by the click position. Not selected actions are available by right click.&lt;br /&gt;
#&#039;&#039;&#039;Browser Tools&#039;&#039;&#039;: Actions not refering to ocertain elements, like scrolling or actions on the current URL or the title, can be triggered here.&lt;br /&gt;
#&#039;&#039;&#039;Page navigation&#039;&#039;&#039;: Actions for page navigation: &#039;&#039;Back&#039;&#039;, &#039;&#039;Forward&#039;&#039; and &#039;&#039;Refresh Page&#039;&#039;&lt;br /&gt;
#&#039;&#039;&#039;Alert Handling&#039;&#039;&#039;: Click this button if the browser shows an alert, to be able to select the actions for alert handling.&lt;br /&gt;
#&#039;&#039;&#039;Online Documentation&#039;&#039;&#039;: Open this online documentation.&lt;br /&gt;
#&#039;&#039;&#039;View&#039;&#039;&#039;: Shows a screenshot of the browsers. Actions can be triggered by mouse depending on the selected tool. If a new action can be entered, the frame of the window is green, red otherwise. Scrolling is forwarded to the browser, but not recorded.&lt;br /&gt;
#&#039;&#039;&#039;Resize Window to Screen Size&#039;&#039;&#039;: Change the size of the window to show the whole screenshot.&lt;br /&gt;
#&#039;&#039;&#039;Set Screen Scale to Fit Window&#039;&#039;&#039;: Scale the screenshot to fully fit in the window&lt;br /&gt;
#&#039;&#039;&#039;Scale&#039;&#039;&#039;: Changes the scale of the screenshot. Can also be adjusted by scrolling with pressed &amp;lt;kbd&amp;gt;CTRL&amp;lt;/kbd&amp;gt; key.&lt;br /&gt;
#&#039;&#039;&#039;Notifications&#039;&#039;&#039;: Shows notifications, e.g. if an action cannot be recorded. The last notification is displayed until it is closed by the button on its right side.&amp;lt;br&amp;gt;&#039;&#039;&#039;Window Tabs&#039;&#039;&#039;: As of expecco 23.1, tabs are displayed above the display for each open window as soon as a connection has more than one browser window. Whether the browser displays this as a tab or in its own window does not matter. You can use the tabs in the recorder to switch the current window and also record this switch.&amp;lt;br&amp;gt;&#039;&#039;&#039;Frame context&#039;&#039;&#039;: As of expecco 23.1, you can see below the display in which frame context you are currently in (see the section [[#Embedded_Content|Embedded Content]]). You can click on the entries to switch to a higher context and record this switch. If you have compound paths enabled, the display will update when you select an embedded item.&lt;br /&gt;
&lt;br /&gt;
=Embedded Content=&lt;br /&gt;
In HTML it is possible to include content from another page within one page. The most common element to do this is an iframe (inline frame). The content of an iframe can also be accessed with Selenium, but first you have to switch to this context. In the SeleniumWebDriverLibrary there are corresponding blocks to switch to the context of an iframe, to switch to the parent context and to switch back to the default content, i.e. the top context. All element blocks always resolve the applied paths within the current context. In the GUI browser, you will see an additional element for embedded content, which you can expand to see its elements.&lt;br /&gt;
&lt;br /&gt;
==Compound Paths==&lt;br /&gt;
Since expecco 23.1 there is the possibility to also use compound paths at the blocks to access the content of an iframe directly from the standard content. For this purpose, simply the path to the iframe and the path within the iframe content are combined into one. It is important here that no elements may be omitted at the transition, i.e. the front part must end with the iframe element and the back part must begin with &#039;&#039;/body&#039;&#039;. In between the paths may be shortened and it is of course also possible to access elements nested to any depth in this way. Both techniques can be used on the blocks as desired, the only important thing is that the paths are always resolved in the context in which Selenium is currently located.&lt;br /&gt;
&lt;br /&gt;
If you want to record the combined paths or use them in the GUI Browser, check the box &#039;&#039;Record Compound Paths&#039;&#039; in the &#039;&#039;GUI Browser&#039;&#039; menu under &#039;&#039;Recording&#039;&#039;. This will create and display a compound path for embedded elements relative to the current context, instead of only within its own context as before. You can also address these elements directly in the recorder or find them via Follow-Mouse.&lt;br /&gt;
&lt;br /&gt;
=Shadow Elements=&lt;br /&gt;
Shadow DOMs allow you to encapsulate parts of a page from the remaining document. They provide a way to attach hidden shadow elements to an element. You can find a more detailed explanation for example here: [https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_shadow_DOM Using shadow DOM - Web APIs | MDN].&lt;br /&gt;
&lt;br /&gt;
The SeleniumWebDirverLibrary has the block &#039;&#039;[Web] Get Shadow DOM&#039;&#039;, which gives you the topmost elements, which then can be used like other WebElements.&lt;br /&gt;
&lt;br /&gt;
As the elements are hidden, they are not directly displayed in the GUI browser. However, since expecco 23.1 you can check in the context menu of the elements in the GUI browser the option to find shadow elements. They then will be displayed when updating the children of an element, if there are any, but not when updating the whole tree. If the option is checked, the elements are also available in the recorder.&lt;br /&gt;
&lt;br /&gt;
==Compound Paths==&lt;br /&gt;
Similar to elements inside a frame, shadow elements can be accessed by compound paths. These paths can be used directly at the library blocks and the block &#039;&#039;[Web] Get Shadow DOM&#039;&#039; is not required. The paths are of the form&lt;br /&gt;
 &amp;lt;host path&amp;gt;/shadowRoot/&amp;lt;shadow path&amp;gt;&lt;br /&gt;
where &#039;&#039;&amp;lt;host path&amp;gt;&#039;&#039; denotes the path to the element that has the shadow DOM attached, and &#039;&#039;&amp;lt;shadow path&amp;gt;&#039;&#039; denotes the path inside the shadow DOM to the desired element. &#039;/shadowRoot&#039; serves as marker where the switch to the shadow DOM is needed.&lt;br /&gt;
&lt;br /&gt;
=Authentication Alerts=&lt;br /&gt;
If a Web page uses HTTP authentication with Basic Authentication, an alert window for entering the user name and password opens when the page is loaded. This window cannot be accessed directly with Selenium. In the GUI browser, it is displayed as an alert. An exception to this is Chrome, where the driver does not respond to any request as long as the dialog is open. At this point, the plugin cannot even determine whether an authentication dialog is open or whether the driver is not responding for other reasons.&lt;br /&gt;
&lt;br /&gt;
For local connections under Windows, authentication can be performed using Windows Access. In the SeleniumWebDriverLibrary there are specific authentication blocks for individual browser types as well as the block &#039;&#039;Authenticate at Alert&#039;&#039;, which executes the corresponding block depending on the connection. There are different restrictions for the different browser types:&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Chrome:&#039;&#039;&#039; The credentials are sent to a chrome window, so it only works if not more than one are open. In this case, the single block has the option to specify the title of the window.&lt;br /&gt;
:&#039;&#039;&#039;Edge&#039;&#039;&#039;: With Microsoft Edge a login is not supported.&lt;br /&gt;
:&#039;&#039;&#039;Firefox&#039;&#039;&#039;: Sends the credentials to a Firefox dialog box and therefore only works if there are not multiple ones.&lt;br /&gt;
:&#039;&#039;&#039;Internet Explorer&#039;&#039;&#039;: With Internet Explorer a login is not supported.&lt;br /&gt;
&lt;br /&gt;
As an additional option, you can also log in using the URL. Instead of the page &amp;lt;nowiki&amp;gt;https://www.example.com&amp;lt;/nowiki&amp;gt; call the URL &amp;lt;nowiki&amp;gt;https://user:password@www.example.com&amp;lt;/nowiki&amp;gt;. It is important that &#039;&#039;:&#039;&#039; and &#039;&#039;@&#039;&#039; do not appear in the user name or password. This method may not be supported by every browser.&lt;br /&gt;
&lt;br /&gt;
With the [[WindowsAutomation_Reference_2.0/en|WindowsAutomation2]]-Plugin it is also possible to execute such a login with all browser types.&lt;br /&gt;
&lt;br /&gt;
=Transferring Old Selenium Tests=&lt;br /&gt;
This Plugin replaces the previous [[Selenium_Web_Test_Plugin|Selenium Web Test Plugin]], which is based on [https://www.seleniumhq.org/projects/remote-control/ Selenium RC]. Selenium RC is no longer supported by their authors and it will also no longer be maintained by exept. The successor is [https://www.seleniumhq.org/projects/webdriver/ Selenium WebDriver], also referred to as Selenium 2. &lt;br /&gt;
&lt;br /&gt;
Recording of test actions using [https://www.seleniumhq.org/projects/ide/ Selenim IDE] is also outdated, as the plugin is not supported by newer browsers. The &#039;&#039;Selenium WebDriver Plugin&#039;&#039; uses its own [[#Recorder|Recorder]] instead.&lt;br /&gt;
&lt;br /&gt;
Tests which were created with the old &#039;&#039;Selenium WebTest Plugin&#039;&#039; using SeleniumLibrary can be executed with the new Selenium WebDriver. &lt;br /&gt;
For this, go to the plugin settings of &amp;quot;&#039;&#039;Webtest Legacy (Selenium)&#039;&#039;&amp;quot; and check &amp;quot;&#039;&#039;Use WebDriver for execution&#039;&#039;&amp;quot;. Please verify that your tests are still running after this change, as there is no 100% backward compatibility (which is outside the scope of expecco). However, most of the old test actions should run without problems.&lt;br /&gt;
&lt;br /&gt;
=FAQ=&lt;br /&gt;
*&#039;&#039;&#039;Scrollbars cannot be handled in the recorder&#039;&#039;&#039;&lt;br /&gt;
:The scrollbar of the browser which is diplayed if a page is larger than the browser window is no controllable web element. Mostly it is useless to scroll by a certain amount in a test where the size of the browser window is not defined. Instead, use the block &amp;lt;code&amp;gt;[Web] Scroll Element into View&amp;lt;/code&amp;gt; to scroll a relevant element to the visible region. The default click block used by the recorder already includes this action (&amp;lt;code&amp;gt;[WebElement] Click (Scroll Element into View)&amp;lt;/code&amp;gt;). If you scroll on the recorder window, the action will also be applied to the browser, but is not recorded. If you actually want to scroll by a certain amount, there is an appropriate entry in the browser actions, and more blocks in the SeleniumWebDriverLibrary.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Block fails if element becomes visible too late&#039;&#039;&#039;&lt;br /&gt;
:All blocks that use an element path have built in that they wait until a corresponding element appears. However, there are cases where an element is already there, but not yet visible. If you click on the element you will get an error. Possible errors in this context are &amp;lt;code&amp;gt;org.openqa.selenium.ElementNotInteractableException: element not interactable&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;org.openqa.selenium.JavascriptException: javascript error: Cannot read property &#039;left&#039; of undefined&amp;lt;/code&amp;gt;. In this case, use the &amp;lt;code&amp;gt;[Web] Wait for Visibility of Element&amp;lt;/code&amp;gt; block or &amp;lt;code&amp;gt;[Web] Wait for Element to Be Clickable&amp;lt;/code&amp;gt; before interacting with the element.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Error message &amp;lt;code&amp;gt;Cannot read property &#039;left&#039; of undefined&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:The error &amp;lt;code&amp;gt;org.openqa.selenium.JavascriptException: javascript error: Cannot read property &#039;left&#039; of undefined&amp;lt;/code&amp;gt; can occur with the Chrome browser. This means that the used element is not visible. See the point above on that. The error is also known in combination with elements in a dropdown list, i.e. when clicking or moving the mouse over a &amp;lt;nowiki&amp;gt;&amp;lt;option&amp;gt;&amp;lt;/nowiki&amp;gt; element within a &amp;lt;nowiki&amp;gt;&amp;lt;select&amp;gt;&amp;lt;/nowiki&amp;gt; element. Such elements are generally not clickable. Instead, use a suitable &amp;lt;code&amp;gt;[Web] Select&amp;lt;/code&amp;gt; block with the &amp;lt;nowiki&amp;gt;&amp;lt;select&amp;gt;&amp;lt;/nowiki&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Error message: &amp;lt;code&amp;gt;Stale Element Reference Exception&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:The error &amp;lt;code&amp;gt;org.openqa.selenium.StaleElementReferenceException&amp;lt;/code&amp;gt; occurs whenever a WebElement is used that is no longer there. If that happens during your test and the element should have been there, try using the locator instead to fetch the element again. Maybe the error occurs because the test is currently in a different frame context as the element. If you are using [[#Compound_Paths|compound paths]], the element should switch by itself to the correct context when it is used.&lt;br /&gt;
:In rare cases this error can also occur in expecco itself, if at somewhere in the GUI browser or the recorder such a WebElement is used. You should then be able to abort and try again. Should the error persist, switch to the default content and refresh the tree in the GUI browser.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Block runs successfully, but without effect&#039;&#039;&#039;&lt;br /&gt;
:This case can occur with Chrome. The element is available, the action does not throw an error, but nothing is executed. Usually it helps to wait briefly before the execution, see [[#Execution_Delay_for_Chrome | Execution Delay for Chrome]].&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Executions using Chrome are slower&#039;&#039;&#039;&lt;br /&gt;
:To fix a problem when executing with Chrome, a delay is defined in the plugin settings for Chrome. Check if this value is possibly too high; see [[#Execution_Delay_for_Chrome | Execution Delay for Chrome]].&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Errors like: &amp;quot;org.openqa.selenium.InvalidArgumentException: Expected &amp;quot;handle&amp;quot; to be a string...&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
:This occurs if the driver does not match the browser (any more). Please read the above chapter &amp;quot;[[#Update WebDriver|Update WebDriver]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Key Chords with Shortcuts are not working&#039;&#039;&#039;&lt;br /&gt;
:Pressing keys simultaneously can be simulated using Key Chords. They can also be used to send shortcuts. However, not all inputs will work, as they are only sent to the page content, not to the browser itself. Combinations like &#039;&#039;Ctrl + t&#039;&#039; to open a new browser tab probably wont&#039;t work, &#039;&#039;Ctrl + a&#039;&#039; and &#039;&#039;Ctrl  c&#039;&#039; on the other hand should be effective.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Additional Window Handles for Opera&#039;&#039;&#039;&lt;br /&gt;
:The Opera browser returns more window handles as there are opened tabs or windows. They represent Opera internal features like &#039;&#039;Speed Dial&#039;&#039; or &#039;&#039;Better Address Bar Experience&#039;&#039; (BABE), which are embedded in the browser window, but not displayed like regular tabs. You can switch to these tabs using an appropriate action block, however not all actions are possible then, which can be used with the normal tabs. For example you cannot close them and they don&#039;t provide a screenshot. Therefore it is better to not even switch to their contexts. So be careful when switching to a tab by index, as the Opera tabs are among the others and the index might be a different one than for the other browser types.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Chrome: Choose your search engine&#039;&#039;&#039;&lt;br /&gt;
:Newer versions of Chrome show an [https://www.google.com/chrome/choicescreen/ overlay] at startup, where you have to choose a search engine. Usually, this choice is saved in the user profile. However, if you don&#039;t explicitly set a Chrome profile for the connection, each connect will use an empty profile and this question will always show up.&lt;br /&gt;
&lt;br /&gt;
:In most cases, the test can run in the back despite the overlay. However, the overlay counts as tap or window, meaning the block &#039;&#039;[Web] Get Window Handles&#039;&#039; for an example returns a window handle for it and you can switch to it. But you have options to get rid of it:&lt;br /&gt;
:* &#039;&#039;--disable-search-engine-choice-screen&#039;&#039;: In the [[#Advanced_Settings|advanced settings]] you can add the option &amp;lt;code&amp;gt;--disable-search-engine-choice-screen&amp;lt;/code&amp;gt; and the overlay won&#039;t show up.&lt;br /&gt;
:* &#039;&#039;Choose&#039;&#039;: You can extend your test, so it actually chooses a search engine and closes the overlay. There are two things you need to bear in mind. First, you have to switch there using a &#039;&#039;Switch to Window&#039;&#039; block (e.g. by index &#039;&#039;2&#039;&#039; or with an empty title) and back to your original tab afterwards as well. Secondly, the interesting elements in the overlay are [[#Shadow_Elements|shadow elements]] and as such not directly displayed in the GUI-Browser.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Firefox: &amp;lt;code&amp;gt;Process unexpectedly closed with status 0&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:Error pattern: The connection to the Firefox browser fails with the error message &amp;lt;code&amp;gt;org.openqa.selenium.WebDriverException: Process unexpectedly closed with status 0&amp;lt;/code&amp;gt;. However, the browser eventually opens without there being a connection in expecco.&lt;br /&gt;
:A known cause of this issue is that the browser is started for the first time after an update, which the browser cannot handle properly in the automated state. The second attempt should then be successful. To prevent this error, make sure that you always start the browser normally the first time after an update.&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Selenium_WebDriver_Plugin&amp;diff=29684</id>
		<title>Selenium WebDriver Plugin</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Selenium_WebDriver_Plugin&amp;diff=29684"/>
		<updated>2024-08-22T15:02:28Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* FAQ */ Firefox nach Update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Deutsche Version&#039;&#039;&#039; | [[Selenium_WebDriver_Plugin/en|English Version]]&lt;br /&gt;
=Achtung=&lt;br /&gt;
Das Webtest Selenium WebDriver Plugin ersetzt das bisherige [[Selenium_Web_Test_Plugin|Selenium Web Test Plugin]]. Zur Automatisierung wird [https://www.seleniumhq.org/projects/webdriver/ Selenium WebDriver] verwendet (Driver für gängige Browser werden von uns mitgeliefert), der das bisher verwendete Selenium RC ersetzt. Dies wurde einerseits notwendig, da die SeleniumRC Schnittstelle von neuen Browsern nicht mehr unterstützt wird, andererseits, sinnvoll, da auch andere UI Technologien mit diesem Protokoll angesprochen werden können. &lt;br /&gt;
&lt;br /&gt;
Sie können dieses Protokoll nur noch mit älteren Browsern verwenden, und wir empfehlen dringend, auf die neue Version umzusteigen. &amp;lt;br&amp;gt;Hinweise zur Migration älterer Testsuiten finden Sie [[#Portierung_alter_Selenium-Tests | unten]].&lt;br /&gt;
&lt;br /&gt;
=Einleitung=&lt;br /&gt;
Mit dem Selenium WebDriver Plugin können Sie Tests von Webapplikationen erstellen oder auch diese automatisieren (*). Das Plugin kann (und wird üblicherweise) zusammen mit dem [[Expecco_GUI_Tests_Extension_Reference|GUI-Browser]] verwendet werden, der das Erstellen von Tests oder automatisierten Browseraktionen unterstützt. Zudem ist damit das Aufzeichnen von Abläufen möglich.&lt;br /&gt;
&lt;br /&gt;
(*) tatsächlich gibt es auch WebDriver-Schnittstellen um z.B. Windows-Apps oder OPS-Fenster zu manipulieren. Insofern gibt es für dieses Plugin weitere Einsatzbereiche.&lt;br /&gt;
&lt;br /&gt;
=Einstellungen=&lt;br /&gt;
Das Plugin verwendet die Java-Bridge und benötigt daher eine Java-Installation. Sie können diese in den Einstellungen unter &#039;&#039;Erweiterungen&#039;&#039; -&amp;gt; &#039;&#039;Java Bridge&#039;&#039; angeben. Wichtig ist hier das Feld &#039;&#039;Pfad zur Java-Installation&#039;&#039;, wo Sie ein JDK oder JRE angeben können. Ist nichts angegeben, versucht expecco java im PATH zu finden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:JDKPfadEinstellungen.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Für das Selenium WebDriver Plugin selbst gibt es ebenfalls Einstellungsmöglichkeiten, die Sie unter &#039;&#039;Erweiterungen&#039;&#039; -&amp;gt; &#039;&#039;Webtest (Selenium WebDriver)&#039;&#039; finden. Hier können Sie zum Beispiel die Adresse zu einem remote laufenden Selenium-Server angeben oder eine andere Jar-Datei für Selenium angeben. Einstellungen zu den verschiedenen Browser-Typen teilen sich auf die Unterseiten &#039;&#039;Beliebte Browser&#039;&#039; und &#039;&#039;Andere Browser&#039;&#039; auf. Dort können Sie den Pfad zur Browser-Ausführungsdatei oder zum Webdriver angeben, der verwendet werden soll. Diese Felder können Sie alle leer lassen, expecco wird dann automatisch danach suchen.&lt;br /&gt;
&lt;br /&gt;
=Browser-Unterstützung=&lt;br /&gt;
Das Plugin unterstützt die Browser Chrome/Chromium, Edge, Firefox, Internet Explorer und Opera. &lt;br /&gt;
&amp;lt;br&amp;gt;Safari unter OSX muss zumindest in der Version 10 vorliegen und OSX muss mindestens die El Capitan Version sein.&lt;br /&gt;
Zur Kommunikation wird die WebDriver Schnittstelle verwendet; somit kann der getestete Browser sowohl lokal als auch auf einem entfernten Rechner laufen.&lt;br /&gt;
&lt;br /&gt;
Da inzwischen eine Vielzahl von weiteren Browsen, Geräten und graphischen Oberflächen eine WebDriver Schnittstelle anbieten, können auch diese - z.T. mit eingeschränktem Funktionsumfang - über diese automatisiert werden. So gibt es z.B. auch Schnittstellen für Windows Mobilgeräte oder Desktopanwendungen.&lt;br /&gt;
&lt;br /&gt;
== WebDriver aktualisieren==&lt;br /&gt;
Für jeden Browsertyp gibt es einen Driver, über den das Starten und Ansteuern der Browserfenster funktioniert. Für die wichtigsten Browser finden sich im Lieferumfang aktuelle Driverversionen. Da die Browser fortlaufend aktualisiert werden, teilweise sogar automatisch, müssen Sie früher oder später neue Driverversionen herunterladen. Legen Sie diese dann in Ihrem expecco-Installationsverzeichnis bei den anderen Versionen ab, und zwar unter:&lt;br /&gt;
 &amp;lt;code&amp;gt;packages/exept/expecco/plugin/seleniumWebDriver/lib/XXX&amp;lt;/code&amp;gt;&lt;br /&gt;
(unter Microsoft Windows Betriebssystemen mit &amp;quot;\” anstatt &amp;quot;/&amp;quot;), wobei &amp;quot;XXX&amp;quot; für das Betriebssystem steht (Windows, Linux, OSX etc.).&lt;br /&gt;
&lt;br /&gt;
Im Verbindungsdialog warnt expecco, wenn eine Driverversion nicht zur Browserversion passt. In manchen Fällen kann das aber auch nur daran liegen, dass  diese Version zum Zeitpunkt der Auslieferung noch nicht bekannt war. Manche Kombinationen können trotz der Warnung funktioniert, aber das können wir im Einzelfall nicht garantieren.&lt;br /&gt;
&lt;br /&gt;
Daher können Sie bei einer solchen Warnung immer die Option &amp;quot;&#039;&#039;Diese Warnung nicht mehr anzeigen&#039;&#039;&amp;quot; anwählen, damit diese Driver-Browser-Versionskombination in ihren Settings als &amp;quot;kompatibel&amp;quot; vermerkt wird, und in Zukunft nicht mehr gemeldet wird. Dies sollten Sie aber nur machen, wenn Sie sicher sind, dass Ihre Tests nach wie vor korrekt ausgeführt werden. Da wir hier selbst bisweilen auf Kompatibilitätsprobleme stoßen, und nicht immer gleich klar ist, woran es liegt, empfehlen wir aber den Driver zu aktualisieren.&lt;br /&gt;
&lt;br /&gt;
Für Chrome und Microsoft Edge, bei denen es für jede neue Browserversion auch eine neue Driverversion gibt, finden Sie im Verbindungsdialog einen Button, um mit expecco die passende Version herunterzuladen.&lt;br /&gt;
&lt;br /&gt;
Neuere Versionen der Driver bekommen Sie an folgenden Adressen:&lt;br /&gt;
{|&lt;br /&gt;
|Chrome/Chromium&lt;br /&gt;
|[https://sites.google.com/chromium.org/driver/ ChromeDriver]&lt;br /&gt;
|-&lt;br /&gt;
|Edge&lt;br /&gt;
|[https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ Microsoft WebDriver]&lt;br /&gt;
|-&lt;br /&gt;
|Firefox&lt;br /&gt;
|[https://github.com/mozilla/geckodriver/releases GeckoDriver]&lt;br /&gt;
|-&lt;br /&gt;
|Internet Explorer&lt;br /&gt;
|[https://selenium-release.storage.googleapis.com/index.html IEDriverServer]&lt;br /&gt;
|-&lt;br /&gt;
|Opera&lt;br /&gt;
|[https://github.com/operasoftware/operachromiumdriver/releases OperaDriver]&lt;br /&gt;
|-&lt;br /&gt;
|Safari&lt;br /&gt;
|[https://webkit.org/blog/6900/webdriver-support-in-safari-10 Safari Support]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Laden Sie sich eine passende Version herunter und legen Sie sie im oben genannten Verzeichnis an der entsprechenden Stelle ab. Expecco wird sie dann finden und verwenden. &amp;lt;!-- Sie können den Namen der Datei erweitern, um mehrere Versionen nebeneinander verwenden zu können. --&amp;gt; Alternativ können Sie auch in expecco den Pfad zu einem Driver angeben, entweder im [[#Erweiterte_Einstellungen | Verbindungseditor]] oder in den [[#Plugin-Einstellungen | Plugin-Einstellungen]].&lt;br /&gt;
&lt;br /&gt;
[[Datei:bulb.png|20px]]Bitte verifizieren Sie, daß die Version des Drivers kompatibel ist mit der des Browsers. Im Zweifel suchen Sie nach der Versionshistorie (z.B. für Chrome: https://chromedriver.storage.googleapis.com/2.25/notes.txt).&lt;br /&gt;
&lt;br /&gt;
[[Datei:bulb.png|20px]]Für den Internet Explorer ist zu beachten, dass der geschützte Modus für alle Zonen gleich eingestellt sein muss, damit eine Verbindung möglich ist. (im Internet Explorer: &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Internetoptionen&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Sicherheit&#039;&#039;&amp;quot; öffnen, und bei allen 4 Zonen &amp;quot;geschützter&amp;quot; Bereich gleich einstellen; ansonsten kommen beim Verbindungsaufbau Fehler- und Warndialoge). Siehe außerdem die [https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver#required-configuration erforderliche Konfiguration] zur Verwendung des InternetExplorerDrivers.&lt;br /&gt;
&lt;br /&gt;
[[Datei:bulb.png|20px]]Das Plugin verwendet für einige Funktionen JavaScript. Stellen Sie daher sicher, dass die Ausführung von JavaScript im verwendeten Browser erlaubt ist, insbesondere wenn Sie den GUI-Browser oder den Recorder verwenden wollen. Das Ausführen von Tests ist auch ohne JavaScript möglich, solange keine Aktionen verwendet werden, welche JavaScript benötigen oder explizit ausführen.&amp;lt;br&amp;gt;Sollten Sie einen Fehler der Art &amp;quot;&amp;lt;code&amp;gt;org.openqa.selenium.JavascriptException: Error executing JavaScript&amp;lt;/code&amp;gt;&amp;quot; bekommen, stellen Sie sicher, dass die Ausführung von JavaScript im verwendeten Browser erlaubt ist und Browser- und zugehörige WebDriver-Version kompatibel sind.&lt;br /&gt;
&lt;br /&gt;
= Headless Browser =&lt;br /&gt;
Mit &amp;quot;&#039;&#039;Headless&#039;&#039;&amp;quot; bezeichnet man eine Anwendung, welche ohne Bedienoberfläche abläuft. Einige der Browser unterstützen einen &amp;quot;headless&amp;quot; Modus,  bei dem kein Browserfenster angezeigt wird. Der Browser operiert dabei in einem &amp;quot;unsichtbaren Fenster&amp;quot; führt aber alle Operationen aus, und liefert auch die selbe Elementhierarchie.&lt;br /&gt;
Bei einigen Browsern sind allerdings die Screenshot (Bild vom Fenster bzw. von Elementen) eingeschränkt bzw. gar nicht verfügbar.&amp;lt;br&amp;gt;Den &amp;quot;headless&amp;quot; Modus können Sie beim Verbindungsaufbau in den &amp;quot;&#039;&#039;Advanced Settings&#039;&#039;&amp;quot; angeben.&lt;br /&gt;
&lt;br /&gt;
= HTML Unit Browser =&lt;br /&gt;
Bei diesem &amp;quot;&#039;&#039;Pseudobrowser&#039;&#039;&amp;quot; handelt es sich um eine weitere &amp;quot;&#039;&#039;headless&#039;&#039;&amp;quot; Variante, welche ganz ohne Renderengine operiert, und lediglich die Elementhierarchie sowie Javascript unterstützt. Sein Verhalten kann stark von dem &amp;quot;echter&amp;quot; Browser abweichen.&lt;br /&gt;
&lt;br /&gt;
Diesen Browsertyp können Sie verwenden, wenn ihr Test das Verhalten des Webservices (also der Servierseite) betrifft, und nicht das Verhalten der Anwendung im Browser (End-User-Experience) im Fokus hat. Zum Beispiel kann der &amp;quot;HTML Unit Browser&amp;quot; zum Generieren von Last oder gleichzeitigen Aktionen gegenüber dem Server dienen.&lt;br /&gt;
Da sich dieser Browser im Verhalten z.T. stark von dem echter Browser unterscheidet sollte er nur (wenn überhaupt) in besonderen Fällen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
= Schneller Einstieg =&lt;br /&gt;
== Browser öffnen / verbinden ==&lt;br /&gt;
* Starten Sie expecco&lt;br /&gt;
* Klicken Sie auf &amp;quot;&#039;&#039;Neue Testsuite&#039;&#039;&amp;quot;&lt;br /&gt;
* Klicken Sie auf das GUI-Browser Symbol ([[Datei:GUIBrowser.png|24px]])&lt;br /&gt;
* Es erscheint der GUI-Browser in einem neuen Reiter&lt;br /&gt;
* Klicken Sie auf &amp;quot;&#039;&#039;Verbinden&#039;&#039;&amp;quot; und wählen Sie &amp;quot;&#039;&#039;Webtest (Selenium WebDriver)&#039;&#039;&amp;quot; aus. Dann erscheint der [[#Verbindungseditor | Verbindungsdialog]] (Details siehe unten)&lt;br /&gt;
* Im Verbindungsdialog geben Sie die zu testende Webseite ein (z.B. &amp;quot;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://www.myHost.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;quot;) und wählen den Browsertyp (z.B. &amp;quot;&amp;lt;code&amp;gt;chrome&amp;lt;/code&amp;gt;&amp;quot; oder &amp;quot;&amp;lt;code&amp;gt;firefox&amp;lt;/code&amp;gt;&amp;quot;) aus&lt;br /&gt;
* Klicken Sie auf &amp;quot;&#039;&#039;Verbinden&#039;&#039;&amp;quot;&lt;br /&gt;
* Ein Browser wird nun automatisch gestartet, und die Seite angezeigt.&lt;br /&gt;
* Sobald die Verbindung steht, wird im GUIBrowser die Seitenstruktur als Baum angezeigt, und im rechten Diagramm-Fenster erscheint ein passender Verbindungsbaustein. Dieser wird nicht automatisch aufgezeichnet, da man diesen normalerweise nicht in jeder aufgezeichneten Sequenz haben will (mehr dazu unten).&lt;br /&gt;
&lt;br /&gt;
== Recording aufnehmen ==&lt;br /&gt;
* Klicken Sie auf das Recording Symbol im GUI-Browser.&lt;br /&gt;
[[Datei:Recording_Start.png | 200px]]&lt;br /&gt;
* Ein Recorderfenster erscheint (eine Beschreibung der Bedienelemente finden Sie unten)&lt;br /&gt;
* Sie zeichnen nun direkt im Rekorder auf.&amp;lt;br&amp;gt;&lt;br /&gt;
* Klicks werden je nach Einstellung als Klick, Mausbewegung, Drag&amp;amp;Drop etc. aufgezeichnet.&amp;lt;br&amp;gt;Während der Aufzeichnung können Sie zwischen diesen Werkzeugen wechseln:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Datei:Recorder_Werkzeuge.png | 300px]]&lt;br /&gt;
* die aufgezeichneten Aktionen werden im Tab &amp;quot;&#039;&#039;Aufgezeichnete Sequenz&#039;&#039;&amp;quot; dargestellt. Sie können dort noch bearbeitet werden.&lt;br /&gt;
* Zum Beenden der Aufzeichnung klicken Sie entweder auf den &amp;quot;&#039;&#039;Stop Recording&#039;&#039;&amp;quot; Knopf im GUI Browser, oder schließen das Rekorderzenster. Es ist auch möglich, das Aufzeichnen temporär zu Pausieren, indem sie im Rekorder auf den &amp;quot;&#039;&#039;Aufnahme&#039;&#039;&amp;quot;-Knopf oben links drücken.&lt;br /&gt;
* Nach dem Aufzeichnen können sie die Sequenz un ihre Testsuite als Testfall oder Teilsequenz übernehmen.&lt;br /&gt;
&lt;br /&gt;
== Aufgezeichnete Aktion wiedergeben ==&lt;br /&gt;
&lt;br /&gt;
* Im Reiter &amp;quot;&#039;&#039;Aufgezeichnete Sequenz&#039;&#039;&amp;quot; kann die aktuelle Aufzeichnung sofort wiedergegeben werden (&amp;quot;&#039;&#039;Play&#039;&#039;&amp;quot;-Knopf drücken)&amp;lt;br&amp;gt;Beachten Sie, daß ihre Webseite üblicherweise im gleichen Zustand sein sollte - gegebenenfalls sollten Sie also den &amp;quot;&#039;&#039;Back&#039;&#039;&amp;quot;-Knopf oder eine andere Navigation anwenden, um dies sicher zu stellen.&lt;br /&gt;
* Die Sequenz kann bearbeitet werden. Dazu können entweder weitere Aktionen aufgenommen werden, oder zusätzliche Aktionen entweder via Drag&amp;amp;Drop oder über das Kontextmenü (bzw. &amp;lt;kbd&amp;gt;&amp;lt;CTRL-N&amp;lt;/kbd&amp;gt;) angelegt werden. Häufig werden zusätzliche Delay- oder Verifikations-Bausteine benötigt, die sie hiermit an geeigneter Stelle einfügen können.&lt;br /&gt;
&lt;br /&gt;
=Verbindungsaufbau=&lt;br /&gt;
==&amp;lt;span id=&amp;quot;Verbindungsdialog&amp;quot;&amp;gt;Verbindungseditor==&lt;br /&gt;
Mit dem Verbindungseditor werden Verbindungen definiert, geändert und aufgebaut. Sie erreichen ihn, indem Sie den GUI-Browser öffnen und dort auf &amp;quot;&#039;&#039;Verbinden&#039;&#039;&amp;quot; klicken und dann &amp;quot;&#039;&#039;Selenium Testing (WebDriver)&#039;&#039;&amp;quot; auswählen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:SeleniumWebDriverConnectDialog.png]]&lt;br /&gt;
&lt;br /&gt;
#&#039;&#039;Einstellungen aus Anhang laden&#039;&#039;: Öffnet einen Anhang im expecco Projekt mit Verbindungseinstellunge. Diese Einstellungen werden in den Editor übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&#039;&#039;Einstellungen aus Datei&#039;&#039;: Öffnet eine gespeicherte Einstellungsdatei (*.csf). Diese Einstellungen werden in den Editor übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&#039;&#039;Einstellungen in Anhang speichern&#039;&#039;: Hier können Sie die eingetragenen Einstellungen als Anhang im expecco-Projekt anlegen.&lt;br /&gt;
#&#039;&#039;Einstellungen in JSON-Anhang speichern&#039;&#039;: Hier können Sie die eingetragenen Einstellungen im JSON-Format als Anhang im expecco-Projekt anlegen.&lt;br /&gt;
#&#039;&#039;Einstellungen in Datei speichern&#039;&#039;: Hier können Sie die eingetragenen Einstellungen in eine Datei (*.csf) speichern.&lt;br /&gt;
#&#039;&#039;Versionsinfo&#039;&#039;: Zeigt ein Fenster mit den verwendeten Versionen des Selenium-Servers, des ausgewählten Browser und dessen Driver an.&lt;br /&gt;
#&#039;&#039;Online-Dokumentation&#039;&#039;: Öffnet diese Online-Dokumentation.&lt;br /&gt;
#&#039;&#039;Verbindungsname&#039;&#039;: Tragen Sie hier den Namen ein, unter dem die Verbindung im GUI-Browser angezeigt werden soll. (Optional)&lt;br /&gt;
#&#039;&#039;Browsertyp&#039;&#039;: Wählen Sie hier aus, welchen Browser Sie verwenden möchten. Stellen Sie sicher, dass dieser installiert ist und die Version des verwendeten Drivers zur Browserversion passt.&lt;br /&gt;
#&#039;&#039;URL&#039;&#039;: Tragen Sie hier die URL ein, die zu Beginn aufgerufen werden soll. Sie können das Feld auch frei lassen, dann wird ein leeres Browser-Fenster geöffnet. Um eine lokale Datei zu öffnen, verwenden Sie das Schema &amp;quot;&amp;lt;code&amp;gt;file://&amp;lt;/code&amp;gt;&amp;quot;, z.B. &amp;quot;&amp;lt;code&amp;gt;file:///C:/Users/admin/Desktop/index.html&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
#&#039;&#039;Erweiterte Ansicht&#039;&#039;: Wechselt zur Ansicht für die Eingabe von [[#Erweiterte Einstellungen|erweiterten Einstellungen]].&lt;br /&gt;
#&#039;&#039;Informationen zum gewählten Browser&#039;&#039;: Hier wird der ausgewählte Browsertyp kurz vorgestellt.&lt;br /&gt;
#&#039;&#039;Informationen zu den Einstellungen&#039;&#039;: Hier wird angezeigt, welche Selenium-, Browser- und Driver-Version mit den aktuellen Einstellungen verwendet wird. Falls Sie [[#Erweiterte Einstellungen|erweiterten Einstellungen]] gesetzt haben, werden diese hier ebenfalls aufgelistet.&lt;br /&gt;
&lt;br /&gt;
===Warnung &amp;amp;uuml;ber m&amp;amp;ouml;gliche Inkompatibilit&amp;amp;auml;t ===&lt;br /&gt;
Manche Browser benötigen einen versionsspezifischen Webdriver, da die verwendeten Kommunikationsprotokolle unterschiedlich sein können. &lt;br /&gt;
&lt;br /&gt;
Da regelmässig neue Browserversionen erscheinen, und damit einhergehend auch neue Versionen des zug. Webdrivers benötigt werden, kann. es sein, dass die mit expecco mitgelieferten Webdriver nicht mehr zur aktuellen Browserversion passen. Dies trat in der Vergangenheit insbes. beim Chromebrowser mehrfach auf.&lt;br /&gt;
 &lt;br /&gt;
Um auf eventuelle Probleme hinzuweisen hält expecco intern eine Liste von Paaren der von exept bereits getesteten Browser- zu Webdriverversion. Falls ihr Browser aktueller ist, und nicht in der Liste enthalten ist, erscheint eine Warnung im Infobereich.&lt;br /&gt;
&lt;br /&gt;
Diese erscheint nur zu Ihrer Information - in den meisten Fällen funktioniert die Interaktion mit dem Browser auch dann. Allerdings ist es in jedem Fall sinnvoll, den Driver zu aktualisieren, um solche Probleme auszuschliessen.&lt;br /&gt;
Wenn die Kombination ohne Probleme läuft, ist es möglich, die aktuelle Kombination in die Liste einzutragen (drücken Sie dazu auf &amp;quot;Diese Kombination ist in Ordnung&amp;quot;). Dann erschient der Warndialog nicht mehr.&lt;br /&gt;
&lt;br /&gt;
===Erweiterte Einstellungen===&lt;br /&gt;
Neben dem zu verwendenden Browser und der Start-URL kann man noch weitere Einstellungen für eine Verbindung vornehmen. Wechseln Sie dazu im Verbindungsmenü die Ansicht über den entsprechenden Menü-Eintrag. Je nachdem, welchen Browsertypen Sie ausgewählt haben, bekommen Sie andere Eingabefelder.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Remote Server&#039;&#039;: Falls der Browser auf einem entfernten Rechner gestartet werden soll, starten Sie dort einen Selenium-Server und geben Sie dessen Adresse in diesem Feld an. Natürlich können Sie auch eine lokale Adresse angeben, wenn nicht automatisch ein Selenium-Server gestartet werden soll. Lesen Sie hierzu auch den nächsten Abschnitt [[#Remote-Verbindungen|Remote-Verbindungen]].&lt;br /&gt;
*&#039;&#039;Binary&#039;&#039;: Geben Sie den Pfad zum Binary des ausgewählten Browsers an, wenn dieser nicht automatisch von Selenium gefunden wird oder Sie eine weitere Version installiert haben.&lt;br /&gt;
*&#039;&#039;Driver&#039;&#039;: Zu jedem Browser wird ein spezieller Driver zur Automatisierung benötigt. Für neue Versionen des Browsers braucht man häufig auch eine neue Version des entsprechenden Drivers. Wenn Sie nicht den von expecco installierten Driver verwenden wollen, geben Sie hier einen entsprechenden Pfad an.&lt;br /&gt;
*&#039;&#039;Firefox Profile&#039;&#039;: Für Firefox gibt es zusätzlich die Möglichkeit, ein Profil bzw. Template anzugeben, das spezifische Einstellungen enthält. Wenn keines angegeben wird, wird für jede Verbindung ein neues, leeres Profil angelegt.&lt;br /&gt;
*&#039;&#039;Capabilities&#039;&#039;: Für Selenium-Verbindungen sind einige Capabilities definiert, mit denen sich Verbindungs-Eigenschaften oder auch das Browserverhalten festlegen lassen. &lt;br /&gt;
Solche Capabilities können Sie sie in diesem Feld angeben. Schreiben Sie dazu &#039;&#039;&amp;lt;capability name&amp;gt;: &amp;lt;value&amp;gt;&#039;&#039; oder &#039;&#039;&amp;lt;capability name&amp;gt; = &amp;lt;value&amp;gt;&#039;&#039;; jeweils ein Eintrag pro Zeile. Außerdem können Sie hier auch Eigenschaften für den Firefox-Browser setzen. Die Eingabe hierfür erfolgt wie für die Capabilities, nur dass sie dem Namen der Eigenschaft ein &#039;&#039;$&#039;&#039; voranstellen müssen.&lt;br /&gt;
&lt;br /&gt;
:Angegebene Capabilities werden durch die Methode &#039;&#039;setCapability()&#039;&#039; gesetzt. Insbesondere bei der Verwendung von Chrome gibt es einige Einstellungsoptionen, die sich nicht mit dieser Methode setzen lassen, sondern beispielsweise über &#039;&#039;setExperimentalOption()&#039;&#039; angegeben werden müssen. Zu diesem Zweck haben Sie außerdem die Möglichkeit, in diesem Feld einen Methodenaufruf mit Werten anzugeben. Diese Methode wird dann auf das entsprechende Options- bzw. Capabilities-Objekt angewandt. Um die Struktur der Eingabe von normalen Capabilities beizubehalten, müssen Sie am Ende noch &#039;&#039;:&#039;&#039; oder &#039;&#039;=&#039;&#039; setzen, aber keinen Wert danach. Beispiel: &#039;&#039;setExperimentalOption(“useAutomationExtension”, false)=&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Lokale-Verbindungen==&lt;br /&gt;
Um einen Browser auf ihrer lokalen Maschine zu starten, werden lediglich die Felder &amp;quot;&#039;&#039;URL&#039;&#039;&amp;quot; sowie &amp;quot;&#039;&#039;Browsertyp&#039;&#039;&amp;quot; benötigt. Als Voreinstellung für den Browser wird &amp;quot;&amp;lt;code&amp;gt;chrome&amp;lt;/code&amp;gt;&amp;quot; erscheinen.&lt;br /&gt;
&lt;br /&gt;
==Remote-Verbindungen==&lt;br /&gt;
Um einen Browser auf einem entfernten Rechner zu starten, müssen Sie zunächst den Selenium-Server und die benötigten Driver auf diesen Rechner kopieren. Auf dem Zielrechner muss Java installiert sein. Sie finden die Dateien in Ihrer expecco-Installation unter &amp;quot;&amp;lt;code&amp;gt;packages/exept/expecco/plugin/seleniumWebDriver/lib&amp;lt;/code&amp;gt;&amp;quot;. Sie können sich auch von [https://www.selenium.dev/downloads/ Selenium] eine aktuelle Version herunterladen.&lt;br /&gt;
&amp;lt;br&amp;gt;Starten Sie dann den Selenium-Sever (auf dem entfernten Rechner) mit:&lt;br /&gt;
 java -jar selenium-server-standalone-3.141.59.jar&lt;br /&gt;
(die Versionsnummer wird in Ihren Fall eine andere sein)&lt;br /&gt;
&lt;br /&gt;
Standardmäßig wird der Server dann auf dem Port 4444 Verbindungen annehmen. Um einen anderen Port zu verwenden, &lt;br /&gt;
geben Sie diesen auf der Kommandozeile mit &amp;quot;&amp;lt;code&amp;gt;-port &amp;amp;lt;nr&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;quot; an. &lt;br /&gt;
&amp;lt;br&amp;gt;Um von expecco eine Verbindung über diesen Server herzustellen, geben Sie beim Verbindungsaufbau als Remote-Server &lt;br /&gt;
 &amp;lt;Server-Adresse&amp;gt;:4444/wd/hub&lt;br /&gt;
an.&lt;br /&gt;
&lt;br /&gt;
Das Starten des Selenium-Servers bzw. die Verbindung muss eventuell von der Firewall zugelassen werden.&lt;br /&gt;
&lt;br /&gt;
Falls der Server beim Verbinden die jeweiligen Driver nicht finden, legen Sie diese ins selbe Verzeichnis, in dem Sie den Server starten, oder fügen Sie das Verzeichnis in dem der Driver liegt zum Pfad hinzu. Beachten Sie dabei, dass expecco verschiedene Versionen eines Driver-Typs mitliefert und diese durch einen Namenszusatz unterscheidet. Aufgrund dieser Zusätze erkennt der Server die Dateien aber häufig nicht.&lt;br /&gt;
&lt;br /&gt;
Für neue Versionen von &#039;&#039;&#039;Microsoft Edge&#039;&#039;&#039;, die Chromium basieren, starten Sie anstatt eines Selenium-Servers direkt den MSEdgeDriver (&amp;quot;msedgedriver.exe&amp;quot;) in der Version, die zur Edge-Version auf diesem Rechner passt.&lt;br /&gt;
  msedgedriver.exe [--port=9515]&lt;br /&gt;
Wenn Sie keine Portnummer angeben, wird der Service auf dem Port 9515 gestartet. Geben Sie dann beim Verbindungsaufbau in expecco als Remote-Server die Adresse&lt;br /&gt;
 &amp;lt;Server-Adresse&amp;gt;:9515&lt;br /&gt;
an. Die Erweiterung &amp;quot;/wd/hub&amp;quot; ist hier nicht erforderlich.&lt;br /&gt;
&lt;br /&gt;
==Verbindungsbausteine==&lt;br /&gt;
Der Verbindungsaufbau, welcher im GUI Browser interaktiv erfolgt, muss natürlich bei einem automatisierten Ablauf über einen Aktionsbaustein erfolgen.&lt;br /&gt;
Dazu gibt es in der SeleniumWebDriverLibrary im Ordner &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; verschiedene Bausteine, welche die Verbindungsparameter von verschiedenen Quellen erhalten:&lt;br /&gt;
* Connect&amp;lt;br&amp;gt;Dieser Baustein erhält die Verbindungsparameter über Eingangspins&lt;br /&gt;
* Connect from File&amp;lt;br&amp;gt;Hier werden die Einstellungen aus einer Datei (Anhang) gelesen (typischerweise im JSON Format)&lt;br /&gt;
* Connect from Spec&amp;lt;br&amp;gt;Die Verbindungsparameter werden in einem Dictionaryobjekt geliefert&lt;br /&gt;
* Reuse or Start Connection&amp;lt;br&amp;gt;Im Gegensatz zu obigen Bausteinen, welche immer eine neue Browserverbindung aufbauen (i.e. ein neues Browserfenster öffnen), wird dieser Baustein zunächst prüfen, ob bereits eine Verbindung besteht, und diese gegebenenfalls wiederverwenden. Dieser Baustein kann daher mehrfach (i.e. zu Beginn von Teilsequenzen) platziert werden, und damit die Teilsequenzen sowohl innerhalb eines komplexeren Gesamttests als auch &amp;quot;stand-alone&amp;quot;, d.h. einzeln ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Alle &amp;quot;Connect&amp;quot; Bausteine benötigen die Angabe eines &amp;quot;&#039;&#039;Verbindungsnamens&#039;&#039;&amp;quot;.&lt;br /&gt;
Dieser hat die Aufgabe, die Verbindung im weiteren Testverlauf zu identifizieren, wenn zwischen mehreren Verbindungen gewechselt wird, und zum Abbauen der Verbindung. &lt;br /&gt;
&lt;br /&gt;
Wenn Sie im GUI Browser im Elementbaum auf eine Verbindung klicken, erscheint in der rechten &amp;quot;Test&amp;quot; Kachel ein Connect Baustein mit entsprechend vorgelegten Parametern. Diesen können Sie bei Bedarf gleich in die Rekordersequenz übertragen, oder (besser) als separate Aktion speichern (es ist sinnvoll, den Verbindungsaufbau von den aufgezeichneten Teilsequenzen zu trennen; damit haben Sie es später leichter, andere Browser zu verwenden, die Parameter der Verbindung zu ändern und auch neue Teilsequenzen aufzuzeichnen oder zu modifizieren.&lt;br /&gt;
&lt;br /&gt;
Verbindungen mit komplexen Einstellungen werden typischerweise im Verbindungsdialog angelegt, und die Einstellungen von dort über die Menüfunktion &amp;quot;&#039;&#039;Sichern in Anhang/Datei&#039;&#039;&amp;quot; in einer Datei gesichert. So können Sie verschiedene Konfigurationen in einzelnen Dateianhängen in ihrer Testsuite oder auch außerhalb aufbewahren. Zum Verbinden verwenden Sie dann den Aktionsbaustein &amp;quot;[&#039;&#039;Connect From File&#039;&#039;]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=Plugin-Einstellungen=&lt;br /&gt;
Wenn Sie eine bestimmte Browser-Installationen oder Driver standardmäßig als Voreinstellung verwenden möchten, können Sie diese in den Einstellungen des Plugins eintragen. Sie finden sie über das Menü unter dem Punkt &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; und dort unter &amp;quot;&#039;&#039;Erweiterungen&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Webtest (Selenium WebDriver)&#039;&#039;&amp;quot;. Einstellungen für spezifische Browser finden Sie unter den Unterpunkten &amp;quot;&#039;&#039;Beliebteste Browser&#039;&#039;&amp;quot; bzw. &amp;quot;&#039;&#039;Andere Browser&#039;&#039;&amp;quot;.&lt;br /&gt;
Die dortigen Einstellungen gelten als Voreinstellung für jede Verbindung, es sei denn in einer konkreten Verbindungseinstellungen ist etwas anderes angegeben.&lt;br /&gt;
&lt;br /&gt;
===Ausführungsverzögerung für Chrome===&lt;br /&gt;
In manchen Fällen kann es bei Verwendung des Chrome-Browsers vorkommen, dass Bausteine mit Element-Aktionen, beispielsweise ein Klick, im Test erfolgreich durchlaufen, die eigentliche Aktion aber gar nicht ausgeführt wurde. Dies ist ein bekannter Fehler [https://github.com/MPDL/imeji-gui-testing/issues/37], [https://github.com/SeleniumHQ/selenium/issues/4075], der von Selenium bzw. chromedriver behoben werden muss.&lt;br /&gt;
&lt;br /&gt;
Der Fehler lässt sich verhindern, indem entweder der Klick über JavaScript aufgerufen wird&amp;amp;nbsp;(setzen Sie dazu im Klick-Baustein &#039;&#039;invokeDirectly&#039;&#039; auf &#039;&#039;true&#039;&#039;&amp;amp;nbsp;) oder vor der Aktion kurz gewartet wird. Die Ausführung über JavaScript hat den Nachteil, dass sie weniger nah am Klick eines echten Benutzers ist; beispielsweise funktionieren Klicks auf Elemente auch dann, wenn sie von anderen Elementen verdeckt werden (was bei einem &amp;quot;normalen&amp;quot;Klick nicht geht). &lt;br /&gt;
&lt;br /&gt;
Generell warten die Bausteine mit Element-Aktionen automatisch, bis das entsprechende Element verfügbar ist (existiert). In den hier beschriebenen Fällen reicht das aber nicht aus. Deshalb finden Sie in den Plugin-Einstellungen für Chrome die Einstellung &amp;quot;&#039;&#039;Ausführungsverzögerung&#039;&#039;&amp;quot;. Bei der Ausführung wird dann zwischen den Aktionen entsprechend lange gewartet. Falls bei Ihnen der beschriebene Fehler eintritt, können Sie diesen Wert erhöhen. Ein größerer Wert hat natürlich Auswirkung auf die Gesamtlaufzeit.&lt;br /&gt;
&lt;br /&gt;
=Recorder=&lt;br /&gt;
&lt;br /&gt;
Die folgende Beschreibung des Recorders gilt prinzipiell für alle von expecco unterstützten GUI Technologien. Verhalten und Bedienung sind bis auf kleine technologiebedingte Unterschiede für alle gleich.&lt;br /&gt;
&lt;br /&gt;
Besteht im GUI-Browser eine Verbindung mit einem Browserfenster, kann der integrierte Recorder verwendet werden, um einen Testabschnitt aufzunehmen. Sie starten den Recorder, indem Sie im GUI-Browser die entsprechende Verbindung auswählen und dann auf den Aufnahme-Knopf klicken. Für den Recorder öffnet sich ein neues Fenster. Für jeden Klick im Fenster wird eine Aktion aufgezeichnet. Weitere Aktionen stehen über das Menü zur Verfügung. Die aufgezeichneten Aktionen werden im Arbeitsbereich des GUI-Browsers angelegt. Daher ist es möglich, das Aufgenommene parallel zu editieren.&lt;br /&gt;
&lt;br /&gt;
Allgemeine Aktionen finden Sie entweder direkt in der Menüleiste oder dort im Browser-Werkzeuge-Menü (s.u.). Um Aktionen auf Elemente aufzuzeichen, ändern Sie entweder die Auswahl des Element-Werkzeugs in der Menüleiste (s.u.) und klicken dann auf das Element oder wählen Sie die entsprechende Aktion aus dem Kontextmenü durch einen Rechtsklick auf das entsprechende Element aus. Für Texteingabe ist es zudem möglich, den Cursor über dem Element zu platzieren und den Text einzugeben. Dabei öffnet sich der Eingabedialog für diese Aktion. Auf diese Weise ist es ebenfalls möglich, die Eingaben &#039;&#039;Backspace&#039;&#039;, &#039;&#039;Return&#039;&#039; und &#039;&#039;Tab&#039;&#039; aufzuzeichnen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:SeleniumWebDriverRecorder.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Komponenten des Recorderfensters&#039;&#039;&#039;&lt;br /&gt;
#&#039;&#039;&#039;Aufnahme Pausieren&#039;&#039;&#039;: Wenn die Kontrollleuchte rot ist, nimmt der Recorder auf. Durch Klicken können Sie die Aufnahme anhalten. Die Kontrolleuchte leuchtet dann grau. In diesem Zustand können Sie weiter Aktionen über das Recorder-Fenster ausführen, sie werden aber nicht aufgezeichnet. Klicken Sie erneut, um die Aufnahme weiterzuführen.&lt;br /&gt;
#&#039;&#039;&#039;Aktualisieren&#039;&#039;&#039;: Holt das aktuelle Bild und den aktuellen Elementbaum vom Browser. Dies wird nötig, wenn die Anzeige des Recorders nicht mit dem tatsächlichen Browserinhalt übereinstimmt. &lt;br /&gt;
#&#039;&#039;&#039;Follow-Mouse&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird im GUI-Browser ausgewählt.&lt;br /&gt;
#&#039;&#039;&#039;Element-Highlighting&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird rot umrandet.&lt;br /&gt;
#&#039;&#039;&#039;Element-Werkzeuge&#039;&#039;&#039;: Auswahl, mit welchem Werkzeug aufgenommen werden soll. Es stehen alle Aktionen zur Verfügung, die auf ein bestimmtes Element ausgeführt werden. Die gewählte Aktion wird bei einem Klick auf die Anzeige ausgelöst und das Element aus der Position bestimmt. Die nicht ausgewählten Aktionen sind jederzeit über einen Rechtsklick erreichbar. &lt;br /&gt;
#&#039;&#039;&#039;Browser-Werkzeuge&#039;&#039;&#039;: Aktionen die sich nicht auf bestimmte Elemente beziehen, wie Scrollen oder Aktionen auf die aktuelle URL oder den Titel, können hier ausgelöst werden.&lt;br /&gt;
#&#039;&#039;&#039;Seitennavigation&#039;&#039;&#039;: Aktionen zur Seitennavigation: &#039;&#039;eine Seite zurück&#039;&#039;, &#039;&#039;eine Seite vor&#039;&#039; und &#039;&#039;aktuelle Seite neu laden&#039;&#039;&lt;br /&gt;
#&#039;&#039;&#039;Alert-Behandlung&#039;&#039;&#039;: Wenn der Browser einen Alert anzeigt, klicken Sie auf diesen Button, um die Aktionen zur Alert-Behandlung auswählen zu können.&lt;br /&gt;
#&#039;&#039;&#039;Online Dokumentation&#039;&#039;&#039;: Öffnet diese Online-Dokumentation.&lt;br /&gt;
#&#039;&#039;&#039;Anzeige&#039;&#039;&#039;: Zeigt einen Screenshot des Browsers. Aktionen werden mit der Maus je nach Werkzeug ausgelöst. Wenn eine neue Aktion eingegeben werden kann, hat das Fenster einen grünen Rahmen, sonst ist er rot. Scrollen wird den Browser weitergeleitet, aber nicht aufgenommen.&lt;br /&gt;
#&#039;&#039;&#039;Fenster an Bild anpassen&#039;&#039;&#039;: Ändert die Größe des Fensters so, dass der Screenshot vollständig angezeigt werden kann.&lt;br /&gt;
#&#039;&#039;&#039;Bild an Fenster anpassen&#039;&#039;&#039;: Skaliert den Screenshot auf eine Größe, mit der er die volle Größe des Fensters ausnutzt.&lt;br /&gt;
#&#039;&#039;&#039;Skalierung&#039;&#039;&#039;: Ändert die Skalierung des Screenshots. Diese kann auch über Scrollen in der Anzeige bei gedrückt gehaltener Strg-Taste angepasst werden.&lt;br /&gt;
#&#039;&#039;&#039;Meldungen&#039;&#039;&#039;: Hier werden Meldungen angezeigt, bspw. wenn eine Aktion nicht aufgenommen werden konnte. Die letzte Meldung wird solange angezeigt, bis sie über den Button rechts daneben geschlossen wird.&amp;lt;br&amp;gt;&#039;&#039;&#039;Fenster-Tabs&#039;&#039;&#039;: Ab expecco 23.1 werden oberhalb der Anzeige Tabs für jedes offene Fenster angezeigt, sobald eine Verbindung mehr als ein Browserfenster besitzt. Ob der Browser dieses als Tab oder in einem eigenen Fenster anzeigt, ist dabei egal. Über die Tabs im Recorder können Sie das aktuelle Fenster wechseln und diesen Wechsel auch aufzeichnen.&amp;lt;br&amp;gt;&#039;&#039;&#039;Frame-Kontext&#039;&#039;&#039;: Ab expecco 23.1 sehen Sie unterhalb der Anzeige, in welchem Frame-Kontext Sie sich gerade befinden (siehe dazu den Abschnitt [[#Eingebettete_Inhalte|Eingebettete Inhalte]]). Sie können auf die Einträge klicken, um in einen höheren Kontext zu wechseln und diesen Wechsel aufzuzeichnen. Falls Sie zusammengesetzte Pfade eingestellt haben, wird die Anzeige aktualisiert, wenn Sie ein eingebettetes Element ausgewählt haben.&lt;br /&gt;
&lt;br /&gt;
=Eingebettete Inhalte=&lt;br /&gt;
In HTML ist es möglich, auf einer Seite Inhalte einer anderen einzubinden. Das gängigste Elemente dafür ist ein Iframe (Inlineframe). Auf den Inhalt eines Iframes kann ebenfalls mit Selenium zugegriffen werden, allerdings muss dazu zuerst in diesen Kontext gewechselt werden. In der SeleniumWebDriverLibrary gibt es entsprechenden Bausteine, um in den Kontext eines Iframes zu wechseln, um in den Elternkontext zu wechseln und um zurück zum Standardinhalt, also dem obersten Kontext zu wechseln. Alle Element-Bausteine lösen die angelegten Pfade immer innerhalb des aktuellen Kontexts auf. Im GUI-Browser sehen Sie für eingebettete Inhalte ein zusätzliches Element, welches sie aufklappen können um dessen Elemente zu sehen.&lt;br /&gt;
&lt;br /&gt;
==Zusammengesetzte Pfade==&lt;br /&gt;
Seit expecco 23.1 gibt es die Möglichkeit, auch zusammengesetzte Pfade an den Bausteinen zu verwenden, um direkt vom Standardinhalt auf den Inhalt eines Iframes zugreifen zu können. Dazu werden einfach der Pfad zum Iframe und der Pfad innerhalb des Iframe-Inhalts zu einem zusammengesetzt. Wichtig ist hierbei, dass beim Übergang keine Elemente ausgelassen werden dürfen, d.h. der vordere Teil muss mit dem Iframe-Element enden und der hintere Teil mit &#039;&#039;/body&#039;&#039; beginnen. Dazwischen dürfen die Pfade gekürzt werden und es ist natürlich auch möglich auf diese Art beliebig tief geschachtelte Elemente zu erreichen. An den Bausteinen können beide Techniken nach belieben verwendet werden, wichtig ist nur, dass die Pfade immer in dem Kontext aufgelöst werden, in dem sich Selenium gerade befindet.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie die kombinierten Pfade aufzeichnen, bzw. im GUI-Browser verwenden wollen, setzen Sie im Menü &#039;&#039;GUI Browser&#039;&#039; unter &#039;&#039;Aufzeichnung&#039;&#039; den Haken bei &#039;&#039;Zusammengesetzte Pfade aufzeichnen&#039;&#039;. Damit wird für eingebettete Elemente ein zusammengesetzter Pfad relativ zum aktuellen Kontext erzeugt und angezeigt, anstatt wie bisher nur innerhalb seines eigenen Kontexts. Außerdem können Sie diese Elemente auch direkt im Recorder ansprechen oder über Follow-Mouse finden.&lt;br /&gt;
&lt;br /&gt;
=Shadow-Elemente=&lt;br /&gt;
Shadow-DOMs sind eine Möglichkeit, um Teile einer Seite vom übrigen Dokument abzukapseln. Dabei werden an ein Element versteckte Shadow-Elemente angehängt. Eine ausführlichere Erklärung finden Sie zum Beispiel hier: [https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_shadow_DOM Using shadow DOM - Web APIs | MDN].&lt;br /&gt;
&lt;br /&gt;
In der SeleniumWebDirverLibrary gibt es den Baustein &#039;&#039;[Web] Get Shadow DOM&#039;&#039;, der die obersten Elemente liefert, die dann wie andere WebElemente verwendet werden können.&lt;br /&gt;
&lt;br /&gt;
Da die Elemente versteckt sind, werden sie vom GUI-Browser nicht direkt angezeigt. Ab expecco 23.1 kann man allerdings im Kontextmenü der Elemente im GUI-Browser einen Haken setzen, dass Shadow-Elemente gesucht werden sollen. Beim Aktualisieren der Kinder eines Elements werden sie dann angezeigt, falls vorhanden, allerdings nicht, wenn der gesamte Baum aktualisiert wird. Wenn der Haken gesetzt ist, sind die Elemente auch im Recorder verfügbar.&lt;br /&gt;
&lt;br /&gt;
==Zusammengesetzte Pfade==&lt;br /&gt;
Ähnlich wie die Elemente innerhalb eines Frames kann auch auf die Shadow-Elemente direkt über zusammengesetzte Pfade zugegriffen werden. Diese Pfade können dann direkt an den Bausteinen verwendet werden, sodass der Baustein &#039;&#039;[Web] Get Shadow DOM&#039;&#039; nicht benötigt wird. Die Pfade haben die Form&lt;br /&gt;
 &amp;lt;host path&amp;gt;/shadowRoot/&amp;lt;shadow path&amp;gt;&lt;br /&gt;
wobei &#039;&#039;&amp;lt;host path&amp;gt;&#039;&#039; den Pfad zum Element angibt, an das der Shadow-DOM angehängt wurde, und &#039;&#039;&amp;lt;shadow path&amp;gt;&#039;&#039; der Pfad innerhalb des Shadow-DOMs zum gewünschten Element ist. &#039;/shadowRoot&#039; dient als Marker, dass an dieser Stelle der Wechsel in den Shadow-DOM erfolgt.&lt;br /&gt;
&lt;br /&gt;
=Authentifizierungs-Alerts=&lt;br /&gt;
Falls eine Webseite HTTP-Authentifizierung mit Basic Authentication verwendet, öffnet sich beim Laden der Seite ein Alert-Fenster zur Eingabe von Benutzernamen und Passwort. Dieses Fenster ist nicht direkt mit Selenium bedienbar. Im GUI-Browser wird es wie ein Alert angezeigt. Eine Ausnahme hierzu bildet Chrome, bei dem der Driver auf keine Anfrage antwortet solange der Dialog geöffnet ist. Das Plugin kann zu diesem Zeitpunkt insbesondere nicht feststellen, ob ein Authentifizierungs-Dialog geöffnet ist oder ob der Driver aus anderen Gründen nicht antwortet.&lt;br /&gt;
&lt;br /&gt;
Bei lokalen Verbindungen unter Windows kann eine Authentifizierung mittels Windows Access ausgeführt werden. Es gibt in der SeleniumWebDriverLibrary für einzelne Browsertypen spezifische Authentifizierungs-Bausteine sowie den Baustein &#039;&#039;Authenticate at Alert&#039;&#039;, der je nach Verbindung den entsprechenden Baustein ausführt. Für die verschiedenen Browser-Typen gibt es dabei unterschiedliche Einschränkungen:&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Chrome:&#039;&#039;&#039; Die Anmeldedaten werden an ein Chromefenster geschickt, daher funktioniert es nur, wenn nicht mehrere geöffnet sind. Der Einzelbaustein hat für diesen Fall die Option, den Titel des Fensters anzugeben.&lt;br /&gt;
:&#039;&#039;&#039;Edge&#039;&#039;&#039;: Mit Microsoft Edge wird eine Anmeldung nicht unterstützt.&lt;br /&gt;
:&#039;&#039;&#039;Firefox&#039;&#039;&#039;: Schickt die Anmeldedaten an ein Firefox-Dialogfenster und funktioniert daher nur, wenn es nicht mehrere gibt.&lt;br /&gt;
:&#039;&#039;&#039;Internet Explorer&#039;&#039;&#039;: Mit dem Internet Explorer wird eine Anmeldung nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
Als zusätzliche Option steht Ihnen auch eine Anmeldung über die URL zur Verfügung. Rufen Sie anstatt der Seite &amp;lt;nowiki&amp;gt;https://www.example.com&amp;lt;/nowiki&amp;gt; die URL &amp;lt;nowiki&amp;gt;https://user:password@www.example.com&amp;lt;/nowiki&amp;gt; auf. Wichtig ist hierbei, dass &#039;&#039;:&#039;&#039; und &#039;&#039;@&#039;&#039; nicht im Benutzernamen oder im Passwort auftauchen. Möglicherweise wird diese Methode nicht von jedem Browser unterstützt.&lt;br /&gt;
&lt;br /&gt;
Mithilfe des [[WindowsAutomation_Reference_2.0|WindowsAutomation2]]-Plugins ist es ebenfalls möglich, solch eine Anmeldung mit allen Browsertypen auszuführen.&lt;br /&gt;
&lt;br /&gt;
=Portierung alter Selenium-Tests=&lt;br /&gt;
Dieses Plugin ersetzt das bisherige [[Selenium_Web_Test_Plugin|Selenium Web Test Plugin]]. Dieses basierte auf [https://www.seleniumhq.org/projects/remote-control/ Selenium RC], welches in Zukunft von den Browsern nicht mehr unterstützt wird. Der Nachfolger von Selenium RC ist [https://www.seleniumhq.org/projects/webdriver/ Selenium WebDriver], auch &#039;&#039;Selenium 2&#039;&#039; genannt. Ebenso ist auch das Aufzeichnen von Tests mit [https://www.seleniumhq.org/projects/ide/ Selenim IDE] veraltet, da das Plugin von neueren Browsern nicht mehr unterstützt wird. Das Selenium WebDriver Plugin verwendet stattdessen einen eigenen [[#Recorder|Recorder]].&lt;br /&gt;
&lt;br /&gt;
Tests, die mit dem alten Selenium Web Test Plugin erstellt wurden und die alte SeleniumLibrary verwenden, können über Selenium WebDriver ausgeführt werden. Setzen Sie dazu in den Plugin-Einstellungen von &amp;quot;&#039;&#039;Webtest Legacy (Selenium)&#039;&#039;&amp;quot; den Haken bei &amp;quot;&#039;&#039;WebDriver für die Ausführung verwenden&#039;&#039;&amp;quot;. Für die wichtigsten Funktionen wurde Wrapper bzw. umsetzende Funktionen erstellt, um die Migration möglichst problemlos zu gestalten.&lt;br /&gt;
Testen Sie dann, ob die Tests wie bisher ablaufen. Für den überwiegenden Teil der Bausteine sollte es dabei keine Probleme geben. Einige wenige Aktionen werden in der WebDriver Version nicht mehr unterstützt oder verhalten sich unterschiedlich. Es ist auch nicht garantiert, daß die Emulation der alten Schnittstelle auf Dauer von Selenium unterstützt werden. Wenn möglich sollten Sie daher über kurz oder lang die Testfälle umschreiben.&lt;br /&gt;
&lt;br /&gt;
=FAQ=&lt;br /&gt;
*&#039;&#039;&#039;Scrollbalken lassen sich im Recorder nicht bedienen&#039;&#039;&#039;&lt;br /&gt;
:Der Scrollbalken des Browsers, der automatisch angezeigt wird, wenn eine Seite größer als das Browserfenster ist, ist kein bedienbares Webelement. Scrollen um einen bestimmten Betrag ist in einem Test selten sinnvoll, wenn die Größe des Browserfensters nicht festgelegt ist. Verwenden Sie stattdessen den Baustein &amp;lt;code&amp;gt;[Web] Scroll Element into View&amp;lt;/code&amp;gt;, um ein entsprechendes Element in den sichtbaren Bereich zu scrollen. Der Klick-Baustein, den der Recorder standardmäßig verwendet, führt diese Aktion bereits automatisch mit aus (&amp;lt;code&amp;gt;[WebElement] Click (Scroll Element into View)&amp;lt;/code&amp;gt;). Wenn Sie im Recorder-Fenster scrollen, wird dies automatisch auf den Browser übertragen, aber nicht aufgezeichnet. Falls Sie tatsächlich um einen bestimmten Betrag scrollen möchten, gibt es bei den Browser-Aktionen einen Eintrag dafür und weitere Bausteine in der SeleniumWebDriverLibrary.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Baustein schlägt fehl, wenn Element zu spät sichtbar wird&#039;&#039;&#039;&lt;br /&gt;
:Alle Bausteine, die einen Elementpfad verwenden, haben automatisch eingebaut, dass sie warten, bis ein entsprechendens Element auftaucht. Es gibt aber Fälle, in denen ein Element zwar bereits da, aber noch nicht sichtbar ist. Bei einem Klick auf das Element bekommen Sie dann einen Fehler. Mögliche Fehler in diesem Zusammenhang sind &amp;lt;code&amp;gt;org.openqa.selenium.ElementNotInteractableException: element not interactable&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;org.openqa.selenium.JavascriptException: javascript error: Cannot read property &#039;left&#039; of undefined&amp;lt;/code&amp;gt;. Verwenden Sie dann vor einer Interaktion mit dem Element den Baustein &amp;lt;code&amp;gt;[Web] Wait for Visibility of Element&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;[Web] Wait for Element to Be Clickable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Fehlermeldung: &amp;lt;code&amp;gt;Cannot read property &#039;left&#039; of undefined&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:Der Fehler &amp;lt;code&amp;gt;org.openqa.selenium.JavascriptException: javascript error: Cannot read property &#039;left&#039; of undefined&amp;lt;/code&amp;gt; kann mit dem Chrome-Browser auftreten. In diesem Fall ist das verwendete Element nicht sichtbar. Lesen Sie dazu den Punkt oben. Der Fehler ist auch im Zusammenhang mit Elementen in einer Dropdown-Liste bekannt, d.h. bei einem Klick oder dem Bewegen der Maus auf ein &amp;lt;nowiki&amp;gt;&amp;lt;option&amp;gt;&amp;lt;/nowiki&amp;gt;-Element innerhalb eines &amp;lt;nowiki&amp;gt;&amp;lt;select&amp;gt;&amp;lt;/nowiki&amp;gt;-Elements. Diese Elemente sind prinzipiell nicht klickbar. Verwenden Sie stattdessen einen passenden &amp;lt;code&amp;gt;[Web] Select&amp;lt;/code&amp;gt;-Baustein mit dem &amp;lt;nowiki&amp;gt;&amp;lt;select&amp;gt;&amp;lt;/nowiki&amp;gt;-Element.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Fehlermeldung: &amp;lt;code&amp;gt;Stale Element Reference Exception&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:Der Fehler &amp;lt;code&amp;gt;org.openqa.selenium.StaleElementReferenceException&amp;lt;/code&amp;gt; tritt immer dann auf, wenn ein WebElement verwendet wird, das nicht mehr da ist. Wenn das in Ihrem Test passiert und das Element eigentlich da sein sollte, verwenden Sie an der Stelle stattdessen den Locator, um das Element neu zu holen. Eventuell liegt es auch daran, dass sich der Test momentan in einem anderen Frame-Kontext befindet als das Element. Wenn Sie [[#Zusammengesetzte_Pfade|zusammengesetzte Pfade]] verwenden, sollte das Element selbst in den richtigen Kontext wechseln, bevor Aktionen darauf ausgeführt werden.&lt;br /&gt;
:In seltenen Fällen kann der Fehler auch in expecco selbst auftreten, wenn an irgendeiner Stelle im GUI-Browser oder Recorder ein entsprechendes WebElement verwendet wird. Sie sollten dann abbrechen können und es nochmal versuchen. Sollte der Fehler bestehen bleiben, wechseln Sie in den Default Content und laden Sie den Baum im GUI-Browser neu.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Baustein läuft erfolgreich, aber ohne Auswirkungen&#039;&#039;&#039;&lt;br /&gt;
:Dieser Fall kann mit Chrome auftreten. Das Element ist verfügbar, die Aktion wirft keinen Fehler, aber es wird nichts ausgeführt. In der Regel hilft es, vor der Ausführung kurz zu warten, siehe [[#Ausf.C3.BChrungsverz.C3.B6gerung_f.C3.BCr_Chrome | Ausführungsverzögerung für Chrome]].&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Ausführungen mit Chrome sind langsamer&#039;&#039;&#039;&lt;br /&gt;
:Um ein Problem bei der Ausführung mit Chrome zu beheben, ist in den Plugin-Einstellungen für Chrome eine Verzögerung definiert. Überprüfen Sie, ob dieser Wert eventuell zu hoch eingestellt ist; siehe [[#Ausf.C3.BChrungsverz.C3.B6gerung_f.C3.BCr_Chrome | Ausführungsverzögerung für Chrome]].&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Fehlermeldungen wie: &amp;quot;org.openqa.selenium.InvalidArgumentException: Expected &amp;quot;handle&amp;quot; to be a string...&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
:Dies passiert wenn der Driver nicht (mehr) zum Browser passt. Lesen Sie dazu obiges Kapitel &amp;quot;[[#WebDriver aktualisieren|WebDriver aktualisieren]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Key Chords mit Shortcuts funktionieren nicht&#039;&#039;&#039;&lt;br /&gt;
:Das Drücken mehrerer Tasten gleichzeitig lässt sich als Key Chord simulieren. Dadurch können auch Shortcuts eingegeben werden. Allerdings funktionieren hier nicht alle Eingaben, da diese nur an den Seiteninhalt und nicht an den Browser selbst gehen. Kombinationen wie &#039;&#039;Strg + t&#039;&#039; um einen neuen Browsertab zu öffnen, funktionieren daher vermutlich nicht, &#039;&#039;Strg + a&#039;&#039; oder &#039;&#039;Strg + c&#039;&#039; sollten hingegen möglich sein.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Zusätzliche Window Handles mit Opera&#039;&#039;&#039;&lt;br /&gt;
:Der Opera-Browser liefert mehr Window Handles als Tabs bzw. Fenster geöffnet sind. Diese kommen von Opera-internen Funktionen wie dem Schnellstart (&#039;&#039;Speed Dial&#039;&#039;) oder der &#039;&#039;Better Address Bar Experience&#039;&#039; (BABE), die zwar im Browserfenster eingebunden, aber nicht als Tab angezeigt werden. Zu diesen Tabs kann zwar mit den entsprechenden Bausteinen gewechselt werden, es sind dann aber nicht alle Aktionen möglich, die für die normalen Tabs zur Verfügung stehen. Sie können zum Beispiel nicht geschlossen werden und man bekommt von ihnen kein Bild. Am besten wechselt man daher gar nicht erst in diese Kontexte. Seien Sie also vorsichtig, wenn Sie anhand des Index zu einem Tab wechseln wollen, da sich die Opera-Tabs zwischen den anderen befinden und der Index ein anderer als für die anderen Browser sein kann.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Chrome: Wähle deine Suchmaschine&#039;&#039;&#039;&lt;br /&gt;
:Neuere Chromeversionen zeigen nach dem Starten ein [https://www.google.com/chrome/choicescreen/ Overlay], bei dem man die verwendete Suchmaschine auswählen soll. Die Entscheidung wird normalerweise im Benutzerprofil gespeichert. Wenn für die Verbindung aber nicht explizit ein Chrome-Profil angegeben wird, hat man bei jedem Verbindungsaufbau ein leeres Profil und es wird immer nachgefragt.&lt;br /&gt;
&lt;br /&gt;
:In vielen Fällen kann der Test auch trotz des Overlays im Hintergrund ablaufen. Das Overlay gilt aber wie ein Tab bzw. Fenster; so liefert beispielsweise vom Baustein &#039;&#039;[Web] Get Window Handles&#039;&#039; einen Handle dafür und es kann auch dorthin gewechselt werden. Es gibt aber auch Möglichkeiten es loszuwerden:&lt;br /&gt;
:* &#039;&#039;--disable-search-engine-choice-screen&#039;&#039;: In den [[#Erweiterte_Einstellungen|erweiterten Einstellungen]] kann man bei den Optionen &amp;lt;code&amp;gt;--disable-search-engine-choice-screen&amp;lt;/code&amp;gt; angeben, dann kommt das Overlay nicht.&lt;br /&gt;
:* &#039;&#039;Auswählen&#039;&#039;: Sie können Ihren Test auch so erweitern, dass zu Beginn eine Suchmaschine ausgewählt und damit das Overlay geschlossen wird. Dabei müssen Sie zwei Dinge beachten. Zum einen müssen Sie zuerst mit einem &#039;&#039;Switch to Window&#039;&#039;-Baustein dorthin wechseln (z.B. mit Index &#039;&#039;2&#039;&#039; oder leerem Titel) und am Ende auch wieder zurück zu Ihrem ursprünglichen Tab. Zum anderen sind interessanten Elemente des Overlays [[#Shadow-Elemente|Shadow-Elemente]] und werden daher im GUI-Browser nicht direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Firefox: &amp;lt;code&amp;gt;Process unexpectedly closed with status 0&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:Fehlerbild: Die Verbindung zum Firefox-Browser kommt nicht zustande mit der Fehlermeldung &amp;lt;code&amp;gt;org.openqa.selenium.WebDriverException: Process unexpectedly closed with status 0&amp;lt;/code&amp;gt;. Der Browser öffnet sich dann aber doch ohne dass es eine Verbindung in expecco gibt.&lt;br /&gt;
:Eine bekannte Ursache dafür ist, dass der Browser dabei zum ersten Mal nach einem Update gestartet wird, womit der Browser im automatisierten Zustand nicht zurecht kommt. Beim zweiten Versuch sollte der Fehler dann nicht mehr auftreten. Um den Fehler zu verhindern, achten Sie darauf, den Browser nach einem Update immer zuerst normal zu starten.&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Selenium_WebDriver_Plugin&amp;diff=29681</id>
		<title>Selenium WebDriver Plugin</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Selenium_WebDriver_Plugin&amp;diff=29681"/>
		<updated>2024-08-05T13:34:15Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* FAQ */ Chrome: Wähle deine Suchmaschine&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Deutsche Version&#039;&#039;&#039; | [[Selenium_WebDriver_Plugin/en|English Version]]&lt;br /&gt;
=Achtung=&lt;br /&gt;
Das Webtest Selenium WebDriver Plugin ersetzt das bisherige [[Selenium_Web_Test_Plugin|Selenium Web Test Plugin]]. Zur Automatisierung wird [https://www.seleniumhq.org/projects/webdriver/ Selenium WebDriver] verwendet (Driver für gängige Browser werden von uns mitgeliefert), der das bisher verwendete Selenium RC ersetzt. Dies wurde einerseits notwendig, da die SeleniumRC Schnittstelle von neuen Browsern nicht mehr unterstützt wird, andererseits, sinnvoll, da auch andere UI Technologien mit diesem Protokoll angesprochen werden können. &lt;br /&gt;
&lt;br /&gt;
Sie können dieses Protokoll nur noch mit älteren Browsern verwenden, und wir empfehlen dringend, auf die neue Version umzusteigen. &amp;lt;br&amp;gt;Hinweise zur Migration älterer Testsuiten finden Sie [[#Portierung_alter_Selenium-Tests | unten]].&lt;br /&gt;
&lt;br /&gt;
=Einleitung=&lt;br /&gt;
Mit dem Selenium WebDriver Plugin können Sie Tests von Webapplikationen erstellen oder auch diese automatisieren (*). Das Plugin kann (und wird üblicherweise) zusammen mit dem [[Expecco_GUI_Tests_Extension_Reference|GUI-Browser]] verwendet werden, der das Erstellen von Tests oder automatisierten Browseraktionen unterstützt. Zudem ist damit das Aufzeichnen von Abläufen möglich.&lt;br /&gt;
&lt;br /&gt;
(*) tatsächlich gibt es auch WebDriver-Schnittstellen um z.B. Windows-Apps oder OPS-Fenster zu manipulieren. Insofern gibt es für dieses Plugin weitere Einsatzbereiche.&lt;br /&gt;
&lt;br /&gt;
=Einstellungen=&lt;br /&gt;
Das Plugin verwendet die Java-Bridge und benötigt daher eine Java-Installation. Sie können diese in den Einstellungen unter &#039;&#039;Erweiterungen&#039;&#039; -&amp;gt; &#039;&#039;Java Bridge&#039;&#039; angeben. Wichtig ist hier das Feld &#039;&#039;Pfad zur Java-Installation&#039;&#039;, wo Sie ein JDK oder JRE angeben können. Ist nichts angegeben, versucht expecco java im PATH zu finden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:JDKPfadEinstellungen.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Für das Selenium WebDriver Plugin selbst gibt es ebenfalls Einstellungsmöglichkeiten, die Sie unter &#039;&#039;Erweiterungen&#039;&#039; -&amp;gt; &#039;&#039;Webtest (Selenium WebDriver)&#039;&#039; finden. Hier können Sie zum Beispiel die Adresse zu einem remote laufenden Selenium-Server angeben oder eine andere Jar-Datei für Selenium angeben. Einstellungen zu den verschiedenen Browser-Typen teilen sich auf die Unterseiten &#039;&#039;Beliebte Browser&#039;&#039; und &#039;&#039;Andere Browser&#039;&#039; auf. Dort können Sie den Pfad zur Browser-Ausführungsdatei oder zum Webdriver angeben, der verwendet werden soll. Diese Felder können Sie alle leer lassen, expecco wird dann automatisch danach suchen.&lt;br /&gt;
&lt;br /&gt;
=Browser-Unterstützung=&lt;br /&gt;
Das Plugin unterstützt die Browser Chrome/Chromium, Edge, Firefox, Internet Explorer und Opera. &lt;br /&gt;
&amp;lt;br&amp;gt;Safari unter OSX muss zumindest in der Version 10 vorliegen und OSX muss mindestens die El Capitan Version sein.&lt;br /&gt;
Zur Kommunikation wird die WebDriver Schnittstelle verwendet; somit kann der getestete Browser sowohl lokal als auch auf einem entfernten Rechner laufen.&lt;br /&gt;
&lt;br /&gt;
Da inzwischen eine Vielzahl von weiteren Browsen, Geräten und graphischen Oberflächen eine WebDriver Schnittstelle anbieten, können auch diese - z.T. mit eingeschränktem Funktionsumfang - über diese automatisiert werden. So gibt es z.B. auch Schnittstellen für Windows Mobilgeräte oder Desktopanwendungen.&lt;br /&gt;
&lt;br /&gt;
== WebDriver aktualisieren==&lt;br /&gt;
Für jeden Browsertyp gibt es einen Driver, über den das Starten und Ansteuern der Browserfenster funktioniert. Für die wichtigsten Browser finden sich im Lieferumfang aktuelle Driverversionen. Da die Browser fortlaufend aktualisiert werden, teilweise sogar automatisch, müssen Sie früher oder später neue Driverversionen herunterladen. Legen Sie diese dann in Ihrem expecco-Installationsverzeichnis bei den anderen Versionen ab, und zwar unter:&lt;br /&gt;
 &amp;lt;code&amp;gt;packages/exept/expecco/plugin/seleniumWebDriver/lib/XXX&amp;lt;/code&amp;gt;&lt;br /&gt;
(unter Microsoft Windows Betriebssystemen mit &amp;quot;\” anstatt &amp;quot;/&amp;quot;), wobei &amp;quot;XXX&amp;quot; für das Betriebssystem steht (Windows, Linux, OSX etc.).&lt;br /&gt;
&lt;br /&gt;
Im Verbindungsdialog warnt expecco, wenn eine Driverversion nicht zur Browserversion passt. In manchen Fällen kann das aber auch nur daran liegen, dass  diese Version zum Zeitpunkt der Auslieferung noch nicht bekannt war. Manche Kombinationen können trotz der Warnung funktioniert, aber das können wir im Einzelfall nicht garantieren.&lt;br /&gt;
&lt;br /&gt;
Daher können Sie bei einer solchen Warnung immer die Option &amp;quot;&#039;&#039;Diese Warnung nicht mehr anzeigen&#039;&#039;&amp;quot; anwählen, damit diese Driver-Browser-Versionskombination in ihren Settings als &amp;quot;kompatibel&amp;quot; vermerkt wird, und in Zukunft nicht mehr gemeldet wird. Dies sollten Sie aber nur machen, wenn Sie sicher sind, dass Ihre Tests nach wie vor korrekt ausgeführt werden. Da wir hier selbst bisweilen auf Kompatibilitätsprobleme stoßen, und nicht immer gleich klar ist, woran es liegt, empfehlen wir aber den Driver zu aktualisieren.&lt;br /&gt;
&lt;br /&gt;
Für Chrome und Microsoft Edge, bei denen es für jede neue Browserversion auch eine neue Driverversion gibt, finden Sie im Verbindungsdialog einen Button, um mit expecco die passende Version herunterzuladen.&lt;br /&gt;
&lt;br /&gt;
Neuere Versionen der Driver bekommen Sie an folgenden Adressen:&lt;br /&gt;
{|&lt;br /&gt;
|Chrome/Chromium&lt;br /&gt;
|[https://sites.google.com/chromium.org/driver/ ChromeDriver]&lt;br /&gt;
|-&lt;br /&gt;
|Edge&lt;br /&gt;
|[https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ Microsoft WebDriver]&lt;br /&gt;
|-&lt;br /&gt;
|Firefox&lt;br /&gt;
|[https://github.com/mozilla/geckodriver/releases GeckoDriver]&lt;br /&gt;
|-&lt;br /&gt;
|Internet Explorer&lt;br /&gt;
|[https://selenium-release.storage.googleapis.com/index.html IEDriverServer]&lt;br /&gt;
|-&lt;br /&gt;
|Opera&lt;br /&gt;
|[https://github.com/operasoftware/operachromiumdriver/releases OperaDriver]&lt;br /&gt;
|-&lt;br /&gt;
|Safari&lt;br /&gt;
|[https://webkit.org/blog/6900/webdriver-support-in-safari-10 Safari Support]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Laden Sie sich eine passende Version herunter und legen Sie sie im oben genannten Verzeichnis an der entsprechenden Stelle ab. Expecco wird sie dann finden und verwenden. &amp;lt;!-- Sie können den Namen der Datei erweitern, um mehrere Versionen nebeneinander verwenden zu können. --&amp;gt; Alternativ können Sie auch in expecco den Pfad zu einem Driver angeben, entweder im [[#Erweiterte_Einstellungen | Verbindungseditor]] oder in den [[#Plugin-Einstellungen | Plugin-Einstellungen]].&lt;br /&gt;
&lt;br /&gt;
[[Datei:bulb.png|20px]]Bitte verifizieren Sie, daß die Version des Drivers kompatibel ist mit der des Browsers. Im Zweifel suchen Sie nach der Versionshistorie (z.B. für Chrome: https://chromedriver.storage.googleapis.com/2.25/notes.txt).&lt;br /&gt;
&lt;br /&gt;
[[Datei:bulb.png|20px]]Für den Internet Explorer ist zu beachten, dass der geschützte Modus für alle Zonen gleich eingestellt sein muss, damit eine Verbindung möglich ist. (im Internet Explorer: &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Internetoptionen&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Sicherheit&#039;&#039;&amp;quot; öffnen, und bei allen 4 Zonen &amp;quot;geschützter&amp;quot; Bereich gleich einstellen; ansonsten kommen beim Verbindungsaufbau Fehler- und Warndialoge). Siehe außerdem die [https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver#required-configuration erforderliche Konfiguration] zur Verwendung des InternetExplorerDrivers.&lt;br /&gt;
&lt;br /&gt;
[[Datei:bulb.png|20px]]Das Plugin verwendet für einige Funktionen JavaScript. Stellen Sie daher sicher, dass die Ausführung von JavaScript im verwendeten Browser erlaubt ist, insbesondere wenn Sie den GUI-Browser oder den Recorder verwenden wollen. Das Ausführen von Tests ist auch ohne JavaScript möglich, solange keine Aktionen verwendet werden, welche JavaScript benötigen oder explizit ausführen.&amp;lt;br&amp;gt;Sollten Sie einen Fehler der Art &amp;quot;&amp;lt;code&amp;gt;org.openqa.selenium.JavascriptException: Error executing JavaScript&amp;lt;/code&amp;gt;&amp;quot; bekommen, stellen Sie sicher, dass die Ausführung von JavaScript im verwendeten Browser erlaubt ist und Browser- und zugehörige WebDriver-Version kompatibel sind.&lt;br /&gt;
&lt;br /&gt;
= Headless Browser =&lt;br /&gt;
Mit &amp;quot;&#039;&#039;Headless&#039;&#039;&amp;quot; bezeichnet man eine Anwendung, welche ohne Bedienoberfläche abläuft. Einige der Browser unterstützen einen &amp;quot;headless&amp;quot; Modus,  bei dem kein Browserfenster angezeigt wird. Der Browser operiert dabei in einem &amp;quot;unsichtbaren Fenster&amp;quot; führt aber alle Operationen aus, und liefert auch die selbe Elementhierarchie.&lt;br /&gt;
Bei einigen Browsern sind allerdings die Screenshot (Bild vom Fenster bzw. von Elementen) eingeschränkt bzw. gar nicht verfügbar.&amp;lt;br&amp;gt;Den &amp;quot;headless&amp;quot; Modus können Sie beim Verbindungsaufbau in den &amp;quot;&#039;&#039;Advanced Settings&#039;&#039;&amp;quot; angeben.&lt;br /&gt;
&lt;br /&gt;
= HTML Unit Browser =&lt;br /&gt;
Bei diesem &amp;quot;&#039;&#039;Pseudobrowser&#039;&#039;&amp;quot; handelt es sich um eine weitere &amp;quot;&#039;&#039;headless&#039;&#039;&amp;quot; Variante, welche ganz ohne Renderengine operiert, und lediglich die Elementhierarchie sowie Javascript unterstützt. Sein Verhalten kann stark von dem &amp;quot;echter&amp;quot; Browser abweichen.&lt;br /&gt;
&lt;br /&gt;
Diesen Browsertyp können Sie verwenden, wenn ihr Test das Verhalten des Webservices (also der Servierseite) betrifft, und nicht das Verhalten der Anwendung im Browser (End-User-Experience) im Fokus hat. Zum Beispiel kann der &amp;quot;HTML Unit Browser&amp;quot; zum Generieren von Last oder gleichzeitigen Aktionen gegenüber dem Server dienen.&lt;br /&gt;
Da sich dieser Browser im Verhalten z.T. stark von dem echter Browser unterscheidet sollte er nur (wenn überhaupt) in besonderen Fällen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
= Schneller Einstieg =&lt;br /&gt;
== Browser öffnen / verbinden ==&lt;br /&gt;
* Starten Sie expecco&lt;br /&gt;
* Klicken Sie auf &amp;quot;&#039;&#039;Neue Testsuite&#039;&#039;&amp;quot;&lt;br /&gt;
* Klicken Sie auf das GUI-Browser Symbol ([[Datei:GUIBrowser.png|24px]])&lt;br /&gt;
* Es erscheint der GUI-Browser in einem neuen Reiter&lt;br /&gt;
* Klicken Sie auf &amp;quot;&#039;&#039;Verbinden&#039;&#039;&amp;quot; und wählen Sie &amp;quot;&#039;&#039;Webtest (Selenium WebDriver)&#039;&#039;&amp;quot; aus. Dann erscheint der [[#Verbindungseditor | Verbindungsdialog]] (Details siehe unten)&lt;br /&gt;
* Im Verbindungsdialog geben Sie die zu testende Webseite ein (z.B. &amp;quot;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://www.myHost.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;quot;) und wählen den Browsertyp (z.B. &amp;quot;&amp;lt;code&amp;gt;chrome&amp;lt;/code&amp;gt;&amp;quot; oder &amp;quot;&amp;lt;code&amp;gt;firefox&amp;lt;/code&amp;gt;&amp;quot;) aus&lt;br /&gt;
* Klicken Sie auf &amp;quot;&#039;&#039;Verbinden&#039;&#039;&amp;quot;&lt;br /&gt;
* Ein Browser wird nun automatisch gestartet, und die Seite angezeigt.&lt;br /&gt;
* Sobald die Verbindung steht, wird im GUIBrowser die Seitenstruktur als Baum angezeigt, und im rechten Diagramm-Fenster erscheint ein passender Verbindungsbaustein. Dieser wird nicht automatisch aufgezeichnet, da man diesen normalerweise nicht in jeder aufgezeichneten Sequenz haben will (mehr dazu unten).&lt;br /&gt;
&lt;br /&gt;
== Recording aufnehmen ==&lt;br /&gt;
* Klicken Sie auf das Recording Symbol im GUI-Browser.&lt;br /&gt;
[[Datei:Recording_Start.png | 200px]]&lt;br /&gt;
* Ein Recorderfenster erscheint (eine Beschreibung der Bedienelemente finden Sie unten)&lt;br /&gt;
* Sie zeichnen nun direkt im Rekorder auf.&amp;lt;br&amp;gt;&lt;br /&gt;
* Klicks werden je nach Einstellung als Klick, Mausbewegung, Drag&amp;amp;Drop etc. aufgezeichnet.&amp;lt;br&amp;gt;Während der Aufzeichnung können Sie zwischen diesen Werkzeugen wechseln:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Datei:Recorder_Werkzeuge.png | 300px]]&lt;br /&gt;
* die aufgezeichneten Aktionen werden im Tab &amp;quot;&#039;&#039;Aufgezeichnete Sequenz&#039;&#039;&amp;quot; dargestellt. Sie können dort noch bearbeitet werden.&lt;br /&gt;
* Zum Beenden der Aufzeichnung klicken Sie entweder auf den &amp;quot;&#039;&#039;Stop Recording&#039;&#039;&amp;quot; Knopf im GUI Browser, oder schließen das Rekorderzenster. Es ist auch möglich, das Aufzeichnen temporär zu Pausieren, indem sie im Rekorder auf den &amp;quot;&#039;&#039;Aufnahme&#039;&#039;&amp;quot;-Knopf oben links drücken.&lt;br /&gt;
* Nach dem Aufzeichnen können sie die Sequenz un ihre Testsuite als Testfall oder Teilsequenz übernehmen.&lt;br /&gt;
&lt;br /&gt;
== Aufgezeichnete Aktion wiedergeben ==&lt;br /&gt;
&lt;br /&gt;
* Im Reiter &amp;quot;&#039;&#039;Aufgezeichnete Sequenz&#039;&#039;&amp;quot; kann die aktuelle Aufzeichnung sofort wiedergegeben werden (&amp;quot;&#039;&#039;Play&#039;&#039;&amp;quot;-Knopf drücken)&amp;lt;br&amp;gt;Beachten Sie, daß ihre Webseite üblicherweise im gleichen Zustand sein sollte - gegebenenfalls sollten Sie also den &amp;quot;&#039;&#039;Back&#039;&#039;&amp;quot;-Knopf oder eine andere Navigation anwenden, um dies sicher zu stellen.&lt;br /&gt;
* Die Sequenz kann bearbeitet werden. Dazu können entweder weitere Aktionen aufgenommen werden, oder zusätzliche Aktionen entweder via Drag&amp;amp;Drop oder über das Kontextmenü (bzw. &amp;lt;kbd&amp;gt;&amp;lt;CTRL-N&amp;lt;/kbd&amp;gt;) angelegt werden. Häufig werden zusätzliche Delay- oder Verifikations-Bausteine benötigt, die sie hiermit an geeigneter Stelle einfügen können.&lt;br /&gt;
&lt;br /&gt;
=Verbindungsaufbau=&lt;br /&gt;
==&amp;lt;span id=&amp;quot;Verbindungsdialog&amp;quot;&amp;gt;Verbindungseditor==&lt;br /&gt;
Mit dem Verbindungseditor werden Verbindungen definiert, geändert und aufgebaut. Sie erreichen ihn, indem Sie den GUI-Browser öffnen und dort auf &amp;quot;&#039;&#039;Verbinden&#039;&#039;&amp;quot; klicken und dann &amp;quot;&#039;&#039;Selenium Testing (WebDriver)&#039;&#039;&amp;quot; auswählen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:SeleniumWebDriverConnectDialog.png]]&lt;br /&gt;
&lt;br /&gt;
#&#039;&#039;Einstellungen aus Anhang laden&#039;&#039;: Öffnet einen Anhang im expecco Projekt mit Verbindungseinstellunge. Diese Einstellungen werden in den Editor übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&#039;&#039;Einstellungen aus Datei&#039;&#039;: Öffnet eine gespeicherte Einstellungsdatei (*.csf). Diese Einstellungen werden in den Editor übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&#039;&#039;Einstellungen in Anhang speichern&#039;&#039;: Hier können Sie die eingetragenen Einstellungen als Anhang im expecco-Projekt anlegen.&lt;br /&gt;
#&#039;&#039;Einstellungen in JSON-Anhang speichern&#039;&#039;: Hier können Sie die eingetragenen Einstellungen im JSON-Format als Anhang im expecco-Projekt anlegen.&lt;br /&gt;
#&#039;&#039;Einstellungen in Datei speichern&#039;&#039;: Hier können Sie die eingetragenen Einstellungen in eine Datei (*.csf) speichern.&lt;br /&gt;
#&#039;&#039;Versionsinfo&#039;&#039;: Zeigt ein Fenster mit den verwendeten Versionen des Selenium-Servers, des ausgewählten Browser und dessen Driver an.&lt;br /&gt;
#&#039;&#039;Online-Dokumentation&#039;&#039;: Öffnet diese Online-Dokumentation.&lt;br /&gt;
#&#039;&#039;Verbindungsname&#039;&#039;: Tragen Sie hier den Namen ein, unter dem die Verbindung im GUI-Browser angezeigt werden soll. (Optional)&lt;br /&gt;
#&#039;&#039;Browsertyp&#039;&#039;: Wählen Sie hier aus, welchen Browser Sie verwenden möchten. Stellen Sie sicher, dass dieser installiert ist und die Version des verwendeten Drivers zur Browserversion passt.&lt;br /&gt;
#&#039;&#039;URL&#039;&#039;: Tragen Sie hier die URL ein, die zu Beginn aufgerufen werden soll. Sie können das Feld auch frei lassen, dann wird ein leeres Browser-Fenster geöffnet. Um eine lokale Datei zu öffnen, verwenden Sie das Schema &amp;quot;&amp;lt;code&amp;gt;file://&amp;lt;/code&amp;gt;&amp;quot;, z.B. &amp;quot;&amp;lt;code&amp;gt;file:///C:/Users/admin/Desktop/index.html&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
#&#039;&#039;Erweiterte Ansicht&#039;&#039;: Wechselt zur Ansicht für die Eingabe von [[#Erweiterte Einstellungen|erweiterten Einstellungen]].&lt;br /&gt;
#&#039;&#039;Informationen zum gewählten Browser&#039;&#039;: Hier wird der ausgewählte Browsertyp kurz vorgestellt.&lt;br /&gt;
#&#039;&#039;Informationen zu den Einstellungen&#039;&#039;: Hier wird angezeigt, welche Selenium-, Browser- und Driver-Version mit den aktuellen Einstellungen verwendet wird. Falls Sie [[#Erweiterte Einstellungen|erweiterten Einstellungen]] gesetzt haben, werden diese hier ebenfalls aufgelistet.&lt;br /&gt;
&lt;br /&gt;
===Warnung &amp;amp;uuml;ber m&amp;amp;ouml;gliche Inkompatibilit&amp;amp;auml;t ===&lt;br /&gt;
Manche Browser benötigen einen versionsspezifischen Webdriver, da die verwendeten Kommunikationsprotokolle unterschiedlich sein können. &lt;br /&gt;
&lt;br /&gt;
Da regelmässig neue Browserversionen erscheinen, und damit einhergehend auch neue Versionen des zug. Webdrivers benötigt werden, kann. es sein, dass die mit expecco mitgelieferten Webdriver nicht mehr zur aktuellen Browserversion passen. Dies trat in der Vergangenheit insbes. beim Chromebrowser mehrfach auf.&lt;br /&gt;
 &lt;br /&gt;
Um auf eventuelle Probleme hinzuweisen hält expecco intern eine Liste von Paaren der von exept bereits getesteten Browser- zu Webdriverversion. Falls ihr Browser aktueller ist, und nicht in der Liste enthalten ist, erscheint eine Warnung im Infobereich.&lt;br /&gt;
&lt;br /&gt;
Diese erscheint nur zu Ihrer Information - in den meisten Fällen funktioniert die Interaktion mit dem Browser auch dann. Allerdings ist es in jedem Fall sinnvoll, den Driver zu aktualisieren, um solche Probleme auszuschliessen.&lt;br /&gt;
Wenn die Kombination ohne Probleme läuft, ist es möglich, die aktuelle Kombination in die Liste einzutragen (drücken Sie dazu auf &amp;quot;Diese Kombination ist in Ordnung&amp;quot;). Dann erschient der Warndialog nicht mehr.&lt;br /&gt;
&lt;br /&gt;
===Erweiterte Einstellungen===&lt;br /&gt;
Neben dem zu verwendenden Browser und der Start-URL kann man noch weitere Einstellungen für eine Verbindung vornehmen. Wechseln Sie dazu im Verbindungsmenü die Ansicht über den entsprechenden Menü-Eintrag. Je nachdem, welchen Browsertypen Sie ausgewählt haben, bekommen Sie andere Eingabefelder.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Remote Server&#039;&#039;: Falls der Browser auf einem entfernten Rechner gestartet werden soll, starten Sie dort einen Selenium-Server und geben Sie dessen Adresse in diesem Feld an. Natürlich können Sie auch eine lokale Adresse angeben, wenn nicht automatisch ein Selenium-Server gestartet werden soll. Lesen Sie hierzu auch den nächsten Abschnitt [[#Remote-Verbindungen|Remote-Verbindungen]].&lt;br /&gt;
*&#039;&#039;Binary&#039;&#039;: Geben Sie den Pfad zum Binary des ausgewählten Browsers an, wenn dieser nicht automatisch von Selenium gefunden wird oder Sie eine weitere Version installiert haben.&lt;br /&gt;
*&#039;&#039;Driver&#039;&#039;: Zu jedem Browser wird ein spezieller Driver zur Automatisierung benötigt. Für neue Versionen des Browsers braucht man häufig auch eine neue Version des entsprechenden Drivers. Wenn Sie nicht den von expecco installierten Driver verwenden wollen, geben Sie hier einen entsprechenden Pfad an.&lt;br /&gt;
*&#039;&#039;Firefox Profile&#039;&#039;: Für Firefox gibt es zusätzlich die Möglichkeit, ein Profil bzw. Template anzugeben, das spezifische Einstellungen enthält. Wenn keines angegeben wird, wird für jede Verbindung ein neues, leeres Profil angelegt.&lt;br /&gt;
*&#039;&#039;Capabilities&#039;&#039;: Für Selenium-Verbindungen sind einige Capabilities definiert, mit denen sich Verbindungs-Eigenschaften oder auch das Browserverhalten festlegen lassen. &lt;br /&gt;
Solche Capabilities können Sie sie in diesem Feld angeben. Schreiben Sie dazu &#039;&#039;&amp;lt;capability name&amp;gt;: &amp;lt;value&amp;gt;&#039;&#039; oder &#039;&#039;&amp;lt;capability name&amp;gt; = &amp;lt;value&amp;gt;&#039;&#039;; jeweils ein Eintrag pro Zeile. Außerdem können Sie hier auch Eigenschaften für den Firefox-Browser setzen. Die Eingabe hierfür erfolgt wie für die Capabilities, nur dass sie dem Namen der Eigenschaft ein &#039;&#039;$&#039;&#039; voranstellen müssen.&lt;br /&gt;
&lt;br /&gt;
:Angegebene Capabilities werden durch die Methode &#039;&#039;setCapability()&#039;&#039; gesetzt. Insbesondere bei der Verwendung von Chrome gibt es einige Einstellungsoptionen, die sich nicht mit dieser Methode setzen lassen, sondern beispielsweise über &#039;&#039;setExperimentalOption()&#039;&#039; angegeben werden müssen. Zu diesem Zweck haben Sie außerdem die Möglichkeit, in diesem Feld einen Methodenaufruf mit Werten anzugeben. Diese Methode wird dann auf das entsprechende Options- bzw. Capabilities-Objekt angewandt. Um die Struktur der Eingabe von normalen Capabilities beizubehalten, müssen Sie am Ende noch &#039;&#039;:&#039;&#039; oder &#039;&#039;=&#039;&#039; setzen, aber keinen Wert danach. Beispiel: &#039;&#039;setExperimentalOption(“useAutomationExtension”, false)=&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Lokale-Verbindungen==&lt;br /&gt;
Um einen Browser auf ihrer lokalen Maschine zu starten, werden lediglich die Felder &amp;quot;&#039;&#039;URL&#039;&#039;&amp;quot; sowie &amp;quot;&#039;&#039;Browsertyp&#039;&#039;&amp;quot; benötigt. Als Voreinstellung für den Browser wird &amp;quot;&amp;lt;code&amp;gt;chrome&amp;lt;/code&amp;gt;&amp;quot; erscheinen.&lt;br /&gt;
&lt;br /&gt;
==Remote-Verbindungen==&lt;br /&gt;
Um einen Browser auf einem entfernten Rechner zu starten, müssen Sie zunächst den Selenium-Server und die benötigten Driver auf diesen Rechner kopieren. Auf dem Zielrechner muss Java installiert sein. Sie finden die Dateien in Ihrer expecco-Installation unter &amp;quot;&amp;lt;code&amp;gt;packages/exept/expecco/plugin/seleniumWebDriver/lib&amp;lt;/code&amp;gt;&amp;quot;. Sie können sich auch von [https://www.selenium.dev/downloads/ Selenium] eine aktuelle Version herunterladen.&lt;br /&gt;
&amp;lt;br&amp;gt;Starten Sie dann den Selenium-Sever (auf dem entfernten Rechner) mit:&lt;br /&gt;
 java -jar selenium-server-standalone-3.141.59.jar&lt;br /&gt;
(die Versionsnummer wird in Ihren Fall eine andere sein)&lt;br /&gt;
&lt;br /&gt;
Standardmäßig wird der Server dann auf dem Port 4444 Verbindungen annehmen. Um einen anderen Port zu verwenden, &lt;br /&gt;
geben Sie diesen auf der Kommandozeile mit &amp;quot;&amp;lt;code&amp;gt;-port &amp;amp;lt;nr&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;quot; an. &lt;br /&gt;
&amp;lt;br&amp;gt;Um von expecco eine Verbindung über diesen Server herzustellen, geben Sie beim Verbindungsaufbau als Remote-Server &lt;br /&gt;
 &amp;lt;Server-Adresse&amp;gt;:4444/wd/hub&lt;br /&gt;
an.&lt;br /&gt;
&lt;br /&gt;
Das Starten des Selenium-Servers bzw. die Verbindung muss eventuell von der Firewall zugelassen werden.&lt;br /&gt;
&lt;br /&gt;
Falls der Server beim Verbinden die jeweiligen Driver nicht finden, legen Sie diese ins selbe Verzeichnis, in dem Sie den Server starten, oder fügen Sie das Verzeichnis in dem der Driver liegt zum Pfad hinzu. Beachten Sie dabei, dass expecco verschiedene Versionen eines Driver-Typs mitliefert und diese durch einen Namenszusatz unterscheidet. Aufgrund dieser Zusätze erkennt der Server die Dateien aber häufig nicht.&lt;br /&gt;
&lt;br /&gt;
Für neue Versionen von &#039;&#039;&#039;Microsoft Edge&#039;&#039;&#039;, die Chromium basieren, starten Sie anstatt eines Selenium-Servers direkt den MSEdgeDriver (&amp;quot;msedgedriver.exe&amp;quot;) in der Version, die zur Edge-Version auf diesem Rechner passt.&lt;br /&gt;
  msedgedriver.exe [--port=9515]&lt;br /&gt;
Wenn Sie keine Portnummer angeben, wird der Service auf dem Port 9515 gestartet. Geben Sie dann beim Verbindungsaufbau in expecco als Remote-Server die Adresse&lt;br /&gt;
 &amp;lt;Server-Adresse&amp;gt;:9515&lt;br /&gt;
an. Die Erweiterung &amp;quot;/wd/hub&amp;quot; ist hier nicht erforderlich.&lt;br /&gt;
&lt;br /&gt;
==Verbindungsbausteine==&lt;br /&gt;
Der Verbindungsaufbau, welcher im GUI Browser interaktiv erfolgt, muss natürlich bei einem automatisierten Ablauf über einen Aktionsbaustein erfolgen.&lt;br /&gt;
Dazu gibt es in der SeleniumWebDriverLibrary im Ordner &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; verschiedene Bausteine, welche die Verbindungsparameter von verschiedenen Quellen erhalten:&lt;br /&gt;
* Connect&amp;lt;br&amp;gt;Dieser Baustein erhält die Verbindungsparameter über Eingangspins&lt;br /&gt;
* Connect from File&amp;lt;br&amp;gt;Hier werden die Einstellungen aus einer Datei (Anhang) gelesen (typischerweise im JSON Format)&lt;br /&gt;
* Connect from Spec&amp;lt;br&amp;gt;Die Verbindungsparameter werden in einem Dictionaryobjekt geliefert&lt;br /&gt;
* Reuse or Start Connection&amp;lt;br&amp;gt;Im Gegensatz zu obigen Bausteinen, welche immer eine neue Browserverbindung aufbauen (i.e. ein neues Browserfenster öffnen), wird dieser Baustein zunächst prüfen, ob bereits eine Verbindung besteht, und diese gegebenenfalls wiederverwenden. Dieser Baustein kann daher mehrfach (i.e. zu Beginn von Teilsequenzen) platziert werden, und damit die Teilsequenzen sowohl innerhalb eines komplexeren Gesamttests als auch &amp;quot;stand-alone&amp;quot;, d.h. einzeln ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Alle &amp;quot;Connect&amp;quot; Bausteine benötigen die Angabe eines &amp;quot;&#039;&#039;Verbindungsnamens&#039;&#039;&amp;quot;.&lt;br /&gt;
Dieser hat die Aufgabe, die Verbindung im weiteren Testverlauf zu identifizieren, wenn zwischen mehreren Verbindungen gewechselt wird, und zum Abbauen der Verbindung. &lt;br /&gt;
&lt;br /&gt;
Wenn Sie im GUI Browser im Elementbaum auf eine Verbindung klicken, erscheint in der rechten &amp;quot;Test&amp;quot; Kachel ein Connect Baustein mit entsprechend vorgelegten Parametern. Diesen können Sie bei Bedarf gleich in die Rekordersequenz übertragen, oder (besser) als separate Aktion speichern (es ist sinnvoll, den Verbindungsaufbau von den aufgezeichneten Teilsequenzen zu trennen; damit haben Sie es später leichter, andere Browser zu verwenden, die Parameter der Verbindung zu ändern und auch neue Teilsequenzen aufzuzeichnen oder zu modifizieren.&lt;br /&gt;
&lt;br /&gt;
Verbindungen mit komplexen Einstellungen werden typischerweise im Verbindungsdialog angelegt, und die Einstellungen von dort über die Menüfunktion &amp;quot;&#039;&#039;Sichern in Anhang/Datei&#039;&#039;&amp;quot; in einer Datei gesichert. So können Sie verschiedene Konfigurationen in einzelnen Dateianhängen in ihrer Testsuite oder auch außerhalb aufbewahren. Zum Verbinden verwenden Sie dann den Aktionsbaustein &amp;quot;[&#039;&#039;Connect From File&#039;&#039;]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=Plugin-Einstellungen=&lt;br /&gt;
Wenn Sie eine bestimmte Browser-Installationen oder Driver standardmäßig als Voreinstellung verwenden möchten, können Sie diese in den Einstellungen des Plugins eintragen. Sie finden sie über das Menü unter dem Punkt &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; und dort unter &amp;quot;&#039;&#039;Erweiterungen&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Webtest (Selenium WebDriver)&#039;&#039;&amp;quot;. Einstellungen für spezifische Browser finden Sie unter den Unterpunkten &amp;quot;&#039;&#039;Beliebteste Browser&#039;&#039;&amp;quot; bzw. &amp;quot;&#039;&#039;Andere Browser&#039;&#039;&amp;quot;.&lt;br /&gt;
Die dortigen Einstellungen gelten als Voreinstellung für jede Verbindung, es sei denn in einer konkreten Verbindungseinstellungen ist etwas anderes angegeben.&lt;br /&gt;
&lt;br /&gt;
===Ausführungsverzögerung für Chrome===&lt;br /&gt;
In manchen Fällen kann es bei Verwendung des Chrome-Browsers vorkommen, dass Bausteine mit Element-Aktionen, beispielsweise ein Klick, im Test erfolgreich durchlaufen, die eigentliche Aktion aber gar nicht ausgeführt wurde. Dies ist ein bekannter Fehler [https://github.com/MPDL/imeji-gui-testing/issues/37], [https://github.com/SeleniumHQ/selenium/issues/4075], der von Selenium bzw. chromedriver behoben werden muss.&lt;br /&gt;
&lt;br /&gt;
Der Fehler lässt sich verhindern, indem entweder der Klick über JavaScript aufgerufen wird&amp;amp;nbsp;(setzen Sie dazu im Klick-Baustein &#039;&#039;invokeDirectly&#039;&#039; auf &#039;&#039;true&#039;&#039;&amp;amp;nbsp;) oder vor der Aktion kurz gewartet wird. Die Ausführung über JavaScript hat den Nachteil, dass sie weniger nah am Klick eines echten Benutzers ist; beispielsweise funktionieren Klicks auf Elemente auch dann, wenn sie von anderen Elementen verdeckt werden (was bei einem &amp;quot;normalen&amp;quot;Klick nicht geht). &lt;br /&gt;
&lt;br /&gt;
Generell warten die Bausteine mit Element-Aktionen automatisch, bis das entsprechende Element verfügbar ist (existiert). In den hier beschriebenen Fällen reicht das aber nicht aus. Deshalb finden Sie in den Plugin-Einstellungen für Chrome die Einstellung &amp;quot;&#039;&#039;Ausführungsverzögerung&#039;&#039;&amp;quot;. Bei der Ausführung wird dann zwischen den Aktionen entsprechend lange gewartet. Falls bei Ihnen der beschriebene Fehler eintritt, können Sie diesen Wert erhöhen. Ein größerer Wert hat natürlich Auswirkung auf die Gesamtlaufzeit.&lt;br /&gt;
&lt;br /&gt;
=Recorder=&lt;br /&gt;
&lt;br /&gt;
Die folgende Beschreibung des Recorders gilt prinzipiell für alle von expecco unterstützten GUI Technologien. Verhalten und Bedienung sind bis auf kleine technologiebedingte Unterschiede für alle gleich.&lt;br /&gt;
&lt;br /&gt;
Besteht im GUI-Browser eine Verbindung mit einem Browserfenster, kann der integrierte Recorder verwendet werden, um einen Testabschnitt aufzunehmen. Sie starten den Recorder, indem Sie im GUI-Browser die entsprechende Verbindung auswählen und dann auf den Aufnahme-Knopf klicken. Für den Recorder öffnet sich ein neues Fenster. Für jeden Klick im Fenster wird eine Aktion aufgezeichnet. Weitere Aktionen stehen über das Menü zur Verfügung. Die aufgezeichneten Aktionen werden im Arbeitsbereich des GUI-Browsers angelegt. Daher ist es möglich, das Aufgenommene parallel zu editieren.&lt;br /&gt;
&lt;br /&gt;
Allgemeine Aktionen finden Sie entweder direkt in der Menüleiste oder dort im Browser-Werkzeuge-Menü (s.u.). Um Aktionen auf Elemente aufzuzeichen, ändern Sie entweder die Auswahl des Element-Werkzeugs in der Menüleiste (s.u.) und klicken dann auf das Element oder wählen Sie die entsprechende Aktion aus dem Kontextmenü durch einen Rechtsklick auf das entsprechende Element aus. Für Texteingabe ist es zudem möglich, den Cursor über dem Element zu platzieren und den Text einzugeben. Dabei öffnet sich der Eingabedialog für diese Aktion. Auf diese Weise ist es ebenfalls möglich, die Eingaben &#039;&#039;Backspace&#039;&#039;, &#039;&#039;Return&#039;&#039; und &#039;&#039;Tab&#039;&#039; aufzuzeichnen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:SeleniumWebDriverRecorder.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Komponenten des Recorderfensters&#039;&#039;&#039;&lt;br /&gt;
#&#039;&#039;&#039;Aufnahme Pausieren&#039;&#039;&#039;: Wenn die Kontrollleuchte rot ist, nimmt der Recorder auf. Durch Klicken können Sie die Aufnahme anhalten. Die Kontrolleuchte leuchtet dann grau. In diesem Zustand können Sie weiter Aktionen über das Recorder-Fenster ausführen, sie werden aber nicht aufgezeichnet. Klicken Sie erneut, um die Aufnahme weiterzuführen.&lt;br /&gt;
#&#039;&#039;&#039;Aktualisieren&#039;&#039;&#039;: Holt das aktuelle Bild und den aktuellen Elementbaum vom Browser. Dies wird nötig, wenn die Anzeige des Recorders nicht mit dem tatsächlichen Browserinhalt übereinstimmt. &lt;br /&gt;
#&#039;&#039;&#039;Follow-Mouse&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird im GUI-Browser ausgewählt.&lt;br /&gt;
#&#039;&#039;&#039;Element-Highlighting&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird rot umrandet.&lt;br /&gt;
#&#039;&#039;&#039;Element-Werkzeuge&#039;&#039;&#039;: Auswahl, mit welchem Werkzeug aufgenommen werden soll. Es stehen alle Aktionen zur Verfügung, die auf ein bestimmtes Element ausgeführt werden. Die gewählte Aktion wird bei einem Klick auf die Anzeige ausgelöst und das Element aus der Position bestimmt. Die nicht ausgewählten Aktionen sind jederzeit über einen Rechtsklick erreichbar. &lt;br /&gt;
#&#039;&#039;&#039;Browser-Werkzeuge&#039;&#039;&#039;: Aktionen die sich nicht auf bestimmte Elemente beziehen, wie Scrollen oder Aktionen auf die aktuelle URL oder den Titel, können hier ausgelöst werden.&lt;br /&gt;
#&#039;&#039;&#039;Seitennavigation&#039;&#039;&#039;: Aktionen zur Seitennavigation: &#039;&#039;eine Seite zurück&#039;&#039;, &#039;&#039;eine Seite vor&#039;&#039; und &#039;&#039;aktuelle Seite neu laden&#039;&#039;&lt;br /&gt;
#&#039;&#039;&#039;Alert-Behandlung&#039;&#039;&#039;: Wenn der Browser einen Alert anzeigt, klicken Sie auf diesen Button, um die Aktionen zur Alert-Behandlung auswählen zu können.&lt;br /&gt;
#&#039;&#039;&#039;Online Dokumentation&#039;&#039;&#039;: Öffnet diese Online-Dokumentation.&lt;br /&gt;
#&#039;&#039;&#039;Anzeige&#039;&#039;&#039;: Zeigt einen Screenshot des Browsers. Aktionen werden mit der Maus je nach Werkzeug ausgelöst. Wenn eine neue Aktion eingegeben werden kann, hat das Fenster einen grünen Rahmen, sonst ist er rot. Scrollen wird den Browser weitergeleitet, aber nicht aufgenommen.&lt;br /&gt;
#&#039;&#039;&#039;Fenster an Bild anpassen&#039;&#039;&#039;: Ändert die Größe des Fensters so, dass der Screenshot vollständig angezeigt werden kann.&lt;br /&gt;
#&#039;&#039;&#039;Bild an Fenster anpassen&#039;&#039;&#039;: Skaliert den Screenshot auf eine Größe, mit der er die volle Größe des Fensters ausnutzt.&lt;br /&gt;
#&#039;&#039;&#039;Skalierung&#039;&#039;&#039;: Ändert die Skalierung des Screenshots. Diese kann auch über Scrollen in der Anzeige bei gedrückt gehaltener Strg-Taste angepasst werden.&lt;br /&gt;
#&#039;&#039;&#039;Meldungen&#039;&#039;&#039;: Hier werden Meldungen angezeigt, bspw. wenn eine Aktion nicht aufgenommen werden konnte. Die letzte Meldung wird solange angezeigt, bis sie über den Button rechts daneben geschlossen wird.&amp;lt;br&amp;gt;&#039;&#039;&#039;Fenster-Tabs&#039;&#039;&#039;: Ab expecco 23.1 werden oberhalb der Anzeige Tabs für jedes offene Fenster angezeigt, sobald eine Verbindung mehr als ein Browserfenster besitzt. Ob der Browser dieses als Tab oder in einem eigenen Fenster anzeigt, ist dabei egal. Über die Tabs im Recorder können Sie das aktuelle Fenster wechseln und diesen Wechsel auch aufzeichnen.&amp;lt;br&amp;gt;&#039;&#039;&#039;Frame-Kontext&#039;&#039;&#039;: Ab expecco 23.1 sehen Sie unterhalb der Anzeige, in welchem Frame-Kontext Sie sich gerade befinden (siehe dazu den Abschnitt [[#Eingebettete_Inhalte|Eingebettete Inhalte]]). Sie können auf die Einträge klicken, um in einen höheren Kontext zu wechseln und diesen Wechsel aufzuzeichnen. Falls Sie zusammengesetzte Pfade eingestellt haben, wird die Anzeige aktualisiert, wenn Sie ein eingebettetes Element ausgewählt haben.&lt;br /&gt;
&lt;br /&gt;
=Eingebettete Inhalte=&lt;br /&gt;
In HTML ist es möglich, auf einer Seite Inhalte einer anderen einzubinden. Das gängigste Elemente dafür ist ein Iframe (Inlineframe). Auf den Inhalt eines Iframes kann ebenfalls mit Selenium zugegriffen werden, allerdings muss dazu zuerst in diesen Kontext gewechselt werden. In der SeleniumWebDriverLibrary gibt es entsprechenden Bausteine, um in den Kontext eines Iframes zu wechseln, um in den Elternkontext zu wechseln und um zurück zum Standardinhalt, also dem obersten Kontext zu wechseln. Alle Element-Bausteine lösen die angelegten Pfade immer innerhalb des aktuellen Kontexts auf. Im GUI-Browser sehen Sie für eingebettete Inhalte ein zusätzliches Element, welches sie aufklappen können um dessen Elemente zu sehen.&lt;br /&gt;
&lt;br /&gt;
==Zusammengesetzte Pfade==&lt;br /&gt;
Seit expecco 23.1 gibt es die Möglichkeit, auch zusammengesetzte Pfade an den Bausteinen zu verwenden, um direkt vom Standardinhalt auf den Inhalt eines Iframes zugreifen zu können. Dazu werden einfach der Pfad zum Iframe und der Pfad innerhalb des Iframe-Inhalts zu einem zusammengesetzt. Wichtig ist hierbei, dass beim Übergang keine Elemente ausgelassen werden dürfen, d.h. der vordere Teil muss mit dem Iframe-Element enden und der hintere Teil mit &#039;&#039;/body&#039;&#039; beginnen. Dazwischen dürfen die Pfade gekürzt werden und es ist natürlich auch möglich auf diese Art beliebig tief geschachtelte Elemente zu erreichen. An den Bausteinen können beide Techniken nach belieben verwendet werden, wichtig ist nur, dass die Pfade immer in dem Kontext aufgelöst werden, in dem sich Selenium gerade befindet.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie die kombinierten Pfade aufzeichnen, bzw. im GUI-Browser verwenden wollen, setzen Sie im Menü &#039;&#039;GUI Browser&#039;&#039; unter &#039;&#039;Aufzeichnung&#039;&#039; den Haken bei &#039;&#039;Zusammengesetzte Pfade aufzeichnen&#039;&#039;. Damit wird für eingebettete Elemente ein zusammengesetzter Pfad relativ zum aktuellen Kontext erzeugt und angezeigt, anstatt wie bisher nur innerhalb seines eigenen Kontexts. Außerdem können Sie diese Elemente auch direkt im Recorder ansprechen oder über Follow-Mouse finden.&lt;br /&gt;
&lt;br /&gt;
=Shadow-Elemente=&lt;br /&gt;
Shadow-DOMs sind eine Möglichkeit, um Teile einer Seite vom übrigen Dokument abzukapseln. Dabei werden an ein Element versteckte Shadow-Elemente angehängt. Eine ausführlichere Erklärung finden Sie zum Beispiel hier: [https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_shadow_DOM Using shadow DOM - Web APIs | MDN].&lt;br /&gt;
&lt;br /&gt;
In der SeleniumWebDirverLibrary gibt es den Baustein &#039;&#039;[Web] Get Shadow DOM&#039;&#039;, der die obersten Elemente liefert, die dann wie andere WebElemente verwendet werden können.&lt;br /&gt;
&lt;br /&gt;
Da die Elemente versteckt sind, werden sie vom GUI-Browser nicht direkt angezeigt. Ab expecco 23.1 kann man allerdings im Kontextmenü der Elemente im GUI-Browser einen Haken setzen, dass Shadow-Elemente gesucht werden sollen. Beim Aktualisieren der Kinder eines Elements werden sie dann angezeigt, falls vorhanden, allerdings nicht, wenn der gesamte Baum aktualisiert wird. Wenn der Haken gesetzt ist, sind die Elemente auch im Recorder verfügbar.&lt;br /&gt;
&lt;br /&gt;
==Zusammengesetzte Pfade==&lt;br /&gt;
Ähnlich wie die Elemente innerhalb eines Frames kann auch auf die Shadow-Elemente direkt über zusammengesetzte Pfade zugegriffen werden. Diese Pfade können dann direkt an den Bausteinen verwendet werden, sodass der Baustein &#039;&#039;[Web] Get Shadow DOM&#039;&#039; nicht benötigt wird. Die Pfade haben die Form&lt;br /&gt;
 &amp;lt;host path&amp;gt;/shadowRoot/&amp;lt;shadow path&amp;gt;&lt;br /&gt;
wobei &#039;&#039;&amp;lt;host path&amp;gt;&#039;&#039; den Pfad zum Element angibt, an das der Shadow-DOM angehängt wurde, und &#039;&#039;&amp;lt;shadow path&amp;gt;&#039;&#039; der Pfad innerhalb des Shadow-DOMs zum gewünschten Element ist. &#039;/shadowRoot&#039; dient als Marker, dass an dieser Stelle der Wechsel in den Shadow-DOM erfolgt.&lt;br /&gt;
&lt;br /&gt;
=Authentifizierungs-Alerts=&lt;br /&gt;
Falls eine Webseite HTTP-Authentifizierung mit Basic Authentication verwendet, öffnet sich beim Laden der Seite ein Alert-Fenster zur Eingabe von Benutzernamen und Passwort. Dieses Fenster ist nicht direkt mit Selenium bedienbar. Im GUI-Browser wird es wie ein Alert angezeigt. Eine Ausnahme hierzu bildet Chrome, bei dem der Driver auf keine Anfrage antwortet solange der Dialog geöffnet ist. Das Plugin kann zu diesem Zeitpunkt insbesondere nicht feststellen, ob ein Authentifizierungs-Dialog geöffnet ist oder ob der Driver aus anderen Gründen nicht antwortet.&lt;br /&gt;
&lt;br /&gt;
Bei lokalen Verbindungen unter Windows kann eine Authentifizierung mittels Windows Access ausgeführt werden. Es gibt in der SeleniumWebDriverLibrary für einzelne Browsertypen spezifische Authentifizierungs-Bausteine sowie den Baustein &#039;&#039;Authenticate at Alert&#039;&#039;, der je nach Verbindung den entsprechenden Baustein ausführt. Für die verschiedenen Browser-Typen gibt es dabei unterschiedliche Einschränkungen:&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Chrome:&#039;&#039;&#039; Die Anmeldedaten werden an ein Chromefenster geschickt, daher funktioniert es nur, wenn nicht mehrere geöffnet sind. Der Einzelbaustein hat für diesen Fall die Option, den Titel des Fensters anzugeben.&lt;br /&gt;
:&#039;&#039;&#039;Edge&#039;&#039;&#039;: Mit Microsoft Edge wird eine Anmeldung nicht unterstützt.&lt;br /&gt;
:&#039;&#039;&#039;Firefox&#039;&#039;&#039;: Schickt die Anmeldedaten an ein Firefox-Dialogfenster und funktioniert daher nur, wenn es nicht mehrere gibt.&lt;br /&gt;
:&#039;&#039;&#039;Internet Explorer&#039;&#039;&#039;: Mit dem Internet Explorer wird eine Anmeldung nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
Als zusätzliche Option steht Ihnen auch eine Anmeldung über die URL zur Verfügung. Rufen Sie anstatt der Seite &amp;lt;nowiki&amp;gt;https://www.example.com&amp;lt;/nowiki&amp;gt; die URL &amp;lt;nowiki&amp;gt;https://user:password@www.example.com&amp;lt;/nowiki&amp;gt; auf. Wichtig ist hierbei, dass &#039;&#039;:&#039;&#039; und &#039;&#039;@&#039;&#039; nicht im Benutzernamen oder im Passwort auftauchen. Möglicherweise wird diese Methode nicht von jedem Browser unterstützt.&lt;br /&gt;
&lt;br /&gt;
Mithilfe des [[WindowsAutomation_Reference_2.0|WindowsAutomation2]]-Plugins ist es ebenfalls möglich, solch eine Anmeldung mit allen Browsertypen auszuführen.&lt;br /&gt;
&lt;br /&gt;
=Portierung alter Selenium-Tests=&lt;br /&gt;
Dieses Plugin ersetzt das bisherige [[Selenium_Web_Test_Plugin|Selenium Web Test Plugin]]. Dieses basierte auf [https://www.seleniumhq.org/projects/remote-control/ Selenium RC], welches in Zukunft von den Browsern nicht mehr unterstützt wird. Der Nachfolger von Selenium RC ist [https://www.seleniumhq.org/projects/webdriver/ Selenium WebDriver], auch &#039;&#039;Selenium 2&#039;&#039; genannt. Ebenso ist auch das Aufzeichnen von Tests mit [https://www.seleniumhq.org/projects/ide/ Selenim IDE] veraltet, da das Plugin von neueren Browsern nicht mehr unterstützt wird. Das Selenium WebDriver Plugin verwendet stattdessen einen eigenen [[#Recorder|Recorder]].&lt;br /&gt;
&lt;br /&gt;
Tests, die mit dem alten Selenium Web Test Plugin erstellt wurden und die alte SeleniumLibrary verwenden, können über Selenium WebDriver ausgeführt werden. Setzen Sie dazu in den Plugin-Einstellungen von &amp;quot;&#039;&#039;Webtest Legacy (Selenium)&#039;&#039;&amp;quot; den Haken bei &amp;quot;&#039;&#039;WebDriver für die Ausführung verwenden&#039;&#039;&amp;quot;. Für die wichtigsten Funktionen wurde Wrapper bzw. umsetzende Funktionen erstellt, um die Migration möglichst problemlos zu gestalten.&lt;br /&gt;
Testen Sie dann, ob die Tests wie bisher ablaufen. Für den überwiegenden Teil der Bausteine sollte es dabei keine Probleme geben. Einige wenige Aktionen werden in der WebDriver Version nicht mehr unterstützt oder verhalten sich unterschiedlich. Es ist auch nicht garantiert, daß die Emulation der alten Schnittstelle auf Dauer von Selenium unterstützt werden. Wenn möglich sollten Sie daher über kurz oder lang die Testfälle umschreiben.&lt;br /&gt;
&lt;br /&gt;
=FAQ=&lt;br /&gt;
*&#039;&#039;&#039;Scrollbalken lassen sich im Recorder nicht bedienen&#039;&#039;&#039;&lt;br /&gt;
:Der Scrollbalken des Browsers, der automatisch angezeigt wird, wenn eine Seite größer als das Browserfenster ist, ist kein bedienbares Webelement. Scrollen um einen bestimmten Betrag ist in einem Test selten sinnvoll, wenn die Größe des Browserfensters nicht festgelegt ist. Verwenden Sie stattdessen den Baustein &amp;lt;code&amp;gt;[Web] Scroll Element into View&amp;lt;/code&amp;gt;, um ein entsprechendes Element in den sichtbaren Bereich zu scrollen. Der Klick-Baustein, den der Recorder standardmäßig verwendet, führt diese Aktion bereits automatisch mit aus (&amp;lt;code&amp;gt;[WebElement] Click (Scroll Element into View)&amp;lt;/code&amp;gt;). Wenn Sie im Recorder-Fenster scrollen, wird dies automatisch auf den Browser übertragen, aber nicht aufgezeichnet. Falls Sie tatsächlich um einen bestimmten Betrag scrollen möchten, gibt es bei den Browser-Aktionen einen Eintrag dafür und weitere Bausteine in der SeleniumWebDriverLibrary.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Baustein schlägt fehl, wenn Element zu spät sichtbar wird&#039;&#039;&#039;&lt;br /&gt;
:Alle Bausteine, die einen Elementpfad verwenden, haben automatisch eingebaut, dass sie warten, bis ein entsprechendens Element auftaucht. Es gibt aber Fälle, in denen ein Element zwar bereits da, aber noch nicht sichtbar ist. Bei einem Klick auf das Element bekommen Sie dann einen Fehler. Mögliche Fehler in diesem Zusammenhang sind &amp;lt;code&amp;gt;org.openqa.selenium.ElementNotInteractableException: element not interactable&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;org.openqa.selenium.JavascriptException: javascript error: Cannot read property &#039;left&#039; of undefined&amp;lt;/code&amp;gt;. Verwenden Sie dann vor einer Interaktion mit dem Element den Baustein &amp;lt;code&amp;gt;[Web] Wait for Visibility of Element&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;[Web] Wait for Element to Be Clickable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Fehlermeldung: &amp;lt;code&amp;gt;Cannot read property &#039;left&#039; of undefined&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:Der Fehler &amp;lt;code&amp;gt;org.openqa.selenium.JavascriptException: javascript error: Cannot read property &#039;left&#039; of undefined&amp;lt;/code&amp;gt; kann mit dem Chrome-Browser auftreten. In diesem Fall ist das verwendete Element nicht sichtbar. Lesen Sie dazu den Punkt oben. Der Fehler ist auch im Zusammenhang mit Elementen in einer Dropdown-Liste bekannt, d.h. bei einem Klick oder dem Bewegen der Maus auf ein &amp;lt;nowiki&amp;gt;&amp;lt;option&amp;gt;&amp;lt;/nowiki&amp;gt;-Element innerhalb eines &amp;lt;nowiki&amp;gt;&amp;lt;select&amp;gt;&amp;lt;/nowiki&amp;gt;-Elements. Diese Elemente sind prinzipiell nicht klickbar. Verwenden Sie stattdessen einen passenden &amp;lt;code&amp;gt;[Web] Select&amp;lt;/code&amp;gt;-Baustein mit dem &amp;lt;nowiki&amp;gt;&amp;lt;select&amp;gt;&amp;lt;/nowiki&amp;gt;-Element.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Fehlermeldung: &amp;lt;code&amp;gt;Stale Element Reference Exception&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:Der Fehler &amp;lt;code&amp;gt;org.openqa.selenium.StaleElementReferenceException&amp;lt;/code&amp;gt; tritt immer dann auf, wenn ein WebElement verwendet wird, das nicht mehr da ist. Wenn das in Ihrem Test passiert und das Element eigentlich da sein sollte, verwenden Sie an der Stelle stattdessen den Locator, um das Element neu zu holen. Eventuell liegt es auch daran, dass sich der Test momentan in einem anderen Frame-Kontext befindet als das Element. Wenn Sie [[#Zusammengesetzte_Pfade|zusammengesetzte Pfade]] verwenden, sollte das Element selbst in den richtigen Kontext wechseln, bevor Aktionen darauf ausgeführt werden.&lt;br /&gt;
:In seltenen Fällen kann der Fehler auch in expecco selbst auftreten, wenn an irgendeiner Stelle im GUI-Browser oder Recorder ein entsprechendes WebElement verwendet wird. Sie sollten dann abbrechen können und es nochmal versuchen. Sollte der Fehler bestehen bleiben, wechseln Sie in den Default Content und laden Sie den Baum im GUI-Browser neu.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Baustein läuft erfolgreich, aber ohne Auswirkungen&#039;&#039;&#039;&lt;br /&gt;
:Dieser Fall kann mit Chrome auftreten. Das Element ist verfügbar, die Aktion wirft keinen Fehler, aber es wird nichts ausgeführt. In der Regel hilft es, vor der Ausführung kurz zu warten, siehe [[#Ausf.C3.BChrungsverz.C3.B6gerung_f.C3.BCr_Chrome | Ausführungsverzögerung für Chrome]].&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Ausführungen mit Chrome sind langsamer&#039;&#039;&#039;&lt;br /&gt;
:Um ein Problem bei der Ausführung mit Chrome zu beheben, ist in den Plugin-Einstellungen für Chrome eine Verzögerung definiert. Überprüfen Sie, ob dieser Wert eventuell zu hoch eingestellt ist; siehe [[#Ausf.C3.BChrungsverz.C3.B6gerung_f.C3.BCr_Chrome | Ausführungsverzögerung für Chrome]].&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Fehlermeldungen wie: &amp;quot;org.openqa.selenium.InvalidArgumentException: Expected &amp;quot;handle&amp;quot; to be a string...&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
:Dies passiert wenn der Driver nicht (mehr) zum Browser passt. Lesen Sie dazu obiges Kapitel &amp;quot;[[#WebDriver aktualisieren|WebDriver aktualisieren]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Key Chords mit Shortcuts funktionieren nicht&#039;&#039;&#039;&lt;br /&gt;
:Das Drücken mehrerer Tasten gleichzeitig lässt sich als Key Chord simulieren. Dadurch können auch Shortcuts eingegeben werden. Allerdings funktionieren hier nicht alle Eingaben, da diese nur an den Seiteninhalt und nicht an den Browser selbst gehen. Kombinationen wie &#039;&#039;Strg + t&#039;&#039; um einen neuen Browsertab zu öffnen, funktionieren daher vermutlich nicht, &#039;&#039;Strg + a&#039;&#039; oder &#039;&#039;Strg + c&#039;&#039; sollten hingegen möglich sein.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Zusätzliche Window Handles mit Opera&#039;&#039;&#039;&lt;br /&gt;
:Der Opera-Browser liefert mehr Window Handles als Tabs bzw. Fenster geöffnet sind. Diese kommen von Opera-internen Funktionen wie dem Schnellstart (&#039;&#039;Speed Dial&#039;&#039;) oder der &#039;&#039;Better Address Bar Experience&#039;&#039; (BABE), die zwar im Browserfenster eingebunden, aber nicht als Tab angezeigt werden. Zu diesen Tabs kann zwar mit den entsprechenden Bausteinen gewechselt werden, es sind dann aber nicht alle Aktionen möglich, die für die normalen Tabs zur Verfügung stehen. Sie können zum Beispiel nicht geschlossen werden und man bekommt von ihnen kein Bild. Am besten wechselt man daher gar nicht erst in diese Kontexte. Seien Sie also vorsichtig, wenn Sie anhand des Index zu einem Tab wechseln wollen, da sich die Opera-Tabs zwischen den anderen befinden und der Index ein anderer als für die anderen Browser sein kann.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Chrome: Wähle deine Suchmaschine&#039;&#039;&#039;&lt;br /&gt;
:Neuere Chromeversionen zeigen nach dem Starten ein [https://www.google.com/chrome/choicescreen/ Overlay], bei dem man die verwendete Suchmaschine auswählen soll. Die Entscheidung wird normalerweise im Benutzerprofil gespeichert. Wenn für die Verbindung aber nicht explizit ein Chrome-Profil angegeben wird, hat man bei jedem Verbindungsaufbau ein leeres Profil und es wird immer nachgefragt.&lt;br /&gt;
&lt;br /&gt;
:In vielen Fällen kann der Test auch trotz des Overlays im Hintergrund ablaufen. Das Overlay gilt aber wie ein Tab bzw. Fenster; so liefert beispielsweise vom Baustein &#039;&#039;[Web] Get Window Handles&#039;&#039; einen Handle dafür und es kann auch dorthin gewechselt werden. Es gibt aber auch Möglichkeiten es loszuwerden:&lt;br /&gt;
:* &#039;&#039;--disable-search-engine-choice-screen&#039;&#039;: In den [[#Erweiterte_Einstellungen|erweiterten Einstellungen]] kann man bei den Optionen &amp;lt;code&amp;gt;--disable-search-engine-choice-screen&amp;lt;/code&amp;gt; angeben, dann kommt das Overlay nicht.&lt;br /&gt;
:* &#039;&#039;Auswählen&#039;&#039;: Sie können Ihren Test auch so erweitern, dass zu Beginn eine Suchmaschine ausgewählt und damit das Overlay geschlossen wird. Dabei müssen Sie zwei Dinge beachten. Zum einen müssen Sie zuerst mit einem &#039;&#039;Switch to Window&#039;&#039;-Baustein dorthin wechseln (z.B. mit Index &#039;&#039;2&#039;&#039; oder leerem Titel) und am Ende auch wieder zurück zu Ihrem ursprünglichen Tab. Zum anderen sind interessanten Elemente des Overlays [[#Shadow-Elemente|Shadow-Elemente]] und werden daher im GUI-Browser nicht direkt angezeigt.&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Selenium_WebDriver_Plugin/en&amp;diff=29680</id>
		<title>Selenium WebDriver Plugin/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Selenium_WebDriver_Plugin/en&amp;diff=29680"/>
		<updated>2024-08-05T13:33:24Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* FAQ */ Chrome: Choose your search engine&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Selenium_WebDriver_Plugin|Deutsche Version]] | &#039;&#039;&#039;English Version&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Use the &#039;&#039;Selenium WebDriver Plugin&#039;&#039; to test or automate interactions of applications running in a web-browser (*). The plugin can be (and usually is) used with the [[Expecco_GUI_Tests_Extension_Reference|GUI Browser]], which helps in the creation of tests. Moreover, the GUI Browser can record UI sessions, which can later be customised or refactored as required.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Selenium WebDriver Plugin&#039;&#039; replaces the previous [[Selenium_Web_Test_Plugin|Selenium Web Test Plugin]], which was based on the now outdated Selenium RC framework.&amp;lt;br&amp;gt;&lt;br /&gt;
The new web driver uses the [https://www.seleniumhq.org/projects/webdriver/ Selenium WebDriver] for automation, and replaces the previous interface.&lt;br /&gt;
(see https://www.guru99.com/introduction-webdriver-comparison-selenium-rc.html  for background information and a description of the differences.)&lt;br /&gt;
Read [[#Transferring_Old_Selenium_Tests|this section]] for information how to transfer testsuites using the old plugin.&lt;br /&gt;
&lt;br /&gt;
(*) actually, there exists WebDriver interfaces to control Windows or OS X desktop applications. Thus, this plugin can be used in a number of additional scenarios.&lt;br /&gt;
&lt;br /&gt;
=Settings=&lt;br /&gt;
This plugin uses the Java bridge and therefore needs a Java installation. You can specify it in the settings under &#039;&#039;Plugins&#039;&#039; -&amp;gt; &#039;&#039;Java Bridge&#039;&#039;. The important field is &#039;&#039;Java Installation Path&#039;&#039;, where you can set a JDK or JRE. If nothing is set, expecco tries to find java in the PATH.&lt;br /&gt;
&lt;br /&gt;
[[Datei:JDKPfadEinstellungen.png|600px]]&lt;br /&gt;
&lt;br /&gt;
There are settings for the Selenium WebDriver Plugin itself as well. You find them under &#039;&#039;Plugins&#039;&#039; -&amp;gt; &#039;&#039;Webtest (Selenium WebDriver)&#039;&#039;. There you can for example set the address of a remote running Selenium server or another Jar file for Selenium. The settings for the different browser types are divided into the two subpages &#039;&#039;Most Popular Browsers&#039;&#039; and &#039;&#039;Other Browsers&#039;&#039;. There you can set the path to the browser executable or to the webdriver to use. You can leave all these fields empty and expecco will search for them automatically&lt;br /&gt;
&lt;br /&gt;
=Browser Support=&lt;br /&gt;
This plugin supports (among others) the Chrome/Chromium, Edge, Firefox, Internet Explorer  and Opera browsers. &lt;br /&gt;
&amp;lt;br&amp;gt;Safari under OSX must be at least version 10, and OSX must be at least El Capitan.&lt;br /&gt;
The plugin uses the WebDriver interface for communication; therefore, browsers running both on the local or on a remote machine can be tested and/or controlled.&lt;br /&gt;
In addition, many other browsers, UIs and devices support the WebDriver protocol, and can thus be automated/tested with expecco.&lt;br /&gt;
&lt;br /&gt;
==Update WebDriver==&lt;br /&gt;
Each browser has a driver (&amp;quot;&#039;&#039;WebDriver&#039;&#039;&amp;quot;) for opening and controlling a browser window. &lt;br /&gt;
Usually, the driver is a separate program which translates WebDriver requests into browser-specific interface calls. However, there are also browsers and programs which have the WebDriver protocol already built in (eg. Safari).&lt;br /&gt;
&lt;br /&gt;
The expecco installation package includes current driver versions for common browsers. However, as the browsers are updated continuously, sometimes even automatically, you sooner or later may have to download a new driver version. In that case put it in the folder inside your expecco installation directory where the other versions are stored as well, at:&lt;br /&gt;
 &amp;lt;code&amp;gt;packages/exept/expecco/plugin/seleniumWebDriver/lib/XXX&amp;lt;/code&amp;gt;&lt;br /&gt;
(of course, with &amp;quot;\”s instead of &amp;quot;/&amp;quot;s on Microsoft Windows operating systems), where &amp;quot;XXX&amp;quot; denotes the operating system (Windows, Linux, OSX etc.).&lt;br /&gt;
&amp;lt;!--To use a different driver, check the &amp;quot;Advanced&amp;quot; toggle in the connection dialog and add the driver&#039;s path to the settings (see below).--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the connection dialog, expecco may show a warning, that the driver version is incompatible with the browser version. In some cases this may only be due to the fact, that this version was not known at the time of delivery. Some combinations may work despite the warning, but we cannot guarantee that for each individual case.&lt;br /&gt;
&lt;br /&gt;
Therefore you can always check the &amp;quot;&#039;&#039;Do not show this warning again&#039;&#039;&amp;quot; toggle, if such a warning is shown, to have expecco remember that combination as &amp;quot;compatible&amp;quot; in your settings, and not warn again. You should only do that, if you are sure that your tests will still be executed correctly. As we sometimes get compatibility problems ourselves and cannot always immediately find the reason, we advice you, to update the driver.&lt;br /&gt;
&lt;br /&gt;
For Chrome and Microsoft Edge, where each new browser version comes with a new driver version, you find a button in the connection dialog, to download matching driver versions by expecco.&lt;br /&gt;
&lt;br /&gt;
You find new driver versions at the following addresses:&lt;br /&gt;
{|&lt;br /&gt;
|Chrome/Chromium&lt;br /&gt;
|[https://sites.google.com/chromium.org/driver/ ChromeDriver]&lt;br /&gt;
|-&lt;br /&gt;
|Edge&lt;br /&gt;
|[https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ Microsoft WebDriver]&lt;br /&gt;
|-&lt;br /&gt;
|Firefox&lt;br /&gt;
|[https://github.com/mozilla/geckodriver/releases GeckoDriver]&lt;br /&gt;
|-&lt;br /&gt;
|Internet Explorer&lt;br /&gt;
|[https://selenium-release.storage.googleapis.com/index.html IEDriverServer]&lt;br /&gt;
|-&lt;br /&gt;
|Opera&lt;br /&gt;
|[https://github.com/operasoftware/operachromiumdriver/releases Opera driver]&lt;br /&gt;
|-&lt;br /&gt;
|Safari&lt;br /&gt;
|[https://webkit.org/blog/6900/webdriver-support-in-safari-10 Safari Support]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Download a suitable version and place it at an appropriate location in the above mentioned directory. expecco will then find and use it. &amp;lt;!-- You can extend the file name to have multiple versions in parallel. --&amp;gt; Alternatively, you can set the path to a driver either in the [[#Advanced_Settings | connection editor]] or in the [[#Plugin_Settings | plugin settings]].&lt;br /&gt;
&lt;br /&gt;
[[Datei:bulb.png|20px]]Please verify that the driver&#039;s version is compatible with the browser version. If in doubt, consult the version history (e.g. for Chrome: https://chromedriver.storage.googleapis.com/2.25/notes.txt).&lt;br /&gt;
&lt;br /&gt;
[[Datei:bulb.png|20px]]Notice: For Internet Explorer, &amp;quot;&amp;lt;code&amp;gt;Protected Mode&amp;lt;/code&amp;gt;&amp;quot; settings must be set to the same value for all zones, to be able to start a connection.  (in the Internet Explorer, open &amp;quot;Settings&amp;quot; - &amp;quot;Internet Options&amp;quot; - &amp;quot;Security&amp;quot;, and set the value of &amp;quot;protected mode&amp;quot; to the same in all 4 zones; otherwise, you&#039;ll get error- and warning dialogs when connecting). See also the [https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver#required-configuration required configuration] to use InternetExplorerDriver.&lt;br /&gt;
&lt;br /&gt;
[[Datei:bulb.png|20px]]Also notice: the plugin uses JavaScript for some advanced functions, and those functions require that JavaScript is enabled in the browser. This is especially needed to use the GUI browser and the recorder. Test execution may be possible without JavaScript, as long as no actions are used which rely on JavaScript.&lt;br /&gt;
If you get an error like &amp;lt;code&amp;gt;&amp;quot;org.openqa.selenium.JavascriptException: Error executing JavaScript&amp;quot;&amp;lt;/code&amp;gt;,&lt;br /&gt;
make sure that JavaScript is enabled in the browser and that the versions of the browser and the associated driver are compatible.&lt;br /&gt;
&lt;br /&gt;
=Additional Uses=&lt;br /&gt;
{|&lt;br /&gt;
|[https://github.com/appium/appium-for-mac AppiumForMac]&lt;br /&gt;
|WebDriver to control OS X apps (i.e. also non-Browsers)&lt;br /&gt;
|-&lt;br /&gt;
|[https://github.com/microsoft/WinAppDriver WinAppDriver]&lt;br /&gt;
|WebDriver to control Windows Desktops&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Notice, that these interfaces usually provide a subset of the functionality provided by special plugins, such as Java-GUI or WindowsAutomation plugins. Usually, they are ok to manipulate the top level window or to confirm simple dialogs, but less usable for more complex UI tests.&lt;br /&gt;
&lt;br /&gt;
= Quick Start =&lt;br /&gt;
== Open Browser / Connecting ==&lt;br /&gt;
* Start expecco&lt;br /&gt;
* Click on &amp;quot;&#039;&#039;New Testsuite&#039;&#039;&amp;quot;&lt;br /&gt;
* Click on the GUI-Browser symbol ([[Datei:GUIBrowser.png|24px]])&lt;br /&gt;
* A new Tab appears, containing the GUI-Browser&lt;br /&gt;
* Click on &amp;quot;&#039;&#039;Connect&#039;&#039;&amp;quot; and choose &amp;quot;&#039;&#039;Selenium Testing&#039;&#039;&amp;quot;. The  [[#Connection Editor | Connection Dialog]] appears (see details below)&lt;br /&gt;
* Choose the type of browser (eg. &amp;quot;&amp;lt;code&amp;gt;firefox&amp;lt;/code&amp;gt;&amp;quot; and enter the URL of the tested web site (eg. &amp;quot;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://www.myHost.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;quot;) and )&lt;br /&gt;
* Click on &amp;quot;Connect&amp;quot;&lt;br /&gt;
* A browser is started automatically, and the page is shown&lt;br /&gt;
* As soon as the connection is established,  the page&#039;s elements are shown in the GUIBrowser&#039;s left tree view&lt;br /&gt;
&lt;br /&gt;
== Start a Recording ==&lt;br /&gt;
* After a connection has been established, click on the record icon ([[Datei:Recording.png|16px]]) in the GUIBrowser.&lt;br /&gt;
&lt;br /&gt;
== Inspecting Elements ==&lt;br /&gt;
* Select an element in the browser&#039;s element-tree, or move the mouse over it in &amp;quot;follow-mouse mode&amp;quot;. If your browser does not support this &amp;quot;follow-mouse&amp;quot; mode, try opening a recorder, and move the mouse there.&lt;br /&gt;
The element&#039;s attributes are shown in the lower-center attribute/property list.&lt;br /&gt;
== Manually adding Actions and Checks ==&lt;br /&gt;
* In addition to recording, actions and checks can also be selected from the upper-centre action list. Select one there and either try it immediately or add it to the recording sequence via the add-action button at the top far right.&lt;br /&gt;
&lt;br /&gt;
=Connecting=&lt;br /&gt;
==&amp;lt;span id=&amp;quot;Verbindungsdialog&amp;quot;&amp;gt;Connection Editor==&lt;br /&gt;
The connection editor defines, changes or starts a connection. Open the GUI browser, click on &amp;quot;&#039;&#039;Connect&#039;&#039;&amp;quot; and select &amp;quot;&#039;&#039;Selenium Testing (WebDriver)&#039;&#039;&amp;quot;. You can also create attachments or files containing connection parameters (&amp;quot;&#039;&#039;connection settings&#039;&#039;&amp;quot;) without actually connecting to/opening a new browser connection via the &amp;quot;&#039;&#039;Save Connection Settings&#039;&#039;&amp;quot; menu item.&lt;br /&gt;
&lt;br /&gt;
When opened, the connection editor presents a number of fields and load/save buttons in its toolbar menu:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:SeleniumWebDriverConnectDialog.png]]&lt;br /&gt;
&lt;br /&gt;
#&#039;&#039;Load settings from attachment&#039;&#039;: Open an attachment containing connection settings from an open project. This settings will be added to the editor. Already entered inputs that are not conflicting will remain unchanged.&lt;br /&gt;
#&#039;&#039;Load settings from file&#039;&#039;: Open a saved settings file (*.csf). Its settings will be added to the editor. Already entered inputs that are not conflicting will remain unchanged.&lt;br /&gt;
#&#039;&#039;Save settings as attachment&#039;&#039;: Save all entered settings as attachment in an open project.&lt;br /&gt;
#&#039;&#039;Save settings as JSON attachment&#039;&#039;: Save all entered settings in JSON format as attachment in an open project.&lt;br /&gt;
#&#039;&#039;Save settings to file&#039;&#039;: Save all entered settings to a file (*.csf).&lt;br /&gt;
#&#039;&#039;Version info&#039;&#039;: Opens a window showing the used versions of the Selenium server, the selected browser and its driver.&lt;br /&gt;
#&#039;&#039;Online documentation&#039;&#039;: Open this online documentation page.&lt;br /&gt;
#&#039;&#039;Connection name&#039;&#039;: Enter the name of the connection used to show it in the GUI browser. (Optional)&lt;br /&gt;
#&#039;&#039;Browser type&#039;&#039;: Choose the type of browser to use. Ensure it is installed and the version of the used driver is compatible with the browser version.&lt;br /&gt;
#&#039;&#039;URL&#039;&#039;: Enter the URL to open at startup. To open an empty browser window, leave this field empty. To open a local file use the &amp;quot;&amp;lt;code&amp;gt;file://&amp;lt;/code&amp;gt;&amp;quot; scheme, e.g. &amp;quot;&amp;lt;code&amp;gt;file:///C:/Users/admin/Desktop/index.html&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
#&#039;&#039;Advanced view&#039;&#039;: Toggle the view to enter [[#Advanced Settings|advanced settings]].&lt;br /&gt;
#&#039;&#039;Information on the selected browser&#039;&#039;: Here, the selected browser type is shortly characterized.&lt;br /&gt;
#&#039;&#039;Information on the settings&#039;&#039;: It shows which Selenium, browser and driver version will be used regarding the current settings. If you have set [[#Advanced Settings|advanced settings]], they will also be displayed here.&lt;br /&gt;
&lt;br /&gt;
===Advanced Settings===&lt;br /&gt;
Besides the used browser and the start URL, more settings and possibly &amp;quot;&#039;&#039;capabilities&#039;&#039;&amp;quot; may be required. To see click on the &amp;quot;Advanced&amp;quot; toggle. Depending on the selected browser type you get different entry fields.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Remote Server&#039;&#039;: To open a browser on a remote host, start a Selenium server there and set this field to its address. You can also enter a local address if you do not want the Selenium server to start automatically or if it is already running. See the next section [[#Remote Connections|Remote Connections]] on how to start a Selenium server.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Headless&#039;&#039;: to open the browser in &amp;quot;headless&amp;quot; mode, i.e. without a window. Not all browsers/drivers support this mode.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Binary&#039;&#039;: Enter the path to the binary of the selected browser. Use this if the browser cannot be found automatically by Selenium, or if you have another browser version installed or to be tested against.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Driver&#039;&#039;: For each browser, a particular driver is needed for automation. New browser versions often also need a new driver version. If you don&#039;t want or cannot use the driver provided by expecco, set its path here.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Command Line Options&#039;&#039;: arguments passed to the browser-command. For example the chrome browser supports a &amp;quot;--disable-extensions&amp;quot; command line argument, firefox supports &amp;quot;--safe-mode&amp;quot; and &amp;quot;--profile&amp;quot;. These options are browser- and possibly browser-version specific. Most browsers allow for a &amp;quot;--help&amp;quot; argument, which you may try in a shell window to find out.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Firefox Profile&#039;&#039;: For Firefox, it is possible to set a &#039;&#039;Firefox Profile&#039;&#039;, containing specific settings. If no profile is set, each connection will use a new empty one.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Capabilities&#039;&#039;: Selenium connections can use several capabilities to define the connection&#039;s behavior. To add specific capabilities, set them in this field. Write &amp;quot;&#039;&#039;&amp;lt;capability name&amp;gt;: &amp;lt;value&amp;gt;&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;&amp;lt;capability name&amp;gt; = &amp;lt;value&amp;gt;&#039;&#039;&amp;quot;, one entry per line.&amp;lt;p&amp;gt;The set of capabilities needed or supported are browser- and driver specific. Please refer to the concrete driver&#039;s documentation as found via the driver links above. Common capabilities are: &amp;quot;app&amp;quot; or &amp;quot;application&amp;quot;, &amp;quot;url&amp;quot;, etc. For drivers which communicate with mobile devices, the capabilities also select which device to use and/or wether an emulator should be started.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;You can also set properties for the Firefox browser - for this, use the same syntax as for capabilities, but add a leading &#039;&#039;$&#039;&#039; to the property name.&amp;lt;/p&amp;gt;Properties used by expecco internally (such as browser type, url or remote host) are prefixed by a &amp;quot;#&amp;quot;-character.&lt;br /&gt;
&lt;br /&gt;
==Remote Connections==&lt;br /&gt;
To start a browser on a remote computer, copy the Selenium server and the required driver to that computer. You find the files in your expecco installation at &amp;quot;&amp;lt;code&amp;gt;packages\exept\expecco\plugin\seleniumWebDriver\lib&amp;lt;/code&amp;gt;&amp;quot;. Start the Selenium server (on the remote host) with:&lt;br /&gt;
 java -jar selenium-server-standalone-3.6.0.jar&lt;br /&gt;
By default, the server will listen on port 4444. To use another port, set it with the &amp;quot;&amp;lt;code&amp;gt;-port &amp;amp;lt;nr&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;quot; command line argument. To connect to that server, set the &amp;quot;&#039;&#039;remote server&#039;&#039;&amp;quot; parameter of the connection to &amp;quot;&#039;&#039;&amp;lt;Server-Address&amp;gt;:4444/wd/hub&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Check and possibly configure your firewall to allow transmission through the port.&lt;br /&gt;
&lt;br /&gt;
== Headless Browsing ==&lt;br /&gt;
&amp;quot;&#039;&#039;Headless Browsing&#039;&#039;&amp;quot; means: &amp;quot;&#039;&#039;without a window&#039;&#039;&amp;quot;,  and is useful to test web-pages for reachability, performance and structure. You can either use the HTMLUnit browser type, which simulates a browser, or run against one of the real browsers in headless mode. Notice, that not all browsers support this headless mode - we recommend using &amp;quot;firefox&amp;quot; or &amp;quot;chrome&amp;quot; for this.&lt;br /&gt;
&lt;br /&gt;
Also notice, that in order to verify that a web page&#039;s interaction with a browser works correctly, you should test against real browsers.&lt;br /&gt;
For an introduction on what &amp;quot;headless browsing&amp;quot; means, see for example [https://www.guru99.com/selenium-with-htmlunit-driver-phantomjs.html https://www.guru99.com/selenium-with-htmlunit-driver-phantomjs.html].&lt;br /&gt;
&lt;br /&gt;
Notice: the HTMLUnit driver has been removed from the latest selenium distribution and is also no longer supplied with expecco (it was not a good test tool anyway, as it behaved differently from real browsers).&lt;br /&gt;
&amp;lt;br&amp;gt;If required, download from [https://github.com/SeleniumHQ/htmlunit-driver https://github.com/SeleniumHQ/htmlunit-driver].&lt;br /&gt;
&lt;br /&gt;
==Connection Blocks==&lt;br /&gt;
SeleniumWebDriverLibrary offers a number of blocks to start a Selenium connection within a testrun. The &#039;&#039;connection name&#039;&#039; identifies the connection during the run, if the test uses multiple connections and switches between them (eg. if multiple browser windows are open simultaneously). To start a connection with predefined settings, save them in the connection dialog (as attachment), and use the &amp;quot;[&#039;&#039;Connect From File&#039;&#039;]&amp;quot; action block.&lt;br /&gt;
&lt;br /&gt;
=Plugin Settings=&lt;br /&gt;
To use certain browser installations or drivers as default, for every connection, set them in the settings dialog of the plugin (&amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Plugins&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Selenium WebDriver Extension&#039;&#039;&amp;quot;). Settings for specific browsers can be found under &amp;quot;&#039;&#039;Most Popular Browsers&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Other Browsers&#039;&#039;&amp;quot;. The settings there are used as default, unless overwritten by an individual connection configuration.&lt;br /&gt;
&lt;br /&gt;
===Execution Delay for Chrome===&lt;br /&gt;
In some cases it can happen when using the Chrome browser that blocks with element actions, for example a click, run successfully in the test, but the actual action was not executed at all. This is a known bug [https://github.com/MPDL/imeji-gui-testing/issues/37], [https://github.com/SeleniumHQ/selenium/issues/4075] that needs to be fixed by Selenium or Chromedriver. The error can be prevented by either calling the click via JavaScript&amp;amp;nbsp;– to do this, set &#039;&#039;invokeDirectly&#039;&#039; to &#039;&#039;true&#039;&#039; at the click block&amp;amp;nbsp;– or wait briefly before the action. Execution via JavaScript has the disadvantage that it is less close to the click of a real user and, for example, clicks on elements work even if they are hidden by other elements. In general, blocks with element actions automatically wait until the corresponding element is available. In the cases described here, however, this is not sufficient. Therefore you will find the setting &#039;&#039;execution delay&#039;&#039; in the plugin settings for Chrome. During execution, the system waits accordingly long between each action. If you experience the described error, you can increase its value. Of course, a higher value has an effect on the test run executio times.&lt;br /&gt;
&lt;br /&gt;
=Recorder=&lt;br /&gt;
The following description applies to all GUI technologies which support remote recording in the integrated expecco recorder: the behaviour of the recorder is (apart from small differences due to technology-specific limitations) the same across different connections.&lt;br /&gt;
&lt;br /&gt;
Use of this recorder has some advantages over direct recording in the browser:&lt;br /&gt;
* it can be used with remote machines/connections/mobil devices&amp;lt;br&amp;gt;especially for mobile devices, which may be all located in a separate (server-) room&lt;br /&gt;
* it provides precise control over which event is to be recorded.&amp;lt;br&amp;gt;For example, for clicks, there are alternative ways to record: as &amp;quot;press-release&amp;quot;, as &amp;quot;click&amp;quot;, as &amp;quot;move-then-click&amp;quot;, as &amp;quot;move-then-press-delay-release&amp;quot;. Depending on the page&#039;s underlying event handling (typically done in JavaScript), either one may be required.&lt;br /&gt;
&lt;br /&gt;
Once connected to a browser, the integrated recorder can be used to record a test case. Start the recorder by selecting the appropriate connection in the GUI browser&#039;s left tree and click the &#039;&#039;record&#039;&#039; button. The recorder opens a new window. Each click in the window records an action. More actions are available in the menu. Recorded actions are added to the &#039;&#039;workspace&#039;&#039; of the GUI browser to form a sequence of interactions. This sequence can be edited, parametrized or replayed immediately. When finished, it should be saved into the suite as a new &amp;quot;Test Action&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
General actions can be found either directly in the menu bar or there in the Browser Tools menu (see below). To record actions on elements, either change the selection of the element tool in the menu bar (see below) and click on the element or select the corresponding action from the context menu by right-clicking on the element. For text input, you can also place the cursor over the element and enter the text. The input dialog for this action opens. It is also possible to record the imputs &#039;&#039;backspace&#039;&#039;, &#039;&#039;return&#039;&#039; and &#039;&#039;tab&#039;&#039; that way.&lt;br /&gt;
&lt;br /&gt;
[[Datei:SeleniumWebDriverRecorder.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Components of the recorder window&#039;&#039;&#039;&lt;br /&gt;
#&#039;&#039;&#039;Pause recording&#039;&#039;&#039;: If the control lamp is red, the recorder is in &amp;quot;&#039;&#039;recording&#039;&#039;&amp;quot;-mode. Pause the recording by clicking on this lamp. The lamp will turn to grey. In this state you can execute actions with the recorder, but they are not recorded. Click again to resume the recording.&lt;br /&gt;
#&#039;&#039;&#039;Update&#039;&#039;&#039;: Update the screenshot on the element tree. Necessary if the recorder view does not fit the browser content.&lt;br /&gt;
#&#039;&#039;&#039;Follow-Mouse&#039;&#039;&#039;: The element under the cursor is selected in the GUI browser.&lt;br /&gt;
#&#039;&#039;&#039;Element Highlighting&#039;&#039;&#039;: The element under the cursor gets a red frame.&lt;br /&gt;
#&#039;&#039;&#039;Element Tools&#039;&#039;&#039;: Select which tool to use for recording. You can choose between all actions that use a certain element. The selected action is triggered by each click in the view and the element is determined by the click position. Not selected actions are available by right click.&lt;br /&gt;
#&#039;&#039;&#039;Browser Tools&#039;&#039;&#039;: Actions not refering to ocertain elements, like scrolling or actions on the current URL or the title, can be triggered here.&lt;br /&gt;
#&#039;&#039;&#039;Page navigation&#039;&#039;&#039;: Actions for page navigation: &#039;&#039;Back&#039;&#039;, &#039;&#039;Forward&#039;&#039; and &#039;&#039;Refresh Page&#039;&#039;&lt;br /&gt;
#&#039;&#039;&#039;Alert Handling&#039;&#039;&#039;: Click this button if the browser shows an alert, to be able to select the actions for alert handling.&lt;br /&gt;
#&#039;&#039;&#039;Online Documentation&#039;&#039;&#039;: Open this online documentation.&lt;br /&gt;
#&#039;&#039;&#039;View&#039;&#039;&#039;: Shows a screenshot of the browsers. Actions can be triggered by mouse depending on the selected tool. If a new action can be entered, the frame of the window is green, red otherwise. Scrolling is forwarded to the browser, but not recorded.&lt;br /&gt;
#&#039;&#039;&#039;Resize Window to Screen Size&#039;&#039;&#039;: Change the size of the window to show the whole screenshot.&lt;br /&gt;
#&#039;&#039;&#039;Set Screen Scale to Fit Window&#039;&#039;&#039;: Scale the screenshot to fully fit in the window&lt;br /&gt;
#&#039;&#039;&#039;Scale&#039;&#039;&#039;: Changes the scale of the screenshot. Can also be adjusted by scrolling with pressed &amp;lt;kbd&amp;gt;CTRL&amp;lt;/kbd&amp;gt; key.&lt;br /&gt;
#&#039;&#039;&#039;Notifications&#039;&#039;&#039;: Shows notifications, e.g. if an action cannot be recorded. The last notification is displayed until it is closed by the button on its right side.&amp;lt;br&amp;gt;&#039;&#039;&#039;Window Tabs&#039;&#039;&#039;: As of expecco 23.1, tabs are displayed above the display for each open window as soon as a connection has more than one browser window. Whether the browser displays this as a tab or in its own window does not matter. You can use the tabs in the recorder to switch the current window and also record this switch.&amp;lt;br&amp;gt;&#039;&#039;&#039;Frame context&#039;&#039;&#039;: As of expecco 23.1, you can see below the display in which frame context you are currently in (see the section [[#Embedded_Content|Embedded Content]]). You can click on the entries to switch to a higher context and record this switch. If you have compound paths enabled, the display will update when you select an embedded item.&lt;br /&gt;
&lt;br /&gt;
=Embedded Content=&lt;br /&gt;
In HTML it is possible to include content from another page within one page. The most common element to do this is an iframe (inline frame). The content of an iframe can also be accessed with Selenium, but first you have to switch to this context. In the SeleniumWebDriverLibrary there are corresponding blocks to switch to the context of an iframe, to switch to the parent context and to switch back to the default content, i.e. the top context. All element blocks always resolve the applied paths within the current context. In the GUI browser, you will see an additional element for embedded content, which you can expand to see its elements.&lt;br /&gt;
&lt;br /&gt;
==Compound Paths==&lt;br /&gt;
Since expecco 23.1 there is the possibility to also use compound paths at the blocks to access the content of an iframe directly from the standard content. For this purpose, simply the path to the iframe and the path within the iframe content are combined into one. It is important here that no elements may be omitted at the transition, i.e. the front part must end with the iframe element and the back part must begin with &#039;&#039;/body&#039;&#039;. In between the paths may be shortened and it is of course also possible to access elements nested to any depth in this way. Both techniques can be used on the blocks as desired, the only important thing is that the paths are always resolved in the context in which Selenium is currently located.&lt;br /&gt;
&lt;br /&gt;
If you want to record the combined paths or use them in the GUI Browser, check the box &#039;&#039;Record Compound Paths&#039;&#039; in the &#039;&#039;GUI Browser&#039;&#039; menu under &#039;&#039;Recording&#039;&#039;. This will create and display a compound path for embedded elements relative to the current context, instead of only within its own context as before. You can also address these elements directly in the recorder or find them via Follow-Mouse.&lt;br /&gt;
&lt;br /&gt;
=Shadow Elements=&lt;br /&gt;
Shadow DOMs allow you to encapsulate parts of a page from the remaining document. They provide a way to attach hidden shadow elements to an element. You can find a more detailed explanation for example here: [https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_shadow_DOM Using shadow DOM - Web APIs | MDN].&lt;br /&gt;
&lt;br /&gt;
The SeleniumWebDirverLibrary has the block &#039;&#039;[Web] Get Shadow DOM&#039;&#039;, which gives you the topmost elements, which then can be used like other WebElements.&lt;br /&gt;
&lt;br /&gt;
As the elements are hidden, they are not directly displayed in the GUI browser. However, since expecco 23.1 you can check in the context menu of the elements in the GUI browser the option to find shadow elements. They then will be displayed when updating the children of an element, if there are any, but not when updating the whole tree. If the option is checked, the elements are also available in the recorder.&lt;br /&gt;
&lt;br /&gt;
==Compound Paths==&lt;br /&gt;
Similar to elements inside a frame, shadow elements can be accessed by compound paths. These paths can be used directly at the library blocks and the block &#039;&#039;[Web] Get Shadow DOM&#039;&#039; is not required. The paths are of the form&lt;br /&gt;
 &amp;lt;host path&amp;gt;/shadowRoot/&amp;lt;shadow path&amp;gt;&lt;br /&gt;
where &#039;&#039;&amp;lt;host path&amp;gt;&#039;&#039; denotes the path to the element that has the shadow DOM attached, and &#039;&#039;&amp;lt;shadow path&amp;gt;&#039;&#039; denotes the path inside the shadow DOM to the desired element. &#039;/shadowRoot&#039; serves as marker where the switch to the shadow DOM is needed.&lt;br /&gt;
&lt;br /&gt;
=Authentication Alerts=&lt;br /&gt;
If a Web page uses HTTP authentication with Basic Authentication, an alert window for entering the user name and password opens when the page is loaded. This window cannot be accessed directly with Selenium. In the GUI browser, it is displayed as an alert. An exception to this is Chrome, where the driver does not respond to any request as long as the dialog is open. At this point, the plugin cannot even determine whether an authentication dialog is open or whether the driver is not responding for other reasons.&lt;br /&gt;
&lt;br /&gt;
For local connections under Windows, authentication can be performed using Windows Access. In the SeleniumWebDriverLibrary there are specific authentication blocks for individual browser types as well as the block &#039;&#039;Authenticate at Alert&#039;&#039;, which executes the corresponding block depending on the connection. There are different restrictions for the different browser types:&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Chrome:&#039;&#039;&#039; The credentials are sent to a chrome window, so it only works if not more than one are open. In this case, the single block has the option to specify the title of the window.&lt;br /&gt;
:&#039;&#039;&#039;Edge&#039;&#039;&#039;: With Microsoft Edge a login is not supported.&lt;br /&gt;
:&#039;&#039;&#039;Firefox&#039;&#039;&#039;: Sends the credentials to a Firefox dialog box and therefore only works if there are not multiple ones.&lt;br /&gt;
:&#039;&#039;&#039;Internet Explorer&#039;&#039;&#039;: With Internet Explorer a login is not supported.&lt;br /&gt;
&lt;br /&gt;
As an additional option, you can also log in using the URL. Instead of the page &amp;lt;nowiki&amp;gt;https://www.example.com&amp;lt;/nowiki&amp;gt; call the URL &amp;lt;nowiki&amp;gt;https://user:password@www.example.com&amp;lt;/nowiki&amp;gt;. It is important that &#039;&#039;:&#039;&#039; and &#039;&#039;@&#039;&#039; do not appear in the user name or password. This method may not be supported by every browser.&lt;br /&gt;
&lt;br /&gt;
With the [[WindowsAutomation_Reference_2.0/en|WindowsAutomation2]]-Plugin it is also possible to execute such a login with all browser types.&lt;br /&gt;
&lt;br /&gt;
=Transferring Old Selenium Tests=&lt;br /&gt;
This Plugin replaces the previous [[Selenium_Web_Test_Plugin|Selenium Web Test Plugin]], which is based on [https://www.seleniumhq.org/projects/remote-control/ Selenium RC]. Selenium RC is no longer supported by their authors and it will also no longer be maintained by exept. The successor is [https://www.seleniumhq.org/projects/webdriver/ Selenium WebDriver], also referred to as Selenium 2. &lt;br /&gt;
&lt;br /&gt;
Recording of test actions using [https://www.seleniumhq.org/projects/ide/ Selenim IDE] is also outdated, as the plugin is not supported by newer browsers. The &#039;&#039;Selenium WebDriver Plugin&#039;&#039; uses its own [[#Recorder|Recorder]] instead.&lt;br /&gt;
&lt;br /&gt;
Tests which were created with the old &#039;&#039;Selenium WebTest Plugin&#039;&#039; using SeleniumLibrary can be executed with the new Selenium WebDriver. &lt;br /&gt;
For this, go to the plugin settings of &amp;quot;&#039;&#039;Webtest Legacy (Selenium)&#039;&#039;&amp;quot; and check &amp;quot;&#039;&#039;Use WebDriver for execution&#039;&#039;&amp;quot;. Please verify that your tests are still running after this change, as there is no 100% backward compatibility (which is outside the scope of expecco). However, most of the old test actions should run without problems.&lt;br /&gt;
&lt;br /&gt;
=FAQ=&lt;br /&gt;
*&#039;&#039;&#039;Scrollbars cannot be handled in the recorder&#039;&#039;&#039;&lt;br /&gt;
:The scrollbar of the browser which is diplayed if a page is larger than the browser window is no controllable web element. Mostly it is useless to scroll by a certain amount in a test where the size of the browser window is not defined. Instead, use the block &amp;lt;code&amp;gt;[Web] Scroll Element into View&amp;lt;/code&amp;gt; to scroll a relevant element to the visible region. The default click block used by the recorder already includes this action (&amp;lt;code&amp;gt;[WebElement] Click (Scroll Element into View)&amp;lt;/code&amp;gt;). If you scroll on the recorder window, the action will also be applied to the browser, but is not recorded. If you actually want to scroll by a certain amount, there is an appropriate entry in the browser actions, and more blocks in the SeleniumWebDriverLibrary.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Block fails if element becomes visible too late&#039;&#039;&#039;&lt;br /&gt;
:All blocks that use an element path have built in that they wait until a corresponding element appears. However, there are cases where an element is already there, but not yet visible. If you click on the element you will get an error. Possible errors in this context are &amp;lt;code&amp;gt;org.openqa.selenium.ElementNotInteractableException: element not interactable&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;org.openqa.selenium.JavascriptException: javascript error: Cannot read property &#039;left&#039; of undefined&amp;lt;/code&amp;gt;. In this case, use the &amp;lt;code&amp;gt;[Web] Wait for Visibility of Element&amp;lt;/code&amp;gt; block or &amp;lt;code&amp;gt;[Web] Wait for Element to Be Clickable&amp;lt;/code&amp;gt; before interacting with the element.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Error message &amp;lt;code&amp;gt;Cannot read property &#039;left&#039; of undefined&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:The error &amp;lt;code&amp;gt;org.openqa.selenium.JavascriptException: javascript error: Cannot read property &#039;left&#039; of undefined&amp;lt;/code&amp;gt; can occur with the Chrome browser. This means that the used element is not visible. See the point above on that. The error is also known in combination with elements in a dropdown list, i.e. when clicking or moving the mouse over a &amp;lt;nowiki&amp;gt;&amp;lt;option&amp;gt;&amp;lt;/nowiki&amp;gt; element within a &amp;lt;nowiki&amp;gt;&amp;lt;select&amp;gt;&amp;lt;/nowiki&amp;gt; element. Such elements are generally not clickable. Instead, use a suitable &amp;lt;code&amp;gt;[Web] Select&amp;lt;/code&amp;gt; block with the &amp;lt;nowiki&amp;gt;&amp;lt;select&amp;gt;&amp;lt;/nowiki&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Error message: &amp;lt;code&amp;gt;Stale Element Reference Exception&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:The error &amp;lt;code&amp;gt;org.openqa.selenium.StaleElementReferenceException&amp;lt;/code&amp;gt; occurs whenever a WebElement is used that is no longer there. If that happens during your test and the element should have been there, try using the locator instead to fetch the element again. Maybe the error occurs because the test is currently in a different frame context as the element. If you are using [[#Compound_Paths|compound paths]], the element should switch by itself to the correct context when it is used.&lt;br /&gt;
:In rare cases this error can also occur in expecco itself, if at somewhere in the GUI browser or the recorder such a WebElement is used. You should then be able to abort and try again. Should the error persist, switch to the default content and refresh the tree in the GUI browser.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Block runs successfully, but without effect&#039;&#039;&#039;&lt;br /&gt;
:This case can occur with Chrome. The element is available, the action does not throw an error, but nothing is executed. Usually it helps to wait briefly before the execution, see [[#Execution_Delay_for_Chrome | Execution Delay for Chrome]].&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Executions using Chrome are slower&#039;&#039;&#039;&lt;br /&gt;
:To fix a problem when executing with Chrome, a delay is defined in the plugin settings for Chrome. Check if this value is possibly too high; see [[#Execution_Delay_for_Chrome | Execution Delay for Chrome]].&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Errors like: &amp;quot;org.openqa.selenium.InvalidArgumentException: Expected &amp;quot;handle&amp;quot; to be a string...&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
:This occurs if the driver does not match the browser (any more). Please read the above chapter &amp;quot;[[#Update WebDriver|Update WebDriver]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Key Chords with Shortcuts are not working&#039;&#039;&#039;&lt;br /&gt;
:Pressing keys simultaneously can be simulated using Key Chords. They can also be used to send shortcuts. However, not all inputs will work, as they are only sent to the page content, not to the browser itself. Combinations like &#039;&#039;Ctrl + t&#039;&#039; to open a new browser tab probably wont&#039;t work, &#039;&#039;Ctrl + a&#039;&#039; and &#039;&#039;Ctrl  c&#039;&#039; on the other hand should be effective.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Additional Window Handles for Opera&#039;&#039;&#039;&lt;br /&gt;
:The Opera browser returns more window handles as there are opened tabs or windows. They represent Opera internal features like &#039;&#039;Speed Dial&#039;&#039; or &#039;&#039;Better Address Bar Experience&#039;&#039; (BABE), which are embedded in the browser window, but not displayed like regular tabs. You can switch to these tabs using an appropriate action block, however not all actions are possible then, which can be used with the normal tabs. For example you cannot close them and they don&#039;t provide a screenshot. Therefore it is better to not even switch to their contexts. So be careful when switching to a tab by index, as the Opera tabs are among the others and the index might be a different one than for the other browser types.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Chrome: Choose your search engine&#039;&#039;&#039;&lt;br /&gt;
:Newer versions of Chrome show an [https://www.google.com/chrome/choicescreen/ overlay] at startup, where you have to choose a search engine. Usually, this choice is saved in the user profile. However, if you don&#039;t explicitly set a Chrome profile for the connection, each connect will use an empty profile and this question will always show up.&lt;br /&gt;
&lt;br /&gt;
:In most cases, the test can run in the back despite the overlay. However, the overlay counts as tap or window, meaning the block &#039;&#039;[Web] Get Window Handles&#039;&#039; for an example returns a window handle for it and you can switch to it. But you have options to get rid of it:&lt;br /&gt;
:* &#039;&#039;--disable-search-engine-choice-screen&#039;&#039;: In the [[#Advanced_Settings|advanced settings]] you can add the option &amp;lt;code&amp;gt;--disable-search-engine-choice-screen&amp;lt;/code&amp;gt; and the overlay won&#039;t show up.&lt;br /&gt;
:* &#039;&#039;Choose&#039;&#039;: You can extend your test, so it actually chooses a search engine and closes the overlay. There are two things you need to bear in mind. First, you have to switch there using a &#039;&#039;Switch to Window&#039;&#039; block (e.g. by index &#039;&#039;2&#039;&#039; or with an empty title) and back to your original tab afterwards as well. Secondly, the interesting elements in the overlay are [[#Shadow_Elemens|shadow elements]] and as such not directly displayed in the GUI-Browser.&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Selenium_WebDriver_Plugin&amp;diff=29679</id>
		<title>Selenium WebDriver Plugin</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Selenium_WebDriver_Plugin&amp;diff=29679"/>
		<updated>2024-08-05T13:11:04Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* FAQ */ Chrome: Wähle deine Suchmaschine&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Deutsche Version&#039;&#039;&#039; | [[Selenium_WebDriver_Plugin/en|English Version]]&lt;br /&gt;
=Achtung=&lt;br /&gt;
Das Webtest Selenium WebDriver Plugin ersetzt das bisherige [[Selenium_Web_Test_Plugin|Selenium Web Test Plugin]]. Zur Automatisierung wird [https://www.seleniumhq.org/projects/webdriver/ Selenium WebDriver] verwendet (Driver für gängige Browser werden von uns mitgeliefert), der das bisher verwendete Selenium RC ersetzt. Dies wurde einerseits notwendig, da die SeleniumRC Schnittstelle von neuen Browsern nicht mehr unterstützt wird, andererseits, sinnvoll, da auch andere UI Technologien mit diesem Protokoll angesprochen werden können. &lt;br /&gt;
&lt;br /&gt;
Sie können dieses Protokoll nur noch mit älteren Browsern verwenden, und wir empfehlen dringend, auf die neue Version umzusteigen. &amp;lt;br&amp;gt;Hinweise zur Migration älterer Testsuiten finden Sie [[#Portierung_alter_Selenium-Tests | unten]].&lt;br /&gt;
&lt;br /&gt;
=Einleitung=&lt;br /&gt;
Mit dem Selenium WebDriver Plugin können Sie Tests von Webapplikationen erstellen oder auch diese automatisieren (*). Das Plugin kann (und wird üblicherweise) zusammen mit dem [[Expecco_GUI_Tests_Extension_Reference|GUI-Browser]] verwendet werden, der das Erstellen von Tests oder automatisierten Browseraktionen unterstützt. Zudem ist damit das Aufzeichnen von Abläufen möglich.&lt;br /&gt;
&lt;br /&gt;
(*) tatsächlich gibt es auch WebDriver-Schnittstellen um z.B. Windows-Apps oder OPS-Fenster zu manipulieren. Insofern gibt es für dieses Plugin weitere Einsatzbereiche.&lt;br /&gt;
&lt;br /&gt;
=Einstellungen=&lt;br /&gt;
Das Plugin verwendet die Java-Bridge und benötigt daher eine Java-Installation. Sie können diese in den Einstellungen unter &#039;&#039;Erweiterungen&#039;&#039; -&amp;gt; &#039;&#039;Java Bridge&#039;&#039; angeben. Wichtig ist hier das Feld &#039;&#039;Pfad zur Java-Installation&#039;&#039;, wo Sie ein JDK oder JRE angeben können. Ist nichts angegeben, versucht expecco java im PATH zu finden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:JDKPfadEinstellungen.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Für das Selenium WebDriver Plugin selbst gibt es ebenfalls Einstellungsmöglichkeiten, die Sie unter &#039;&#039;Erweiterungen&#039;&#039; -&amp;gt; &#039;&#039;Webtest (Selenium WebDriver)&#039;&#039; finden. Hier können Sie zum Beispiel die Adresse zu einem remote laufenden Selenium-Server angeben oder eine andere Jar-Datei für Selenium angeben. Einstellungen zu den verschiedenen Browser-Typen teilen sich auf die Unterseiten &#039;&#039;Beliebte Browser&#039;&#039; und &#039;&#039;Andere Browser&#039;&#039; auf. Dort können Sie den Pfad zur Browser-Ausführungsdatei oder zum Webdriver angeben, der verwendet werden soll. Diese Felder können Sie alle leer lassen, expecco wird dann automatisch danach suchen.&lt;br /&gt;
&lt;br /&gt;
=Browser-Unterstützung=&lt;br /&gt;
Das Plugin unterstützt die Browser Chrome/Chromium, Edge, Firefox, Internet Explorer und Opera. &lt;br /&gt;
&amp;lt;br&amp;gt;Safari unter OSX muss zumindest in der Version 10 vorliegen und OSX muss mindestens die El Capitan Version sein.&lt;br /&gt;
Zur Kommunikation wird die WebDriver Schnittstelle verwendet; somit kann der getestete Browser sowohl lokal als auch auf einem entfernten Rechner laufen.&lt;br /&gt;
&lt;br /&gt;
Da inzwischen eine Vielzahl von weiteren Browsen, Geräten und graphischen Oberflächen eine WebDriver Schnittstelle anbieten, können auch diese - z.T. mit eingeschränktem Funktionsumfang - über diese automatisiert werden. So gibt es z.B. auch Schnittstellen für Windows Mobilgeräte oder Desktopanwendungen.&lt;br /&gt;
&lt;br /&gt;
== WebDriver aktualisieren==&lt;br /&gt;
Für jeden Browsertyp gibt es einen Driver, über den das Starten und Ansteuern der Browserfenster funktioniert. Für die wichtigsten Browser finden sich im Lieferumfang aktuelle Driverversionen. Da die Browser fortlaufend aktualisiert werden, teilweise sogar automatisch, müssen Sie früher oder später neue Driverversionen herunterladen. Legen Sie diese dann in Ihrem expecco-Installationsverzeichnis bei den anderen Versionen ab, und zwar unter:&lt;br /&gt;
 &amp;lt;code&amp;gt;packages/exept/expecco/plugin/seleniumWebDriver/lib/XXX&amp;lt;/code&amp;gt;&lt;br /&gt;
(unter Microsoft Windows Betriebssystemen mit &amp;quot;\” anstatt &amp;quot;/&amp;quot;), wobei &amp;quot;XXX&amp;quot; für das Betriebssystem steht (Windows, Linux, OSX etc.).&lt;br /&gt;
&lt;br /&gt;
Im Verbindungsdialog warnt expecco, wenn eine Driverversion nicht zur Browserversion passt. In manchen Fällen kann das aber auch nur daran liegen, dass  diese Version zum Zeitpunkt der Auslieferung noch nicht bekannt war. Manche Kombinationen können trotz der Warnung funktioniert, aber das können wir im Einzelfall nicht garantieren.&lt;br /&gt;
&lt;br /&gt;
Daher können Sie bei einer solchen Warnung immer die Option &amp;quot;&#039;&#039;Diese Warnung nicht mehr anzeigen&#039;&#039;&amp;quot; anwählen, damit diese Driver-Browser-Versionskombination in ihren Settings als &amp;quot;kompatibel&amp;quot; vermerkt wird, und in Zukunft nicht mehr gemeldet wird. Dies sollten Sie aber nur machen, wenn Sie sicher sind, dass Ihre Tests nach wie vor korrekt ausgeführt werden. Da wir hier selbst bisweilen auf Kompatibilitätsprobleme stoßen, und nicht immer gleich klar ist, woran es liegt, empfehlen wir aber den Driver zu aktualisieren.&lt;br /&gt;
&lt;br /&gt;
Für Chrome und Microsoft Edge, bei denen es für jede neue Browserversion auch eine neue Driverversion gibt, finden Sie im Verbindungsdialog einen Button, um mit expecco die passende Version herunterzuladen.&lt;br /&gt;
&lt;br /&gt;
Neuere Versionen der Driver bekommen Sie an folgenden Adressen:&lt;br /&gt;
{|&lt;br /&gt;
|Chrome/Chromium&lt;br /&gt;
|[https://sites.google.com/chromium.org/driver/ ChromeDriver]&lt;br /&gt;
|-&lt;br /&gt;
|Edge&lt;br /&gt;
|[https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ Microsoft WebDriver]&lt;br /&gt;
|-&lt;br /&gt;
|Firefox&lt;br /&gt;
|[https://github.com/mozilla/geckodriver/releases GeckoDriver]&lt;br /&gt;
|-&lt;br /&gt;
|Internet Explorer&lt;br /&gt;
|[https://selenium-release.storage.googleapis.com/index.html IEDriverServer]&lt;br /&gt;
|-&lt;br /&gt;
|Opera&lt;br /&gt;
|[https://github.com/operasoftware/operachromiumdriver/releases OperaDriver]&lt;br /&gt;
|-&lt;br /&gt;
|Safari&lt;br /&gt;
|[https://webkit.org/blog/6900/webdriver-support-in-safari-10 Safari Support]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Laden Sie sich eine passende Version herunter und legen Sie sie im oben genannten Verzeichnis an der entsprechenden Stelle ab. Expecco wird sie dann finden und verwenden. &amp;lt;!-- Sie können den Namen der Datei erweitern, um mehrere Versionen nebeneinander verwenden zu können. --&amp;gt; Alternativ können Sie auch in expecco den Pfad zu einem Driver angeben, entweder im [[#Erweiterte_Einstellungen | Verbindungseditor]] oder in den [[#Plugin-Einstellungen | Plugin-Einstellungen]].&lt;br /&gt;
&lt;br /&gt;
[[Datei:bulb.png|20px]]Bitte verifizieren Sie, daß die Version des Drivers kompatibel ist mit der des Browsers. Im Zweifel suchen Sie nach der Versionshistorie (z.B. für Chrome: https://chromedriver.storage.googleapis.com/2.25/notes.txt).&lt;br /&gt;
&lt;br /&gt;
[[Datei:bulb.png|20px]]Für den Internet Explorer ist zu beachten, dass der geschützte Modus für alle Zonen gleich eingestellt sein muss, damit eine Verbindung möglich ist. (im Internet Explorer: &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Internetoptionen&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Sicherheit&#039;&#039;&amp;quot; öffnen, und bei allen 4 Zonen &amp;quot;geschützter&amp;quot; Bereich gleich einstellen; ansonsten kommen beim Verbindungsaufbau Fehler- und Warndialoge). Siehe außerdem die [https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver#required-configuration erforderliche Konfiguration] zur Verwendung des InternetExplorerDrivers.&lt;br /&gt;
&lt;br /&gt;
[[Datei:bulb.png|20px]]Das Plugin verwendet für einige Funktionen JavaScript. Stellen Sie daher sicher, dass die Ausführung von JavaScript im verwendeten Browser erlaubt ist, insbesondere wenn Sie den GUI-Browser oder den Recorder verwenden wollen. Das Ausführen von Tests ist auch ohne JavaScript möglich, solange keine Aktionen verwendet werden, welche JavaScript benötigen oder explizit ausführen.&amp;lt;br&amp;gt;Sollten Sie einen Fehler der Art &amp;quot;&amp;lt;code&amp;gt;org.openqa.selenium.JavascriptException: Error executing JavaScript&amp;lt;/code&amp;gt;&amp;quot; bekommen, stellen Sie sicher, dass die Ausführung von JavaScript im verwendeten Browser erlaubt ist und Browser- und zugehörige WebDriver-Version kompatibel sind.&lt;br /&gt;
&lt;br /&gt;
= Headless Browser =&lt;br /&gt;
Mit &amp;quot;&#039;&#039;Headless&#039;&#039;&amp;quot; bezeichnet man eine Anwendung, welche ohne Bedienoberfläche abläuft. Einige der Browser unterstützen einen &amp;quot;headless&amp;quot; Modus,  bei dem kein Browserfenster angezeigt wird. Der Browser operiert dabei in einem &amp;quot;unsichtbaren Fenster&amp;quot; führt aber alle Operationen aus, und liefert auch die selbe Elementhierarchie.&lt;br /&gt;
Bei einigen Browsern sind allerdings die Screenshot (Bild vom Fenster bzw. von Elementen) eingeschränkt bzw. gar nicht verfügbar.&amp;lt;br&amp;gt;Den &amp;quot;headless&amp;quot; Modus können Sie beim Verbindungsaufbau in den &amp;quot;&#039;&#039;Advanced Settings&#039;&#039;&amp;quot; angeben.&lt;br /&gt;
&lt;br /&gt;
= HTML Unit Browser =&lt;br /&gt;
Bei diesem &amp;quot;&#039;&#039;Pseudobrowser&#039;&#039;&amp;quot; handelt es sich um eine weitere &amp;quot;&#039;&#039;headless&#039;&#039;&amp;quot; Variante, welche ganz ohne Renderengine operiert, und lediglich die Elementhierarchie sowie Javascript unterstützt. Sein Verhalten kann stark von dem &amp;quot;echter&amp;quot; Browser abweichen.&lt;br /&gt;
&lt;br /&gt;
Diesen Browsertyp können Sie verwenden, wenn ihr Test das Verhalten des Webservices (also der Servierseite) betrifft, und nicht das Verhalten der Anwendung im Browser (End-User-Experience) im Fokus hat. Zum Beispiel kann der &amp;quot;HTML Unit Browser&amp;quot; zum Generieren von Last oder gleichzeitigen Aktionen gegenüber dem Server dienen.&lt;br /&gt;
Da sich dieser Browser im Verhalten z.T. stark von dem echter Browser unterscheidet sollte er nur (wenn überhaupt) in besonderen Fällen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
= Schneller Einstieg =&lt;br /&gt;
== Browser öffnen / verbinden ==&lt;br /&gt;
* Starten Sie expecco&lt;br /&gt;
* Klicken Sie auf &amp;quot;&#039;&#039;Neue Testsuite&#039;&#039;&amp;quot;&lt;br /&gt;
* Klicken Sie auf das GUI-Browser Symbol ([[Datei:GUIBrowser.png|24px]])&lt;br /&gt;
* Es erscheint der GUI-Browser in einem neuen Reiter&lt;br /&gt;
* Klicken Sie auf &amp;quot;&#039;&#039;Verbinden&#039;&#039;&amp;quot; und wählen Sie &amp;quot;&#039;&#039;Webtest (Selenium WebDriver)&#039;&#039;&amp;quot; aus. Dann erscheint der [[#Verbindungseditor | Verbindungsdialog]] (Details siehe unten)&lt;br /&gt;
* Im Verbindungsdialog geben Sie die zu testende Webseite ein (z.B. &amp;quot;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://www.myHost.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;quot;) und wählen den Browsertyp (z.B. &amp;quot;&amp;lt;code&amp;gt;chrome&amp;lt;/code&amp;gt;&amp;quot; oder &amp;quot;&amp;lt;code&amp;gt;firefox&amp;lt;/code&amp;gt;&amp;quot;) aus&lt;br /&gt;
* Klicken Sie auf &amp;quot;&#039;&#039;Verbinden&#039;&#039;&amp;quot;&lt;br /&gt;
* Ein Browser wird nun automatisch gestartet, und die Seite angezeigt.&lt;br /&gt;
* Sobald die Verbindung steht, wird im GUIBrowser die Seitenstruktur als Baum angezeigt, und im rechten Diagramm-Fenster erscheint ein passender Verbindungsbaustein. Dieser wird nicht automatisch aufgezeichnet, da man diesen normalerweise nicht in jeder aufgezeichneten Sequenz haben will (mehr dazu unten).&lt;br /&gt;
&lt;br /&gt;
== Recording aufnehmen ==&lt;br /&gt;
* Klicken Sie auf das Recording Symbol im GUI-Browser.&lt;br /&gt;
[[Datei:Recording_Start.png | 200px]]&lt;br /&gt;
* Ein Recorderfenster erscheint (eine Beschreibung der Bedienelemente finden Sie unten)&lt;br /&gt;
* Sie zeichnen nun direkt im Rekorder auf.&amp;lt;br&amp;gt;&lt;br /&gt;
* Klicks werden je nach Einstellung als Klick, Mausbewegung, Drag&amp;amp;Drop etc. aufgezeichnet.&amp;lt;br&amp;gt;Während der Aufzeichnung können Sie zwischen diesen Werkzeugen wechseln:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Datei:Recorder_Werkzeuge.png | 300px]]&lt;br /&gt;
* die aufgezeichneten Aktionen werden im Tab &amp;quot;&#039;&#039;Aufgezeichnete Sequenz&#039;&#039;&amp;quot; dargestellt. Sie können dort noch bearbeitet werden.&lt;br /&gt;
* Zum Beenden der Aufzeichnung klicken Sie entweder auf den &amp;quot;&#039;&#039;Stop Recording&#039;&#039;&amp;quot; Knopf im GUI Browser, oder schließen das Rekorderzenster. Es ist auch möglich, das Aufzeichnen temporär zu Pausieren, indem sie im Rekorder auf den &amp;quot;&#039;&#039;Aufnahme&#039;&#039;&amp;quot;-Knopf oben links drücken.&lt;br /&gt;
* Nach dem Aufzeichnen können sie die Sequenz un ihre Testsuite als Testfall oder Teilsequenz übernehmen.&lt;br /&gt;
&lt;br /&gt;
== Aufgezeichnete Aktion wiedergeben ==&lt;br /&gt;
&lt;br /&gt;
* Im Reiter &amp;quot;&#039;&#039;Aufgezeichnete Sequenz&#039;&#039;&amp;quot; kann die aktuelle Aufzeichnung sofort wiedergegeben werden (&amp;quot;&#039;&#039;Play&#039;&#039;&amp;quot;-Knopf drücken)&amp;lt;br&amp;gt;Beachten Sie, daß ihre Webseite üblicherweise im gleichen Zustand sein sollte - gegebenenfalls sollten Sie also den &amp;quot;&#039;&#039;Back&#039;&#039;&amp;quot;-Knopf oder eine andere Navigation anwenden, um dies sicher zu stellen.&lt;br /&gt;
* Die Sequenz kann bearbeitet werden. Dazu können entweder weitere Aktionen aufgenommen werden, oder zusätzliche Aktionen entweder via Drag&amp;amp;Drop oder über das Kontextmenü (bzw. &amp;lt;kbd&amp;gt;&amp;lt;CTRL-N&amp;lt;/kbd&amp;gt;) angelegt werden. Häufig werden zusätzliche Delay- oder Verifikations-Bausteine benötigt, die sie hiermit an geeigneter Stelle einfügen können.&lt;br /&gt;
&lt;br /&gt;
=Verbindungsaufbau=&lt;br /&gt;
==&amp;lt;span id=&amp;quot;Verbindungsdialog&amp;quot;&amp;gt;Verbindungseditor==&lt;br /&gt;
Mit dem Verbindungseditor werden Verbindungen definiert, geändert und aufgebaut. Sie erreichen ihn, indem Sie den GUI-Browser öffnen und dort auf &amp;quot;&#039;&#039;Verbinden&#039;&#039;&amp;quot; klicken und dann &amp;quot;&#039;&#039;Selenium Testing (WebDriver)&#039;&#039;&amp;quot; auswählen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:SeleniumWebDriverConnectDialog.png]]&lt;br /&gt;
&lt;br /&gt;
#&#039;&#039;Einstellungen aus Anhang laden&#039;&#039;: Öffnet einen Anhang im expecco Projekt mit Verbindungseinstellunge. Diese Einstellungen werden in den Editor übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&#039;&#039;Einstellungen aus Datei&#039;&#039;: Öffnet eine gespeicherte Einstellungsdatei (*.csf). Diese Einstellungen werden in den Editor übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&#039;&#039;Einstellungen in Anhang speichern&#039;&#039;: Hier können Sie die eingetragenen Einstellungen als Anhang im expecco-Projekt anlegen.&lt;br /&gt;
#&#039;&#039;Einstellungen in JSON-Anhang speichern&#039;&#039;: Hier können Sie die eingetragenen Einstellungen im JSON-Format als Anhang im expecco-Projekt anlegen.&lt;br /&gt;
#&#039;&#039;Einstellungen in Datei speichern&#039;&#039;: Hier können Sie die eingetragenen Einstellungen in eine Datei (*.csf) speichern.&lt;br /&gt;
#&#039;&#039;Versionsinfo&#039;&#039;: Zeigt ein Fenster mit den verwendeten Versionen des Selenium-Servers, des ausgewählten Browser und dessen Driver an.&lt;br /&gt;
#&#039;&#039;Online-Dokumentation&#039;&#039;: Öffnet diese Online-Dokumentation.&lt;br /&gt;
#&#039;&#039;Verbindungsname&#039;&#039;: Tragen Sie hier den Namen ein, unter dem die Verbindung im GUI-Browser angezeigt werden soll. (Optional)&lt;br /&gt;
#&#039;&#039;Browsertyp&#039;&#039;: Wählen Sie hier aus, welchen Browser Sie verwenden möchten. Stellen Sie sicher, dass dieser installiert ist und die Version des verwendeten Drivers zur Browserversion passt.&lt;br /&gt;
#&#039;&#039;URL&#039;&#039;: Tragen Sie hier die URL ein, die zu Beginn aufgerufen werden soll. Sie können das Feld auch frei lassen, dann wird ein leeres Browser-Fenster geöffnet. Um eine lokale Datei zu öffnen, verwenden Sie das Schema &amp;quot;&amp;lt;code&amp;gt;file://&amp;lt;/code&amp;gt;&amp;quot;, z.B. &amp;quot;&amp;lt;code&amp;gt;file:///C:/Users/admin/Desktop/index.html&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
#&#039;&#039;Erweiterte Ansicht&#039;&#039;: Wechselt zur Ansicht für die Eingabe von [[#Erweiterte Einstellungen|erweiterten Einstellungen]].&lt;br /&gt;
#&#039;&#039;Informationen zum gewählten Browser&#039;&#039;: Hier wird der ausgewählte Browsertyp kurz vorgestellt.&lt;br /&gt;
#&#039;&#039;Informationen zu den Einstellungen&#039;&#039;: Hier wird angezeigt, welche Selenium-, Browser- und Driver-Version mit den aktuellen Einstellungen verwendet wird. Falls Sie [[#Erweiterte Einstellungen|erweiterten Einstellungen]] gesetzt haben, werden diese hier ebenfalls aufgelistet.&lt;br /&gt;
&lt;br /&gt;
===Warnung &amp;amp;uuml;ber m&amp;amp;ouml;gliche Inkompatibilit&amp;amp;auml;t ===&lt;br /&gt;
Manche Browser benötigen einen versionsspezifischen Webdriver, da die verwendeten Kommunikationsprotokolle unterschiedlich sein können. &lt;br /&gt;
&lt;br /&gt;
Da regelmässig neue Browserversionen erscheinen, und damit einhergehend auch neue Versionen des zug. Webdrivers benötigt werden, kann. es sein, dass die mit expecco mitgelieferten Webdriver nicht mehr zur aktuellen Browserversion passen. Dies trat in der Vergangenheit insbes. beim Chromebrowser mehrfach auf.&lt;br /&gt;
 &lt;br /&gt;
Um auf eventuelle Probleme hinzuweisen hält expecco intern eine Liste von Paaren der von exept bereits getesteten Browser- zu Webdriverversion. Falls ihr Browser aktueller ist, und nicht in der Liste enthalten ist, erscheint eine Warnung im Infobereich.&lt;br /&gt;
&lt;br /&gt;
Diese erscheint nur zu Ihrer Information - in den meisten Fällen funktioniert die Interaktion mit dem Browser auch dann. Allerdings ist es in jedem Fall sinnvoll, den Driver zu aktualisieren, um solche Probleme auszuschliessen.&lt;br /&gt;
Wenn die Kombination ohne Probleme läuft, ist es möglich, die aktuelle Kombination in die Liste einzutragen (drücken Sie dazu auf &amp;quot;Diese Kombination ist in Ordnung&amp;quot;). Dann erschient der Warndialog nicht mehr.&lt;br /&gt;
&lt;br /&gt;
===Erweiterte Einstellungen===&lt;br /&gt;
Neben dem zu verwendenden Browser und der Start-URL kann man noch weitere Einstellungen für eine Verbindung vornehmen. Wechseln Sie dazu im Verbindungsmenü die Ansicht über den entsprechenden Menü-Eintrag. Je nachdem, welchen Browsertypen Sie ausgewählt haben, bekommen Sie andere Eingabefelder.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Remote Server&#039;&#039;: Falls der Browser auf einem entfernten Rechner gestartet werden soll, starten Sie dort einen Selenium-Server und geben Sie dessen Adresse in diesem Feld an. Natürlich können Sie auch eine lokale Adresse angeben, wenn nicht automatisch ein Selenium-Server gestartet werden soll. Lesen Sie hierzu auch den nächsten Abschnitt [[#Remote-Verbindungen|Remote-Verbindungen]].&lt;br /&gt;
*&#039;&#039;Binary&#039;&#039;: Geben Sie den Pfad zum Binary des ausgewählten Browsers an, wenn dieser nicht automatisch von Selenium gefunden wird oder Sie eine weitere Version installiert haben.&lt;br /&gt;
*&#039;&#039;Driver&#039;&#039;: Zu jedem Browser wird ein spezieller Driver zur Automatisierung benötigt. Für neue Versionen des Browsers braucht man häufig auch eine neue Version des entsprechenden Drivers. Wenn Sie nicht den von expecco installierten Driver verwenden wollen, geben Sie hier einen entsprechenden Pfad an.&lt;br /&gt;
*&#039;&#039;Firefox Profile&#039;&#039;: Für Firefox gibt es zusätzlich die Möglichkeit, ein Profil bzw. Template anzugeben, das spezifische Einstellungen enthält. Wenn keines angegeben wird, wird für jede Verbindung ein neues, leeres Profil angelegt.&lt;br /&gt;
*&#039;&#039;Capabilities&#039;&#039;: Für Selenium-Verbindungen sind einige Capabilities definiert, mit denen sich Verbindungs-Eigenschaften oder auch das Browserverhalten festlegen lassen. &lt;br /&gt;
Solche Capabilities können Sie sie in diesem Feld angeben. Schreiben Sie dazu &#039;&#039;&amp;lt;capability name&amp;gt;: &amp;lt;value&amp;gt;&#039;&#039; oder &#039;&#039;&amp;lt;capability name&amp;gt; = &amp;lt;value&amp;gt;&#039;&#039;; jeweils ein Eintrag pro Zeile. Außerdem können Sie hier auch Eigenschaften für den Firefox-Browser setzen. Die Eingabe hierfür erfolgt wie für die Capabilities, nur dass sie dem Namen der Eigenschaft ein &#039;&#039;$&#039;&#039; voranstellen müssen.&lt;br /&gt;
&lt;br /&gt;
:Angegebene Capabilities werden durch die Methode &#039;&#039;setCapability()&#039;&#039; gesetzt. Insbesondere bei der Verwendung von Chrome gibt es einige Einstellungsoptionen, die sich nicht mit dieser Methode setzen lassen, sondern beispielsweise über &#039;&#039;setExperimentalOption()&#039;&#039; angegeben werden müssen. Zu diesem Zweck haben Sie außerdem die Möglichkeit, in diesem Feld einen Methodenaufruf mit Werten anzugeben. Diese Methode wird dann auf das entsprechende Options- bzw. Capabilities-Objekt angewandt. Um die Struktur der Eingabe von normalen Capabilities beizubehalten, müssen Sie am Ende noch &#039;&#039;:&#039;&#039; oder &#039;&#039;=&#039;&#039; setzen, aber keinen Wert danach. Beispiel: &#039;&#039;setExperimentalOption(“useAutomationExtension”, false)=&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Lokale-Verbindungen==&lt;br /&gt;
Um einen Browser auf ihrer lokalen Maschine zu starten, werden lediglich die Felder &amp;quot;&#039;&#039;URL&#039;&#039;&amp;quot; sowie &amp;quot;&#039;&#039;Browsertyp&#039;&#039;&amp;quot; benötigt. Als Voreinstellung für den Browser wird &amp;quot;&amp;lt;code&amp;gt;chrome&amp;lt;/code&amp;gt;&amp;quot; erscheinen.&lt;br /&gt;
&lt;br /&gt;
==Remote-Verbindungen==&lt;br /&gt;
Um einen Browser auf einem entfernten Rechner zu starten, müssen Sie zunächst den Selenium-Server und die benötigten Driver auf diesen Rechner kopieren. Auf dem Zielrechner muss Java installiert sein. Sie finden die Dateien in Ihrer expecco-Installation unter &amp;quot;&amp;lt;code&amp;gt;packages/exept/expecco/plugin/seleniumWebDriver/lib&amp;lt;/code&amp;gt;&amp;quot;. Sie können sich auch von [https://www.selenium.dev/downloads/ Selenium] eine aktuelle Version herunterladen.&lt;br /&gt;
&amp;lt;br&amp;gt;Starten Sie dann den Selenium-Sever (auf dem entfernten Rechner) mit:&lt;br /&gt;
 java -jar selenium-server-standalone-3.141.59.jar&lt;br /&gt;
(die Versionsnummer wird in Ihren Fall eine andere sein)&lt;br /&gt;
&lt;br /&gt;
Standardmäßig wird der Server dann auf dem Port 4444 Verbindungen annehmen. Um einen anderen Port zu verwenden, &lt;br /&gt;
geben Sie diesen auf der Kommandozeile mit &amp;quot;&amp;lt;code&amp;gt;-port &amp;amp;lt;nr&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;quot; an. &lt;br /&gt;
&amp;lt;br&amp;gt;Um von expecco eine Verbindung über diesen Server herzustellen, geben Sie beim Verbindungsaufbau als Remote-Server &lt;br /&gt;
 &amp;lt;Server-Adresse&amp;gt;:4444/wd/hub&lt;br /&gt;
an.&lt;br /&gt;
&lt;br /&gt;
Das Starten des Selenium-Servers bzw. die Verbindung muss eventuell von der Firewall zugelassen werden.&lt;br /&gt;
&lt;br /&gt;
Falls der Server beim Verbinden die jeweiligen Driver nicht finden, legen Sie diese ins selbe Verzeichnis, in dem Sie den Server starten, oder fügen Sie das Verzeichnis in dem der Driver liegt zum Pfad hinzu. Beachten Sie dabei, dass expecco verschiedene Versionen eines Driver-Typs mitliefert und diese durch einen Namenszusatz unterscheidet. Aufgrund dieser Zusätze erkennt der Server die Dateien aber häufig nicht.&lt;br /&gt;
&lt;br /&gt;
Für neue Versionen von &#039;&#039;&#039;Microsoft Edge&#039;&#039;&#039;, die Chromium basieren, starten Sie anstatt eines Selenium-Servers direkt den MSEdgeDriver (&amp;quot;msedgedriver.exe&amp;quot;) in der Version, die zur Edge-Version auf diesem Rechner passt.&lt;br /&gt;
  msedgedriver.exe [--port=9515]&lt;br /&gt;
Wenn Sie keine Portnummer angeben, wird der Service auf dem Port 9515 gestartet. Geben Sie dann beim Verbindungsaufbau in expecco als Remote-Server die Adresse&lt;br /&gt;
 &amp;lt;Server-Adresse&amp;gt;:9515&lt;br /&gt;
an. Die Erweiterung &amp;quot;/wd/hub&amp;quot; ist hier nicht erforderlich.&lt;br /&gt;
&lt;br /&gt;
==Verbindungsbausteine==&lt;br /&gt;
Der Verbindungsaufbau, welcher im GUI Browser interaktiv erfolgt, muss natürlich bei einem automatisierten Ablauf über einen Aktionsbaustein erfolgen.&lt;br /&gt;
Dazu gibt es in der SeleniumWebDriverLibrary im Ordner &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; verschiedene Bausteine, welche die Verbindungsparameter von verschiedenen Quellen erhalten:&lt;br /&gt;
* Connect&amp;lt;br&amp;gt;Dieser Baustein erhält die Verbindungsparameter über Eingangspins&lt;br /&gt;
* Connect from File&amp;lt;br&amp;gt;Hier werden die Einstellungen aus einer Datei (Anhang) gelesen (typischerweise im JSON Format)&lt;br /&gt;
* Connect from Spec&amp;lt;br&amp;gt;Die Verbindungsparameter werden in einem Dictionaryobjekt geliefert&lt;br /&gt;
* Reuse or Start Connection&amp;lt;br&amp;gt;Im Gegensatz zu obigen Bausteinen, welche immer eine neue Browserverbindung aufbauen (i.e. ein neues Browserfenster öffnen), wird dieser Baustein zunächst prüfen, ob bereits eine Verbindung besteht, und diese gegebenenfalls wiederverwenden. Dieser Baustein kann daher mehrfach (i.e. zu Beginn von Teilsequenzen) platziert werden, und damit die Teilsequenzen sowohl innerhalb eines komplexeren Gesamttests als auch &amp;quot;stand-alone&amp;quot;, d.h. einzeln ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Alle &amp;quot;Connect&amp;quot; Bausteine benötigen die Angabe eines &amp;quot;&#039;&#039;Verbindungsnamens&#039;&#039;&amp;quot;.&lt;br /&gt;
Dieser hat die Aufgabe, die Verbindung im weiteren Testverlauf zu identifizieren, wenn zwischen mehreren Verbindungen gewechselt wird, und zum Abbauen der Verbindung. &lt;br /&gt;
&lt;br /&gt;
Wenn Sie im GUI Browser im Elementbaum auf eine Verbindung klicken, erscheint in der rechten &amp;quot;Test&amp;quot; Kachel ein Connect Baustein mit entsprechend vorgelegten Parametern. Diesen können Sie bei Bedarf gleich in die Rekordersequenz übertragen, oder (besser) als separate Aktion speichern (es ist sinnvoll, den Verbindungsaufbau von den aufgezeichneten Teilsequenzen zu trennen; damit haben Sie es später leichter, andere Browser zu verwenden, die Parameter der Verbindung zu ändern und auch neue Teilsequenzen aufzuzeichnen oder zu modifizieren.&lt;br /&gt;
&lt;br /&gt;
Verbindungen mit komplexen Einstellungen werden typischerweise im Verbindungsdialog angelegt, und die Einstellungen von dort über die Menüfunktion &amp;quot;&#039;&#039;Sichern in Anhang/Datei&#039;&#039;&amp;quot; in einer Datei gesichert. So können Sie verschiedene Konfigurationen in einzelnen Dateianhängen in ihrer Testsuite oder auch außerhalb aufbewahren. Zum Verbinden verwenden Sie dann den Aktionsbaustein &amp;quot;[&#039;&#039;Connect From File&#039;&#039;]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=Plugin-Einstellungen=&lt;br /&gt;
Wenn Sie eine bestimmte Browser-Installationen oder Driver standardmäßig als Voreinstellung verwenden möchten, können Sie diese in den Einstellungen des Plugins eintragen. Sie finden sie über das Menü unter dem Punkt &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; und dort unter &amp;quot;&#039;&#039;Erweiterungen&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Webtest (Selenium WebDriver)&#039;&#039;&amp;quot;. Einstellungen für spezifische Browser finden Sie unter den Unterpunkten &amp;quot;&#039;&#039;Beliebteste Browser&#039;&#039;&amp;quot; bzw. &amp;quot;&#039;&#039;Andere Browser&#039;&#039;&amp;quot;.&lt;br /&gt;
Die dortigen Einstellungen gelten als Voreinstellung für jede Verbindung, es sei denn in einer konkreten Verbindungseinstellungen ist etwas anderes angegeben.&lt;br /&gt;
&lt;br /&gt;
===Ausführungsverzögerung für Chrome===&lt;br /&gt;
In manchen Fällen kann es bei Verwendung des Chrome-Browsers vorkommen, dass Bausteine mit Element-Aktionen, beispielsweise ein Klick, im Test erfolgreich durchlaufen, die eigentliche Aktion aber gar nicht ausgeführt wurde. Dies ist ein bekannter Fehler [https://github.com/MPDL/imeji-gui-testing/issues/37], [https://github.com/SeleniumHQ/selenium/issues/4075], der von Selenium bzw. chromedriver behoben werden muss.&lt;br /&gt;
&lt;br /&gt;
Der Fehler lässt sich verhindern, indem entweder der Klick über JavaScript aufgerufen wird&amp;amp;nbsp;(setzen Sie dazu im Klick-Baustein &#039;&#039;invokeDirectly&#039;&#039; auf &#039;&#039;true&#039;&#039;&amp;amp;nbsp;) oder vor der Aktion kurz gewartet wird. Die Ausführung über JavaScript hat den Nachteil, dass sie weniger nah am Klick eines echten Benutzers ist; beispielsweise funktionieren Klicks auf Elemente auch dann, wenn sie von anderen Elementen verdeckt werden (was bei einem &amp;quot;normalen&amp;quot;Klick nicht geht). &lt;br /&gt;
&lt;br /&gt;
Generell warten die Bausteine mit Element-Aktionen automatisch, bis das entsprechende Element verfügbar ist (existiert). In den hier beschriebenen Fällen reicht das aber nicht aus. Deshalb finden Sie in den Plugin-Einstellungen für Chrome die Einstellung &amp;quot;&#039;&#039;Ausführungsverzögerung&#039;&#039;&amp;quot;. Bei der Ausführung wird dann zwischen den Aktionen entsprechend lange gewartet. Falls bei Ihnen der beschriebene Fehler eintritt, können Sie diesen Wert erhöhen. Ein größerer Wert hat natürlich Auswirkung auf die Gesamtlaufzeit.&lt;br /&gt;
&lt;br /&gt;
=Recorder=&lt;br /&gt;
&lt;br /&gt;
Die folgende Beschreibung des Recorders gilt prinzipiell für alle von expecco unterstützten GUI Technologien. Verhalten und Bedienung sind bis auf kleine technologiebedingte Unterschiede für alle gleich.&lt;br /&gt;
&lt;br /&gt;
Besteht im GUI-Browser eine Verbindung mit einem Browserfenster, kann der integrierte Recorder verwendet werden, um einen Testabschnitt aufzunehmen. Sie starten den Recorder, indem Sie im GUI-Browser die entsprechende Verbindung auswählen und dann auf den Aufnahme-Knopf klicken. Für den Recorder öffnet sich ein neues Fenster. Für jeden Klick im Fenster wird eine Aktion aufgezeichnet. Weitere Aktionen stehen über das Menü zur Verfügung. Die aufgezeichneten Aktionen werden im Arbeitsbereich des GUI-Browsers angelegt. Daher ist es möglich, das Aufgenommene parallel zu editieren.&lt;br /&gt;
&lt;br /&gt;
Allgemeine Aktionen finden Sie entweder direkt in der Menüleiste oder dort im Browser-Werkzeuge-Menü (s.u.). Um Aktionen auf Elemente aufzuzeichen, ändern Sie entweder die Auswahl des Element-Werkzeugs in der Menüleiste (s.u.) und klicken dann auf das Element oder wählen Sie die entsprechende Aktion aus dem Kontextmenü durch einen Rechtsklick auf das entsprechende Element aus. Für Texteingabe ist es zudem möglich, den Cursor über dem Element zu platzieren und den Text einzugeben. Dabei öffnet sich der Eingabedialog für diese Aktion. Auf diese Weise ist es ebenfalls möglich, die Eingaben &#039;&#039;Backspace&#039;&#039;, &#039;&#039;Return&#039;&#039; und &#039;&#039;Tab&#039;&#039; aufzuzeichnen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:SeleniumWebDriverRecorder.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Komponenten des Recorderfensters&#039;&#039;&#039;&lt;br /&gt;
#&#039;&#039;&#039;Aufnahme Pausieren&#039;&#039;&#039;: Wenn die Kontrollleuchte rot ist, nimmt der Recorder auf. Durch Klicken können Sie die Aufnahme anhalten. Die Kontrolleuchte leuchtet dann grau. In diesem Zustand können Sie weiter Aktionen über das Recorder-Fenster ausführen, sie werden aber nicht aufgezeichnet. Klicken Sie erneut, um die Aufnahme weiterzuführen.&lt;br /&gt;
#&#039;&#039;&#039;Aktualisieren&#039;&#039;&#039;: Holt das aktuelle Bild und den aktuellen Elementbaum vom Browser. Dies wird nötig, wenn die Anzeige des Recorders nicht mit dem tatsächlichen Browserinhalt übereinstimmt. &lt;br /&gt;
#&#039;&#039;&#039;Follow-Mouse&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird im GUI-Browser ausgewählt.&lt;br /&gt;
#&#039;&#039;&#039;Element-Highlighting&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird rot umrandet.&lt;br /&gt;
#&#039;&#039;&#039;Element-Werkzeuge&#039;&#039;&#039;: Auswahl, mit welchem Werkzeug aufgenommen werden soll. Es stehen alle Aktionen zur Verfügung, die auf ein bestimmtes Element ausgeführt werden. Die gewählte Aktion wird bei einem Klick auf die Anzeige ausgelöst und das Element aus der Position bestimmt. Die nicht ausgewählten Aktionen sind jederzeit über einen Rechtsklick erreichbar. &lt;br /&gt;
#&#039;&#039;&#039;Browser-Werkzeuge&#039;&#039;&#039;: Aktionen die sich nicht auf bestimmte Elemente beziehen, wie Scrollen oder Aktionen auf die aktuelle URL oder den Titel, können hier ausgelöst werden.&lt;br /&gt;
#&#039;&#039;&#039;Seitennavigation&#039;&#039;&#039;: Aktionen zur Seitennavigation: &#039;&#039;eine Seite zurück&#039;&#039;, &#039;&#039;eine Seite vor&#039;&#039; und &#039;&#039;aktuelle Seite neu laden&#039;&#039;&lt;br /&gt;
#&#039;&#039;&#039;Alert-Behandlung&#039;&#039;&#039;: Wenn der Browser einen Alert anzeigt, klicken Sie auf diesen Button, um die Aktionen zur Alert-Behandlung auswählen zu können.&lt;br /&gt;
#&#039;&#039;&#039;Online Dokumentation&#039;&#039;&#039;: Öffnet diese Online-Dokumentation.&lt;br /&gt;
#&#039;&#039;&#039;Anzeige&#039;&#039;&#039;: Zeigt einen Screenshot des Browsers. Aktionen werden mit der Maus je nach Werkzeug ausgelöst. Wenn eine neue Aktion eingegeben werden kann, hat das Fenster einen grünen Rahmen, sonst ist er rot. Scrollen wird den Browser weitergeleitet, aber nicht aufgenommen.&lt;br /&gt;
#&#039;&#039;&#039;Fenster an Bild anpassen&#039;&#039;&#039;: Ändert die Größe des Fensters so, dass der Screenshot vollständig angezeigt werden kann.&lt;br /&gt;
#&#039;&#039;&#039;Bild an Fenster anpassen&#039;&#039;&#039;: Skaliert den Screenshot auf eine Größe, mit der er die volle Größe des Fensters ausnutzt.&lt;br /&gt;
#&#039;&#039;&#039;Skalierung&#039;&#039;&#039;: Ändert die Skalierung des Screenshots. Diese kann auch über Scrollen in der Anzeige bei gedrückt gehaltener Strg-Taste angepasst werden.&lt;br /&gt;
#&#039;&#039;&#039;Meldungen&#039;&#039;&#039;: Hier werden Meldungen angezeigt, bspw. wenn eine Aktion nicht aufgenommen werden konnte. Die letzte Meldung wird solange angezeigt, bis sie über den Button rechts daneben geschlossen wird.&amp;lt;br&amp;gt;&#039;&#039;&#039;Fenster-Tabs&#039;&#039;&#039;: Ab expecco 23.1 werden oberhalb der Anzeige Tabs für jedes offene Fenster angezeigt, sobald eine Verbindung mehr als ein Browserfenster besitzt. Ob der Browser dieses als Tab oder in einem eigenen Fenster anzeigt, ist dabei egal. Über die Tabs im Recorder können Sie das aktuelle Fenster wechseln und diesen Wechsel auch aufzeichnen.&amp;lt;br&amp;gt;&#039;&#039;&#039;Frame-Kontext&#039;&#039;&#039;: Ab expecco 23.1 sehen Sie unterhalb der Anzeige, in welchem Frame-Kontext Sie sich gerade befinden (siehe dazu den Abschnitt [[#Eingebettete_Inhalte|Eingebettete Inhalte]]). Sie können auf die Einträge klicken, um in einen höheren Kontext zu wechseln und diesen Wechsel aufzuzeichnen. Falls Sie zusammengesetzte Pfade eingestellt haben, wird die Anzeige aktualisiert, wenn Sie ein eingebettetes Element ausgewählt haben.&lt;br /&gt;
&lt;br /&gt;
=Eingebettete Inhalte=&lt;br /&gt;
In HTML ist es möglich, auf einer Seite Inhalte einer anderen einzubinden. Das gängigste Elemente dafür ist ein Iframe (Inlineframe). Auf den Inhalt eines Iframes kann ebenfalls mit Selenium zugegriffen werden, allerdings muss dazu zuerst in diesen Kontext gewechselt werden. In der SeleniumWebDriverLibrary gibt es entsprechenden Bausteine, um in den Kontext eines Iframes zu wechseln, um in den Elternkontext zu wechseln und um zurück zum Standardinhalt, also dem obersten Kontext zu wechseln. Alle Element-Bausteine lösen die angelegten Pfade immer innerhalb des aktuellen Kontexts auf. Im GUI-Browser sehen Sie für eingebettete Inhalte ein zusätzliches Element, welches sie aufklappen können um dessen Elemente zu sehen.&lt;br /&gt;
&lt;br /&gt;
==Zusammengesetzte Pfade==&lt;br /&gt;
Seit expecco 23.1 gibt es die Möglichkeit, auch zusammengesetzte Pfade an den Bausteinen zu verwenden, um direkt vom Standardinhalt auf den Inhalt eines Iframes zugreifen zu können. Dazu werden einfach der Pfad zum Iframe und der Pfad innerhalb des Iframe-Inhalts zu einem zusammengesetzt. Wichtig ist hierbei, dass beim Übergang keine Elemente ausgelassen werden dürfen, d.h. der vordere Teil muss mit dem Iframe-Element enden und der hintere Teil mit &#039;&#039;/body&#039;&#039; beginnen. Dazwischen dürfen die Pfade gekürzt werden und es ist natürlich auch möglich auf diese Art beliebig tief geschachtelte Elemente zu erreichen. An den Bausteinen können beide Techniken nach belieben verwendet werden, wichtig ist nur, dass die Pfade immer in dem Kontext aufgelöst werden, in dem sich Selenium gerade befindet.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie die kombinierten Pfade aufzeichnen, bzw. im GUI-Browser verwenden wollen, setzen Sie im Menü &#039;&#039;GUI Browser&#039;&#039; unter &#039;&#039;Aufzeichnung&#039;&#039; den Haken bei &#039;&#039;Zusammengesetzte Pfade aufzeichnen&#039;&#039;. Damit wird für eingebettete Elemente ein zusammengesetzter Pfad relativ zum aktuellen Kontext erzeugt und angezeigt, anstatt wie bisher nur innerhalb seines eigenen Kontexts. Außerdem können Sie diese Elemente auch direkt im Recorder ansprechen oder über Follow-Mouse finden.&lt;br /&gt;
&lt;br /&gt;
=Shadow-Elemente=&lt;br /&gt;
Shadow-DOMs sind eine Möglichkeit, um Teile einer Seite vom übrigen Dokument abzukapseln. Dabei werden an ein Element versteckte Shadow-Elemente angehängt. Eine ausführlichere Erklärung finden Sie zum Beispiel hier: [https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_shadow_DOM Using shadow DOM - Web APIs | MDN].&lt;br /&gt;
&lt;br /&gt;
In der SeleniumWebDirverLibrary gibt es den Baustein &#039;&#039;[Web] Get Shadow DOM&#039;&#039;, der die obersten Elemente liefert, die dann wie andere WebElemente verwendet werden können.&lt;br /&gt;
&lt;br /&gt;
Da die Elemente versteckt sind, werden sie vom GUI-Browser nicht direkt angezeigt. Ab expecco 23.1 kann man allerdings im Kontextmenü der Elemente im GUI-Browser einen Haken setzen, dass Shadow-Elemente gesucht werden sollen. Beim Aktualisieren der Kinder eines Elements werden sie dann angezeigt, falls vorhanden, allerdings nicht, wenn der gesamte Baum aktualisiert wird. Wenn der Haken gesetzt ist, sind die Elemente auch im Recorder verfügbar.&lt;br /&gt;
&lt;br /&gt;
==Zusammengesetzte Pfade==&lt;br /&gt;
Ähnlich wie die Elemente innerhalb eines Frames kann auch auf die Shadow-Elemente direkt über zusammengesetzte Pfade zugegriffen werden. Diese Pfade können dann direkt an den Bausteinen verwendet werden, sodass der Baustein &#039;&#039;[Web] Get Shadow DOM&#039;&#039; nicht benötigt wird. Die Pfade haben die Form&lt;br /&gt;
 &amp;lt;host path&amp;gt;/shadowRoot/&amp;lt;shadow path&amp;gt;&lt;br /&gt;
wobei &#039;&#039;&amp;lt;host path&amp;gt;&#039;&#039; den Pfad zum Element angibt, an das der Shadow-DOM angehängt wurde, und &#039;&#039;&amp;lt;shadow path&amp;gt;&#039;&#039; der Pfad innerhalb des Shadow-DOMs zum gewünschten Element ist. &#039;/shadowRoot&#039; dient als Marker, dass an dieser Stelle der Wechsel in den Shadow-DOM erfolgt.&lt;br /&gt;
&lt;br /&gt;
=Authentifizierungs-Alerts=&lt;br /&gt;
Falls eine Webseite HTTP-Authentifizierung mit Basic Authentication verwendet, öffnet sich beim Laden der Seite ein Alert-Fenster zur Eingabe von Benutzernamen und Passwort. Dieses Fenster ist nicht direkt mit Selenium bedienbar. Im GUI-Browser wird es wie ein Alert angezeigt. Eine Ausnahme hierzu bildet Chrome, bei dem der Driver auf keine Anfrage antwortet solange der Dialog geöffnet ist. Das Plugin kann zu diesem Zeitpunkt insbesondere nicht feststellen, ob ein Authentifizierungs-Dialog geöffnet ist oder ob der Driver aus anderen Gründen nicht antwortet.&lt;br /&gt;
&lt;br /&gt;
Bei lokalen Verbindungen unter Windows kann eine Authentifizierung mittels Windows Access ausgeführt werden. Es gibt in der SeleniumWebDriverLibrary für einzelne Browsertypen spezifische Authentifizierungs-Bausteine sowie den Baustein &#039;&#039;Authenticate at Alert&#039;&#039;, der je nach Verbindung den entsprechenden Baustein ausführt. Für die verschiedenen Browser-Typen gibt es dabei unterschiedliche Einschränkungen:&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Chrome:&#039;&#039;&#039; Die Anmeldedaten werden an ein Chromefenster geschickt, daher funktioniert es nur, wenn nicht mehrere geöffnet sind. Der Einzelbaustein hat für diesen Fall die Option, den Titel des Fensters anzugeben.&lt;br /&gt;
:&#039;&#039;&#039;Edge&#039;&#039;&#039;: Mit Microsoft Edge wird eine Anmeldung nicht unterstützt.&lt;br /&gt;
:&#039;&#039;&#039;Firefox&#039;&#039;&#039;: Schickt die Anmeldedaten an ein Firefox-Dialogfenster und funktioniert daher nur, wenn es nicht mehrere gibt.&lt;br /&gt;
:&#039;&#039;&#039;Internet Explorer&#039;&#039;&#039;: Mit dem Internet Explorer wird eine Anmeldung nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
Als zusätzliche Option steht Ihnen auch eine Anmeldung über die URL zur Verfügung. Rufen Sie anstatt der Seite &amp;lt;nowiki&amp;gt;https://www.example.com&amp;lt;/nowiki&amp;gt; die URL &amp;lt;nowiki&amp;gt;https://user:password@www.example.com&amp;lt;/nowiki&amp;gt; auf. Wichtig ist hierbei, dass &#039;&#039;:&#039;&#039; und &#039;&#039;@&#039;&#039; nicht im Benutzernamen oder im Passwort auftauchen. Möglicherweise wird diese Methode nicht von jedem Browser unterstützt.&lt;br /&gt;
&lt;br /&gt;
Mithilfe des [[WindowsAutomation_Reference_2.0|WindowsAutomation2]]-Plugins ist es ebenfalls möglich, solch eine Anmeldung mit allen Browsertypen auszuführen.&lt;br /&gt;
&lt;br /&gt;
=Portierung alter Selenium-Tests=&lt;br /&gt;
Dieses Plugin ersetzt das bisherige [[Selenium_Web_Test_Plugin|Selenium Web Test Plugin]]. Dieses basierte auf [https://www.seleniumhq.org/projects/remote-control/ Selenium RC], welches in Zukunft von den Browsern nicht mehr unterstützt wird. Der Nachfolger von Selenium RC ist [https://www.seleniumhq.org/projects/webdriver/ Selenium WebDriver], auch &#039;&#039;Selenium 2&#039;&#039; genannt. Ebenso ist auch das Aufzeichnen von Tests mit [https://www.seleniumhq.org/projects/ide/ Selenim IDE] veraltet, da das Plugin von neueren Browsern nicht mehr unterstützt wird. Das Selenium WebDriver Plugin verwendet stattdessen einen eigenen [[#Recorder|Recorder]].&lt;br /&gt;
&lt;br /&gt;
Tests, die mit dem alten Selenium Web Test Plugin erstellt wurden und die alte SeleniumLibrary verwenden, können über Selenium WebDriver ausgeführt werden. Setzen Sie dazu in den Plugin-Einstellungen von &amp;quot;&#039;&#039;Webtest Legacy (Selenium)&#039;&#039;&amp;quot; den Haken bei &amp;quot;&#039;&#039;WebDriver für die Ausführung verwenden&#039;&#039;&amp;quot;. Für die wichtigsten Funktionen wurde Wrapper bzw. umsetzende Funktionen erstellt, um die Migration möglichst problemlos zu gestalten.&lt;br /&gt;
Testen Sie dann, ob die Tests wie bisher ablaufen. Für den überwiegenden Teil der Bausteine sollte es dabei keine Probleme geben. Einige wenige Aktionen werden in der WebDriver Version nicht mehr unterstützt oder verhalten sich unterschiedlich. Es ist auch nicht garantiert, daß die Emulation der alten Schnittstelle auf Dauer von Selenium unterstützt werden. Wenn möglich sollten Sie daher über kurz oder lang die Testfälle umschreiben.&lt;br /&gt;
&lt;br /&gt;
=FAQ=&lt;br /&gt;
*&#039;&#039;&#039;Scrollbalken lassen sich im Recorder nicht bedienen&#039;&#039;&#039;&lt;br /&gt;
:Der Scrollbalken des Browsers, der automatisch angezeigt wird, wenn eine Seite größer als das Browserfenster ist, ist kein bedienbares Webelement. Scrollen um einen bestimmten Betrag ist in einem Test selten sinnvoll, wenn die Größe des Browserfensters nicht festgelegt ist. Verwenden Sie stattdessen den Baustein &amp;lt;code&amp;gt;[Web] Scroll Element into View&amp;lt;/code&amp;gt;, um ein entsprechendes Element in den sichtbaren Bereich zu scrollen. Der Klick-Baustein, den der Recorder standardmäßig verwendet, führt diese Aktion bereits automatisch mit aus (&amp;lt;code&amp;gt;[WebElement] Click (Scroll Element into View)&amp;lt;/code&amp;gt;). Wenn Sie im Recorder-Fenster scrollen, wird dies automatisch auf den Browser übertragen, aber nicht aufgezeichnet. Falls Sie tatsächlich um einen bestimmten Betrag scrollen möchten, gibt es bei den Browser-Aktionen einen Eintrag dafür und weitere Bausteine in der SeleniumWebDriverLibrary.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Baustein schlägt fehl, wenn Element zu spät sichtbar wird&#039;&#039;&#039;&lt;br /&gt;
:Alle Bausteine, die einen Elementpfad verwenden, haben automatisch eingebaut, dass sie warten, bis ein entsprechendens Element auftaucht. Es gibt aber Fälle, in denen ein Element zwar bereits da, aber noch nicht sichtbar ist. Bei einem Klick auf das Element bekommen Sie dann einen Fehler. Mögliche Fehler in diesem Zusammenhang sind &amp;lt;code&amp;gt;org.openqa.selenium.ElementNotInteractableException: element not interactable&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;org.openqa.selenium.JavascriptException: javascript error: Cannot read property &#039;left&#039; of undefined&amp;lt;/code&amp;gt;. Verwenden Sie dann vor einer Interaktion mit dem Element den Baustein &amp;lt;code&amp;gt;[Web] Wait for Visibility of Element&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;[Web] Wait for Element to Be Clickable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Fehlermeldung: &amp;lt;code&amp;gt;Cannot read property &#039;left&#039; of undefined&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:Der Fehler &amp;lt;code&amp;gt;org.openqa.selenium.JavascriptException: javascript error: Cannot read property &#039;left&#039; of undefined&amp;lt;/code&amp;gt; kann mit dem Chrome-Browser auftreten. In diesem Fall ist das verwendete Element nicht sichtbar. Lesen Sie dazu den Punkt oben. Der Fehler ist auch im Zusammenhang mit Elementen in einer Dropdown-Liste bekannt, d.h. bei einem Klick oder dem Bewegen der Maus auf ein &amp;lt;nowiki&amp;gt;&amp;lt;option&amp;gt;&amp;lt;/nowiki&amp;gt;-Element innerhalb eines &amp;lt;nowiki&amp;gt;&amp;lt;select&amp;gt;&amp;lt;/nowiki&amp;gt;-Elements. Diese Elemente sind prinzipiell nicht klickbar. Verwenden Sie stattdessen einen passenden &amp;lt;code&amp;gt;[Web] Select&amp;lt;/code&amp;gt;-Baustein mit dem &amp;lt;nowiki&amp;gt;&amp;lt;select&amp;gt;&amp;lt;/nowiki&amp;gt;-Element.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Fehlermeldung: &amp;lt;code&amp;gt;Stale Element Reference Exception&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:Der Fehler &amp;lt;code&amp;gt;org.openqa.selenium.StaleElementReferenceException&amp;lt;/code&amp;gt; tritt immer dann auf, wenn ein WebElement verwendet wird, das nicht mehr da ist. Wenn das in Ihrem Test passiert und das Element eigentlich da sein sollte, verwenden Sie an der Stelle stattdessen den Locator, um das Element neu zu holen. Eventuell liegt es auch daran, dass sich der Test momentan in einem anderen Frame-Kontext befindet als das Element. Wenn Sie [[#Zusammengesetzte_Pfade|zusammengesetzte Pfade]] verwenden, sollte das Element selbst in den richtigen Kontext wechseln, bevor Aktionen darauf ausgeführt werden.&lt;br /&gt;
:In seltenen Fällen kann der Fehler auch in expecco selbst auftreten, wenn an irgendeiner Stelle im GUI-Browser oder Recorder ein entsprechendes WebElement verwendet wird. Sie sollten dann abbrechen können und es nochmal versuchen. Sollte der Fehler bestehen bleiben, wechseln Sie in den Default Content und laden Sie den Baum im GUI-Browser neu.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Baustein läuft erfolgreich, aber ohne Auswirkungen&#039;&#039;&#039;&lt;br /&gt;
:Dieser Fall kann mit Chrome auftreten. Das Element ist verfügbar, die Aktion wirft keinen Fehler, aber es wird nichts ausgeführt. In der Regel hilft es, vor der Ausführung kurz zu warten, siehe [[#Ausf.C3.BChrungsverz.C3.B6gerung_f.C3.BCr_Chrome | Ausführungsverzögerung für Chrome]].&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Ausführungen mit Chrome sind langsamer&#039;&#039;&#039;&lt;br /&gt;
:Um ein Problem bei der Ausführung mit Chrome zu beheben, ist in den Plugin-Einstellungen für Chrome eine Verzögerung definiert. Überprüfen Sie, ob dieser Wert eventuell zu hoch eingestellt ist; siehe [[#Ausf.C3.BChrungsverz.C3.B6gerung_f.C3.BCr_Chrome | Ausführungsverzögerung für Chrome]].&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Fehlermeldungen wie: &amp;quot;org.openqa.selenium.InvalidArgumentException: Expected &amp;quot;handle&amp;quot; to be a string...&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
:Dies passiert wenn der Driver nicht (mehr) zum Browser passt. Lesen Sie dazu obiges Kapitel &amp;quot;[[#WebDriver aktualisieren|WebDriver aktualisieren]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Key Chords mit Shortcuts funktionieren nicht&#039;&#039;&#039;&lt;br /&gt;
:Das Drücken mehrerer Tasten gleichzeitig lässt sich als Key Chord simulieren. Dadurch können auch Shortcuts eingegeben werden. Allerdings funktionieren hier nicht alle Eingaben, da diese nur an den Seiteninhalt und nicht an den Browser selbst gehen. Kombinationen wie &#039;&#039;Strg + t&#039;&#039; um einen neuen Browsertab zu öffnen, funktionieren daher vermutlich nicht, &#039;&#039;Strg + a&#039;&#039; oder &#039;&#039;Strg + c&#039;&#039; sollten hingegen möglich sein.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Zusätzliche Window Handles mit Opera&#039;&#039;&#039;&lt;br /&gt;
:Der Opera-Browser liefert mehr Window Handles als Tabs bzw. Fenster geöffnet sind. Diese kommen von Opera-internen Funktionen wie dem Schnellstart (&#039;&#039;Speed Dial&#039;&#039;) oder der &#039;&#039;Better Address Bar Experience&#039;&#039; (BABE), die zwar im Browserfenster eingebunden, aber nicht als Tab angezeigt werden. Zu diesen Tabs kann zwar mit den entsprechenden Bausteinen gewechselt werden, es sind dann aber nicht alle Aktionen möglich, die für die normalen Tabs zur Verfügung stehen. Sie können zum Beispiel nicht geschlossen werden und man bekommt von ihnen kein Bild. Am besten wechselt man daher gar nicht erst in diese Kontexte. Seien Sie also vorsichtig, wenn Sie anhand des Index zu einem Tab wechseln wollen, da sich die Opera-Tabs zwischen den anderen befinden und der Index ein anderer als für die anderen Browser sein kann.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Chrome: Wähle deine Suchmaschine&#039;&#039;&#039;&lt;br /&gt;
:Neuere Chromeversionen zeigen nach dem Starten ein Overlay, bei dem man die verwendete Suchmaschine auswählen soll. Die Entscheidung wird normalerweise im Benutzerprofil gespeichert. Wenn für die Verbindung aber nicht explizit ein Chrome-Profil angegeben wird, hat man bei jedem Verbindungsaufbau ein leeres Profil und es wird immer nachgefragt.&lt;br /&gt;
&lt;br /&gt;
:In vielen Fällen kann der Test auch trotz des Overlays im Hintergrund ablaufen. Das Overlay gilt aber wie ein Tab bzw. Fenster; so liefert beispielsweise vom Baustein &#039;&#039;[Web] Get Window Handles&#039;&#039; einen Handle dafür und es kann auch dorthin gewechselt werden. Es gibt aber auch Möglichkeiten es loszuwerden:&lt;br /&gt;
:* &#039;&#039;--disable-search-engine-choice-screen&#039;&#039;: In den [[#Erweiterte_Einstellungen|erweiterten Einstellungen]] kann man bei den Optionen &amp;lt;code&amp;gt;--disable-search-engine-choice-screen&amp;lt;/code&amp;gt; angeben, dann kommt das Overlay nicht.&lt;br /&gt;
:* &#039;&#039;Auswählen&#039;&#039;: Sie können Ihren Test auch so erweitern, dass zu Beginn eine Suchmaschine ausgewählt und damit das Overlay geschlossen wird. Dabei müssen Sie zwei Dinge beachten. Zum einen müssen Sie zuerst mit einem &#039;&#039;Switch to Window&#039;&#039;-Baustein dorthin wechseln (z.B. mit Index &#039;&#039;2&#039;&#039; oder leerem Titel) und am Ende auch wieder zurück zu Ihrem ursprünglichen Tab. Zum anderen sind interessanten Elemente des Overlays [[#Shadow-Elemente|Shadow-Elemente]] und werden daher im GUI-Browser nicht direkt angezeigt.&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin/en&amp;diff=29664</id>
		<title>Mobile Testing Plugin/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin/en&amp;diff=29664"/>
		<updated>2024-07-24T14:27:38Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Windows */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile_Testing_Plugin|Deutsche Version]] | &#039;&#039;&#039;English Version&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
The &#039;&#039;Mobile Testing Plugin&#039;&#039; adds mechanisms to test and automate Android and iOS devices. This includes both real and emulated devices - it does not matter whether real mobile devices or emulated devices are used. The plugin can (and usually is) used in conjunction with the [[Expecco_GUI_Tests_Extension_Reference|GUI-Browser]], which supports the creation of tests. It can also be used to record test procedures.&lt;br /&gt;
&lt;br /&gt;
[http://appium.io/ Appium] is used to connect to the devices. Appium is a free open source framework for testing and automating mobile applications.&lt;br /&gt;
&lt;br /&gt;
We recommend to go through the [[Mobile_Testing_Tutorial/en|Tutorial]] to familiarize yourself with the Mobile Plugin. This tutorial leads step by step through the creation of a test case using an example and explains the necessary basics.&lt;br /&gt;
&lt;br /&gt;
= Installation and Setup =&lt;br /&gt;
To use the &#039;&#039;Mobile Testing Plugin&#039;&#039;, you must have installed expecco together with the corresponding plugin, and you need the appropriate licenses. expecco communicates with the mobile devices via an Appium server, which either runs on the same computer as expecco, or on a second computer. This must be accessible for expecco.&lt;br /&gt;
&lt;br /&gt;
== Installation Overview ==&lt;br /&gt;
&#039;&#039;&#039;Computer running expecco:&#039;&#039;&#039;&lt;br /&gt;
* Java JDK version 8, 9, 10 or 11&lt;br /&gt;
&#039;&#039;&#039;Computer connected to Android devices :&#039;&#039;&#039;&lt;br /&gt;
* Appium Server, you can install it via the Mobile Testing Supplement (see below), of which we regularly provide a new version&lt;br /&gt;
* Android SDK, you can also get it with the Mobile Testing Supplement&lt;br /&gt;
* Java JDK version 8, 9, 10 or 11&lt;br /&gt;
&#039;&#039;&#039;Computer connected to iOS devices&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
* Appium Server, you can install it via the Mobile Testing Supplement for MacOS (see below), of which we regularly provide a new version&lt;br /&gt;
* Xcode in a version that supports the iOS version used, available from the Apple App Store&lt;br /&gt;
* Java JDK version 8, 9, 10 or 11&lt;br /&gt;
* Apple Developer Certificate incl. matching private key (to sign the WebDriverAgent)&lt;br /&gt;
* Provisioning Profile for the mobile devices to be used&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; Please note that due to the requirements (no connection to non-Apple devices available) iOS devices can only be controlled from a Mac.&lt;br /&gt;
&lt;br /&gt;
Depending on the setup, the above-mentioned computers can also be the same device. expecco can either connect to a remote Appium Server and mobile devices connected to it via the network, or start an Appium Server locally itself and use it with local mobile devices. However, some of expecco&#039;s functions that make it easier to create test cases are only available if the mobile devices are connected to the same computer on which expecco is running. A possible setup may therefore look like the following figure:&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAufbau.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
The following explains how to install Appium and other necessary applications for Windows and Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
The easiest way is to install everything from our Mobile Testing Supplement. However, newer versions do not contain a JDK anymore due to a change in Oracle&#039;s license terms, so you have to install it additionally. Of course, you are free to install Appium directly to use the version you want. However, to then be able to start an Appium server with expecco, a suitable batch file must be available and specified in the [[Mobile_Testing_Plugin/en#Plugin_Configuration|settings]]. However, connections can also be established to other running Appium servers.&lt;br /&gt;
*&#039;&#039;&#039;expecco 24.1&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-24.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.3]&lt;br /&gt;
:Same versions as in the predecessor, but with updated chromedriver versions&lt;br /&gt;
*expecco 23.2: [https://download.exept.de/transfer/h-expecco-23.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.2]&lt;br /&gt;
:Same versions as in the predecessor, but with updated chromedriver versions&lt;br /&gt;
*expecco 23.1: [https://download.exept.de/transfer/h-expecco-23.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.1]&lt;br /&gt;
:Same versions as in the predecessor, but the installer now allows to add Appium to the Autostart.&lt;br /&gt;
*expecco 22.2 and 22.1: [https://download.exept.de/transfer/h-expecco-22.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.2.0]&lt;br /&gt;
:Appium 1.22.3*&lt;br /&gt;
:Node 14.17.5&lt;br /&gt;
:adb 1.0.41 from platform-tools 33.0.2&lt;br /&gt;
:&#039;&#039;* We added the capability&#039;&#039; chromedriverStartTimeout &#039;&#039;to Appium, to get a timeout earlier, if Chromedriver cannot be initialized. (see [[#startChromedriverTimeout|Problems and Solutions]])&#039;&#039;&lt;br /&gt;
*expecco 21.2: [https://download.exept.de/transfer/h-expecco-21.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.12.0.0]&lt;br /&gt;
:Contains Appium version 1.22.0, Node still is version 12.13.1.&lt;br /&gt;
*expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.1.0]&lt;br /&gt;
:Only minor changes compared to the previous version.&lt;br /&gt;
*expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.0.0]&lt;br /&gt;
:Compared to the previous version, Appium was updated to version 1.16.0-rc.1 and node 12 is used. &lt;br /&gt;
*expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.8.1.0]&lt;br /&gt;
:This installs Appium in the version 1.12.0 and now additionally contains build-tools in the version 28.0.3 in the android-sdk. Apart from this, it is the same as the previous version.&lt;br /&gt;
*expecco 18.2: [http://download.exept.de/transfer/h-expecco-18.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.7.3.0]&lt;br /&gt;
:This installs Appium in the version 1.8.1. In addition, an installation of &#039;&#039;Android Debug Bridge&#039;&#039; and &#039;&#039;Google USB Driver&#039;&#039; ([https://gsmusbdrivers.com/download/adb-fastboot-drivers/ adb-setup-1.4.3]) is offered. This covers drivers for a broad range of Android devices, and you won&#039;t have to install an individual driver for each device. A &#039;&#039;&#039;JDK is not contained anymore (due to a change in Oracle&#039;s license terms)&#039;&#039;&#039;, you have to download it on your own, e.g. from [https://www.oracle.com/technetwork/java/javase/downloads/index.html Oracle].&lt;br /&gt;
*expecco 18.1: same procedure as for expecco 2.11&lt;br /&gt;
*expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/MobileTestingSupplement_1.6.0.2_Setup.exe Mobile Testing Supplement 1.6.0.2]&lt;br /&gt;
:This installs a Java JDK Version 8, android-sdk and Appium Version 1.6.4. The supplement also offers a universal adb driver ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]). This driver supports a wide range of Android Devise, and avoids the need to search for individual device-specific drivers.&lt;br /&gt;
*expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_1.5.0.0_Setup.exe Mobile Testing Supplement 1.5.0.0]&lt;br /&gt;
:It installs a Java JDK version 8, android-sdk and Appium version 1.4.16. During the installation the graphical user interface of Appium is started, you can close this window immediately. The supplement also offers a universal adb driver (ClockworkMod). This combines drivers for a wide range of Android devices so that you do not have to search for and install a separate driver for each device.&lt;br /&gt;
&lt;br /&gt;
If expecco has to use mobile devices that are connected to another computer, you have to start an Appium server there. You can do this by using the file &amp;lt;code&amp;gt;appium_standalone.cmd&amp;lt;/code&amp;gt;. The server is then started on default port 4723. If you want to use a different port number, start the server with&lt;br /&gt;
&lt;br /&gt;
 appium_standalone.cmd -p &amp;lt;portnummer&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The server is ready, as soon as the line&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Appium REST http interface listener started on 0.0.0.0:4723&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
is displayed, where you can read the used port number at the end.&lt;br /&gt;
&lt;br /&gt;
If your Android device is connected to a remote machine,&lt;br /&gt;
you may want to see the live screen locally using a tool like&lt;br /&gt;
[https://github.com/Genymobile/scrcpy scrcpy].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When Appium is started for the first time – either standalone or by expecco – it may happen that the Windows firewall blocks access to the node server. Allow the access or Appium cannot be started.&lt;br /&gt;
&lt;br /&gt;
== Mac OS ==&lt;br /&gt;
Note: the following can be ignored if you do not plan to test iOS (iPhone) devices. The Mac setup is not needed for Android devices.&lt;br /&gt;
&lt;br /&gt;
=== Xcode ===&lt;br /&gt;
Automation with iOS devices needs [https://developer.apple.com/xcode/ Xcode]. You can install it from the App Store. Please make sure that the version matches the tested iOS versions.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;iOS&#039;&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp;  &lt;br /&gt;
|&#039;&#039;&#039;Xcode&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;macOS&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|10.x&lt;br /&gt;
|8.x&lt;br /&gt;
|10.12 (Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|11.x&lt;br /&gt;
|9.x&lt;br /&gt;
|10.13 (High Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|12.x&lt;br /&gt;
|10.x&lt;br /&gt;
|10.14 (Mojave)&lt;br /&gt;
|-&lt;br /&gt;
|13.x&lt;br /&gt;
|11.x&lt;br /&gt;
|10.15 (Catalina)&lt;br /&gt;
|-&lt;br /&gt;
|14.x&lt;br /&gt;
|12.x&lt;br /&gt;
|11.0 (Big Sur)&lt;br /&gt;
|-&lt;br /&gt;
|15.x&lt;br /&gt;
|13.x&lt;br /&gt;
|12.0 (Monterey)&lt;br /&gt;
|-&lt;br /&gt;
|16.x&lt;br /&gt;
|14.x&lt;br /&gt;
|12.5 (Monterey)&lt;br /&gt;
|}&lt;br /&gt;
This table is only a simplified overview, better see [https://xcodereleases.com/ Xcode releases] or [https://en.wikipedia.org/wiki/Xcode#Version_comparison_table Xcode versions] for the exact versions. For new iOS minor versions, there is usually also a new release of Xcode, e.g. for iOS 10.2 you need at least Xcode 8.2, for iOS 10.3 at least Xcode 8.3, etc. So if you are upgrading to a newer iOS version, you will usually need a newer Xcode version as well. Newer versions of Xcode may not run on older operating systems, which in turn may require an operating system upgrade. If you also want to test older iOS versions, it can be useful to install the corresponding Xcode versions in parallel.&lt;br /&gt;
&lt;br /&gt;
=== Appium ===&lt;br /&gt;
You can install Appium either as command-line tool or use it with [https://github.com/appium/appium-desktop Appium Desktop], which provides a GUI to start the server. Meanwhile there is also Appium 2.0, which is not tested with expecco yet and therefore not recommended to use.&lt;br /&gt;
&lt;br /&gt;
==== Appium Desktop ====&lt;br /&gt;
Download the newest version of [https://github.com/appium/appium-desktop/releases/ Appium Desktop]. For the Mac, it is best to take the dmg file and install it to the applications. When starting &#039;&#039;Appium Server GUI&#039;&#039; you will probably get the error message, that it is not possible for security reasons. In this case, open the context menu of the app file (right click or Ctrl + click) and choose &#039;&#039;Open&#039;&#039; there. Then confirm that you really want to open the application. From now on you can open the application normally.&lt;br /&gt;
&lt;br /&gt;
[[Datei:OpenAppiumServerGUI1.png|text-top]] [[Datei:OpenAppiumServerGUI2.png|text-top]]&lt;br /&gt;
&lt;br /&gt;
Since Xcode 14 there are problems with signing the WebDriverAgent, which Appium loads on the device for the automation. This means that no connection is possible with version 1.22.3-4 of Appium Desktop. In newer versions of WebDriverAgent, this problem is solved, but currently there is no version of Appium Desktop using such a new version (as of November 2022). However, you can manually download a new version (e.g. 4.10.2) and replace the files in Appium. To do this, download one of the two archive files (zip or tar.gz) containing the source code from the [https://github.com/appium/WebDriverAgent/releases/ WebDriverAgent download page]. Then open and extract this file. Copy the contents of the folder &#039;&#039;WebDriverAgent-4.10.2&#039; to&lt;br /&gt;
&lt;br /&gt;
 /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
If you navigate there by Finder, make a context click (right click or Ctrl + click) on the application and choose &#039;&#039;Show Package Contents&#039;&#039; from the menu. Replace all files that are already present with the same name.&lt;br /&gt;
&lt;br /&gt;
==== Install Appium using npm ====&lt;br /&gt;
You can install Appium using npm (Node Package Manager) as well. To do this, you have to install node/npm first. This can be done using [https://github.com/nvm-sh/nvm nvm] (Node Version Manager), which you can get on Github. If the following installation instructions should not work for you, you will find detailed information in the [https://github.com/nvm-sh/nvm#readme Readme] there.&lt;br /&gt;
&lt;br /&gt;
Open a Terminal window. Then clone the Github repository of nvm&lt;br /&gt;
 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash&lt;br /&gt;
and load it&lt;br /&gt;
 export NVM_DIR=&amp;quot;$([ -z &amp;quot;${XDG_CONFIG_HOME-}&amp;quot; ] &amp;amp;&amp;amp; printf %s &amp;quot;${HOME}/.nvm&amp;quot; || printf %s &amp;quot;${XDG_CONFIG_HOME}/nvm&amp;quot;)&amp;quot; [ -s &amp;quot;$NVM_DIR/nvm.sh&amp;quot; ] &amp;amp;&amp;amp; \. &amp;quot;$NVM_DIR/nvm.sh&amp;quot; # This loads nvm&lt;br /&gt;
&lt;br /&gt;
Then execute&lt;br /&gt;
 command -v nvm&lt;br /&gt;
to see if it works. It should print &#039;&#039;nvm&#039;&#039;. If there is no response, execute&lt;br /&gt;
 touch ~/.zshrc&lt;br /&gt;
and try again.&lt;br /&gt;
&lt;br /&gt;
Now you can install node with the following command.&lt;br /&gt;
 nvm install 16.15.1&lt;br /&gt;
As there are problems installing Appium using the newest version of node, we recommend this version.&lt;br /&gt;
&lt;br /&gt;
After node is installed, you can use it to install Appium:&lt;br /&gt;
 npm install -g appium&lt;br /&gt;
&lt;br /&gt;
The Appium server now simply can be started with the command&lt;br /&gt;
 appium&lt;br /&gt;
The output will then be written directly to the terminal.&lt;br /&gt;
&lt;br /&gt;
This version also has problems with signing the WebDriverAgent, like explained in [[#Appium_Desktop | Appium Desktop]]. Therefore download a newer version of WebDriverAgent in this case as well and replace the old files. You will find them at&lt;br /&gt;
 /Users/&amp;lt;user&amp;gt;/.nvm/versions/16.15.1/lib/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
==== Mobile Testing Supplement ====&lt;br /&gt;
We provide older versions of Appium via the Mobile Testing Supplement for Mac OS, with which you can easily install it:&lt;br /&gt;
* &#039;&#039;&#039;expecco 20.2&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-20.2.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement for Mac OS (1.2.2)]&lt;br /&gt;
:Contains Appium version 1.18.3 and uses node 14.&lt;br /&gt;
&lt;br /&gt;
* expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement for Mac OS (1.2.0)]&lt;br /&gt;
:Only a few changes compared to the previous version.&lt;br /&gt;
&lt;br /&gt;
* expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement_for_MacOS.tar.bz2 Mobile Testing Supplement for Mac OS (1.1.98)]&lt;br /&gt;
:Appium is updated to version 1.16.0-rc.1 and node 12 is used.&lt;br /&gt;
&lt;br /&gt;
* expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.96.tar.bz2 Mobile Testing Supplement for Mac OS (1.1.96)]&lt;br /&gt;
:This version contains Appium 1.12.0.&lt;br /&gt;
&lt;br /&gt;
* expecco 18.1: [http://download.exept.de/transfer/h-expecco-18.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.94.tar.bz2 Mobile Testing Supplement for Mac OS (1.1.94)]&lt;br /&gt;
:This version contains Appium 1.8.0.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.11:[http://download.exept.de/transfer/h-expecco-2.11.1/Mobile_Testing_Supplement_for_Mac_OS_1.0.94.tar.bz2 Mobile Testing Supplement for Mac OS (1.0.94)]&lt;br /&gt;
:This version contains Appium 1.6.4.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_for_Mac_OS_1.0.tar.bz2 Mobile Testing Supplement for Mac OS]&lt;br /&gt;
:Diese Version entält Appium 1.4.16.&lt;br /&gt;
&lt;br /&gt;
After you have downloaded the supplement, you can move it to a directory of your choice (e.g. your home directory) and unpack it there. A suitable command in a shell could look like this, adjust the version number accordingly:&lt;br /&gt;
&lt;br /&gt;
 tar -xvpf Mobile_Testing_Supplement_for_Mac_OS_1.1.98.tar.bz2&lt;br /&gt;
&lt;br /&gt;
If your default Xcode installation is the one you want to use, you can start Appium directly from the file in the &#039;&#039;bin&#039;&#039; directory with the appropriate version number:&lt;br /&gt;
&lt;br /&gt;
 Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
If you want to use another Xcode than the one configured as default, you have to tell Appium the corresponding path by using the environment variable &#039;&#039;DEVELOPER_DIR&#039;&#039;. For example, if you have installed Xcode in &#039;&#039;/Applications/Xcode-11.3.app&#039;&#039;, you can start Appium this way:&lt;br /&gt;
&lt;br /&gt;
 DEVELOPER_DIR=&amp;quot;/Applications/Xcode-11.3.app/Contents/Developer&amp;quot; Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
To find out what is set as the default Xcode installation on your system, use this command:&lt;br /&gt;
&lt;br /&gt;
 xcode-select -p&lt;br /&gt;
&lt;br /&gt;
If Appium cannot find your Xcode installation, a message like this appears:&lt;br /&gt;
&#039;&#039;&amp;lt;blockquote&amp;gt;org.openqa.selenium.SessionNotCreatedException - A new session could not be created. (Original error: Could not find path to Xcode, environment variable DEVELOPER_DIR set to: /Applications/Xcode.app but no Xcode found)&amp;lt;/blockquote&amp;gt;&#039;&#039;&lt;br /&gt;
In such a case, restart Appium by specifying a valid &#039;&#039;DEVELOPER_DIR&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Signing WebDriverAgent ====&lt;br /&gt;
For automation, Appium installs an App called WebDriverAgent on the device and therefore has to be able to sign it. You need an Apple account and a respective certificate for this. For evaluation you can use a free account. This has the disadvantage that created profiles are only valid for one week and must be recreated afterwards. Also be careful when sharing the account, as certificates may be revoked or invalidated by automatic generation. As a result, apps that have already been signed can no longer be used.&lt;br /&gt;
&lt;br /&gt;
If you already have a respective certificate and its associated private key in your keychain on the Mac, you can have the WebDriverAgent automatically signed. If not, it is recommended to set and manage the signing using Xcode.&lt;br /&gt;
&lt;br /&gt;
First, connect the device you want to use to your Mac via USB. Make sure both the Mac and the device are in the same network or there will be problems when connection with Appium. Start Xcode and open &#039;&#039;Preferences&#039;&#039;. Go to the Accounts page and create an entry with your account. You can then click on &#039;&#039;Manage Certificates...&#039;&#039; to see the certificates that belong to that account. To run tests, you need an iOS Development Certificate and the associated private key. If you do not already have one, create one. If you already have one, but it is not in your keychain (indicated by &amp;quot;Not in Keychain&amp;quot;), you can import it. You can do that by the [https://support.apple.com/en-us/guide/keychain-access/welcome/mac keychain access] on your Mac, if you have exported it previously from the keychain, where it is stored. The certificate with the associated key should be in the keychain &#039;&#039;Login&#039;&#039;. It can be exported from there as PKCS#12 file (typical ending .p12). To import a certificate into your keychain, select the option &#039;&#039;Import objects&#039;&#039; from the &#039;&#039;File&#039;&#039; menu. If you don&#039;t know where the certificate is stored, you can also revoke it in Xcode and recreate it in your keychain. However, only do this if you know that the old certificate is no longer in use because it can no longer be used afterwards. Now the keychain should contain an iOS development certificate.&lt;br /&gt;
&amp;lt;!--(Den folgenden Teil braucht man wohl nicht mehr, wenn es in Xcode eingestellt ist)From the right-click menu, select Information. Under the details of the certificate you will find the Team ID, which is referred to here as the Organizational Unit. Enter it in the Team ID field of the plug-in&#039;s settings, see [[#Plugin_Configuration|Plugin Configuration]].--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now open the WebDriverAgent project in Xcode. If you have installed the Mobile Testing Supplement, you will find it in this directory at&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
If you have installed Appium Desktop, you will find it at&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;/Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You can use the Finder to navigate to the Xcode project file and open it by double clicking. Note, that you have to perform a context click (right click or Ctrl + click) on the Appium Server GUI app and select &#039;&#039;Show Package Contents&#039;&#039; in the menu, to get to its subdirectory.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingWebDriverAgentXcode.png]]&lt;br /&gt;
&lt;br /&gt;
Select &#039;&#039;WebDriverAgentLib&#039;&#039; and the page &#039;&#039;Signing &amp;amp; Capabilities&#039;&#039;. In the section &#039;&#039;Signing&#039;&#039; set the option &#039;&#039;Automatically manage signing&#039;&#039; and then select a team. Now switch to &#039;&#039;WebDriverAgentRunner&#039;&#039; and do the same there.&lt;br /&gt;
&amp;lt;!-- (The following seems to not be relevant anymore.) Here you should see errors indicating that no Provisioning Profiles have been created or found. Therefore, go to the &#039;&#039;Build Settings&#039;&#039; page and look for the entry &#039;&#039;Product Bundle Identifier&#039;&#039; in the &#039;&#039;Packaging&#039;&#039; section. Change this from com.facebook.WebDriverAgentRunner to something Xcode accepts by changing the prefix. Xcode can now generate a matching Provisioning Profile and the errors on the General page should disappear. After that you can quit Xcode. --&amp;gt;&lt;br /&gt;
By setting the team, the errors showing up for WebDriverAgentRunner should disappear. If Xcode should not be able to create a Provisioning Profile matching the Bundle ID &#039;&#039;com.facebook.WebDriverAgentRunner&#039;&#039;, you can edit the latter so that it fits your certificate. After that you can quit Xcode or you can, like explained further below, directly start the build in Xcode, so the project will be already built when Appium wants to use it.&lt;br /&gt;
&lt;br /&gt;
If you now connect to your device from expecco, the WebDriverAgent will be installed and started on it and then switch to the app to be tested. You may still have to trust the execution of the WebDriverAgent on the device. It maybe a sign that you have to do this, if the app WebDriverAgent first appears on the device and tries to start, but then is uninstalled again. To trust the execution, open the settings during the connection setup on the device and then the entry &#039;&#039;Device management&#039;&#039; under &#039;&#039;General&#039;&#039;. This entry is only visible if a developer app is installed on the device. You may therefore have to wait until the WebDriverAgent is installed before the entry appears. Select the entry of your Apple account and trust it. Since the WebDriverAgent will be uninstalled again if the start did not work, you have to do this during the connection setup. If this is too hectic for you, you can also execute the following code:&lt;br /&gt;
&lt;br /&gt;
 xcodebuild -project Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
 xcodebuild -project /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&lt;br /&gt;
&lt;br /&gt;
This installs the WebDriverAgent on the device without deleting it again.&lt;br /&gt;
&lt;br /&gt;
If there are problems while installing the WebDriverAgent, you can also try and start the build in Xcode. Make sure the right target &#039;&#039;WebDriverAgent&#039;&#039; is selected. Error messages in Xcode might indicate easier what the problem is about. Sometimes it even helps to try for a second time, if it took too long for the first time and got aborted. It may occur, that you are asked several times during the build to enter the password for the keychain.&lt;br /&gt;
&lt;br /&gt;
[[Datei:WebDriverAgentCodesign.png]]&lt;br /&gt;
&lt;br /&gt;
Read also the documentation of Appium on [https://github.com/appium/appium-xcuitest-driver/blob/master/docs/real-device-config.md Setting up tests with iOS devices]. Refer to the [https://support.apple.com/en-us/HT204460 Apple documentation] for details on installing and trusting of apps.&lt;br /&gt;
&lt;br /&gt;
Once the WebDriverAgent is installed on the device, it will be reused for later connections und connecting should work faster. The signed version is then already on your Mac as well and doesn&#039;t have to be built again. This should speed up the connect with other devices as well. If you know, that the connect has to build and sign the WebDriverAgent first, it is advisable to set the capability &#039;&#039;wdaLaunchTimeout&#039;&#039;. This timeout specifies how long Appium waits for the WebDriverAgents to start up on the device and is per default set to 60000&amp;amp;nbsp;ms. Building often takes a little longer than one minute, so the connect attempt will be canceled. A value of 120000 will be more reliable here.&lt;br /&gt;
&lt;br /&gt;
== Plugin Configuration ==&lt;br /&gt;
Before you start, please check the settings of the Mobile Testing Plugin and adjust them if necessary. Select the menu item &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Extensions&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot; (see fig.). By default, these paths are found automatically (1). To adjust a path manually, deactivate the corresponding check mark at the right. You&#039;ll see a drop-down list with some paths to choose from. If an entered path is wrong or cannot be found, the field is marked red and a message appears. Make sure that all paths are specified correctly.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingEinstellungen.png | thumb | 400px | Plugin Configuration]]&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;appium&#039;&#039;&#039;: Enter the path to the executable file with which Appium can be started in the command line. Under Windows this file will usually be called &amp;quot;&amp;lt;code&amp;gt;appium.cmd&amp;lt;/code&amp;gt;&amp;quot;. This path is used when expecco starts an Appium server.&lt;br /&gt;
*&#039;&#039;&#039;node&#039;&#039;&#039;: Enter the path to the executable that starts Node (also called (also called &amp;quot;Node.js&amp;quot;). This path is passed to Appium when a server is started so that Appium can find it independently of the PATH variable. Under Windows this file is usually called &amp;quot;&amp;lt;code&amp;gt;node.exe&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;JAVA_HOME&#039;&#039;&#039;: Enter the path to a JDK (Java Development Kit)here. This path is passed to each Appium server. Leave the field blank to use the value from the environment variable. To specify which Java should be used by expecco, set this path in the Java Bridge settings.&lt;br /&gt;
*&#039;&#039;&#039;ANDROID_HOME&#039;&#039;&#039;: Enter the path to an Android SDK here. This path is passed to each Appium server. Leave the field blank to use the value from the environment variable.&lt;br /&gt;
*&#039;&#039;&#039;adb&#039;&#039;&#039;: The path to the adb command. Under Windows the file is called &amp;quot;&amp;lt;code&amp;gt;adb.exe&amp;lt;/code&amp;gt;&amp;quot;. This file is used by expecco, for example, to get the list of connected devices. This path should be selected automatically, if the command is found in the ANDROID_HOME directory. This is also used by Appium. If expecco and Appium use different versions of adb, conflicts may occur.&lt;br /&gt;
*&#039;&#039;&#039;android.bat&#039;&#039;&#039;: This file is only needed to start the AVD and the SDK Manager, which deal with phone emulators. The file in the ANDROID_HOME directory will be selected automatically, if present there.&lt;br /&gt;
*&#039;&#039;&#039;aapt&#039;&#039;&#039;: The path to the &amp;quot;aapt&amp;quot; command here. Under Windows this file is called &amp;quot;&amp;lt;code&amp;gt;aapt.exe&amp;lt;/code&amp;gt;&amp;quot;. expecco uses &amp;quot;aapt&amp;quot; only in the connection editor to read the package and activities of an &amp;quot;apk&amp;quot; file. The file in the ANDROID_HOME directory will be selected automatically, if present there.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingJavaBridgeEinstellungen.png | thumb | 400px | JDK Configuration]]&lt;br /&gt;
&lt;br /&gt;
Starting with expecco 2.11, there is an additional field called &#039;&#039;Team ID&#039;&#039;. If you run iOS tests, enter the Team ID of your certificate here. This is used for every iOS connection, unless you change the value in the connection settings in individual cases. For information on how to obtain the team ID, please refer to the section on [[#Signing| signing]] for installations on Mac OS. With expecco 2.10 and older, you can only enter the Team ID as capability for each connection setting separately. However, you must use the [[#Extended_View|extended view]] to do this. Enter the capability &#039;&#039;xcodeOrgId&#039;&#039; here and set the Team ID of the certificate as value.&lt;br /&gt;
&lt;br /&gt;
The server address setting at the bottom of the page refers to the behavior of the connection editor. It checks at the end whether the server address ends in &#039;&#039;/wd/hub&#039;&#039; as this is the usual form. If not, a dialog asks how to react. The defined behavior can be viewed and changed here.&lt;br /&gt;
&lt;br /&gt;
Also switch to the entry &#039;&#039;Java Bridge&#039;&#039; (see figure). Here you have to specify the path to your Java installation, which is used by expecco. Enter a JDK here. If you want to use the one from the Mobile Testing Supplement under Windows, the path is&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;C:\Program Files (x86)\exept\Mobile Testing Supplement\jdk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can also use the system settings.&lt;br /&gt;
&lt;br /&gt;
== Prepare Android Device ==&lt;br /&gt;
If you connect an Android device under Windows, you may still need an adb driver for the device. You can usually find a suitable driver on the manufacturer&#039;s website. If you have installed the universal driver from the Mobile Testing Supplement, everything should already work for most devices. In some cases, Windows will automatically try to install a driver when you connect the device for the first time. &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Attention&#039;&#039;&#039;: Before you can control a mobile device with the Appium plugin, you have to allow this debugging!&lt;br /&gt;
&lt;br /&gt;
For Android devices, you can find this option in the settings under &#039;&#039;[https://developer.android.com/studio/debug/dev-options Developer Options]&#039;&#039; called &#039;&#039;USB-Debugging&#039;&#039;. If the developer options are not displayed, you can unlock them by tapping Build Number seven times in About the Phone.&lt;br /&gt;
&lt;br /&gt;
Also enable the &#039;&#039;Stay awake&#039;&#039; feature to prevent the device from turning off the screen during test creation or execution.&lt;br /&gt;
&lt;br /&gt;
For security reasons, USB debugging must be allowed for each computer individually. When connecting the device to the PC via USB, you must agree to the connection on the device. If you haven&#039;t done this for your computer yet, but no corresponding dialog appears on the device, it may help to unplug and reconnect the device. This can happen especially if you have installed the ADB driver while the device was already connected via USB. If this doesn&#039;t help either, open the notifications by dragging them from the top of the screen. There you will find the USB connection and you can open the options. Select another type of connection; usually MTP or PTP should work.&lt;br /&gt;
&lt;br /&gt;
You can also test on an emulator. It does not need to be prepared separately, as it is already designed for USB debugging. It is even possible to start an emulator at the beginning of the test.&lt;br /&gt;
&lt;br /&gt;
To check if a device you have connected to your computer can be used, open the [[#Connection_Editor|connection editor]]. The device should be displayed there.&lt;br /&gt;
&lt;br /&gt;
=== Connection via WLAN ===&lt;br /&gt;
It is possible to connect to Android devices via Wireless LAN. For devices using Android 11 or newer, this can be done wirelessly, else you have to connect initially via USB. Since expecco 22.1, WiFi connections can be established using the [[Mobile_Testing_Plugin/en#Connection_Editor|Connection Editor]]. It is also possible to do this using a command window.&lt;br /&gt;
==== Wireless Connect (Android 11) ====&lt;br /&gt;
In the developer options of your device, enable wireless debugging and open its options. You initially have to pair your machine with the device. To do this, choose &amp;quot;&#039;&#039;Pair device with pairing code&#039;&#039;&amp;quot; to get a pairing code and an IP address with port. Then open a command window (terminal window) on your machine and enter:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb pair &amp;lt;Device IP Address&amp;gt;:&amp;lt;Pairing Port&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
where &amp;lt;tt&amp;gt;&amp;lt;Device IP Address&amp;gt;:&amp;lt;Pairing Port&amp;gt;&amp;lt;/tt&amp;gt; is the IP address and port as shown on the device. After that, you will be asked for the pairing code. If everything went right, the popup on the device should have closed and your machine is added to the list of paired devices. Then enter at the command window:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;Device IP Address&amp;gt;:&amp;lt;Debugging Port&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The IP address is the same as for pairing, but the port is different. Both are shown as IP address &amp;amp; Port on the device. The device should now be connected via WLAN and can be used in the same way as with a USB connection. You can check this by entering &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; or open the connection dialog in expecco. In the list, the device appears with its IP address and port. Remember that the WLAN connection no longer exists when the ADB server or the device is restarted. Restarting the device often disables wireless debugging and the used port is changed. The pairing, however, is permanent and has not to be done again the next time you connect.&lt;br /&gt;
==== Start via USB ====&lt;br /&gt;
First, connect your device via USB. Then open a command window (terminal window) and enter:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The device listens for a TCP/IP connection on port 5555. If you have several devices connected or emulators running, you have to specify which device you mean. Enter in this case:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb devices -l&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
to get a list of all devices, where the first column gives the device&#039;s ID.&lt;br /&gt;
Then, enter:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb -s &amp;lt;deviceID&amp;gt; tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
with the device identification of the desired device. You can now disconnect the USB connection.&amp;lt;br&amp;gt;Now you have to find out the IP address of your device. You can usually find it somewhere in the device&#039;s settings, for example in the Status or WLAN settings of the phone. Then type in:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP address of device&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The device should now be connected via WLAN and can be used in the same way as with a USB connection. You can check this by entering &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; again or open the connection dialog in expecco. In the list, the device appears with its IP address and port. Remember that the WLAN connection no longer exists when the ADB server or the device is restarted.&lt;br /&gt;
&lt;br /&gt;
== Preparing an iOS-Device and App ==&lt;br /&gt;
Control of iOS devices is only possible via a Mac. Please also read the section [[#Mac_OS|Installation under Mac OS]].&lt;br /&gt;
&lt;br /&gt;
Before you can control a mobile device with the Mobile Testing Plugin, you must allow debugging for iOS devices with iOS 8 or higher. Activate the option &amp;quot;&#039;&#039;Enable UI Automation&#039;&#039;&amp;quot; under the &amp;quot;&#039;&#039;Developer&#039;&#039;&amp;quot; menu in the device settings.&amp;lt;br&amp;gt;If you cannot find the &amp;quot;&#039;&#039;Developer&#039;&#039;&amp;quot; entry in the settings, proceed as follows: Connect the device to the Mac via USB. If necessary, you must still agree to the connection on the device. Start Xcode and then select &amp;quot;&#039;&#039;Devices&#039;&#039;&amp;quot; from the menu bar at the top of the screen in the &amp;quot;&#039;&#039;Window&#039;&#039;&amp;quot; menu. A window opens in which a list of the connected devices is displayed. Select your device there. Then the entry &amp;quot;&#039;&#039;Developer&#039;&#039;&amp;quot; should appear in the settings on the device. You may have to exit the settings and restart.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Alert.png | thumb | 270px | Alert unter iOS]]&lt;br /&gt;
It is not possible to establish a connection to the device as long as it shows certain alerts. Such an alert may appear if FaceTime is activated (by displaying a message about SMS charges as shown in the screenshot). Be sure to configure the device so that it does not show such alerts when idle.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.11 and later ===&lt;br /&gt;
You can test any app which is executable or already installed on the device used. If the app is available as a development build, the UDID of the device must be stored in the app. In any case, the WebDriverAgent must be signed for the device. Please read the section about [[#Signing|signing]] under Mac OS.&lt;br /&gt;
&lt;br /&gt;
If you want to use the Home button in a test, you must activate &amp;quot;AssistiveTouch&amp;quot; on the device. You will find this option in the settings under &amp;quot;&#039;&#039;General&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;Operating Help&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;AssistiveTouch&#039;&#039;&amp;quot;. Then place the menu in the middle of the upper edge of the screen. You can then record pressing the Home button with the corresponding menu entry in the recorder or use the &amp;quot;&#039;&#039;Press Home Button&#039;&#039;&amp;quot; block directly.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.10 ===&lt;br /&gt;
The app you want to use must be available as a development build. The UDID of the device must also be stored in the app.&lt;br /&gt;
&lt;br /&gt;
=== Sign the development build ===&lt;br /&gt;
A development build of an app is only allowed for a limited number of devices and cannot be started on other devices. However, it is possible to exchange the certificate and the usable devices in a development build.&lt;br /&gt;
&lt;br /&gt;
* Evaluation with demo app of eXept:&lt;br /&gt;
:We will be happy to provide you with a demo app which is available as a development build and which we can sign for your device. Please send the UDID of your device to your eXept contact person. How to determine the UDID of your device is described in the following section.&lt;br /&gt;
&lt;br /&gt;
* Using your own app for your test device:&lt;br /&gt;
:If you receive a development build (IPA file) from the app developers that is approved for your test device, you can use it directly. To do this, you must tell the developers the UDID of your device so they can enter it. &#039;&#039;&#039;You can use Xcode to read the UDID of a device&#039;&#039;&#039;. Start Xcode and select &#039;&#039;Devices&#039;&#039; from the menu bar at the top of the screen in the &#039;&#039;Window&#039;&#039; menu. A window opens in which a list of the connected devices is displayed. Select your device and search for the &#039;&#039;Identifier&#039;&#039; entry in Properties. The UDID is a 40-digit hexadecimal number.&lt;br /&gt;
&lt;br /&gt;
* Externally developed app for your test device:&lt;br /&gt;
:You can also re-sign apps to make them run on other devices. However, this process is complicated and requires access to an Apple Developer account. A documentation on the procedure is currently in preparation.&lt;br /&gt;
&lt;br /&gt;
:For the evaluation we will gladly support you with the re-signing of your app..&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Log in to the [https://developer.apple.com/ Apple-Webinterface]. Navigate to &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039;. If necessary, create a Developer Certificate and a Provisioning Profile for your device here and download both. If you don&#039;t have a Developer Account yet, create one here: https://developer.apple.com/enroll/. For this you have to register with an Apple-ID.&lt;br /&gt;
&lt;br /&gt;
# Find out Team ID (&#039;&#039;Membership&#039;&#039; -&amp;gt; &#039;&#039;Team ID&#039;&#039;)&lt;br /&gt;
# Under &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039; select development certificate (under &#039;&#039;+&#039;&#039; create, if not available) and download&lt;br /&gt;
# Under &#039;&#039;App ID&#039;&#039; create Wildcard App ID, if not present. Note App ID (AppID = Prefix.ID)&lt;br /&gt;
# Add device, find out UDID (or &#039;&#039;Identifier&#039;&#039;) of the device (&#039;&#039;Xcode&#039;&#039; -&amp;gt; &#039;&#039;Window&#039;&#039; (above in menu bar) -&amp;gt; &#039;&#039;Devices&#039;&#039;)&lt;br /&gt;
# Create commission profiles: &#039;&#039;iOS App Development&#039;&#039; -&amp;gt; Select &#039;&#039;AppID&#039;&#039; -&amp;gt; Select certificate -&amp;gt; Select device -&amp;gt; Create profile name -&amp;gt; Download provisioning profiles.&lt;br /&gt;
# Import the downloaded certificate (&#039;&#039;Downloads&#039;&#039; -&amp;gt; Certificate (.cer)&lt;br /&gt;
# Copy SHA1 fingerprint. Right click on Certificate -&amp;gt; &#039;&#039;Information&#039;&#039;, then scroll to the bottom of the page).&lt;br /&gt;
# Create Entitlements.plist (&#039;&#039;Open Terminal&#039; -&amp;gt; Downloads/Mobile_Testing_Supplement/bin/gen-entitlements_plist &#039;Team-ID&#039; &#039;App ID&#039; Downloads/Mobile_Testing_Supplement/bin/re-sign-ipa &amp;lt;path to ipa (z.B. Downloads/expeccoMobileDemo.ipa)&amp;gt; \&lt;br /&gt;
&amp;quot;&amp;lt;Zertifikat (SHA1-Fingerabdruck, z.B. 76 E8 4B E8 78 D5 D7 F9 2E 09 8B D7 E8 FB CE 30 0C F5 D0 EF)&amp;gt;&amp;quot; \&lt;br /&gt;
&amp;lt;Path to Commission Profile (e.g. /Users/exept_test/Downloads/dut.mobileprovision)&amp;gt; \&lt;br /&gt;
&amp;lt;Path for the result ipa (z.B. Downloads/expeccoMobileDemo_re-signed.ipa)&amp;gt; \&lt;br /&gt;
[Pfad zur entitlements.plist] (z.B. /Users/exept_test/entitlements.plist)&lt;br /&gt;
&lt;br /&gt;
To re-sign, you can use the corresponding script from the Mobile Testing Supplement for Mac OS or any other tool (e.g. isign).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more information about using iOS devices, see also the &lt;br /&gt;
[http://appium.io/slate/en/master/?java#appium-on-real-ios-devices Appium documentation].&lt;br /&gt;
&lt;br /&gt;
=== Native iOS-Apps ===&lt;br /&gt;
You can also use apps that are already natively present on the device. To do this, you must know their bundle ID and then enter it in the connection settings. Here is a small selection of common apps:&lt;br /&gt;
{| style=&amp;quot;text-align:left&amp;quot;&lt;br /&gt;
! App&lt;br /&gt;
!&lt;br /&gt;
! Bundle-ID&lt;br /&gt;
|-&lt;br /&gt;
| App Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.AppStore&lt;br /&gt;
|-&lt;br /&gt;
| Calculator&lt;br /&gt;
| &lt;br /&gt;
| com.apple.calculator&lt;br /&gt;
|-&lt;br /&gt;
| Calendar&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilecal&lt;br /&gt;
|-&lt;br /&gt;
| Camera&lt;br /&gt;
| &lt;br /&gt;
| com.apple.camera&lt;br /&gt;
|-&lt;br /&gt;
| Contacts&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileAddressBook&lt;br /&gt;
|-&lt;br /&gt;
| iTunes Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileStore&lt;br /&gt;
|-&lt;br /&gt;
| Mail&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilemail&lt;br /&gt;
|-&lt;br /&gt;
| Maps&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Maps&lt;br /&gt;
|-&lt;br /&gt;
| Messages&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileSMS&lt;br /&gt;
|-&lt;br /&gt;
| Phone&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilephone&lt;br /&gt;
|-&lt;br /&gt;
| Photos&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobileslideshow&lt;br /&gt;
|-&lt;br /&gt;
| Settings&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Preferences&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
You can find further Bundle-IDs [https://github.com/joeblau/apple-bundle-identifiers here].&lt;br /&gt;
&lt;br /&gt;
= Examples =&lt;br /&gt;
In the demo test suites for expecco you will also find examples for tests with the Mobile Testing Plugin. To do this, select the option &amp;quot;&#039;&#039;Example from File&#039;&#039;&amp;quot; on the start screen and open the folder named &amp;quot;&#039;&#039;mobile&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;TestsuiteMobileTestingDemo&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m01_MobileTestingDemo.ets --&amp;gt;&amp;lt;/span&amp;gt; &#039;&#039;m01_MobileTestingDemo.ets&#039;&#039; ==&lt;br /&gt;
The test suite contains two simple test plans: &amp;quot;&#039;&#039;Simple CalculatorTest&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Complex Calculator and Messaging Test&#039;&#039;&amp;quot;. Both tests use an Android emulator, which you must start before starting. The apps used in the test are part of the basic equipment of the emulator and therefore no longer need to be installed. Since the apps may differ under every Android version, it is important that your emulator runs under Android 6.0. In addition, the language must be set to English.&lt;br /&gt;
&lt;br /&gt;
; Simple CalculatorTest&lt;br /&gt;
: This test connects to the calculator and enters the formula &#039;&#039;2+3&#039;&#039;. The result of the calculator is compared with the expected value &#039;&#039;5&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; Complex Calculator and Messaging Test&lt;br /&gt;
: This test connects to the calculator and then opens the message service. There it waits for an incoming message from the number &#039;&#039;15555215556&#039;&#039;, in which a formula to be calculated is sent. The message is generated before via a socket at the emulator. When the message arrives, it is opened by the test and its contents are read. Then the calculator is opened again, the received formula is entered and the result is read. The test then switches back to the message service and sends the result as an answer.&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;m02_expeccoMobileDemo.ets&#039;&#039; und &#039;&#039;m03_expeccoMobileDemoIOS.ets&#039;&#039; ==&lt;br /&gt;
These are part of the tutorial for the Mobile Testing Plugin. The included test case is incomplete and will be added during the tutorial. Please read the section [[#Tutorial|Tutorial]].&lt;br /&gt;
&lt;br /&gt;
= Tutorial =&lt;br /&gt;
There is a tutorial describing the basic procedure for creating tests with the Mobile Testing Plugin. It is based on a supplied example consisting of a simple app and an expecco test suite.&lt;br /&gt;
&lt;br /&gt;
You find it on the page [[Mobile_Testing_Tutorial/en|Mobile Testing Tutorial]] in two versions for Android and iOS devices.&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsAndroid&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m02_expeccoMobileDemo.ets --&amp;gt;&amp;lt;/span&amp;gt; [[Mobile_Testing_Tutorial/en#First_steps_with_Android|First steps with Android]]&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsIOS&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m03_expeccoMobileDemoIOS.ets --&amp;gt;&amp;lt;/span&amp;gt; [[Mobile_Testing_Tutorial/en#First_steps_with_iOS|First steps with iOS]]&lt;br /&gt;
&lt;br /&gt;
= Dialogs of the Mobile Testing Plugin =&lt;br /&gt;
== Connection Editor ==&lt;br /&gt;
You can use the Connection Editor to quickly define, change, or establish connections. Depending on the task, the dialog has small differences and is opened differently:&lt;br /&gt;
*If you want to establish a connection, access the dialog in the GUI browser by clicking on &#039;&#039;Connect&#039;&#039; and then selecting &#039;&#039;Mobile Testing&#039;&#039;.&lt;br /&gt;
*To change or copy an existing connection in the GUI browser, select it, right-click and select &#039;&#039;Edit Connection&#039;&#039; or &#039;&#039;Copy Connection&#039;&#039; from the context menu.&lt;br /&gt;
*If you do not want to create connection settings for the GUI browser but for use in a test, choose &#039;&#039;Create Connection Settings&#039;&#039; from the Mobile Testing Plugin menu.... This only allows you to create the settings for a connection without creating a connection in the GUI browser.&lt;br /&gt;
&lt;br /&gt;
The Connection Editor menu has several buttons, some of which are only visible when creating connection settings:&lt;br /&gt;
[[Datei:MobileTestingVerbindungseditorMenu.png]]&lt;br /&gt;
#&#039;&#039;Delete Settings&#039;&#039;: Resets all entries. (Only visible when creating settings.)&lt;br /&gt;
#&#039;&#039;Load settings from file&#039;&#039;: Allows to open a saved settings file (*.csf). Its settings are transferred to the dialog. Entries already made without conflict are retained.&lt;br /&gt;
#&#039;&#039;Load settings from attachment&#039;&#039;: Allows you to open an attachment with connection settings from an open project. These settings are applied to the dialog. Entries already made without conflict are retained.&lt;br /&gt;
#&#039;&#039;Save settings to file&#039;&#039; and&lt;br /&gt;
#&#039;&#039;Save settings to attachment&#039;&#039;: Here you can save the entered settings to a file (*.csf) or create them as an attachment in an open project. Both options have a delayed menu in which you can choose to save only a certain part of the settings. (Only visible when creating settings.)&lt;br /&gt;
#&#039;&#039;Advanced View&#039;&#039;: Allows you to switch to the advanced view to make additional settings. Read more about this at the end of this chapter. (Only visible when creating settings.)&lt;br /&gt;
#&#039;&#039;Help&#039;&#039;: A help text for the respective step is shown or hidden on the right side.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The dialog is divided into three steps. In the first step you select the device you want to use, in the second step you select which App should be used and in the last step the settings for the Appium server are made.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep1&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Step 1: Select Device ===&lt;br /&gt;
In the upper part you will see a list of all connected Appium devices that are detected. With the checkbox below you can hide devices that are detected but not ready. If you want to enter a device that is not connected, you can create it with the corresponding button &#039;&#039;Enter Android device&#039;&#039; or &#039;&#039;Enter iOS device&#039;&#039;. However, you need to know the required properties of your device. The device is then created in a second device list and can be selected there. If no list with connected elements can be displayed, various messages are displayed instead:&lt;br /&gt;
*No devices found&lt;br /&gt;
*:expecco could not find any Android devices.&lt;br /&gt;
*:To automatically configure a connection to a device, make sure&lt;br /&gt;
*:*it is connected&lt;br /&gt;
*:*it is turned on&lt;br /&gt;
*:*that it has an appropriate adb driver installed&lt;br /&gt;
*:*it is enabled for debugging (see below).&lt;br /&gt;
*No available devices found&lt;br /&gt;
*:expecco could not find any available Android devices. But not available ones were found, e.g. with the status &amp;quot;unauthorized&amp;quot;.&lt;br /&gt;
*:To configure a connection to a device automatically, make sure that &lt;br /&gt;
*:*it is connected&lt;br /&gt;
*:*it is turned on&lt;br /&gt;
*:*that it has an appropriate adb driver installed&lt;br /&gt;
*:*it is enabled for debugging (see below).&lt;br /&gt;
*:To view unavailable devices, enable this option below.&lt;br /&gt;
*Connection lost&lt;br /&gt;
*:expecco has lost the connection to the adb server. Try to re-establish the connection by clicking on the button.&lt;br /&gt;
*Connection failed&lt;br /&gt;
*:expecco could not connect to the adb server. Possibly it is not running or the specified path is not correct.&lt;br /&gt;
*:Check the adb configuration in the settings and try to start the adb server and establish a connection by clicking on the button.&lt;br /&gt;
*Connect ...&lt;br /&gt;
*:expecco connects to the adb server. This may take a few seconds.&lt;br /&gt;
*Start adb-Server ...&lt;br /&gt;
*:expecco starts the adb-Server. This may take a few seconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--With &#039;&#039;Automation by&#039;&#039; you can specify, which automation engine is to be used. If you leave the setting at &#039;&#039;(Default)&#039;&#039; the corresponding capability is not set at all. Otherwise Appium, Selendroid and from expecco 2.11 XCUITest are available. Selendroid is usually only used for Android devices prior to version 4.1.--&amp;gt;With &#039;&#039;Next&#039;&#039; you get to the next step. If you enter settings for the GUI browser, this is only possible once a device has been selected.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;UnlockingDeveloperOptions&amp;quot;&amp;gt;Note on unlocking&amp;lt;/span&amp;gt;: In newer Android versions the developer options are no longer offered in the settings at first. If your Android device does not show an entry for &amp;quot;&#039;&#039;Developer options&#039;&#039;&amp;quot; in the settings, first select the entry &amp;quot;&#039;&#039;Phone info&#039;&#039;&amp;quot;, then &amp;quot;&#039;&#039;SoftwareVersionsInfo&#039;&#039;&amp;quot; and click on the entry &amp;quot;&#039;&#039;BuildVersion&#039;&#039;&amp;quot; several times.&lt;br /&gt;
&lt;br /&gt;
==== Manage Chromedrivers ====&lt;br /&gt;
If the App you want to automate uses WebViews with Chrome, Appium needs to have access to an appropriate Chromedriver. If you have selected a device in the list, you can use &amp;quot;&#039;&#039;Manage Chromedrivers&#039;&#039;&amp;quot; to see, which Chrome versions are installed on the device and which Chromedriver versions are provided by expecco. With this dialog you can also download required Chromedriver versions. Beware that there may be several Chrome versions on the device. An App doesn&#039;t have to use the version of the installed Chrome browser for its WebViews. The Chromedriver you use should fit your app for everything to work properly. You can also change the path to the Chromedriver in the capabilities generated at the end of the connection editor.&lt;br /&gt;
&lt;br /&gt;
==== Connect WiFi Android Device ====&lt;br /&gt;
&lt;br /&gt;
You can connect to Android devices using WiFi as well. In this case, the device has to be connected to ADB first, see [[Mobile_Testing_Plugin/en#Connection_via_WLAN|Connection via WLAN]]. Since expecco 22.1, the connection editor provides a dialog helping to set this up, which can be used instead of the command window. For devices using Android 11 or newer, you can pair the device with your machine here by specifying the appropriate parameters and then establish the connection by specifying the IP address and port. You can also use this to establish a wireless connection for devices that are connected via USB. When you select the corresponding device in the list, the required information is read out automatically.&lt;br /&gt;
&lt;br /&gt;
Note that establishing a wireless connection is not part of the connection settings. If you want to establish a new connection with the generated settings, you must make sure that the device is connected to ADB with the specified IP address and port so that it can be found. The ADB connection will be lost if the ADB server or the device are restarted. The permission for wireless debugging is also often reset when the device is restarted and the debug port can then change. Therefore, a wireless connection must always be established manually.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep2&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Step 2: Select App===&lt;br /&gt;
Here you can enter information about the app to be tested. You can decide if you want to use an app that is already installed on the device or if you want to install an app for the test. Select the appropriate tab above. Depending on whether you selected an Android or an iOS device in the previous step, the required input will change.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Android&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App on Device&#039;&#039;&lt;br /&gt;
**:If you have selected a connected device in the first step, the packages of all installed apps are automatically retrieved and you can select from the drop-down lists. The installed apps are divided into third-party packages and system packages; select the appropriate package list. This selection does not belong to the settings, but only provides the corresponding package list. You can use the filter to further narrow down the list and then select the desired package. The activities of the selected package are also automatically retrieved and made available as a drop-down list. Select the activity you want to start. As a rule, an activity is automatically entered from the list. If you are not using a connected device, you must enter the package and the activity manually.&lt;br /&gt;
**&#039;&#039;Install App&#039;&#039;&lt;br /&gt;
**:Under &#039;&#039;App&#039;&#039;, enter the path to an app. The path must be valid for the Appium server being used. You can also specify a URL. If you are using a local Appium server, you can use the right button to navigate to the App installation file and enter this path. If possible, the corresponding package and the activity are also entered in the fields below. However, this entry is not necessary.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;iOS&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App on Device&#039;&#039;&lt;br /&gt;
**:Specify the bundle ID of an installed app. You can find out the IDs of the installed apps using Xcode, for example. Start Xcode and select &#039;&#039;Devices&#039;&#039; from the menu bar at the top of the screen in the &#039;&#039;Window&#039;&#039; menu. A window will open displaying a list of connected devices. If you select your device, you will see a list of the apps you have installed in the overview.&lt;br /&gt;
**&#039;&#039;Install App&#039;&#039;&lt;br /&gt;
**:Under &#039;&#039;App&#039;&#039;, enter the path to an app. The path must be valid for the Appium server being used. You can also specify a URL. For the requirements of apps for real devices, please read the section  [[#iOS-Ger.C3.A4t_and_App_Preparing|Preparing an iOS-Device and App]].&lt;br /&gt;
&lt;br /&gt;
In the lower part you can specify whether the app should be reset or uninstalled when the connection is terminated, and whether it should be reset initially. Again, the corresponding capability is not set if you select &#039;&#039;(Default)&#039;&#039;. With &#039;&#039;Next&#039;&#039; you get to the next step.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep3&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Step 3: Server Settings===&lt;br /&gt;
In the last step, a list of all the capabilities that result from your entries in the previous steps is first displayed in the upper part. If you are familiar with Appium and want to set additional capabilities that are not covered by the connection editor, you can click on &#039;&#039;Edit&#039;&#039; to open the extended view. See the section below for more information.&lt;br /&gt;
&lt;br /&gt;
If you enter settings for the GUI browser, you can enter the &#039;&#039;Connection name&#039;&#039; with which the connection is displayed. This is also the name under which devices can use this connection when it is established. If you leave the field blank, a name will be generated. If the box &amp;quot;&#039;&#039;Managed by expecco&#039;&#039;&amp;quot; is checked, expecco will start a local Appium server on a free port, or use a free server that has already been started. To use your own server, turn this feature off and enter the appropriate address. You will get the local default address and already used addresses to choose from.&lt;br /&gt;
&lt;br /&gt;
In older expecco versions the box is labeled &amp;quot;&#039;&#039;Start on demand&#039;&#039;&amp;quot;. In this case, you must also enter an address if you want expecco to start the server. expecco then tries to start an Appium server at the given address when connecting, if none is running there yet. This server will then also be shut down when the connection is terminated. This only works for local addresses. Make sure that you only use port numbers that are free. It is best to only use odd port numbers from the standard port 4723. The following port number is also used when establishing a connection, which could otherwise lead to conflicts.&lt;br /&gt;
&lt;br /&gt;
Depending on how you opened the dialog, there are now different buttons to close it. In any case you have the option to save. This opens a dialog where you can either select an open project to save the settings there as an attachment, or choose to save it to a file that you can then specify. Saving does not close the dialog, allowing you to select another option.&lt;br /&gt;
&lt;br /&gt;
If you have opened the editor for establishing a connection, you can finally click on &#039;&#039;Connect&#039;&#039; or &#039;&#039;Start and connect server&#039;&#039;, depending on whether the check mark for server start is set. For changing or copying a connection in the GUI Browser, this option is called &#039;&#039;Apply&#039;&#039;, since in this case only the connection entry is changed or created, but the connection setup is not started. If necessary, you can do this afterwards via the context menu. If you have changed capabilities of an existing connection, a dialog then prompts you to decide whether these changes should be applied directly by closing the connection and establishing the new connection or not. In this case, the changes only take effect after you reestablish the connection.&lt;br /&gt;
&lt;br /&gt;
To use the connection editor, also read the corresponding section in the respective tutorial in step 1. (Android: [[Mobile_Testing_Tutorial/en#Step_1:_Run_Demo|Run Demo]], iOS: [[Mobile_Testing_Tutorial/en#Step_1:_Run_Demo_2|Run Demo]]).&lt;br /&gt;
&lt;br /&gt;
===Extended View===&lt;br /&gt;
The extended view of the connection editor can be obtained either by clicking on &#039;&#039;Edit&#039;&#039; in the third step or at any time via the corresponding menu item if you have started the editor via the plugin menu. This view displays a list of all configured Appium Capabilities. You can add, change or remove further entries to this list. To add a capability, select it from the drop-down list of the input field. In this list all known capabilities are sorted into the categories &#039;&#039;Common&#039;&#039;, &#039;&#039;Android&#039;&#039; and &#039;&#039;iOS&#039;&#039;. If you have selected a capability, a short information text is displayed. You can also enter a capability manually in the field. Then click on &#039;&#039;Add&#039;&#039; to add the capability to the list. There you can set the value in the right column. To delete an entry, select it and click on &#039;&#039;Remove&#039;&#039;. With &#039;&#039;Back&#039;&#039; you leave the extended view.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingErweiterteAnsicht.png]]&lt;br /&gt;
&lt;br /&gt;
== Running Appium Servers ==&lt;br /&gt;
In the menu of the Mobile Testing Plugin you will find the entry &#039;&#039;Appium-Server...&#039;&#039;. This opens a window with an overview of all Appium servers started by expecco and on which port they are running. By clicking on the icon in the column &#039;&#039;Show Log&#039;&#039; you can view the logfile of the corresponding server. This is deleted when the server is shut down. With the icons in the column &#039;&#039;Exit&#039;&#039; the corresponding server can be terminated. However, this is prevented if expecco still has an open connection via this server. The rightmost column shows for which connection the server is in use. If it reads &#039;&#039;&amp;lt;idle&amp;gt;&#039;&#039;, the server is currently not used by expecco.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAppiumServer.png]]&lt;br /&gt;
&lt;br /&gt;
When opening the editor to start an Appium connection, an Appium server is started immediately to speed up the connection process. For this purpose, expecco always keeps one idle running Appium server. Additional running servers however, which are not in use anymore, will be terminated automatically after a while.&lt;br /&gt;
&lt;br /&gt;
In the menu of the Mobile Testing Plugin you will also find the entry &#039;&#039;Close all Connections and Servers&#039;&#039;. This is intended for cases where connections or servers cannot be terminated in any other way. If possible, always terminate connections in the GUI browser or by executing a corresponding block. Servers that you have started in the server overview should be terminated there; servers that were started with a connection are automatically terminated with this connection.&lt;br /&gt;
&lt;br /&gt;
Note that only servers started and managed by expecco are listed in the overview. Possible other Appium servers that were started in a different way are not recognized.&lt;br /&gt;
&lt;br /&gt;
== Recorder ==&lt;br /&gt;
If the GUI browser is connected to a device, the integrated recorder can be used to record a test section with that device. To start the recorder, select the appropriate connection in the GUI browser and click the Record button. A new window opens for the recorder. The recorded actions are created in the GUI browser work area. It is therefore possible to edit the recorded data in parallel.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingRecorder.png|caption|]]&lt;br /&gt;
&lt;br /&gt;
====Components of the Recorder Window====&lt;br /&gt;
#&#039;&#039;&#039;Continue/Pause Recording&#039;&#039;&#039;: You can pause the recording by clicking the right icon. You will then see a large pause sign in the view. All actions that you perform now in the recorder are executed, but no blocks are recorded. You can switch back to normal recording mode by clicking the left icon.&lt;br /&gt;
#&#039;&#039;&#039;Stop Recording&#039;&#039;&#039;: Stops the recording and closes the recorder window.&lt;br /&gt;
#&#039;&#039;&#039;Update&#039;&#039;&#039;: Gets the current image and element tree from the device. This is necessary if the device takes longer to execute an action or if something changes without being triggered by the recorder. Since expecco 21.2, there is an additional submenu here that can be used to enable automatic update by checking for changes in the background (see also &#039;&#039;Automatic Update&#039;&#039; further below).&lt;br /&gt;
#&#039;&#039;&#039;Follow Mouse&#039;&#039;&#039;: Select the element under the mouse pointer in the GUI browser.&lt;br /&gt;
#&#039;&#039;&#039;Element Highlighting&#039;&#039;&#039;: The element under the mouse is outlined in red.&lt;br /&gt;
#&#039;&#039;&#039;Show Elements&#039;&#039;&#039;: Show the borders of all elements in the view.&lt;br /&gt;
#&#039;&#039;&#039;Tools&#039;&#039;&#039;: Selection, which  tool is used for recording. The selected action is triggered with each click on the view. The following actions are available:&lt;br /&gt;
#*Element Actions:&lt;br /&gt;
#**Click: Short click on the element under cursor. To determine more precisely which element is used, use the Follow Mouse or Element Highlighting function.&lt;br /&gt;
#**Tap with Duration (Element): Similar to click, except that the duration of the click will be recorded as well. This allows the recording of long clicks.&lt;br /&gt;
#**Tap with Position (Element): Similar to click, but additionally records the position inside the element. The position can be recorded relative to the element size or, when pressing Ctrl while clicking, as absolute position from the upper left corner of the element.&lt;br /&gt;
#**Set Text: Allows to set the text of an input field.&lt;br /&gt;
#**Clear Text: Clears the text of an input field.&lt;br /&gt;
#*Device Actions:&lt;br /&gt;
#**Tap (Screen): Triggers a click at the screen position.&lt;br /&gt;
#**Tap with Duration (Screen): Triggers a click at the screen position, which also considers the duration.&lt;br /&gt;
#**Swipe: Swipe in a straight line from the point where you press the mouse button until you release it. The duration is also recorded.&lt;br /&gt;
#:Please note for this actions that the result may differ on different devices, e.g. with different screen resolutions.&lt;br /&gt;
#*Test Flow Blocks&lt;br /&gt;
#**Check Attribute: Compares the value of a specified attribute of the element with a predefined value. The result triggers the corresponding output.&lt;br /&gt;
#**Assert Attribut: Compares the value of a specified attribute of the element with a predefined value. If the values are not equal, the test fails.&lt;br /&gt;
#**Get Attribute: Gets the current value of a specified attribute of the element.&lt;br /&gt;
#*Auto&lt;br /&gt;
#:If the Auto tool is selected, you can use all actions by specific input methods: &#039;&#039;Click&#039;&#039;, &#039;&#039;Tap Element&#039;&#039; and &#039;&#039;Swipe&#039;&#039; still work by clicking, but are distinguished by the duration and movement of the cursor. To trigger a &#039;&#039;Tap&#039;&#039;, hold down Ctrl while clicking. The remaining actions are available in a context menu by right-clicking on the element.&lt;br /&gt;
#&#039;&#039;&#039;Context Actions&#039;&#039;&#039;: Here you can record actions concerning contexts:&lt;br /&gt;
#*Switch to Context: Shows a list of all currently available contexts and you can select to which one you want to switch.&lt;br /&gt;
#*Get Current Context: Gets the handle of the current context.&lt;br /&gt;
#*Get Context Handles: Gets a list of all currently available contexts.&lt;br /&gt;
#&#039;&#039;&#039;Softkeys&#039;&#039;&#039;: Only for Android. Simulates pressing the buttons Back, Home, Menu and Power.&lt;br /&gt;
#&#039;&#039;&#039;Home Button&#039;&#039;&#039;: Only for iOS since expecco 2.11. Allows pressing the Home button.Prior to expecco 19.2, it only works if AssistiveTouch is activated and the menu is located in the middle of the upper screen border. From expecco 19.2 on, the function no longer uses AssistiveTouch.&lt;br /&gt;
#&#039;&#039;&#039;Help&#039;&#039;&#039;: Opens this online documentation on the general page about [[GuiBrowser_Recorder/en|GUI Browser recorders]].&lt;br /&gt;
#&#039;&#039;&#039;View&#039;&#039;&#039;: Shows a screenshot of the device. Actions are triggerd by mouse depending on the selected tool. If a new action can be recorded, the window has a green frame, else it is red.&lt;br /&gt;
#&#039;&#039;&#039;Resize Window to Image&#039;&#039;&#039;: Resizes the recorder window so that the screenshot can be displayed completely.&lt;br /&gt;
#&#039;&#039;&#039;Resize Image to Window&#039;&#039;&#039;: Scales the screenshot to a size that makes use of the full size of the window.&lt;br /&gt;
#&#039;&#039;&#039;Adjust Display&#039;&#039;&#039;: Opens a dialog to adjust the displayed image, if expecco does not show it right. You can correct the scaling or rotate the image by 90°.&lt;br /&gt;
#&#039;&#039;&#039;Correct Orientation&#039;&#039;&#039;: Corrects the image if it is upside down. Using the arrow to the right, the image can also be rotated by 90°, if this should ever be necessary. Since expecco 19.1 you find this functionality under &#039;&#039;Adjust Display&#039;&#039;. The orientation of the image is irrelevant for the functionality of the recorder, it only works on the elements it receives.&lt;br /&gt;
#&#039;&#039;&#039;Scaling&#039;&#039;&#039;: Changes the scaling of the screenshots.&lt;br /&gt;
#&#039;&#039;&#039;Messages&#039;&#039;&#039;: Shows the path of the current selected element or other messages. It has a context menu to show a list of previous messages.&lt;br /&gt;
&lt;br /&gt;
====Usage====&lt;br /&gt;
Each click in the window triggers an action and is recorded in the workspace of the GUI browser. There you can run, edit, or create a new block from what you have recorded. You find the actions to trigger softkeys directly in the menu bar (see above). To record actions on elements, either change the selection of the tool in the menu bar (see above) and then click on the element or select the corresponding action from the context menu by right-clicking on the corresponding element. For text input it is also possible to place the cursor over the element and enter the text. This opens the input dialog for this action. On how to use the recorder, see also step 2 in the tutorial ([[Mobile_Testing_Tutorial/en#Step_2:_Creating_a_Block_with_the_Recorder|Android]] resp. [[Mobile_Testing_Tutorial/en#Step_2:_Creating_a_block_with_the_Recorder_2|iOS]]).&lt;br /&gt;
&lt;br /&gt;
====Hide elements====&lt;br /&gt;
Since expecco 21.2 it is also possible to hide the selected element in the recorder from the context menu. This means that this element cannot be selected from now on. This function is useful for ignoring elements that are in the foreground to be able to access elements below them. To undo this state, you have to find the corresponding element in the tree of the GUI browser, which also has such an entry in the context menu.&lt;br /&gt;
&lt;br /&gt;
====Automatic Update====&lt;br /&gt;
The recorder doesn&#039;t show a live image of the device, but only a snapshot. Therefore an update is needed after changes to match what is displayed on the device. The recorder updates automatically after executing an action. Since expecco 20.2 there are further automatic updates possible. You can enable the, in the menu &amp;quot;View&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
One option is, to check after an action has been executed, if there are further changes after the first update. If so, a second update is triggered. This shall fix the problem, that the recorder is not up to date after an action, because the update has been done too early.&lt;br /&gt;
&lt;br /&gt;
The second option is to enable a periodical update. After a set interval the recorder is automatically updated if there are changes. Thereby the recorder view is mostly up to date, but this causes an overhead regarding the communication to the device.&lt;br /&gt;
&lt;br /&gt;
== AVD Manager und SDK Manager ==&lt;br /&gt;
AVD Manager und SDK Manager sind beides Anwendungen von Android. Im Menü des Mobile Testing Plugins bietet expecco die Möglichkeit, diese zu starten. Ansonsten finden Sie diese Programme bei Ihrer Android-Installation. Mit dem AVD Manager können Sie AVDs, also Konfigurationen für Emulatoren, erstellen, bearbeiten und starten. Mit dem SDK Manager erhalten Sie einen Überblick über Ihre Android-Installation und können diese bei Bedarf erweitern.&lt;br /&gt;
&lt;br /&gt;
= Hybrid Apps and WebViews =&lt;br /&gt;
&#039;&#039;&#039;!!! IMPORTANT NOTICE - If you have problems switching to the webview, please set the &amp;quot;Default Application - Browser App&amp;quot; in Android Settings to &amp;quot;Chrome&amp;quot; !!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hybrid apps contain platform native elements as well as other elements that are integrated in a WebView. These elements can also be used, but you first have to switch to the corresponding context. With the block &#039;&#039;Get Current Context&#039;&#039; you get the current context. Initially this is &#039;&#039;NATIVE_APP&#039;&#039;, i.e. the context of the native elements. With the block &#039;&#039;Get Context Handles&#039;&#039; you get a collection of all existing contexts. If there is a WebView context, it is called &#039;&#039;WEBVIEW_1&#039;&#039; or &#039;&#039;WEBVIEW_&amp;lt;package&amp;gt;&#039;&#039; with the package of the WebView. Several WebView contexts are also possible. For each WebView context, there is a corresponding WebView element in the native context. You can use the &#039;&#039;Switch to Context&#039;&#039; block to switch to such a context and from now on only have access to the elements in this context.&lt;br /&gt;
&lt;br /&gt;
In the GUI browser, the existing contexts are displayed at the top of the tree as well as the tree of a context is inserted below the corresponding WebView element.&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span id=&amp;quot;Customizing XPath using the GUI Browsers&amp;quot;&amp;gt;&amp;lt;!-- name before 01.10.2020--&amp;gt;&amp;lt;/span&amp;gt;Customizing XPath using the GUI Browser=&lt;br /&gt;
Bausteine, die auf einem Gerät fehlerfrei funktionieren, tun dies auf anderen Geräten möglicherweise nicht. Auch können kleine Änderungen der App dazu führen, dass ein Baustein nicht mehr den gewünschten Effekt hat. Man sollte einen Baustein daher so robust formulieren, dass er für eine Vielzahl von Geräten verwendet werden kann und kleine Anpassungen an der App verkraftet. Dazu muss man das grundlegende Funktionsprinzip der Adressierung verstehen. Dies wird im Folgenden am Beispiel der App aus dem Tutorial erläutert.&lt;br /&gt;
&lt;br /&gt;
Die Ansicht der App setzt sich aus einzelnen Elementen zusammen. Dazu gehören die Schaltflächen &#039;&#039;GTIN-13 (EAN-13)&#039;&#039; und &#039;&#039;Verify&#039;&#039;, das Eingabefeld der Zahl &#039;&#039;4006381333986&#039;&#039; und das Ergebnisfeld, in dem OK erscheint, wie auch alle anderen auf der Anzeige sichtbaren Dinge. Diese sichtbaren Elemente sind in unsichtbare Strukturelemente eingebettet. Alle Elemente zusammen sind in einer zusammenhängenden Hierarchie, dem Elementbaum, organisiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingGUIBrowser.png | frame | left | Abb. 1: Funktionen des GUI-Browsers]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
Sie können sich diesen Baum im GUI-Browser ansehen. Wechseln Sie dazu in den GUI-Browser (Abb. 1) und starten Sie eine beliebige Verbindung. Sobald die Verbindung aufgebaut ist, können Sie den gesamten Baum aufklappen (1) (Klick bei gedrückter Strg-Taste). Er enthält alle Elemente der aktuellen Seite der App.&lt;br /&gt;
&lt;br /&gt;
Ein Baustein, der nun ein bestimmtes Element verwendet, muss dieses eindeutig angeben, indem er dessen Position im Elementbaum mit einem Pfad im XPath-Format beschreibt. Dieses Format ist ein verbreiteter Web-Standard für XML-Dokumente und -Datenbanken, eignet sich aber genauso für Pfade im Elementbaum.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie ein Element im Baum auswählen, wird unten der von expecco automatisch generierte XPath (2) für das Element angezeigt, der auch beim Aufzeichnen verwendet wird. Oberhalb davon in der Mitte des Fensters befindet sich eine Liste der Eigenschaften (3) des ausgewählten Elements. Man nennt diese Eigenschaften auch Attribute. Sie beschreiben das Element näher wie beispielsweise seinen Typ, seinen Text oder andere Informationen zu seinem Zustand. Links unten können Sie zur besseren Orientierung im Baum die &#039;&#039;Vorschau&#039;&#039; (4) aktivieren, um sich den Bildausschnitt des Elements anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Der Elementbaum für gleiche Ansicht einer App kann sich je nach Gerät unterscheiden. Es sind diese Unterschiede, die verhindern, eine Aufnahme von einem Gerät unverändert auch auf allen anderen Geräten abzuspielen: Ein XPath, der im einen Elementbaum ein bestimmtes Element identifiziert, beschreibt nicht unbedingt das gleiche Element im Elementbaum auf einem anderen Gerät. Es kann stattdessen passieren, dass der XPath auf kein Element, auf ein falsches Element oder auf mehrere Elemente passt. Dann schlägt der Test fehl oder er verhält sich unerwartet.&lt;br /&gt;
&lt;br /&gt;
Man könnte natürlich für jedes Gerät einen eigenen Testfall schreiben. Das brächte aber unverhältnismäßigen Aufwand bei Testerstellung und -wartung mit sich. Das Problem lässt sich auch anders lösen, da ein jeweiliges Element nicht nur durch genau einen XPath beschrieben wird. Vielmehr erlaubt der Standard mithilfe verschiedener Merkmale unterschiedliche Beschreibungen für ein und dasselbe Element zu formulieren. Das Ziel ist daher, einen Pfad zu finden, der auf allen für den Test verwendeten Geräten funktioniert und überall eindeutig zum richtigen Element führt.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel besteht die Verbindung zur Android-App aus dem Tutorial und der Eintrag des GTIN-13-Buttons ist ausgewählt (5). Dessen automatisch generierter XPath (2) kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[@resource id=&#039;android:id/content&#039;]/android.widget.RelativeLayout/android.widget.Button[@resource-id=&#039;de.exept.expeccomobiledemo:id/gtin_13&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Er ist offensichtlich lang und unübersichtlich. Der sehr viel kürzere Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@text=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
führt zum selben Element.&lt;br /&gt;
&lt;br /&gt;
Für die iOS-App lautet der automatisch generierte XPath für diesen Button beispielsweise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/XCUIElementTypeApplication/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/UIAApplication/UIAWindow[1]/UIAButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und kann kürzer als&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@name=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Sie können den Pfad entsprechend im GUI-Browser ändern und durch &#039;&#039;Pfad überprüfen&#039;&#039; (6) feststellen, ob er weiterhin auf das ausgewählte Element zeigt, was expecco mit &#039;&#039;Verify Path: OK&#039;&#039; (7) bestätigen sollte. Der erste, sehr viel längere Pfad, beschreibt den gesamten Weg vom obersten Element des Baumes bis hin zum gesuchten Button. Der zweite Pfad hingegen wählt mit * zunächst sämtliche Elemente des Baumes und schränkt die Auswahl dann auf genau die Elemente ein, die ein &#039;&#039;text&#039;&#039;- bzw. &#039;&#039;name&#039;&#039;-Attribut mit dem Wert &#039;&#039;GTIN-13 (EAN-13)&#039;&#039; besitzen, in unserem Fall also genau der eine Button, den wir suchen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden Android-ähnliche Pfade zur Veranschaulichung verwendet. Die Elemente in iOS-Apps heißen zwar anders, wodurch andere Pfade entstehen; das Prinzip ist jedoch das gleiche.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum1.png | frame | Abb. 2: Elementbaum einer fiktiven App]]&lt;br /&gt;
&lt;br /&gt;
Sie können solche Pfade mit Hilfe weniger Regeln selbst formulieren. Sehen Sie sich den einfachen Baum einer fiktiven Android-App in Abb. 2 an: Die Einrückungen innerhalb des Baumes geben die Hierarchie der Elemente wieder. Ein Element ist ein &#039;&#039;Kind&#039;&#039; eines anderen Elementes, wenn jenes andere Element das nächsthöhere Element mit einem um eins geringeren Einzug ist. Jenes Element ist das &#039;&#039;Elternelement&#039;&#039; des Kindes. Sind mehrere untereinander stehende Elemente gleich eingerückt, so sind sie also alle Kinder desselben Elternelements.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad durch alle Ebenen der Hierarchie zum TextView-Element ist nun:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Elemente sind mit Schrägstrichen voneinander getrennt. Es fällt auf, dass der Name des ersten Elements nicht mit dem im Baum übereinstimmt. Das oberste Element in der Hierarchie heißt immer &#039;&#039;hierarchy&#039;&#039; (für iOS wäre es &#039;&#039;AppiumAUT&#039;&#039;), expecco zeigt im Baum stattdessen den Namen der Verbindung an, damit man mehrere Verbindungen voneinander unterscheiden kann. Die weiteren Elemente tragen jeweils das Präfix &#039;&#039;android.widget.&#039;&#039;, das im Baum zur besseren Übersicht nicht angezeigt wird. Bei IOS gibt es kein Präfix, das durch einen Punkt abgetrennt wäre, expecco 2.11 blendet aber entsprechend &#039;&#039;XCUIElementType&#039;&#039; am Anfang aus. Mit jedem Schrägstrich führt der Pfad über eine Eltern-Kind-Beziehung in eine tiefere Hierarchie-Ebene, d. h. &#039;&#039;FrameLayout&#039;&#039; ist ein Kindelement von &#039;&#039;hierarchy&#039;&#039;, &#039;&#039;LinearLayout&#039;&#039; ist ein Kind von &#039;&#039;FrameLayout&#039;&#039; usw. Die in eckigen Klammern geschriebenen Wörter dienen nur als Orientierungshilfe im Baum. Sie gehören nicht zum Typ.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad muss nicht beim Element &#039;&#039;hierarchy&#039;&#039; beginnen. Man kann den Pfad beginnend mit einem beliebigen Element des Baumes bilden. Man kann also verkürzt auch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
schreiben. Der Pfad führt zum selben &#039;&#039;TextView&#039;&#039;-Element, da es nur ein Element dieses Typs gibt. Anders verhält es sich bei dem Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da es zwei Elemente vom Typ &#039;&#039;Button&#039;&#039; gibt, passt dieser Pfad auf zwei Elemente, nämlich den Button, der mit &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; markiert ist, und den &#039;&#039;Button&#039;&#039;, der mit &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; markiert ist. Es würde an dieser Stelle aber auch nicht helfen den langen Pfad von &#039;&#039;hierarchy&#039;&#039; aus beginnend anzugeben. Um einen mehrdeutigen Pfad weiter zu differenzieren, kann man explizit ein Element aus einer Menge wählen, indem man den numerischen Index in eckigen Klammern dahinter schreibt. Der Pfad aus dem obigen Beispiel lässt sich damit so anpassen, dass er eindeutig auf den &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; weist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[1].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ihnen fällt sicher auf, dass der Index eine 1 ist obwohl das zweite Element gemeint ist. Das kommt daher, dass die Zählung bei 0 beginnt. Der Button mit der Markierung &amp;quot;An&amp;quot; hat also die Nummer 0 und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Nummer 1.&lt;br /&gt;
&lt;br /&gt;
Dieser Ansatz, einen expliziten Index zu verwenden, hat zwei Nachteile: Zum einen lässt sich an dem Pfad nur schwer ablesen welches Element gemeint ist, zum andern ist der Pfad sehr empfindlich schon gegenüber kleinsten Änderungen, wie zum Beispiel dem Vertauschen der beiden &#039;&#039;Button&#039;&#039;-Elemente oder dem Einfügen eines weiteren &#039;&#039;Button&#039;&#039;-Elements in der App.&lt;br /&gt;
&lt;br /&gt;
Es wäre daher wünschenswert, das gemeinte Element über eine ihm charakteristische Eigenschaft wie einen Attributwert, zu adressieren. Für Android-Apps eignet sich hierfür häufig das Attribut &#039;&#039;resource-id&#039;&#039;. Im Idealfall muss bei der Entwicklung der App darauf geachtet werden, dass jedes Element eine eindeutige Id erhält. Die &#039;&#039;resource-id&#039;&#039; hat den großen Vorteil, dass sie unabhängig vom Text des Elements oder der Spracheinstellung des Geräts ist. Für iOS-Apps kann entsprechend das Attribut &#039;&#039;name&#039;&#039; verwendet werden, wenn es von der App sinnvoll gesetzt wird. Der XPath-Standard erlaubt solche Auswahlbedingungen zu einem Element anzugeben. Angenommen, der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Eigenschaft &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;off&#039;&#039; und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; hat als &#039;&#039;resource-id&#039;&#039; den Wert &#039;&#039;on&#039;&#039;, dann kann man als eindeutigen Pfad für den &amp;quot;Aus&amp;quot;-&#039;&#039;Button&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[@resource-id=&#039;off&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
formulieren. Wie an dem Beispiel zu sehen werden solche Bedingungen wie ein Index in eckigen Klammern an den Elementtyp angehängt. Der Name eines Attributes wird mit einem @ eingeleitet und der Wert mit einem = in Anführungszeichen angehängt. Ist der Attributwert global eindeutig, kann man den vorausgehenden Pfad sogar durch den globalen Platzhalter * ersetzen, der auf jedes Element passt. Das obige Beispiel mit dem GTIN-13-&#039;&#039;Button&#039;&#039; war ein solcher Fall.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum2.png | frame | Abb. 3: Elementbaum einer fiktiven App mit Erweiterungen]]&lt;br /&gt;
&lt;br /&gt;
Abb. 3 zeigt eine Erweiterung des Beispiels aus Abb. 2. Die App hat nun ein weiteres, nahezu identisches &#039;&#039;LinearLayout&#039;&#039; bekommen. Die &#039;&#039;Buttons&#039;&#039; sind in ihren Attributen jeweils ununterscheidbar. Deshalb funktioniert der vorige Ansatz nicht, einen eindeutigen Pfad nur mithilfe eines Attributwerts zu formulieren. Offensichtlich unterscheiden sich aber ihre benachbarten &#039;&#039;TextViews&#039;&#039;. Es ist möglich die jeweilige &#039;&#039;TextView&#039;&#039; in den Pfad mit aufzunehmen, um einen &#039;&#039;Button&#039;&#039; dennoch eindeutig zu adressieren. Ein Pfad zum &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; unterhalb der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; kann dabei wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView[@resource-id=&#039;push&#039;]/../android.widget.Button[@resource-id=&#039;on&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Teil beschreibt den Pfad zu der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; und der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;push&#039;&#039;. Danach folgt ein Schrägstrich gefolgt von zwei Punkten. Die zwei Punkte sind eine spezielle Elementbezeichnung, die nicht ein Kindelement benennt, sondern zum Elternelement wechselt, in diesem Fall also das &#039;&#039;LinearLayout&#039;&#039;, in dem die &#039;&#039;TextView&#039;&#039; eingebettet ist. Im Kontext dieses &#039;&#039;LinearLayout&#039;&#039; ist der restliche Pfad, nämlich der &#039;&#039;Button&#039;&#039; mit der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;on&#039;&#039;, eindeutig.&lt;br /&gt;
&lt;br /&gt;
Der XPath-Standard bietet noch sehr viel mehr Ausdrucksmittel. Mit der hier knapp vorgestellten Auswahl ist es aber bereits möglich für die meisten praktischen Testfälle gute Pfade zu formulieren. Eine vollständige Einführung in XPath ginge über den Umfang dieser Einführung weit hinaus. Sie finden zahlreiche weiterführende Dokumentationen im Web und in Büchern.&lt;br /&gt;
&lt;br /&gt;
Eine universelle Strategie zum Erstellen guter XPaths gibt es nicht, da sie von den Testanforderungen abhängt. In der Regel ist es sinnvoll, den XPath kurz und dennoch eindeutig zu halten. Häufig lassen sich Elemente über Eigenschaften identifizieren wie beispielsweise ihren Text. Will man aber gerade den Text eines Elements auslesen, kann dieser natürlich nicht im Pfad verwendet werden, da er vorher nicht bekannt ist. Ebenso wird der Text variieren, wenn die App mit verschiedenen Sprachen gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Jeder Baustein, der auf einem Element arbeitet, hat einen Eingangspin für den XPath. Im GUI-Browser finden Sie in der Mitte oben eine Liste von Bausteinen mit Aktionen, die Sie auf das ausgewählte Element anwenden können. Suchen Sie den Baustein &#039;&#039;Click&#039;&#039; (8) im Ordner Elements und wählen Sie ihn aus (Abb. 1). Er wird im rechten Teil unter &#039;&#039;Test&#039;&#039; eingefügt, der Pin für den XPath ist mit dem automatisch generierten Pfad des Elements vorbelegt (9). Sie können den Baustein hier auch ausführen. Die Ansicht wechselt dann auf &#039;&#039;Lauf&#039;&#039;. Ändert sich durch die Aktion der Zustand Ihrer App, müssen Sie den Baum anschließend aktualisieren (10).&lt;br /&gt;
&lt;br /&gt;
Wenn Sie in der unteren Liste eine Eigenschaft auswählen, wechselt die Anzeige der Bausteine zu &#039;&#039;Eigenschaften&#039;&#039;, wo Sie die eigenschaftsbezogenen Bausteine finden. Wie bei den Aktionen können Sie auch hier einen Baustein auswählen, der dann rechts in Test mit dem Pfad des Elements und der ausgewählten Eigenschaft eingetragen wird, sodass Sie ihn direkt ausführen können.&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span id=&amp;quot;troubleshooting&amp;quot;&amp;gt;&amp;lt;!-- Referenced by error dialog on connection error --&amp;gt;&amp;lt;/span&amp;gt;Problems and Solutions=&lt;br /&gt;
== Locators depend on the version or are variable ==&lt;br /&gt;
In this case consider to either store the locators (xPath) in a variable or to define a locator mapping inside a screenplay attachment. It is also possible to store just parts of an locator (e.g. locator path of a parent or attribute value) in a variable and add them in the freeze value of the locator pin by &amp;quot;&#039;&#039;$(varName)&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Invisible UI Elements ==&lt;br /&gt;
Note that the [[#Recorder|Recorder]] also considers items that you cannot see on the screen. Therefore, turn on element highlighting or use the follow mouse function and the element tree in the GUI browser to determine if the correct element is used. It can happen, that invisible elements are in front of other elements and cover them, so that the desired element cannot be selected in the recorder. See section [[#Hide_elements|Hide elements]] for a solution to this.&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;org.openqa.selenium.StaleElementReferenceException&#039;&#039;==&lt;br /&gt;
The error &amp;lt;code&amp;gt;org.openqa.selenium.StaleElementReferenceException&amp;lt;/code&amp;gt; occurs whenever an element is used that is no longer there. If that happens during your test and the element should have been there, try using the locator (xPath) instead to fetch the element again.&lt;br /&gt;
&lt;br /&gt;
In some cases this error can also occur even if you already use a locator at the action block. This is because the locator is always resolved first and the corresponding element is fetched and the action is then executed with this element. If the app refreshes the element exactly between the resolving and fetching part and the execution, creating a new element, this error occurs. If it happens at a specific point in your test, your best option is to catch the error and retry.&lt;br /&gt;
&lt;br /&gt;
== iOS: Cable not certified ==&lt;br /&gt;
In some cases, when connecting an iOS device via USB, a message appears indicating that the cable used is not certified. In this case, replacing the respective cable is the only solution.&lt;br /&gt;
&lt;br /&gt;
== iOS: Alerts when connecting ==&lt;br /&gt;
Make sure that no alerts are open when connecting to an iOS device. Otherwise the connection will fail because the app cannot be brought to the foreground. See also [[#Preparing_an_iOS-Device_and_App|Preparing an iOS-Device and App]].&lt;br /&gt;
&lt;br /&gt;
== iOS: .ipa cannot be installed ==&lt;br /&gt;
Note that on iOS simulators no &#039;&#039;.ipa&#039;&#039; files can be installed but only &#039;&#039;.app&#039;&#039; files.&lt;br /&gt;
&lt;br /&gt;
==iOS: First Connect is not working==&lt;br /&gt;
If there is not already a signed build of the WebDriverAgent on your Mac, it has to be created during the first connect. Usually, this can take a little longer than one minute. Per default Appium uses a timeout of 60000&amp;amp;nbsp;ms to wait for the WebDriverAgent to start on the device, so the connect will be canceled in that case. You can set this timeout with the capability &#039;&#039;wdaLaunchTimeout&#039;&#039;, e.g. to &#039;&#039;120000&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Moreover, the signing settings have to be correct. In our experience, the most reliable solution is to set automatic signing in the WebDriverAgent Xcode project an selecting the team there. See the explanation in section [[#Signing_WebDriverAgent|Signing WebDriverAgent]] for that. In this case you should &#039;&#039;&#039;not&#039;&#039;&#039; use the capabilities &#039;&#039;xcodeConfigFile&#039;&#039; resp. &#039;&#039;xcodeOrgId&#039;&#039; and &#039;&#039;xcodeSigningId&#039;&#039;, as they could cause a conflict. Caution: If you have set a Team ID in the Mobile Testing settings, expecco will automatically set this as &#039;&#039;xcodeOrgId&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
Pay attention to your device during the first connect. You might have to agree to the installation by entering your password. On the Mac you might need to enter the password to allow access to the key chain for signing, often several times.&lt;br /&gt;
&lt;br /&gt;
== Android: Device not visible in the connect editor ==&lt;br /&gt;
If an Android device connected via USB does not appear in the connection editor, try changing the USB connection type. Usually MTP or PTP should work. Check again, if &amp;quot;USB Debugging&amp;quot; is enabled in the developer options on the device (these options are disabled on some devices and have to be enabled first using a trick.) See also [[#Prepare_Android_Device|Prepare Android Device]].&lt;br /&gt;
&lt;br /&gt;
== Android: Truncated Elements at Bottom ==&lt;br /&gt;
For Android devices that automatically show and hide the navigation bar/softkeys, the recorder may cut off elements in the lower area that would be hidden by the softkeys, even if they are not displayed at this time. In this case it is advisable to set the softkeys so that they are permanently displayed.&lt;br /&gt;
&lt;br /&gt;
For newer Android versions there usually is no such option. Even if the controls are visible all the time, they don&#039;t have their own space, but are on top of the content of the app. Therefore, there is an area on the lower part of the screen, which cannot be automated, because it is not counted to the active area of the app. Appium will then truncate the elements there. This area can even be larger then the needed by the controls. This is a known issue for Samsung devices with Android 11. Since the information about the size of the app area is already provided on Android level, we cannot offer a solution for this, but can only hope that the problem will be fixed by the manufacturer. You may try to get better results by setting the control to gestures, but this bears the same issue.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;waitForIdleTimeout&amp;quot;&amp;gt;&amp;lt;!-- Referenced by expecco--&amp;gt;&amp;lt;/span&amp;gt; Android: Test Hangs While Finding an Element==&lt;br /&gt;
The block &#039;&#039;Find Element by XPath&#039;&#039; and all element blocks wait until an element is present for the given path. The timeout for this can be set either directly at the block or in the environment variables. However, if the element should already be present, but the test doesn&#039;t continue anyway, the reason could be in the UIAutomator/UIAutomator2. It waits for the app to go to the idle state before it even starts to search for the element. This may take longer, if the app e.g. runs an animation in the background or executes other kinds of actions. Fetching the page source, e.g. when updating in the GUI browser or in the recorder, can also take longer for this reason. There is a default timeout of 10 seconds after which it no longer waits for the idle state. This timeout can be set in Appium (waitForIdleTimeout). If you want to change the value of this timeout, you can do this since expecco 21.2 by executing the Smalltalk code &amp;lt;code&amp;gt;AppiumTestRunner::TestRunConnection waitForIdleTimeout:2000&amp;lt;/code&amp;gt; before the test. The timeout is given in milliseconds, so the example sets it to 2 seconds.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;startChromedriverTimeout/&amp;gt;Android: Updating the Tree or Switching to Webview Context takes too long==&lt;br /&gt;
Especially with older devices it can happen that newer Chromedriver cannot be initialized. This makes it impossible to switch to the webview context. However, this is only detected over a timeout by Appium, which is 4 minutes by default. Since expecco also tries to switch to the webview context when building the tree in the GUI browser, this can lead to very long loading times. Since there is no way to decrease this timeout in Appium, we have added a corresponding capability to the version we provide in the MobileTestingSupplement. Starting with version 1.13.1.0 of the [[#Windows|MobileTestingSupplement]], &#039;&#039;chromedriverStartTimeout&#039;&#039; can be used to set the timeout in milliseconds. The switch still doesn&#039;t work then, but expecco doesn&#039;t take as long to update the tree and the context switch module fails faster. The connection dialog adds this capability automatically starting with expecco 22.1. &lt;br /&gt;
&lt;br /&gt;
== No Action on Click ==&lt;br /&gt;
The block to click on an element is successful, but no action was performed on the device.&lt;br /&gt;
:This can happen if the element is hidden by another element and therefore clicking on the element is not possible. In this case, Appium does not throw an error, but simply nothing happens. If you would like to make a click at the position of the element anyways, even if it is hidden, use the block &#039;&#039;Tap&#039;&#039; instead and pass the location of the element to it (&#039;&#039;Get Location&#039;&#039;). If instead you want to check before a click whether the element is hidden at this moment, try whether the properties &#039;&#039;Is Displayed&#039;&#039; or &#039;&#039;Is Enabled&#039;&#039; might help you.&lt;br /&gt;
&lt;br /&gt;
== No Update After Action ==&lt;br /&gt;
An action was triggered on the recorder and a block has been recorded, but the recorder still shows the old image.&lt;br /&gt;
:The recorder doesn&#039;t show a live image of the device, but only a snapshot. After an action has been executed, the recorder will update automatically. However, it can happen, that the image has already been updated before the effects of the action are fully completed on the device. In this case you should update the recorder by hand using the icon with the blue arrows. Since expecco 20.2 you can also enable automatic updates for this case. See also the description for the [[#Recorder|recorder]].&lt;br /&gt;
&lt;br /&gt;
== Attribute &amp;quot;clickable&amp;quot; is wrong ==&lt;br /&gt;
An element has for the attribute/property &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; the value &amp;quot;&#039;&#039;false&#039;&#039;&amp;quot;, but is actually clickable.&lt;br /&gt;
:The attribute &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; has to be set explicitly by the app developer and does not affect the behavior of the app. You should generally disregard this attribute in your tests. Unfortunately, many apps exist where the programmer was &amp;quot;lazy&amp;quot; about this.&lt;br /&gt;
&lt;br /&gt;
==Connecting Fails==&lt;br /&gt;
If the connection to the Appium server fails, you will receive an error message in expecco similar to the one shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:MobileTestingVerbindungsfehler.png]]&lt;br /&gt;
&lt;br /&gt;
Here you can see the type of error that has occurred. Click on &amp;quot;&#039;&#039;Details&#039;&#039;&amp;quot; to get more information. Possible errors are:&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.remote.UnreachableBrowserException&#039;&#039;&lt;br /&gt;
:The specified server is not running or is not reachable. Check the server address.&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.WebDriverException&#039;&#039;&lt;br /&gt;
:Read the message after &#039;&#039;Original Error&#039;&#039; in the first line of the details:&lt;br /&gt;
:*&#039;&#039;Unknown device or simulator UDID&#039;&#039;&lt;br /&gt;
::Either the device is not connected properly or the udid is not correct.&lt;br /&gt;
:*&#039;&#039;Unable to launch WebDriverAgent because of xcodebuild failure: xcodebuild failed with code 65&#039;&#039;&lt;br /&gt;
::This error can have various causes. Either the WebDriverAgent could actually not be built because the signing settings are wrong or the appropriate provisioning profile is missing. Please read the section about [[#Signing|Signing]].  It is also possible that the WebDriverAgent cannot be started on the device, for example because an alert is in the foreground or you did not trust the developer.&lt;br /&gt;
:*&#039;&#039;Could not install app: &#039;Command &#039;ios-deploy [...] exited with code 253&#039;&#039;&#039;&lt;br /&gt;
::The specified app cannot be installed on the iOS device because it is not entered in the app&#039;s Provisioning Profile.&lt;br /&gt;
:*&#039;&#039;Bad app: [...] App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name.&#039;&#039;&lt;br /&gt;
::The path to the app is wrong. Make sure that the file is located in the specified path on your Mac.&lt;br /&gt;
:*&#039;&#039;packageAndLaunchActivityFromManifest failed.&#039;&#039;&lt;br /&gt;
::The specified &#039;&#039;apk&#039;&#039; file is probably broken.&lt;br /&gt;
:*&#039;&#039;Could not find app apk at [...]&#039;&#039;&lt;br /&gt;
::The path to the app is wrong. Make sure that the &#039;&#039;apk&#039;&#039; file is located in the specified path.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the error is not due to one of the causes listed above, the automation applications on the device may no longer function properly. In this case it helps to uninstall them from the mobile device. They are then automatically reinstalled the next time a connection is established.&lt;br /&gt;
&lt;br /&gt;
*For iOS devices, this is the WebDriverAgent, which you can simply uninstall from the home screen. This usually solves problems caused by changing the used Mac or the Xcode version.&lt;br /&gt;
&lt;br /&gt;
*For Android devices, it is the UIAutomator2; here, a problem occurs sporadically on some devices, the cause is currently unknown to us. To uninstall, on the device, navigate to &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;Applications&#039;&#039;&amp;quot;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; and search the list for the following entries:&lt;br /&gt;
    Appium Settings&lt;br /&gt;
    io.appium.uiautomator2.server&lt;br /&gt;
    io.appium.uiautomator2.server.test&lt;br /&gt;
:Click on the respective application and then on &amp;quot;&#039;&#039;Uninstall&#039;&#039;&amp;quot;.&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&#039;&#039;The corresponding entry may have a slightly different name on some devices.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If this doesn&#039;t help, check the output of the Appium server. For a server started by expecco, you can find the log in the list of [[#Running_Appium_Servers|Running Appium Servers]].&lt;br /&gt;
&lt;br /&gt;
==I do not have a Mac==&lt;br /&gt;
Maybe this site will help you: [https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10 https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin&amp;diff=29663</id>
		<title>Mobile Testing Plugin</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin&amp;diff=29663"/>
		<updated>2024-07-24T14:27:16Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Windows */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Deutsche Version&#039;&#039;&#039; | [[Mobile_Testing_Plugin/en|English Version]]&lt;br /&gt;
&lt;br /&gt;
= Einleitung =&lt;br /&gt;
Mit dem &#039;&#039;Mobile Testing Plugin&#039;&#039; können Anwendungen auf Android- und iOS-Geräten getestet werden. Dabei ist es egal, ob reale mobile Endgeräte oder emulierte Geräte verwendet werden. Das Plugin kann (und wird üblicherweise) zusammen mit dem [[Expecco_GUI_Tests_Extension_Reference|GUI-Browser]] verwendet werden, der das Erstellen von Tests unterstützt. Zudem ist damit das Aufzeichnen von Testabläufen möglich.&lt;br /&gt;
&lt;br /&gt;
Zur Verbindung mit den Geräten wird [http://appium.io/ Appium] verwendet. Appium ist ein freies Open-Source-Framework zum Testen und Automatisieren von mobilen Anwendungen.&lt;br /&gt;
&lt;br /&gt;
Zur Einarbeitung in das Mobile Plugin empfehlen wir das [[Mobile_Testing_Tutorial|Tutorial]] zu bearbeiten. Dieses führt anhand eines Beispiels Schritt für Schritt durch die Erstellung eines Testfalls und erklärt die nötigen Grundlagen.&lt;br /&gt;
&lt;br /&gt;
= Installation und Aufbau =&lt;br /&gt;
Zur Verwendung des Mobile Testing Plugins müssen Sie expecco inkl. des Plugins Mobile Testing installiert haben und Sie benötigen die entsprechenden Lizenzen. expecco kommuniziert mit den Mobilgeräten über einen Appium-Server, der entweder auf demselben Rechner wie expecco läuft, oder auf einem zweiten Rechner. Dieser muss für expecco erreichbar sein.&lt;br /&gt;
&lt;br /&gt;
==Installationsübersicht==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rechner, auf dem expecco läuft:&#039;&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rechner, an dem Android-Geräte angeschlossen sind:&#039;&#039;&#039;&lt;br /&gt;
* Appium-Server&#039;&#039;, diesen können Sie über das Mobile Testing Supplement installieren (s.u.), von dem wir regelmäßig einen neue Version zur Verfügung stellen&#039;&#039;&lt;br /&gt;
* Android SDK&#039;&#039;, dieses erhalten Sie ebenfalls mit dem Mobile Testing Supplement&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rechner, an dem iOS-Geräte angeschlossen sind&amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
* Appium-Server&#039;&#039;, diesen können Sie über das Mobile Testing Supplement für Mac OS installieren (s.u.), von dem wir regelmäßig einen neue Version zur Verfügung stellen&#039;&#039;&lt;br /&gt;
* Xcode &#039;&#039;in einer Version, die die verwendete iOS-Version unterstützt, erhältlich über den Apple App Store&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
* Apple-Entwickler-Zertifikat mit zugehörigem privaten Schlüssel &#039;&#039;(zum Signieren des WebDriverAgents)&#039;&#039;&lt;br /&gt;
* Provisioning Profile mit den verwendeten Mobilgeräten&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Je nach Aufbau können die oben genannten Rechner auch das selbe Gerät sein. expecco kann sich sowohl über das Netzwerk mit einem entfernten Appium-Server und dort angeschlossenen Mobilgeräten verbinden, als auch lokal selbst einen Appium-Server starten und diesen mit lokalen Mobilgeräten verwenden. Einige Funktionen von expecco, die die Erstellung von Testfällen erleichtern, sind jedoch nur verfügbar, wenn die Mobilgeräte am selben Rechner angeschlossen sind, auf dem auch expecco läuft. Ein möglicher Aufbau kann daher wie in folgender Abbildung aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAufbau.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird die Installation von Appium und anderer nötiger Programme für Windows und Mac OS erklärt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;: Zum Zeitpunkt der Erstellung dieses Dokuments wurden Versionen bis 11 auf Funktion verifiziert. Neuere Versionen sollten - sofern nicht grundlegende Änderungen von Oracle vorgenommen wurden, ebenfalls funktionieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;: Beachten Sie, dass aufgrund der Voraussetzungen (keine Anbindung an nicht-Apple Geräte verfügbar) iOS-Geräte nur von einem Mac aus angesteuert werden können. Sie benötigen also einen Mac als &amp;quot;Vermittler&amp;quot; (siehe auch unten: [[#Ich habe keinen Mac | &amp;quot;Ich habe keinen Mac&amp;quot;]])&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
Am einfachsten installieren Sie alles mit unserem Mobile Testing Supplement&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;. In neueren Versionen ist allerdings aufgrund geänderter Lizenzbedingungen seitens Oracle kein JDK mehr enthalten, sodass sie dieses zusätzlich installieren müssen. Sie können natürlich Appium auch direkt installieren, um die Version zu verwenden, die Sie möchten. Um dann einen Appium-Server mit expecco starten zu können, muss allerdings eine entsprechende Batchdatei vorhanden sein und in den [[Mobile_Testing_Plugin#Konfiguration_des_Plugins|Einstellungen]] angegeben werden. Verbindungen können aber auch zu anderen laufenden Appium-Servern aufgebaut werden.&lt;br /&gt;
*&#039;&#039;&#039;expecco 24.1&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-24.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.3]&lt;br /&gt;
:Im Vergleich zum Vorgänger aktualisierte Chromedriver Versionen.&lt;br /&gt;
*expecco 23.2: [https://download.exept.de/transfer/h-expecco-23.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.2]&lt;br /&gt;
:Im Vergleich zum Vorgänger aktualisierte Chromedriver Versionen.&lt;br /&gt;
*expecco 23.1: [https://download.exept.de/transfer/h-expecco-23.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.1]&lt;br /&gt;
:Gleiche Versionen wie der Vorgänger, aber der Installer erlaubt nun, Appium zum Autostart hinzuzufügen.&lt;br /&gt;
*expecco 22.2 und 22.1: [https://download.exept.de/transfer/h-expecco-22.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.2.0]&lt;br /&gt;
:Appium 1.22.3*&lt;br /&gt;
:Node 14.17.5&lt;br /&gt;
:adb 1.0.41 aus platform-tools 33.0.2&lt;br /&gt;
:&#039;&#039;* Wir haben Appium um die Capability&#039;&#039; chromedriverStartTimeout &#039;&#039;erweitert, um schneller einen Timeout zu bekommen, wenn der Chromedriver nicht gestartet werden kann. (siehe [[#startChromedriverTimeout|Probleme und Lösungen]])&#039;&#039;&lt;br /&gt;
*expecco 21.2: [https://download.exept.de/transfer/h-expecco-21.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.12.0.0]&lt;br /&gt;
:Enthält die Appium-Version 1.22.0, Node ist weiterhin in der Version 12.13.1.&lt;br /&gt;
*expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.1.0]&lt;br /&gt;
:Nur kleine Änderungen im Vergleich zur vorigen Version.&lt;br /&gt;
*expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.0.0]&lt;br /&gt;
:Im Vergleich zur vorigen Version wurde Appium auf die Version 1.16.0-rc.1 aktualisiert und node 12 verwendet. &lt;br /&gt;
*expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.8.1.0]&lt;br /&gt;
:Dieses installiert Appium in der Version 1.12.0 und enthält nun zusätzlich build-tools der Version 28.0.3 im android-sdk. Ansonsten ist es gleich wie die vorige Version.&lt;br /&gt;
*expecco 18.2: [http://download.exept.de/transfer/h-expecco-18.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.7.3.0]&lt;br /&gt;
:Dieses installiert Appium in der Version 1.8.1. Außerdem bietet das Supplement auch an, &#039;&#039;Android Debug Bridge&#039;&#039; und &#039;&#039;Google USB Driver&#039;&#039; ([https://gsmusbdrivers.com/download/adb-fastboot-drivers/ adb-setup-1.4.3]) zu installieren. Damit sind Treiber für ein breites Spektrum an Android-Geräten abgedeckt, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen. Ein &#039;&#039;&#039;JDK ist (aufgrund geänderter Lizenzbedingungen seitens Oracle) nicht mehr enthalten&#039;&#039;&#039;, dieses müssen Sie selbst herunterladen, z.B. von [https://www.oracle.com/technetwork/java/javase/downloads/index.html Oracle].&lt;br /&gt;
*expecco 18.1: wie expecco 2.11&lt;br /&gt;
*expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/MobileTestingSupplement_1.6.0.2_Setup.exe Mobile Testing Supplement 1.6.0.2]&lt;br /&gt;
:Dieses installiert ein Java JDK der Version 8, android-sdk und Appium in der Version 1.6.4. Außerdem bietet das Supplement auch einen universellen adb-Treiber ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]) an. Dieser vereint Treiber für ein breites Spektrum an Android-Geräten, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen.&lt;br /&gt;
*expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_1.5.0.0_Setup.exe Mobile Testing Supplement 1.5.0.0]&lt;br /&gt;
:Dieses installiert ein Java JDK der Version 8, android-sdk und Appium in der Version 1.4.16. Während der Installation wird die grafische Oberfläche von Appium gestartet, dieses Fenster können Sie sofort wieder schließen. Außerdem bietet das Supplement auch einen universellen adb-Treiber ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]) an. Dieser vereint Treiber für ein breites Spektrum an Android-Geräten, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen.&lt;br /&gt;
&lt;br /&gt;
Wenn expecco Mobilgeräte verwenden soll, die an einem anderen Rechner angeschlossen sind, müssen Sie dort einen Appium-Server starten. Dies können Sie mit der Datei &amp;lt;code&amp;gt;appium_standalone.cmd&amp;lt;/code&amp;gt; tun. Der Server wird dann mit dem Standard-Port 4723 gestartet. Falls Sie eine andere Portnummer verwenden wollen, starten Sie den Server mit&lt;br /&gt;
&lt;br /&gt;
 appium_standalone.cmd -p &amp;lt;portnummer&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Server ist bereit, sobald die Zeile&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Appium REST http interface listener started on 0.0.0.0:4723&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
angezeigt wird, wobei Sie am Ende die verwendete Portnummer ablesen können.&lt;br /&gt;
&lt;br /&gt;
Beim ersten Starten von Appium – sowohl im Standalone als auch gestartet von expecco – kann es vorkommen, dass die Windows-Firewall den Node-Server blockiert. Lassen Sie den Zugriff zu, sonst kann Appium nicht gestartet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;) Sie können natürlich auch die Command Line Tools (adb, sdkmanager, avdmanager etc.) einer vorhandenen Android Studio Version verwenden, sowie Appium separat installieren.&lt;br /&gt;
Da sich diese Tools regelmäßig ändern, und es in der Vergangenheit zu Inkompatibilitäten und Fehlern nach Releasewechseln kam, empfehlen wir zu Beginn, das mitgelieferte Paket zu verwenden. Dies ist möglicherweise nicht das aktuellste, wurde aber auf Lauffähigkeit getestet.&lt;br /&gt;
&lt;br /&gt;
Falls das Android Mobilgerät an einem entfernen Rechner angeschlossen ist,&lt;br /&gt;
können Sie den aktuellen Bildschirminhalt z.B. mit dem [https://github.com/Genymobile/scrcpy scrcpy] tool live mitverfolgen.&lt;br /&gt;
&lt;br /&gt;
== Mac OS (nicht erforderlich für Android-Tests)==&lt;br /&gt;
Hinweis: Wenn Sie nicht vorhaben, iOS-Geräte (iPhone, iPad, etc.) zu testen, können Sie das Folgende ignorieren. &#039;&#039;&#039;Der Apple-Rechner sowie das Mac-Setup werden für Android-Geräte nicht benötigt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Xcode ===&lt;br /&gt;
Zur Automatisierung mit iOS-Geräten wird [https://developer.apple.com/xcode/ Xcode] benötigt. Sie erhalten dieses über den App Store. Dabei ist darauf zu achten, dass die Version zu den getesteten iOS-Versionen passt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;iOS&#039;&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp;  &lt;br /&gt;
|&#039;&#039;&#039;Xcode&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;macOS&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|10.x&lt;br /&gt;
|8.x&lt;br /&gt;
|10.12 (Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|11.x&lt;br /&gt;
|9.x&lt;br /&gt;
|10.13 (High Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|12.x&lt;br /&gt;
|10.x&lt;br /&gt;
|10.14 (Mojave)&lt;br /&gt;
|-&lt;br /&gt;
|13.x&lt;br /&gt;
|11.x&lt;br /&gt;
|10.15 (Catalina)&lt;br /&gt;
|-&lt;br /&gt;
|14.x&lt;br /&gt;
|12.x&lt;br /&gt;
|11.0 (Big Sur)&lt;br /&gt;
|-&lt;br /&gt;
|15.x&lt;br /&gt;
|13.x&lt;br /&gt;
|12.0 (Monterey)&lt;br /&gt;
|-&lt;br /&gt;
|16.x&lt;br /&gt;
|14.x&lt;br /&gt;
|12.5 (Monterey)&lt;br /&gt;
|}&lt;br /&gt;
Diese Tabelle gibt nur eine vereinfachte Übersicht, lesen Sie besser unter [https://xcodereleases.com/ Xcode Releases] oder [https://en.wikipedia.org/wiki/Xcode#Version_comparison_table Xcode-Versionen] welche Version Sie brauchen. Für neue iOS Minor-Versionen gibt es in der Regel auch ein Update für Xcode, z.B. brauchen Sie für iOS 10.2 mindestens Xcode 8.2, für iOS 10.3 mindestens Xcode 8.3 usw. &lt;br /&gt;
Wenn Sie also auf eine neuere iOS-Version wechseln, benötigen Sie in der Regel auch eine neuere Xcode-Version. Neuere Versionen von Xcode laufen möglicherweise nicht auf älteren Betriebssystemen, was wiederum eine Aktualisierung des Betriebssystems erforderlich machen kann. Falls Sie auch ältere iOS-Versionen testen wollen kann es sinnvoll sein, die entsprechenden Xcode-Versionen parallel zu installieren.&lt;br /&gt;
&lt;br /&gt;
=== Appium ===&lt;br /&gt;
Der Appium-Server kann entweder als Kommandozeilen-Anwendung installiert werden oder über [https://github.com/appium/appium-desktop Appium Desktop] verwendet werden, welcher den Server über ein GUI zur Verfügung stellt. Mittlerweile gibt es auch Appium 2.0, was wir aber bisher noch nicht mit expecco getestet haben und daher nicht empfehlen.&lt;br /&gt;
&lt;br /&gt;
==== Appium Desktop ====&lt;br /&gt;
Laden Sie die neueste Version von [https://github.com/appium/appium-desktop/releases/ Appium Desktop] herunter. Für den Mac nehmen Sie am besten die dmg-Datei und installieren sie in den Anwendungen. Beim Starten der Anwendung &#039;&#039;Appium Server GUI&#039;&#039; erhalten Sie wahrscheinlich eine Fehlermeldung, dass es aus Sicherheitsgründen nicht möglich ist. Öffnen Sie dann das Kontextmenü auf der Anwendungsdatei (Rechtsklick bzw. Strg + Klick) und wählen Sie dort &#039;&#039;Öffnen&#039;&#039; aus. Bestätigen Sie dann, dass Sie die Anwendung wirklich öffnen wollen. Fortan können Sie die Anwendung normal öffnen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:OpenAppiumServerGUI1.png|text-top]] [[Datei:OpenAppiumServerGUI2.png|text-top]]&lt;br /&gt;
&lt;br /&gt;
Ab Xcode 14 gibt es Probleme beim Signieren des WebDriverAgents, den Appium zur Automatisierung auf das Gerät spielt. Dadurch ist mit der Version 1.22.3-4 von Appium Desktop kein Verbindungsaufbau möglich. Das Problem ist in neueren Versionen des WebDriverAgents behoben, es gibt aber aktuell noch keine Version von Appium Desktop, die eine solche Version enthält (Stand November 2022). Sie können aber manuell eine neue Version herunterladen (z.B. 4.10.2)  und die Dateien in Appium ersetzen. Laden Sie dazu von der [https://github.com/appium/WebDriverAgent/releases/ WebDriverAgent Download-Seite] eine der beiden Archivdateien (zip oder tar.gz) mit dem Source Code herunter. Öffnen und entpacken Sie dann diese Datei. Den Inhalt des Ordners WebDriverAgent-4.10.2 müssen Sie nun nach&lt;br /&gt;
&lt;br /&gt;
 /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
kopieren. Wenn Sie über den Finder dorthin navigieren, machen Sie auf die Anwendung &#039;&#039;Appium Server GUI&#039;&#039; einen Kontextklick (Rechtsklick bzw. Strg + Klick) und wählen Sie im Menü &#039;&#039;Paketinhalt anzeigen&#039;&#039;. Ersetzen Sie alle Dateien, die bereits mit gleichem Namen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
==== Appium über npm installieren ====&lt;br /&gt;
Sie können Appium auch über npm (Node Package Manager) installieren. Dazu müsen Sie erst node/npm installieren. Das geht mit [https://github.com/nvm-sh/nvm nvm] (Node Version Manager) was Sie von Github bekommen. Falls die folgende Installationsanleitung bei Ihnen nicht funktionieren sollte, finden Sie dort ausführlichere Informationen im [https://github.com/nvm-sh/nvm#readme Readme].&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie ein Terminal-Fenster. Klonen Sie dann das Github-Repository von nvm&lt;br /&gt;
 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash&lt;br /&gt;
und laden Sie es&lt;br /&gt;
 export NVM_DIR=&amp;quot;$([ -z &amp;quot;${XDG_CONFIG_HOME-}&amp;quot; ] &amp;amp;&amp;amp; printf %s &amp;quot;${HOME}/.nvm&amp;quot; || printf %s &amp;quot;${XDG_CONFIG_HOME}/nvm&amp;quot;)&amp;quot; [ -s &amp;quot;$NVM_DIR/nvm.sh&amp;quot; ] &amp;amp;&amp;amp; \. &amp;quot;$NVM_DIR/nvm.sh&amp;quot; # This loads nvm&lt;br /&gt;
&lt;br /&gt;
Führen Sie danach&lt;br /&gt;
 command -v nvm&lt;br /&gt;
aus, um zu testen, ob es funktioniert hat. Es sollte &#039;&#039;nvm&#039;&#039; ausgegeben werden. Kommt keine Antwort, führen Sie&lt;br /&gt;
 touch ~/.zshrc&lt;br /&gt;
aus, und versuchen Sie es erneut.&lt;br /&gt;
&lt;br /&gt;
Nun können Sie node mit dem folgenden Befehl installieren.&lt;br /&gt;
 nvm install 16.15.1&lt;br /&gt;
Da es mit der aktuellen Version von node Probleme beim Installieren von Appium gibt, empfehlen wir diese Version.&lt;br /&gt;
&lt;br /&gt;
Nachdem node installiert ist, können Sie Appium darüber installieren:&lt;br /&gt;
 npm install -g appium&lt;br /&gt;
&lt;br /&gt;
Den Appium-Server können Sie nun einfach über den Befehl&lt;br /&gt;
 appium&lt;br /&gt;
starten. Die Ausgabe erfolgt dann direkt im Terminal.&lt;br /&gt;
&lt;br /&gt;
Auch bei dieser Version gibt es das Problem bei der Signierung des WebDriverAgents, wie bei [[#Appium_Desktop | Appium Desktop]] beschrieben. Laden Sie also auch in diesem Fall eine neuere Version des WebDriverAgents herunter und ersetzen Sie die alten Dateien. Diese finden Sie unter&lt;br /&gt;
 /Users/&amp;lt;user&amp;gt;/.nvm/versions/16.15.1/lib/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
==== Mobile Testing Supplement ====&lt;br /&gt;
Ältere Appium-Versionen stellen wir Ihnen über das Mobile Testing Supplement für Mac OS zur Verfügung, mit dem Sie es einfach installieren können:&lt;br /&gt;
* &#039;&#039;&#039;expecco 20.2&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-20.2.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement für Mac OS (1.2.2)]&lt;br /&gt;
:Enthält Appium Version 1.18.3 und verwendet node 14.&lt;br /&gt;
&lt;br /&gt;
* expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement für Mac OS (1.2.0)]&lt;br /&gt;
:Nur wenige Änderungen im Vergleich zur vorigen Version.&lt;br /&gt;
&lt;br /&gt;
* expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement_for_MacOS.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.98)]&lt;br /&gt;
:Im Vergleich zur vorigen Version wurde Appium auf die Version 1.16.0-rc.1 aktualisiert und es wird node 12 verwendet. &lt;br /&gt;
&lt;br /&gt;
* expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.96.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.96)]&lt;br /&gt;
:Diese Version enthält Appium 1.12.0. &lt;br /&gt;
&lt;br /&gt;
* expecco 18.1: [http://download.exept.de/transfer/h-expecco-18.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.94.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.94)]&lt;br /&gt;
:Diese Version enthält Appium 1.8.0.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/Mobile_Testing_Supplement_for_Mac_OS_1.0.94.tar.bz2 Mobile Testing Supplement für Mac OS (1.0.94)]&lt;br /&gt;
:Diese Version enthält Appium 1.6.4.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_for_Mac_OS_1.0.tar.bz2 Mobile Testing Supplement für Mac OS]&lt;br /&gt;
:Diese Version entält Appium 1.4.16.&lt;br /&gt;
&lt;br /&gt;
Nachdem Herunterladen des Supplements, können Sie es in ein Verzeichnis Ihrer Wahl (z. B. Ihr Home-Verzeichnis) verschieben und dort entpacken. Ein geeigneter Befehl in einer Shell könnte wie folgt aussehen, passen Sie dabei die Versionsnummer entsprechend an:&lt;br /&gt;
&lt;br /&gt;
 tar -xvpf Mobile_Testing_Supplement_for_Mac_OS_1.1.98.tar.bz2&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Ihre Standard-Xcode-Installation verwenden wollen, können Sie Appium direkt über die Datei im &#039;&#039;bin&#039;&#039;-Verzeichnis mit der entsprechenden Versionsnummer starten:&lt;br /&gt;
&lt;br /&gt;
 Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
Falls Sie ein anderes Xcode als das als Standard konfigurierte verwenden wollen, müssen Sie Appium den entsprechenden Pfad über die Umgebungsvariable &#039;&#039;DEVELOPER_DIR&#039;&#039; angeben. &lt;br /&gt;
Wenn Sie Xcode z. B. in &#039;&#039;/Applications/Xcode-11.3.app&#039;&#039; installiert haben, müssten Sie Appium so starten:&lt;br /&gt;
&lt;br /&gt;
 DEVELOPER_DIR=&amp;quot;/Applications/Xcode-11.3.app/Contents/Developer&amp;quot; Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
Was als Standard-Xcode-Installation gesetzt ist, zeigt der Befehl:&lt;br /&gt;
&lt;br /&gt;
 xcode-select -p&lt;br /&gt;
&lt;br /&gt;
Wenn Appium Ihre Xcode-Installation nicht findet, erscheint beim Verbinden eine Fehlermeldung in der Art:&lt;br /&gt;
&#039;&#039;&amp;lt;blockquote&amp;gt;org.openqa.selenium.SessionNotCreatedException - A new session could not be created. (Original error: Could not find path to Xcode, environment variable DEVELOPER_DIR set to: /Applications/Xcode.app but no Xcode found)&amp;lt;/blockquote&amp;gt;&#039;&#039;&lt;br /&gt;
Starten Sie in diesem Fall Appium erneut, unter Angabe eines gültigen &#039;&#039;DEVELOPER_DIR&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== WebDriverAgent-Signierung ====&lt;br /&gt;
Zur Automatisierung lädt Appium eine App namens WebDriverAgent auf das Gerät und muss sie dafür signieren können. Dazu brauchen Sie einen Apple-Account und ein entsprechendes Zertifikat. Zur Evaluierung können Sie einen kostenlosen Account verwenden. Dieser hat den Nachteil, dass erstellte Profile nur eine Woche gültig sind und danach neu erstellt werden müssen. Seien Sie auch vorsichtig, wenn Sie sich den Account teilen, da es vorkommen kann, dass Zertifikate widerrufen werden oder durch automatische Generierung ungültig werden. Als Folge können bereits signierte Apps nicht mehr verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie bereits ein entsprechendes Zertifikat mit dem zugehörigen privaten Schlüssel in Ihrer [https://support.apple.com/de-de/guide/keychain-access/welcome/mac Schlüsselbundverwaltung] auf dem Mac haben, können Sie den WebDriverAgent automatisch signieren lassen. Ansonsten empfiehlt es sich, die Signierung über Xcode einzustellen und zu verwalten.&lt;br /&gt;
&lt;br /&gt;
Schließen Sie zuerst das Gerät, das Sie verwenden möchten, über USB an den Mac an. Stellen Sie sicher, dass sich der Mac und das Gerät im selben Netzwerk befinden, ansonsten kann es beim Verbindungsaufbau mit Appium zu Problemen kommen. Starten Sie Xcode und öffnen Sie &#039;&#039;Preferences&#039;&#039;. Wechseln Sie zur Seite der Accounts und legen Sie einen Eintrag mit Ihrem Account an. Anschließend können Sie auf &#039;&#039;Manage Certificates...&#039;&#039; klicken, um die Zertifikate zu sehen, die zu diesem Account gehören. Zum Ausführen von Tests benötigen Sie ein iOS-Development-Zertifikat und den dazugehörigen privaten Schlüssel. Wenn Sie noch keines besitzen, erstellen Sie eines. Wenn Sie bereits eines haben, aber es nicht in Ihrem Schlüsselbund vorhanden ist (erkennbar an dem Hinweis &amp;quot;Not in Keychain&amp;quot;), können Sie es importieren. Das können Sie über die [https://support.apple.com/de-de/guide/keychain-access/welcome/mac Schlüsselbundverwaltung] auf dem Mac machen, wenn Sie es zuvor aus dem Schlüsselbund exportiert haben, in dem es sich befindet. Das Zertifikat mit dem zugehörigen Schlüssel sollte sich im Schlüsselbund &#039;&#039;Anmeldung&#039;&#039; befinden. Dort kann es als PKCS#12-Datei (Endung typischerweise .p12) exportiert werden. Um ein Zertifikat in Ihren Schlüsselbund zu importieren, wählen Sie im Menü &#039;&#039;Ablage&#039;&#039; die Option &#039;&#039;Objekte importieren&#039;&#039;. Falls Sie nicht wissen, wo das Zertifikat gespeichert ist, können Sie es in Xcode auch widerrufen und in Ihrem Schlüsselbund neu anlegen. Machen Sie das jedoch nur, wenn Sie wissen, dass das alte Zertifikat nicht mehr in Verwendung ist, da es danach nicht mehr benutzt werden kann. Nun sollte Ihr Schlüsselbund ein iOS-Development-Zertifikat enthalten.&lt;br /&gt;
&amp;lt;!---(Ich habe den folgenden Teil mal rausgenommen. Man braucht das nicht, wenn es in Xcode eingestellt ist.) Wählen Sie im Rechtsklick-Menü den Punkt &#039;&#039;Informationen&#039;&#039; aus. Unter den Details des Zertifikats finden Sie die Team-ID, die hier als Organisationseinheit bezeichnet wird. Tragen Sie diese in den Einstellungen des Plugins im Feld &#039;&#039;Team-ID&#039;&#039; ein, siehe [[#Konfiguration_des_Plugins|Konfiguration des Plugins]].--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie nun das WebDriverAgent-Projekt in Xcode. Wenn Sie das Mobile Testing Supplement installiert haben, finden Sie es in dessen Verzeichnis unter&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
Wenn Sie Appium Desktop installier haben, finden Sie es unter&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;/Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
Sie können einfach im Finder zu der Xcode-Project-Datei navigieren und Sie über einen Doppelklick öffnen. Beachten Sie dabei, dass Sie dabei auf die Anwendung Appium Server GUI einen Kontextklick (Rechtsklick bzw. Strg + Klick) machen und im Menü &#039;&#039;Paketinhalt anzeigen&#039;&#039; auswählen müssen, um in deren Unterverzeichnis zu gelangen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingWebDriverAgentXcode.png]]&lt;br /&gt;
&lt;br /&gt;
Wählen Sie &#039;&#039;WebDriverAgentLib&#039;&#039; und die Seite &#039;&#039;Signing &amp;amp; Capabilities&#039;&#039; aus. Setzen Sie dort im Abschnitt &#039;&#039;Signing&#039;&#039; die Option &#039;&#039;Automatically manage signing&#039;&#039; und wählen Sie dann ein Team aus. Wechseln Sie nun zu &#039;&#039;WebDriverAgentRunner&#039;&#039; und tun Sie dort dasselbe.&lt;br /&gt;
&amp;lt;!--(Das Folgende scheint nicht mehr aktuell zu sein.) Es sollten an dieser Stelle Fehler angezeigt werden, dass kein Provisioning Profile angelegt oder gefunden wurde. Wechseln Sie deshalb zur Seite &#039;&#039;Build Settings&#039;&#039; und suchen Sie hier im Abschnitt &#039;&#039;Packaging&#039;&#039; den Eintrag &#039;&#039;Product Bundle Identifier&#039;&#039;. Ändern Sie diesen von com.facebook.WebDriverAgentRunner zu etwas, das von Xcode akzeptiert wird, indem Sie den Präfix ändern. Xcode kann nun ein passendes Provisioning Profile generieren und die Fehler auf der General-Seite sollten verschwinden. Danach können Sie Xcode beenden. --&amp;gt;&lt;br /&gt;
Durch das Setzen des Teams sollten die Fehler für den WebDriverAgentRunner verschwinden. Sollte Xcode kein passendes Provisioning Profile für die Bundle ID &#039;&#039;com.facebook.WebDriverAgentRunner&#039;&#039; erstellen können, können Sie diese anpassen, dass sie zu Ihrem Zertifikat passt. Danach können Sie Xcode beenden oder auch, wie weiter unten beschrieben, direkt den Build über Xcode starten, damit das Projekt bereits gebaut ist, wenn Appium es verwenden möchte.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie sich nun von expecco eine Verbindung zu Ihrem Gerät aufbauen, wird der WebDriverAgent darauf installiert und gestartet, um anschließend zur zu testenden App zu wechseln. Eventuell muss auf dem Gerät muss der Ausführung des WebDriverAgents vertraut noch werden. Ein Anzeichnen dafür kann sein, dass die App WebDriverAgent zwar auf dem Gerät erscheint und zu starten versucht, danach aber wieder deinstalliert wird. Öffnen Sie dazu während des Verbindungsaufbaus auf dem Gerät in die Einstellungen und dort unter &#039;&#039;Allgemein&#039;&#039; den Eintrag &#039;&#039;Geräteverwaltung&#039;&#039;. Dieser Eintrag ist nur sichtbar, wenn eine Entwickler-App auf dem Gerät installiert ist. Sie müssen daher möglicherweise warten, bis der WebDriverAgent installiert ist, bevor der Eintrag erscheint. Wählen Sie dort den Eintrag Ihres Apple-Accounts und vertrauen Sie ihm. Da der WebDriverAgent wieder deinstalliert wird, wenn der Start nicht funktioniert hat, müssen Sie dies während des Verbindungsaufbaus tun. Falls Ihnen das zu hektisch ist, können Sie auch folgenden Code ausführen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;xcodebuild -project Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
  xcodebuild -project /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&lt;br /&gt;
&lt;br /&gt;
Damit wird der WebDriverAgent auf dem Gerät installiert ohne dass er wieder gelöscht wird.&lt;br /&gt;
&lt;br /&gt;
Wenn es Probleme beim Installieren des WebDriverAgents gibt, können Sie auch versuchen, den Build über Xcode zu starten. Stellen Sie sicher, dass das richtige Target &#039;&#039;WebDriverAgent&#039;&#039; ausgewählt ist. Fehlermeldungen in Xcode zeigen vielleicht einfacher, wo das Problem liegt. Manchmal hilft es auch, es ein zweites Mal zu versuchen, weil es möglicherweise beim ersten Mal zu lange gedauert hat und abgebrochen wurde. Es kann sein, dass Sie während des Builds mehrmals aufgefordert werden, das Passwort für Ihren Schlüsselbund anzugeben.&lt;br /&gt;
&lt;br /&gt;
[[Datei:WebDriverAgentCodesign.png]]&lt;br /&gt;
&lt;br /&gt;
Lesen Sie auch die Dokumentation von Appium zum [https://github.com/appium/appium-xcuitest-driver/blob/master/docs/real-device-config.md Aufsetzen von Tests mit iOS-Geräten]. In der [https://support.apple.com/en-us/HT204460 Dokumentation von Apple] finden Sie nähere Informationen zum Installieren und Vertrauen von Apps.&lt;br /&gt;
&lt;br /&gt;
Ist der WebDriverAgent einmal auf dem Gerät installiert, wird er für spätere Verbindungen wieder verwendet und der Verbindungsaufbau sollte schneller funktionieren. Ebenso liegt dann die signierte Version bereits auf Ihrem Mac und muss nicht erneut gebaut werden, was die Verbindung zu weiteren Geräten ebenfalls beschleunigt. Wenn Sie wissen, dass bei Ihrem Verbindungsaufbau der WebDriverAgent erst noch signiert und gebaut werden muss, ist es ratsam, die Capability &#039;&#039;wdaLaunchTimeout&#039;&#039; zu setzen. Dieser Timeout, wie lange auf den Start der WebDriverAgents auf dem Gerät gewartet werden soll, liegt standardmäßig bei 60000$nbsp;ms. Der Build dauert aber häufig über eine Minute, sodass der Versuch zum Verbindungsaufbau dann abgebrochen wird. Ein Wert von 120000 hat sich hier als besser erwiesen.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration des Plugins ==&lt;br /&gt;
Bevor Sie loslegen, sollten Sie die Einstellungen des Mobile Testing Plugins überprüfen und ggf. anpassen.&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie im Menü den Punkt &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; und dort unter &amp;quot;&#039;&#039;Erweiterungen&#039;&#039;&amp;quot; den Eintrag &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot; (s. Abb.). Standardmäßig werden diese Pfade automatisch gefunden (1). Um einen Pfad manuell anzupassen, deaktivieren Sie den entsprechenden Haken rechts davon. Sie erhalten in einer Drop-down-Liste einige Pfade zur Auswahl. Ist ein eingetragener Pfad falsch oder kann er nicht gefunden werden, wird das Feld rot markiert und es erscheint ein diesbezüglicher Hinweis. Stellen Sie sicher, dass alle Pfade richtig angegeben sind.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingEinstellungen.png | thumb | 400px | Konfiguration des Plugins]]&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;appium&#039;&#039;&#039;: Geben Sie hier den Pfad zur ausführbaren Datei an mit der Appium in der Kommandozeile gestartet werden kann. Unter Windows wird diese Datei in der Regel &amp;quot;&amp;lt;code&amp;gt;appium.cmd&amp;lt;/code&amp;gt;&amp;quot; heißen. Dieser Pfad wird benutzt, wenn expecco einen Appium-Server startet.&lt;br /&gt;
*&#039;&#039;&#039;node&#039;&#039;&#039;: Geben Sie hier den Pfad zur ausführbaren Datei an, die Node (auch &amp;quot;Node.js&amp;quot;) startet. Dieser Pfad wird beim Starten eines Servers an Appium weitergegeben, damit Appium ihn unabhängig von der PATH-Variablen findet. Unter Windows heißt diese Datei in der Regel &amp;quot;&amp;lt;code&amp;gt;node.exe&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;JAVA_HOME&#039;&#039;&#039;: Geben Sie hier den Pfad zu einem JDK an. Dieser Pfad wird an jeden Appium-Server weitergegeben. Lassen Sie das Feld frei, um den Wert aus der Umgebungsvariablen zu verwenden. Um einzustellen, welches Java von expecco verwendet werden soll, setzen Sie diesen Pfad in den Einstellungen für die Java Bridge.&lt;br /&gt;
*&#039;&#039;&#039;ANDROID_HOME&#039;&#039;&#039;: Geben Sie hier den Pfad zu einem SDK von Android an. Dieser Pfad wird an jeden Appium-Server weitergegeben. Lassen Sie das Feld frei, um den Wert aus der Umgebungsvariablen zu verwenden.&lt;br /&gt;
*&#039;&#039;&#039;adb&#039;&#039;&#039;: Hier steht der Pfad zum adb-Befehl. Unter Windows heißt die Datei adb.exe. Diese wird von expecco beispielsweise verwendet, um die Liste der angeschlossenen Geräte zu erhalten. Diesen Pfad sollten Sie automatisch wählen lassen, da dann der Befehl im ANDROID_HOME-Verzeichnis verwendet wird. Dieser wird auch von Appium verwendet. Falls expecco und Appium jedoch verschiedene Versionen von adb verwenden kann es zu Konflikten kommen.&lt;br /&gt;
*&#039;&#039;&#039;android.bat&#039;&#039;&#039;: Diese Datei wird nur benötigt, um damit den AVD und den SDK Manager zu starten. Automatisch wird hier die Datei im ANDROID_HOME-Verzeichnis gesucht.&lt;br /&gt;
*&#039;&#039;&#039;aapt&#039;&#039;&#039;: Geben Sie hier den Pfad zum aapt-Befehl an. Unter Windows heißt diese Datei &#039;&#039;aapt.exe&#039;&#039;. expecco verwendet aapt nur im Verbindungseditor, um das Paket und die Activities einer apk-Datei zu lesen. Automatisch wird hier die Datei im ANDROID_HOME-Verzeichnis gesucht.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingJavaBridgeEinstellungen.png | thumb | 400px | Konfiguration des JDKs]]&lt;br /&gt;
&lt;br /&gt;
Ab expecco 2.11 gibt es das Feld &#039;&#039;Team-ID&#039;&#039;. Wenn Sie iOS-Tests ausführen, tragen Sie hier die Team-ID Ihres Zertifikats ein. Diese wird für jede iOS-Verbindung verwendet, außer Sie setzen den Wert im Einzelfall in den Verbindungseinstellungen um. Wie Sie die Team-ID erhalten, lesen Sie im Abschnitt zur [[#Signierung|Signierung]] ber der Installation auf Mac OS. Mit expecco 2.10 können Sie die Team-ID nur für jede Verbindungseinstellung extra als Capability eintragen. Dazu müssen Sie jedoch die [[#Erweiterte_Ansicht|erweiterte Ansicht]] verwenden. Geben Sie hier die Capability &#039;&#039;xcodeOrgId&#039;&#039; an und setzen Sie als Wert die Team-ID des Zertifikats.&lt;br /&gt;
&lt;br /&gt;
Die Einstellung zur Serveradresse unten auf der Seite bezieht sich auf das Verhalten des Verbindungseditors. Dieser prüft am Ende, ob die Serveradresse auf &#039;&#039;/wd/hub&#039;&#039; endet, da dies die übliche Form ist. Falls nicht, wird in einem Dialog gefragt, wie darauf reagiert werden soll. Das festgelegte Verhalten kann hier eingesehen und verändert werden.&lt;br /&gt;
&lt;br /&gt;
Wechseln Sie ebenfalls zum Eintrag &#039;&#039;Java Bridge&#039;&#039; (s. Abb.). Hier muss der Pfad zu Ihrer Java-Installation angegeben werden, die von expecco benutzt wird. Tragen Sie hier ein JDK ein. Falls Sie unter Windows das aus dem Mobile Testing Supplement verwenden möchten, lautet der Pfad&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;C:\Program Files (x86)\exept\Mobile Testing Supplement\jdk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Sie können auch die Systemeinstellungen verwenden.&lt;br /&gt;
&lt;br /&gt;
== Android-Gerät vorbereiten ==&lt;br /&gt;
Wenn Sie ein Android-Gerät unter Windows anschließen benötigen Sie möglicherweise noch einen adb-Treiber für das Gerät. Einen passenden Treiber finden Sie üblicherweise auf der jeweiligen Webseite des Herstellers. Haben Sie den Universal-Treiber aus dem Mobile Testing Supplement installiert, sollte für die meisten Geräte bereits alles funktionieren. In einigen Fällen versucht auch Windows automatisch einen Treiber zu installieren, wenn Sie das Gerät zum ersten mal anschließen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===USB-Debugging Einschalten===&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Bevor Sie ein Mobilgerät mit dem Appium-Plugin ansteuern können, müssen Sie für dieses Debugging erlauben!&lt;br /&gt;
&lt;br /&gt;
Für Android-Geräte finden Sie diese Option in den Einstellungen unter &#039;&#039;[https://www.droidwiki.org/wiki/Entwickleroptionen Entwickleroptionen]&#039;&#039; mit dem Namen &#039;&#039;[https://www.droidwiki.org/USB-Debugging USB-Debugging]&#039;&#039;. Falls die Entwickleroptionen nicht angezeigt werden, können Sie diese freischalten, indem Sie unter &amp;quot;&#039;&#039;Über das Telefon&#039;&#039;&amp;quot; siebenmal auf &amp;quot;&#039;&#039;Build-Nummer&#039;&#039;&amp;quot; tippen.&lt;br /&gt;
&lt;br /&gt;
===Wach bleiben Aktivieren===&lt;br /&gt;
Aktivieren Sie auch die Funktion &#039;&#039;Wach bleiben&#039;&#039;, damit das Gerät nicht während der Testerstellung oder -ausführung den Bildschirm abschaltet.&lt;br /&gt;
&lt;br /&gt;
Aus Sicherheitsgründen muss USB-Debugging für jeden Computer einzeln zugelassen werden. Beim Verbinden des Geräts mit dem PC über USB müssen Sie dabei am Gerät der Verbindung zustimmen. Falls Sie dies für Ihren Computer noch nicht getan haben, aber auf dem Gerät kein entsprechender Dialog erscheint, kann es helfen, das Gerät aus- und wieder einzustecken. Das kann insbesondere dann passieren, wenn Sie den ADB-Treiber installiert haben während das Gerät bereits über USB angeschlossen war. Falls auch das nicht hilft, öffnen Sie die Benachrichtigungen, indem Sie sie vom oberen Bildschirmrand herunter ziehen. Dort finden Sie die USB-Verbindung und Sie können die Optionen dazu öffnen. Wählen Sie einen anderen Verbindungstypen aus; in der Regel sollten MTP oder PTP funktionieren.&lt;br /&gt;
&lt;br /&gt;
Sie können auch auf einem Emulator testen. Dieser muss nicht gesondert vorbereitet werden, da er bereits für USB-Debugging ausgelegt ist. Es ist sogar möglich, einen Emulator bei Testbeginn zu starten.&lt;br /&gt;
&lt;br /&gt;
Um zu überprüfen, ob ein Gerät, das Sie an Ihren Rechner angeschlossen haben, verwendet werden kann, öffnen Sie den [[#Verbindungseditor|Verbindungseditor]]. Das Gerät sollte dort angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Verbindung über WLAN ===&lt;br /&gt;
Es ist auch möglich, Android-Geräte über WLAN zu verbinden. Für Geräte mit Android 11 oder neuer ist dies direkt über WLAN möglich, im anderen Fall müssen Sie das Gerät zuerst über USB verbinden. Ab expecco 22.1 können Sie eine WLAN-Verbindung über den [[Mobile Testing Plugin#Verbindungseditor|Verbindungseditor]] aufbauen. Ansonsten ist es auch über die Eingabeaufforderung möglich.&lt;br /&gt;
==== Drahtlos verbinden über die Eingabeaufforderung mit expecco Versionen vor 22.1 (ab Android 11) ====&lt;br /&gt;
Mit expecco ab Version 22.1 funktioniert das einfacher über den Verbindungseditor.&lt;br /&gt;
&lt;br /&gt;
Erlauben Sie in den Entwickleroptionen des Geräts Debugging über WLAN und öffnen Sie dessen Optionen. Sie müssen zuerst das Gerät mit dem  Rechner koppeln. Wählen Sie dazu &amp;quot;&#039;&#039;Gerät mit einem Kopplungscode koppeln&#039;&#039;&amp;quot;, um einen Kopplungscode und eine IP-Adresse mit Port zu erhalten. Öffnen Sie dann auf dem Rechner die Eingabeaufforderung und geben Sie dort ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb pair &amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Kopplungsport&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
wobei Sie &amp;lt;tt&amp;gt;&amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Kopplungsport&amp;gt;&amp;lt;/tt&amp;gt; durch die auf dem Gerät angezeigte IP-Adresse &amp;amp; Port ersetzen. Danach werden Sie aufgefordert, den Kopplungscode einzugeben. Wenn alles geklappt hat, sollte sich das Popup auf dem Gerät schließen und der Rechner als gekoppeltes Gerät angezeigt werden. Geben Sie dann in der Eingabeaufforderung ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Debug-Port&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die IP-Adresse ist hier noch die gleiche wie beim Koppeln, aber der Port ist ein anderer. Beides wird als IP-Adresse &amp;amp; Port auf dem Gerät angezeigt. Damit sollte das Gerät nun über WLAN verbunden sein und kann genauso verwendet werden, wie mit USB-Verbindung. Sie können dies überprüfen, indem Sie entweder &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; eingeben oder in expecco den Verbindungsdialog öffnen. In der Liste taucht das Gerät mit seiner IP-Adresse und dem Port auf. Bedenken Sie, dass die WLAN-Verbindung nicht mehr besteht, wenn der ADB-Server oder das Gerät neu gestartet werden. Häufig wird beim Neustart des Geräts auch die Erlaubnis für das Debugging über WLAN wieder zurückgesetzt und der verwendete Port ändert sich. Die Kopplung bleibt aber bestehen und muss beim nächsten Verbinden nicht noch einmal durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==== WLAN Verbindung über USB starten (Android 10 und früher) ====&lt;br /&gt;
Verbinden Sie zunächst das Gerät über USB mit dem Rechner. Öffnen Sie dann die Eingabeaufforderung und geben Sie dort ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit lauscht das Gerät auf eine TCP/IP-Verbindung an Port 5555. Sollten Sie mehrere Geräte angeschlossen oder Emulatoren laufen haben, müssen Sie genauer angeben, welches Gerät Sie meinen. Geben Sie in diesem Fall ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb devices -l&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Sie erhalten eine Liste aller Geräte, wobei die erste Spalte deren Kennung ist. Schreiben Sie dann stattdessen&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb -s &amp;lt;Gerätekennung&amp;gt; tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
mit der Gerätekennung des gewünschten Geräts. Sie können die USB-Verbindung nun trennen. Jetzt müssen Sie die IP-Adresse Ihres Gerätes in Erfahrung bringen. Sie finden diese üblicherweise irgendwo in den Einstellungen des Geräts, beispielsweise beim Status oder in den WLAN-Einstellungen. Geben Sie dann ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP-Adresse des Geräts&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit sollte das Gerät nun über WLAN verbunden sein und kann genauso verwendet werden, wie mit USB-Verbindung. Sie können dies überprüfen, indem Sie wieder &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; eingeben oder in expecco den Verbindungsdialog öffnen. In der Liste taucht das Gerät mit seiner IP-Adresse und dem Port auf. Bedenken Sie, dass die WLAN-Verbindung nicht mehr besteht, wenn der ADB-Server oder das Gerät neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
=== Verbindung zu einem Emulator ===&lt;br /&gt;
Sie benötigen dazu den Emulator selbst, sowie mindestens ein AVD (Android Virtual Device). Hinweise zu Installation finden Sie in der [https://developer.android.com/studio/run/emulator Android Studio Dokumentation].&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Android Studio bereits mit den Defaulteinstellungen installiert haben &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;, sollte der Emulator bereits mitinstalliert sein. Falls nicht, wählen Sie in Android Studio &amp;quot;&#039;&#039;Configure&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;SDK Manager&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Android SDK&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;SDK Tools&#039;&#039;&amp;quot; - &#039;&#039;Android Emulator&#039;&#039;&amp;quot;, sowie dort die &amp;quot;&#039;&#039;Platform Tools&#039;&#039;&amp;quot;.&lt;br /&gt;
Alternativ geht das auch über die Kommandzeile mit dem &amp;quot;sdkmanager&amp;quot; Kommando.&lt;br /&gt;
&lt;br /&gt;
Als nächstes benötigen Sie mindestens ein AVD; auch dies geht am einfachsten über den Dialog in Android Studio:&lt;br /&gt;
wählen sie &amp;quot;&#039;&#039;Configure&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;AVD Manager&#039;&#039;&amp;quot; und folgen den Anweisungen (Deviceauswahl, Platform und Android Version).  &lt;br /&gt;
&lt;br /&gt;
Auch wenn Sie den Emulator automatisieren benötigen sie Appium; installieren Sie dieses entweder mit dem Mobile Testing Supplement, oder direkt von der Appium homepage (https://github.com/appium/appium-desktop/releases).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;Android Studio selbst wird nicht von expecco benötigt; es bietet aber kompfortable Dialoge zum Installieren von Paketen und AVDs.&lt;br /&gt;
&lt;br /&gt;
== iOS-Gerät und App vorbereiten ==&lt;br /&gt;
Das Ansteuern von iOS-Geräten ist nur über einen Mac möglich. Lesen Sie daher auch den Abschnitt zur [[#Mac_OS|Installation unter Mac OS]].&lt;br /&gt;
&lt;br /&gt;
Bevor Sie ein Mobilgerät mit dem Mobile Testing Plugin ansteuern können, müssen Sie für iOS-Geräte ab iOS 8 Debugging erlauben. Aktivieren Sie dazu die Option &#039;&#039;Enable UI Automation&#039;&#039; unter dem Menüpunkt &#039;&#039;Entwickler&#039;&#039; in den Einstellungen des Geräts. Falls Sie den Eintrag &#039;&#039;Entwickler&#039;&#039; in den Einstellungen nicht finden, gehen Sie wie folgt vor: Schließen Sie das Gerät über USB an den Mac an. Dabei müssen Sie ggf. am Gerät noch der Verbindung zustimmen. Starten Sie Xcode und wählen Sie dann in der Menüleiste am oberen Bildschirmrand im Menü &#039;&#039;Window&#039;&#039; den Eintrag &#039;&#039;Devices&#039;&#039;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wählen Sie dort Ihr Gerät aus. Danach sollte der Eintrag &#039;&#039;Entwickler&#039;&#039; in den Einstellungen auf dem Gerät auftauchen. Dazu müssen Sie möglicherweise die Einstellungen beenden und neu starten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Alert.png | thumb | 270px | Beispiel für einen Alert unter iOS]]&lt;br /&gt;
Ein Verbindungsaufbau zu dem Gerät ist nicht möglich solange es bestimmte Alerts zeigt. Ein solcher Alert kann z.&amp;amp;#x202f;B. erscheinen wenn FaceTime aktiviert ist, indem ein Hinweis auf anfallende SMS-Gebühren angezeigt wird (siehe Screenshot). Achten Sie darauf, das Gerät so zu konfigurieren, dass es im Leerlauf keine solchen Alerts zeigt.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.11 und später ===&lt;br /&gt;
Sie können beliebige Apps testen, die auf dem verwendeten Gerät lauffähig oder bereits installiert sind. Wenn die App als Development-Build vorliegt, muss die UDID des Geräts in der App hinterlegt sein. In jedem Fall muss der WebDriverAgent für das Gerät signiert werden. Lesen Sie dazu den Abschnitt zur [[#Signierung|Signierung]] unter Mac OS.&lt;br /&gt;
&lt;br /&gt;
Falls Sie in einem Test den Home-Button verwenden wollen, müssen Sie auf dem Gerät AssistiveTouch aktivieren. Sie finden diese Option in den Einstellungen unter &#039;&#039;Allgemein&#039;&#039; &amp;gt; &#039;&#039;Bedienungshilfen&#039;&#039; &amp;gt; &#039;&#039;AssistiveTouch&#039;&#039;. Platzieren Sie dann das Menü in der Mitte des oberen Bildschirmrands. Sie können das Drücken des Home-Buttons dann mit dem entsprechenden Menüeintrag im Recorder aufzeichnen oder direkt den Baustein &#039;&#039;Press Home Button&#039;&#039; benutzen.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.10 ===&lt;br /&gt;
Die App, die Sie verwenden wollen, muss als Development-Build vorliegen. Außerdem muss die UDID des Geräts in der App hinterlegt sein.&lt;br /&gt;
&lt;br /&gt;
=== Development-Build signieren ===&lt;br /&gt;
Ein Development-Build einer App ist nur für eine begrenzte Zahl von Geräten zugelassen und kann auf anderen Geräten nicht gestartet werden. Es ist aber möglich, das Zertifikat und die verwendbaren Geräte in einem Development-Build auszutauschen.&lt;br /&gt;
&lt;br /&gt;
* Evaluierung mit Demo-App von eXept:&lt;br /&gt;
:Gerne stellen wir Ihnen eine Demo-App zur Verfügung, die als Development-Build vorliegt und die wir für Ihr Gerät signieren können. Senden Sie dazu bitte Ihrem eXept-Ansprechpartner die UDID Ihres Gerätes zu. Wie Sie die UDID Ihres Gerätes ermitteln können, ist im folgenden Abschnitt beschrieben.&lt;br /&gt;
&lt;br /&gt;
* Eigene App für Ihr Testgerät verwenden:&lt;br /&gt;
:Wenn Sie von den App-Entwicklern einen Development-Build (IPA-Datei) erhalten, der für Ihr Testgerät zugelassen ist, können Sie diesen direkt verwenden. Dazu müssen Sie den Entwicklern die UDID Ihres Geräts mitteilen, damit sie diese eintragen können. &#039;&#039;&#039;Sie können die UDID eines Gerätes mithilfe von Xcode auslesen&#039;&#039;&#039;. Starten Sie dazu Xcode und wählen Sie in der Menüleiste am oberen Bildschirmrand im Menü &#039;&#039;Window&#039;&#039; den Eintrag &#039;&#039;Devices&#039;&#039;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wählen Sie Ihr Gerät aus und suchen Sie in Eigenschaften den Eintrag &#039;&#039;Identifier&#039;&#039;. Die UDID ist eine 40-stellige Hexadezimalzahl.&lt;br /&gt;
&lt;br /&gt;
* Extern entwickelte App für Ihr Testgerät umsignieren:&lt;br /&gt;
:Es können auch Apps umsigniert werden, damit Sie auf anderen Geräten lauffähig sind. Dieser Vorgang ist jedoch kompliziert und setzt insbesondere einen Zugang zu einem Apple-Developer-Account voraus. Eine Dokumentation zur Vorgehensweise ist derzeit in Vorbereitung.&lt;br /&gt;
&lt;br /&gt;
:Für die Evaluierung unterstützen wir Sie gerne beim Umsignieren Ihrer App.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Melden Sie sich beim [https://developer.apple.com/ Apple-Webinterface] an. Navigieren Sie zu &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039;. Erzeugen Sie hier ggf. ein Developer-Zertifikat und ein Provisioning Profile für Ihr Gerät und laden Sie beide herunter. Sollten Sie noch keinen Developer Account haben, erstellen Sie hier einen: https://developer.apple.com/enroll/. Hierzu müssen Sie sich mit einer Apple-ID anmelden.&lt;br /&gt;
&lt;br /&gt;
# Team-ID herausfinden (&#039;&#039;Membership&#039;&#039; -&amp;gt; &#039;&#039;Team ID&#039;&#039;)&lt;br /&gt;
# Unter &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039; Development-Zertifikat auswählen (unter &#039;&#039;+&#039;&#039; anlegen, falls nicht vorhanden) und herunterladen.&lt;br /&gt;
# Unter &#039;&#039;App ID&#039;&#039; Wildcard-App-ID erzeugen, falls nicht vorhanden. App-ID notieren (AppID = Prefix.ID)&lt;br /&gt;
# Gerät hinzufügen, dazu UDID (bzw. &#039;&#039;Identifier&#039;&#039;) des Geräts herausfinden (&#039;&#039;Xcode&#039;&#039; -&amp;gt; &#039;&#039;Window&#039;&#039; (oben in Menüleiste) -&amp;gt; &#039;&#039;Devices&#039;&#039;)&lt;br /&gt;
# Provisionen Profile erstellen: &#039;&#039;iOS App Development&#039;&#039; -&amp;gt; &#039;&#039;AppID&#039;&#039; auswählen -&amp;gt; Zertifikat wählen -&amp;gt; Gerät auswählen -&amp;gt; Profilname anlegen -&amp;gt; Provisioning Profile herunterladen.&lt;br /&gt;
# Das heruntergeladene Zertifikat importieren (&#039;&#039;Downloads&#039;&#039; -&amp;gt; Zertifikat (.cer)&lt;br /&gt;
# SHA1-Fingerabdruck kopieren. Dazu Rechtsklick auf Zertifikat -&amp;gt; &#039;&#039;Information&#039;&#039;, anschließend bis zum Ende der Seite scrollen).&lt;br /&gt;
# Entitlements.plist erstellen (&#039;&#039;Terminal&#039; öffnen -&amp;gt; Downloads/Mobile_Testing_Supplement/bin/gen-entitlements_plist &#039;Team-ID&#039; &#039;App ID&#039; Downloads/Mobile_Testing_Supplement/bin/re-sign-ipa &amp;lt;Pfad zum ipa (z.B. Downloads/expeccoMobileDemo.ipa)&amp;gt; \&lt;br /&gt;
&amp;quot;&amp;lt;Zertifikat (SHA1-Fingerabdruck, z.B. 76 E8 4B E8 78 D5 D7 F9 2E 09 8B D7 E8 FB CE 30 0C F5 D0 EF)&amp;gt;&amp;quot; \&lt;br /&gt;
&amp;lt;Pfad zum Provisionen Profile (z.B. /Users/exept_test/Downloads/dut.mobileprovision)&amp;gt; \&lt;br /&gt;
&amp;lt;Pfad für das Ergebnis-ipa (z.B. Downloads/expeccoMobileDemo_re-signed.ipa)&amp;gt; \&lt;br /&gt;
[Pfad zur entitlements.plist] (z.B. /Users/exept_test/entitlements.plist)&lt;br /&gt;
&lt;br /&gt;
Zum Umsignieren können Sie das entsprechende Skript aus dem Mobile Testing Supplement für Mac OS oder jedes beliebige andere Tool (z.B. isign) verwenden.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zur Verwendung von iOS-Geräten finden Sie auch in der [http://appium.io/slate/en/master/?java#appium-on-real-ios-devices Dokumentation von Appium].&lt;br /&gt;
&lt;br /&gt;
=== Native iOS-Apps ===&lt;br /&gt;
Sie können auch Apps verwenden, die bereits nativ auf dem Gerät vorhanden sind. Dazu müssen Sie deren Bundle-ID kennen und diese dann in die Verbindungseinstellungen eintragen. Hier eine kleine Auswahl gängiger Apps:&lt;br /&gt;
{| style=&amp;quot;text-align:left&amp;quot;&lt;br /&gt;
! App&lt;br /&gt;
!&lt;br /&gt;
! Bundle-ID&lt;br /&gt;
|-&lt;br /&gt;
| App Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.AppStore&lt;br /&gt;
|-&lt;br /&gt;
| Calculator&lt;br /&gt;
| &lt;br /&gt;
| com.apple.calculator&lt;br /&gt;
|-&lt;br /&gt;
| Calendar&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilecal&lt;br /&gt;
|-&lt;br /&gt;
| Camera&lt;br /&gt;
| &lt;br /&gt;
| com.apple.camera&lt;br /&gt;
|-&lt;br /&gt;
| Contacts&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileAddressBook&lt;br /&gt;
|-&lt;br /&gt;
| iTunes Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileStore&lt;br /&gt;
|-&lt;br /&gt;
| Mail&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilemail&lt;br /&gt;
|-&lt;br /&gt;
| Maps&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Maps&lt;br /&gt;
|-&lt;br /&gt;
| Messages&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileSMS&lt;br /&gt;
|-&lt;br /&gt;
| Phone&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilephone&lt;br /&gt;
|-&lt;br /&gt;
| Photos&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobileslideshow&lt;br /&gt;
|-&lt;br /&gt;
| Settings&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Preferences&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Weitere Bundle-IDs finden Sie [https://github.com/joeblau/apple-bundle-identifiers hier].&lt;br /&gt;
&lt;br /&gt;
= Beispiele =&lt;br /&gt;
Bei den Demo-Testsuiten für expecco finden Sie auch Beispiele für Tests mit dem Mobile Testing Plugin. Wählen Sie dazu auf dem Startbildschirm die Option &amp;quot;&#039;&#039;Beispiel aus Datei&#039;&#039;&amp;quot; und öffnen Sie den Ordner &amp;quot;&#039;&#039;mobile&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;TestsuiteMobileTestingDemo&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m01_MobileTestingDemo.ets --&amp;gt;&amp;lt;/span&amp;gt; &#039;&#039;m01_MobileTestingDemo.ets&#039;&#039; ==&lt;br /&gt;
Die Testsuite enthält zwei einfache Testpläne: &amp;quot;&#039;&#039;Simple CalculatorTest&#039;&#039;&amp;quot; und &amp;quot;&#039;&#039;Complex Calculator and Messaging Test&#039;&#039;&amp;quot;. Beide Tests verwenden einen Android-Emulator, den Sie vor Beginn starten müssen. Die Apps, die im Test verwendet werden, gehören zur Grundausstattung des Emulators und müssen daher nicht mehr installiert werden. Da sich die Apps unter jeder Android-Version unterscheiden können, ist es wichtig, dass Ihr Emulator unter Android 6.0 läuft. Außerdem muss die Sprache auf Englisch gestellt sein.&lt;br /&gt;
&lt;br /&gt;
; Simple CalculatorTest&lt;br /&gt;
: Dieser Test verbindet sich mit dem Taschenrechner und gibt die Formel &#039;&#039;2+3&#039;&#039; ein. Das Ergebnis des Rechners wird mit dem erwarteten Wert &#039;&#039;5&#039;&#039; verglichen.&lt;br /&gt;
&lt;br /&gt;
; Complex Calculator and Messaging Test&lt;br /&gt;
: Dieser Test verbindet sich mit dem Taschenrechner und öffnet anschließend den Nachrichtendienst. Dort wartet er auf eine einkommende Nachricht von der Nummer &#039;&#039;15555215556&#039;&#039;, in der eine zu berechnende Formel gesendet wird. Die Nachricht wird zuvor über einen Socket beim Emulator erzeugt. Nach dem Eintreffen der Nachricht wird diese vom Test geöffnet und deren Inhalt gelesen. Danach wird wieder der Taschenrechner geöffnet, die erhaltene Formel eingegeben und das Ergebnis gelesen. Anschließend wechselt der Test wieder zum Nachrichtendienst und sendet das Ergebnis als Antwort.&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;m02_expeccoMobileDemo.ets&#039;&#039; und &#039;&#039;m03_expeccoMobileDemoIOS.ets&#039;&#039; ==&lt;br /&gt;
Diese sind Bestandteil des Tutorials zum Mobile Testing Plugin. Der jeweils enthaltene Testfall ist unvollständig und wird im Zuge des Tutorials ergänzt. Lesen Sie dazu den Abschnitt [[#Tutorial|Tutorial]].&lt;br /&gt;
&lt;br /&gt;
= Tutorial =&lt;br /&gt;
Es gibt ein Tutorial, das das grundsätzliche Vorgehen zur Erstellung von Tests mit dem Mobile Testing Plugin beschreibt. Grundlage dafür ist ein mitgeliefertes Beispiel, bestehend aus einer einfachen App und einer expecco-Testsuite.&lt;br /&gt;
&lt;br /&gt;
Sie finden es auf der Seite [[Mobile_Testing_Tutorial|Mobile Testing Tutorial]] in zwei Versionen für Android und für iOS.&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsAndroid&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m02_expeccoMobileDemo.ets --&amp;gt;&amp;lt;/span&amp;gt;[[Mobile_Testing_Tutorial#Erste_Schritte_mit_Android|Erste Schritte mit Android]]&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsIOS&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m03_expeccoMobileDemoIOS.ets --&amp;gt;&amp;lt;/span&amp;gt;[[Mobile_Testing_Tutorial#Erste_Schritte_mit_iOS|Erste Schritte mit iOS]]&lt;br /&gt;
&lt;br /&gt;
= Dialoge des Mobile Testing Plugins =&lt;br /&gt;
== Verbindungseditor ==&lt;br /&gt;
Mithilfe des Verbindungseditors können Sie schnell Verbindungen definieren, ändern oder aufbauen. Je nach Aufgabe weist der Dialog kleine Unterschiede auf und wird unterschiedlich geöffnet:&lt;br /&gt;
*Um eine Verbindung aufzubauen, klicken Sie im GUI-Browser auf &amp;quot;&#039;&#039;Verbinden&#039;&amp;quot;&#039; klicken und wählen dann &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot;.&lt;br /&gt;
*Um eine bestehende Verbindung im GUI-Browser zu ändern oder zu kopieren, wählen Sie diese aus, machen einen Rechtsklick und wählen im Kontextmenü &amp;quot;&#039;&#039;Verbindung bearbeiten&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;Verbindung kopieren&#039;&#039;&amp;quot; aus.&lt;br /&gt;
*Wollen Sie Verbindungseinstellungen nicht für den GUI-Browser sondern zur Verwendung in einem Test erstellen, wählen Sie im Menü des Mobile Testing Plugins den Punkt &amp;quot;&#039;&#039;Verbindungseinstellungen erstellen...&#039;&#039;&amp;quot;. Darüber können nur die Einstellungen für eine Verbindung erstellt werden, ohne dass eine Verbindung tatsächlich angelegt wird.&lt;br /&gt;
&lt;br /&gt;
Einige der Schaltflächen sind nur beim Erstellen von Verbindungseinstellungen sichtbar:&lt;br /&gt;
[[Datei:MobileTestingVerbindungseditorMenu.png]]&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen löschen&#039;&#039;&amp;quot;: Setzt alle Einträge zurück. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen aus Datei laden&#039;&#039;&amp;quot;: Erlaubt das Öffnen einer gespeicherten Einstellungsdatei (*.csf). Deren Einstellungen werden in den Dialog übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen aus Anhang laden&#039;&#039;&amp;quot;: Erlaubt das Öffnen eines Anhangs mit Verbindungseinstellungen aus einem geöffneten Projekt. Diese Einstellungen werden in den Dialog übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen in Datei speichern&#039;&#039;&amp;quot; sowie&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen in Anhang speichern&#039;&#039;&amp;quot;: Hier können Sie die eingetragenen Einstellungen in eine Datei (*.csf) speichern oder als Anhang in einem geöffneten Projekt anlegen. Beide Optionen besitzen ein verzögertes Menü, in dem Sie auswählen können, nur einen bestimmten Teil der Einstellungen zu speichern. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Erweiterte Ansicht&#039;&#039;&amp;quot;: Damit können Sie in die erweiterte Ansicht wechseln, um zusätzliche Einstellungen vorzunehmen. Lesen Sie dazu mehr am Ende des Kapitels. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Hilfe&#039;&#039;&amp;quot;: An der rechten Seite wird ein Hilfetext zum jeweiligen Schritt ein- oder ausgeblendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Dialog ist in drei Schritte unterteilt. Im ersten Schritt wählen Sie das Gerät, das Sie verwenden möchten, im zweiten Schritt wählen Sie aus, welche App verwendet werden soll und im letzten Schritt erfolgen die Einstellungen zum Appium-Server.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep1&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 1: Gerät auswählen===&lt;br /&gt;
Im oberen Teil erhalten Sie eine Liste aller angeschlossenen Appium-Geräte, die erkannt werden. Mit der Checkbox darunter können Sie die Geräte ausblenden, die zwar erkannt werden, aber nicht bereit sind. Falls Sie ein Gerät eintragen wollen, das nicht angeschlossen ist, können Sie dies mit dem entsprechenden Knopf &amp;quot;&#039;&#039;Android-Gerät eingeben&#039;&#039;&amp;quot; bzw. &amp;quot;&#039;&#039;iOS-Gerät eingeben&#039;&#039;&amp;quot; anlegen. Dazu müssen Sie jedoch die benötigten Eigenschaften Ihres Geräts kennen. Das Gerät wird dann in einer zweiten Geräteliste angelegt und kann dort ausgewählt werden. Wenn keine Liste mit angeschlossenen Elementen angezeigt werden kann, werden stattdessen verschiedene Meldungen angezeigt:&lt;br /&gt;
*Keine Geräte gefunden&lt;br /&gt;
*:expecco konnte kein Android-Geräte finden.&lt;br /&gt;
*:Um eine Verbindung zu einem Gerät automatisch zu konfigurieren, stellen Sie sicher, dass es&lt;br /&gt;
*:*angeschlossen ist&lt;br /&gt;
*:*eingeschaltet ist&lt;br /&gt;
*:*einen passenden adb-Treiber installiert hat&lt;br /&gt;
*:*für Debugging freigeschaltet ist (siehe unten).&lt;br /&gt;
*Keine verfügbaren Geräte gefunden&lt;br /&gt;
*:expecco konnte keine verfügbaren Android-Geräte finden. Es wurden aber nicht verfügbare gefunden, z.B. mit dem Status &amp;quot;unauthorized&amp;quot;.&lt;br /&gt;
*:Um eine Verbindung zu einem Gerät automatisch zu konfigurieren, stellen Sie sicher, dass es&lt;br /&gt;
*:*angeschlossen ist&lt;br /&gt;
*:*eingeschaltet ist&lt;br /&gt;
*:*einen passenden adb-Treiber installiert hat&lt;br /&gt;
*:*für Debugging freigeschaltet ist (siehe unten).&lt;br /&gt;
*:Um nicht verfügbare Geräte anzuzeigen, aktivieren Sie unten diese Option.&lt;br /&gt;
*Verbindung verloren&lt;br /&gt;
*:expecco hat die Verbindung zum adb-Server verloren. Versuchen Sie die Verbindung wieder herzustellen, indem Sie auf den Button klicken.&lt;br /&gt;
*Verbindung fehlgeschlagen&lt;br /&gt;
*:expecco konnte sich nicht mit dem adb-Server verbinden. Möglicherweise läuft er nicht oder der angegebene Pfad stimmt nicht.&lt;br /&gt;
*:Überprüfen Sie die adb-Konfiguration in den Einstellungen und versuchen Sie den adb-Server zu starten und eine Verbindung herzustellen indem Sie auf den Knopf klicken.&lt;br /&gt;
*Verbinden ...&lt;br /&gt;
*:expecco verbindet sich mit dem adb-Server. Dies kann einige Sekunden dauern.&lt;br /&gt;
*adb-Server starten ...&lt;br /&gt;
*:expecco startet den adb-Server. Dies kann einige Sekunden dauern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Bei &amp;quot;&#039;&#039;Automatisierung durch&#039;&#039;&amp;quot; können Sie angeben, welche Automation-Engine verwendet werden soll. Lassen Sie die Einstellung auf &amp;quot;&#039;&#039;(Default)&#039;&#039;&amp;quot; wird die entsprechende Capability gar nicht gesetzt. Ansonsten stehen Appium, Selendroid und ab expecco 2.11 XCUITest zur Verfügung. In der Regel wird Selendroid nur für Android-Geräte vor Version 4.1 gebraucht.--&amp;gt;Mit &amp;quot;&#039;&#039;Weiter&#039;&#039;&amp;quot; gelangen Sie zum nächsten Schritt. Wenn Sie Einstellungen für den GUI-Browser eingeben, ist das erst möglich, wenn ein Gerät ausgewählt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;UnlockingDeveloperOptions&amp;quot;&amp;gt;Anmerkung zum Freischalten&amp;lt;/span&amp;gt;: In jüngeren Android Versionen werden die Entwickleroptionen zunächst nicht mehr in den Einstellungen angeboten. Falls ihr Android Gerät in den Einstellungen keinen Eintrag zu &amp;quot;&#039;&#039;Entwickleroptionen&#039;&#039;&amp;quot; zeigt, wählen Sie zunächst den Eintrag &amp;quot;&#039;&#039;Telefoninfo&#039;&#039;&amp;quot;, dann &amp;quot;&#039;&#039;SoftwareVersionsInfo&#039;&#039;&amp;quot; und klicken darin mehrfach auf den Eintrag &amp;quot;&#039;&#039;BuildVersion&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Chromedriver verwalten ====&lt;br /&gt;
Wenn die App, die Sie bedienen wollen, WebViews mit Chrome benutzt, benötigt Appium Zugriff auf einen passenden Chromedriver. Wenn Sie ein Gerät in der Liste auswählen, können Sie über &amp;quot;&#039;&#039;Chromedriver verwalten&#039;&#039;&amp;quot; sehen, welche Chrome-Versionen auf dem Gerät vorhanden sind und welche Chromedriver-Versionen durch expecco zur Verfügung stehen. Über diesen Dialog können Sie auch benötigte Chromedriver-Versionen herunterladen. Beachten Sie, dass auf dem Gerät verschiedene Chrome-Versionen vorhanden sein können, da die Apps in ihren WebViews nicht die gleiche Chrome-Version verwenden müssen, wie die als Browser installierte. Damit alles funktioniert, sollte der verwendete Chromedriver zur entsprechenden App passen. Sie können den Pfad zum Chromedriver auch am Ende des Verbindungsdialogs in den erstellten Capabilities ändern.&lt;br /&gt;
&lt;br /&gt;
==== WLAN-Android-Geräte verbinden ====&lt;br /&gt;
Sie können sich auch über WLAN zu Android-Geräten verbinden. Dazu muss das Gerät zunächst mit adb verbunden werden, siehe [[Mobile_Testing_Plugin#Verbindung_.C3.BCber_WLAN|Verbindung über WLAN]]. Ab expecco 22.1 bietet der Verbindungseditor hierfür einen Dialog, der Ihnen dabei hilft und den Sie anstatt der Eingabeaufforderung verwenden können. Für Geräte mit Android 11 oder höher können Sie hier das Gerät mit dem Rechner zu koppeln, indem Sie die entsprechenden Parameter angeben und anschließend die Verbindung unter Angabe von IP-Adresse und Port aufbauen. Sie können damit auch für Geräte, die über USB verbunden sind, eine WLAN-Verbindung aufbauen. Wenn Sie das entsprechende Gerät in der Liste auswählen, werden die benötigten Angaben automatisch ausgelesen.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass der Aufbau einer WLAN-Verbindung nicht Teil der Verbindungseinstellungen ist. Wenn Sie mit den erzeugten Einstellungen eine neue Verbindung aufbauen wollen, müssen Sie sicherstellen, dass das Gerät über mit der angegebenen IP-Adresse und dem Port mit adb verbunden ist, damit es gefunden wird. Die ADB-Verbindung geht verloren, wenn der ADB-Server oder das Gerät neu gestartet werden. Die Erlaubnis für das WLAN-Debugging wird beim Neustart des Geräts auch häufig zurückgesetzt und der Debug-Port kann dann wechseln. Daher muss eine WLAN-Verbindung immer manuell hergestellt werden.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep2&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 2: App auswählen===&lt;br /&gt;
Hier können Sie Angaben zur App machen, die getestet werden soll. Dabei können Sie entscheiden, ob Sie eine App verwenden wollen, die bereits auf dem Gerät installiert ist, oder ob für den Test eine App installiert werden soll. Wählen Sie oben den entsprechenden Reiter aus. Je nachdem, ob Sie im vorigen Schritt ein Android- oder ein iOS-Gerät ausgewählt haben, ändert sich die erforderte Eingabe.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Android&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App auf dem Gerät&#039;&#039;&lt;br /&gt;
**:Wenn Sie im ersten Schritt ein angeschlossenes Gerät ausgewählt haben, werden die Pakete aller installierten Apps automatisch abgerufen und Sie können die Auswahl aus den Drop-down-Listen treffen. Die installierten Apps sind in Fremdpakete und Systempakete unterteilt; wählen Sie die entsprechende Paketliste aus. Diese Auswahl gehört nicht zu den Einstellungen, sondern stellt nur die entsprechende Paketliste zur Verfügung. Sie können den Filter benutzen, um die Liste weiter einzuschränken und dann das gewünschte Paket auswählen. Die Activities des ausgwählten Pakets werden ebenfalls automatisch abgerufen und als Drop-down-Liste zur Verfügung gestellt. Wählen Sie die Activity aus, die gestartet werden soll. In der Regel wird automatisch eine Activity aus der Liste eingetragen. Falls Sie kein verbundenes Gerät verwenden, müssen Sie die Eingabe des Pakets und der Activity von Hand vornehmen.&lt;br /&gt;
**&#039;&#039;App installieren&#039;&#039;&lt;br /&gt;
**:Geben Sie bei &amp;quot;&#039;&#039;App&#039;&#039;&amp;quot; den Pfad zu einer App an. Der Pfad muss für den Appium-Server gültig sein, der verwendet wird. Sie können auch eine URL angeben. Benutzen Sie einen lokalen Appium-Server, können Sie den rechten Butten benutzen, um zu der Installationsdatei der App zu navigieren und diesen Pfad einzutragen. Wenn möglich werden dabei auch das entsprechende Paket und die Activity in den Feldern darunter eingetragen. Diese Angabe ist aber nicht notwendig.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;iOS&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App auf dem Gerät&#039;&#039;&lt;br /&gt;
**:Geben Sie die Bundle-ID einer installierten App an. Sie können die IDs der installierten Apps bspw. mithilfe von Xcode erfahren. Starten Sie dazu Xcode und wählen Sie in der Menüleiste am oberen Bildschirmrand im Menü &amp;quot;&#039;&#039;Window&#039;&#039;&amp;quot; den Eintrag &amp;quot;&#039;&#039;Devices&#039;&#039;&amp;quot;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wenn Sie Ihr Gerät auswählen, sehen Sie in der Übersicht eine Auflistung der von Ihnen installierten Apps.&lt;br /&gt;
**&#039;&#039;App installieren&#039;&#039;&lt;br /&gt;
**:Geben Sie bei &amp;quot;&#039;&#039;App&#039;&#039;&amp;quot; den Pfad zu einer App an. Der Pfad muss für den Appium-Server gültig sein, der verwendet wird. Sie können auch eine URL angeben. Zu den Vorraussetzungen an Apps für reale Geräte lesen Sie bitte den Abschnitt [[#iOS-Ger.C3.A4t_und_App_vorbereiten|iOS-Geräte und App vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
Im unteren Teil können Sie festlegen, ob die App beim Verbindungsabbau zurückgesetzt bzw. deinstalliert werden soll, und ob sie initial zurückgesetzt werden soll. Auch hier wird die entsprechende Capability gar nicht gesetzt, wenn Sie &amp;quot;&#039;&#039;(Default)&#039;&#039;&amp;quot; auswählen. Mit &amp;quot;&#039;&#039;Weiter&#039;&#039;&amp;quot; gelangen Sie zum nächsten Schritt.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep3&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 3: Servereinstellungen===&lt;br /&gt;
Im letzten Schritt befindet sich zunächst im oberen Teil eine Liste aller Capabilities, die sich aus Ihren Angaben der vorigen Schritte ergeben. Wenn Sie sich mit Appium auskennen und noch zusätzliche Capabilities setzen möchten, die der Verbindungseditor nicht abdeckt, können Sie durch Klicken auf &amp;quot;&#039;&#039;Bearbeiten&#039;&#039;&amp;quot; in die erweiterte Ansicht gelangen. Lesen Sie dazu den Abschnitt weiter unten.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Einstellungen für den GUI-Browser eingeben, können Sie den &#039;&#039;Verbindungsnamen&#039;&#039; eintragen, mit dem die Verbindung angezeigt wird. Dies ist auch der Name unter dem Bausteine diese Verbindung verwenden können, wenn sie aufgebaut ist. Wenn Sie das Feld frei lassen, wird ein Name generiert. Wenn der Haken für &amp;quot;&#039;&#039;Von expecco gesteuert&#039;&#039;&amp;quot; gesetzt ist, wird expecco einen lokalen Appium-Server an einem freien Port starten, oder einen bereits gestarteten freien Server verwenden. Um einen eigenen Server zu verwenden, schalten Sie diese Funktion ab und geben Sie die entsprechende Adresse ein. Sie erhalten die lokale Standard-Adresse und bereits verwendete Adressen zur Auswahl.&lt;br /&gt;
&lt;br /&gt;
In älteren expecco-Versionen ist der Haken mit &amp;quot;&#039;&#039;Bei Bedarf starten&#039;&#039;&amp;quot; beschriftet. In diesem Fall müssen Sie auch eine Adresse angeben, wenn expecco den Server starten soll. expecco versucht dann beim Verbinden einen Appium-Server an der angegebenen Adresse zu starten, wenn dort noch keiner läuft. Dieser Server wird dann beim Beenden der Verbindung ebenfalls heruntergefahren. Dies funktioniert nur für lokale Adressen. Achten Sie darauf, nur Portnummern zu verwenden, die auch frei sind. Verwenden Sie am besten nur ungerade Portnummern ab dem Standardport 4723. Beim Verbindungsaufbau wird ebenfalls die folgende Portnummer verwendet, wodurch es sonst zu Konflikten kommen könnte. &lt;br /&gt;
&lt;br /&gt;
Je nachdem, wie Sie den Dialog geöffnet haben, gibt es nun verschiedene Schaltflächen um ihn abzuschließen. In jedem Fall haben Sie die Option zu speichern. Dabei öffnet sich ein Dialog, indem Sie entweder ein geöffnet Projekt auswählen können, um die Einstellungen dort als Anhang zu speichern, oder auswählen es in einer Datei zu speichern, die Sie anschließend angeben können. Durch das Speichern wird der Dialog nicht beendet, wodurch Sie anschließend noch eine andere Option auswählen könnten.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie den Editor zum Verbindungsaufbau geöffnet haben, können Sie abschließend auf &amp;quot;&#039;&#039;Verbinden&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;Server starten und verbinden&#039;&#039;&amp;quot; klicken, je nachdem, ob der Haken für den Serverstart gesetzt ist. Für das Ändern oder Kopieren einer Verbindung im GUI-Brower heißt diese Option &amp;quot;&#039;&#039;Übernehmen&#039;&#039;&amp;quot;, da in diesem Fall nur der Verbindungseintrag geändert bzw. neu angelegt wird, der Verbindungsaufbau aber nicht gestartet wird. Das können Sie bei Bedarf anschließend über das Kontextmenü tun. Falls Sie Capabilities einer bestehenden Verbindung geändert haben, fordert Sie anschließend ein Dialog auf zu entscheiden, ob diese Änderungen direkt übernommen werden sollen, indem die Verbindung abgebaut und mit den neuen Verbindungen aufgebaut wird, oder nicht. In diesem Fall werden die Änderungen erst wirksam, nachdem Sie die Verbindung neu aufbauen.&lt;br /&gt;
&lt;br /&gt;
Zur Verwendung des Verbindungseditors lesen Sie auch den entsprechenden Abschnitt im jeweiligen Tutorial in Schritt 1 (Android: [[Mobile_Testing_Tutorial#Schritt_1:_Demo_ausf.C3.BChren|Demo ausführen]], iOS: [[Mobile_Testing_Tutorial#Schritt_1:_Demo_ausf.C3.BChren_.28iOS.29|Demo ausführen (iOS)]]).&lt;br /&gt;
&lt;br /&gt;
===Erweiterte Ansicht===&lt;br /&gt;
Die erweiterte Ansicht des Verbindungseditors erhalten Sie entweder durch Klicken auf &amp;quot;&#039;&#039;Bearbeiten&#039;&#039;&amp;quot; im dritten Schritt oder jederzeit über den entsprechenden Menüeintrag, wenn Sie den Editor über das Plugin-Menü gestartet haben. In dieser Ansicht erhalten Sie eine Liste aller eingestellten Appium-Capabilities. Zu dieser können Sie weitere hinzufügen, Einträge ändern oder entfernen. Um eine Capability hinzuzufügen, wählen Sie diese aus der Drop-down-Liste des Eingabefelds aus. In dieser befinden sich alle bekannten Capabilities sortiert in die Kategorien &#039;&#039;Common&#039;&#039;, &#039;&#039;Android&#039;&#039; und &#039;&#039;iOS&#039;&#039;. Haben Sie eine Capability ausgewählt, wird ein kurzer Informationstext dazu angezeigt. Sie können in das Feld auch von Hand eine Capability eingeben. Klicken Sie dann auf &amp;quot;&#039;&#039;Hinzufügen&#039;&#039;&amp;quot;, um die Capabilitiy in die Liste einzutragen. Dort können Sie in der rechten Spalte den Wert setzen. Um einen Entrag zu löschen, wählen Sie diesen aus und klicken Sie auf &amp;quot;&#039;&#039;Entfernen&#039;&#039;&amp;quot;. Mit &amp;quot;&#039;&#039;Zurück&#039;&#039;&amp;quot; verlassen Sie die erweiterte Ansicht.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingErweiterteAnsicht.png]]&lt;br /&gt;
&lt;br /&gt;
== Laufende Appium-Server ==&lt;br /&gt;
Im Menü des Mobile Testing Plugins finden Sie den Eintrag &amp;quot;&#039;&#039;Appium-Server...&#039;&#039;&amp;quot;. Mit diesem öffnen Sie ein Fenster mit einer Übersicht aller Appium-Server, die von expecco gestartet wurden und auf welchem Port diese laufen. Durch Klicken auf das Icon in der Spalte &amp;quot;&#039;&#039;Log anzeigen&#039;&#039;&amp;quot; können Sie das Logfile des entsprechenden Servers anschauen. Dieses wird beim Beenden des Servers wieder gelöscht. Mit den Icons in der Spalte &amp;quot;&#039;&#039;Beenden&#039;&#039;&amp;quot; kann der entsprechenden Server beendet werden. Allerdings wird dies verhindert, wenn expecco über diesen Server noch eine offene Verbindung hat. Für welche Verbindung ein Server verwendet wird, sehen Sie in der rechten Spalte. Steht dort &#039;&#039;&amp;lt;idle&amp;gt;&#039;&#039; wird er zur Zeit nicht von expecco verwendet.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAppiumServer.png]]&lt;br /&gt;
&lt;br /&gt;
Beim Öffnen des Editors um eine Appium-Verbindung aufzubauen, wird direkt ein Appium-Server gestartet, um den folgenden Verbindungsaufbau zu beschleunigen. Zu diesem Zweck hält sich expecco auch immer einen freien Appium-Server offen. Weitere laufende Server, die nicht mehr verwendet werden, werden jedoch nach einiger Zeit automatisch beendet.&lt;br /&gt;
&lt;br /&gt;
Im Menü des Mobile Testing Plugins finden Sie auch den Eintrag &amp;quot;&#039;&#039;Alle Verbindungen und Server beenden&#039;&#039;&amp;quot;. Dies ist für den Fall gedacht, dass Verbindungen oder Server auf andere Weise nicht beendet werden können. Beenden Sie Verbindungen wenn möglich immer im GUI-Browser oder durch Ausführen eines entsprechenden Bausteins. Server, die Sie in der Server-Übersicht gestartet haben, beenden Sie dort; Server, die mit einer Verbindung gestartet wurden, werden automatisch mit dieser beendet.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass in der Übersicht nur Server aufgelistet sind, die von expecco gestartet und verwaltet werden. Mögliche andere Appium-Server, die auf andere Art gestartet wurden, werden nicht erkannt.&lt;br /&gt;
&lt;br /&gt;
== Recorder ==&lt;br /&gt;
Besteht im GUI-Browser eine Verbindung zu einem Gerät, kann der integrierte Recorder verwendet werden, um mit diesem Gerät einen Testabschnitt aufzunehmen. Sie starten den Recorder, indem Sie im GUI-Browser die entsprechende Verbindung auswählen und dann auf den Aufnahme-Knopf klicken. Für den Recorder öffnet sich ein neues Fenster. Die aufgezeichneten Aktionen werden im Arbeitsbereich des GUI-Browsers angelegt. Daher ist es möglich, das Aufgenommene parallel zu editieren.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingRecorder.png|caption|]]&lt;br /&gt;
&lt;br /&gt;
====Komponenten des Recorderfensters====&lt;br /&gt;
#&#039;&#039;&#039;Aufnahme fortsetzen/pausieren&#039;&#039;&#039;: Über das rechte Symbol können Sie die Aufnahme pausieren. Sie sehen dann ein großes Pause-Symbol in der Anzeige. Alle Aktionen, die Sie währenddessen im Recorder machen werden zwar ausgeführt, es werden aber keine Bausteine aufgezeichnet. Über das linke Symbol können Sie dann wieder in den normalen Aufnahmemodus wechseln.&lt;br /&gt;
#&#039;&#039;&#039;Aufnahme stoppen&#039;&#039;&#039;: Stoppt die Aufnahme und schließt das Recorderfenster.&lt;br /&gt;
#&#039;&#039;&#039;Aktualisieren&#039;&#039;&#039;: Holt das aktuelle Bild und den aktuellen Elementbaum vom Gerät. Dies wird nötig, wenn das Gerät zur Ausführung einer Aktion länger braucht oder sich etwas ohne das Anstoßen durch den Recorder ändert. Seit expecco 21.2 gibt es hier zusätzlich ein Untermenü, mit dem automatisches Aktualisieren angeschaltet werden kann, indem im Hintergrund auf Änderungen geprüft wird (siehe auch &#039;&#039;Automatisches Aktualisieren&#039;&#039; weiter unten).&lt;br /&gt;
#&#039;&#039;&#039;Follow-Mouse&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird im GUI-Browser ausgewählt.&lt;br /&gt;
#&#039;&#039;&#039;Element-Highlighting&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird rot umrandet.&lt;br /&gt;
#&#039;&#039;&#039;Elemente einzeichnen&#039;&#039;&#039;: Die Rahmen aller Elemente der Ansicht werden angezeigt.&lt;br /&gt;
#&#039;&#039;&#039;Werkzeuge&#039;&#039;&#039;: Auswahl, mit welchem Werkzeug aufgenommen werden soll. Die gewählte Aktion wird bei einem Klick auf die Anzeige ausgelöst. Dabei stehen folgende Aktionen zur Verfügung:&lt;br /&gt;
#*Aktionen auf Elemente:&lt;br /&gt;
#**Klicken: Kurzer Klick auf das Element, über dem der Cursor steht. Zur genaueren Bestimmung, welches Element verwendet wird, benutzen Sie die Funktion Follow-Mouse oder Element-Highlighting.&lt;br /&gt;
#**Antippen mit Dauer (Element): Ähnlich zum Klicken, nur dass zusätzlich die Dauer des Klicks aufgezeichnet wird. Dadurch sind auch längere Klicks möglich.&lt;br /&gt;
#**Antippen mit Position (Element): Ähnlich zum Klicken, aber zusätzlich wird die Position innerhalb des Elements aufgenommen. Die Position kann relativ zur Größe des Elements aufgenommen werden oder, wenn Sie dabei Strg gedrückt halten, absolut zur linken oberen Ecke des Elements.&lt;br /&gt;
#**Text setzen: Ermöglicht das Setzen eines Textes in Eingabefelder.&lt;br /&gt;
#**Text löschen: Löscht den Text eines Eingabefelds.&lt;br /&gt;
#*Aktionen auf das Gerät:&lt;br /&gt;
#**Antippen (Bildschirm): Löst einen Klick auf die Bildschirmposition aus.&lt;br /&gt;
#**Antippen mit Dauer (Bildschirm): Löst einen Klick auf die Bildschirmposition aus, bei dem auch die Dauer berücksichtigt wird.&lt;br /&gt;
#**Wischen: Wischen in einer geraden Linie vom Punkt des Drückens des Mausknopfes bis zum Loslassen. Die Dauer wird ebenfalls aufgezeichnet.&lt;br /&gt;
#:Beachten Sie bei diesen Aktionen, dass das Ergebnis sich auf verschiedenen Geräten unterscheiden kann, bspw. bei verschiedenen Bildschirmauflösungen.&lt;br /&gt;
#*Erstellen von Testablauf-Bausteinen&lt;br /&gt;
#**Attribut prüfen: Vergleicht den Wert eines festgelegten Attributs des Elements mit einem vorgegebenen Wert. Das Ergebnis triggert den entsprechenden Ausgang.&lt;br /&gt;
#**Attribut zusichern: Vergleicht den Wert eines festgelegten Attributs des Elements mit einem vorgegebenen Wert. Bei Ungleichheit schlägt der Test fehl.&lt;br /&gt;
#**Attribut holen: Liest den aktuellen Wert eines Attributs aus.&lt;br /&gt;
#*Automatisch&lt;br /&gt;
#:Ist das Auto-Werkzeug ausgewählt, können alle Aktionen durch spezifische Eingabeweise benutzt werden: &#039;&#039;Klicken&#039;&#039;, &#039;&#039;Element antippen&#039;&#039; und &#039;&#039;Wischen&#039;&#039; funktionieren weiterhin durch Klicken, wobei sie anhand der Dauer und der Bewegung des Cursors unterschieden werden. Um ein &#039;&#039;Antippen&#039;&#039; auszulösen, halten Sie beim Klicken Strg gedrückt. Die übrigen Aktionen erhalten Sie durch einen Rechtsklick auf das Element in einem Kontextmenü.&lt;br /&gt;
#&#039;&#039;&#039;Kontext-Aktionen&#039;&#039;&#039;: Hier können Sie Aktionen aufzeichnen, die Kontexte betreffen:&lt;br /&gt;
#*Zu Kontext wechseln: Bietet eine Liste der aktuell verfügbaren Kontexte und Sie können auswählen, zu welchem gewechselt werden soll.&lt;br /&gt;
#*Aktuellen Kontext holen: Holt den Handle des aktuellen Kontexts.&lt;br /&gt;
#*Kontext-Handles holen: Holt eine Liste aller aktuell verfügbaren Kontext-Handles.&lt;br /&gt;
#&#039;&#039;&#039;Softkeys&#039;&#039;&#039;: Nur unter Android. Simuliert das Drücken der Knöpfe Zurück, Home, Fensterliste und Power.&lt;br /&gt;
#&#039;&#039;&#039;Home-Button&#039;&#039;&#039;: Nur unter iOS ab expecco 2.11. Ermöglicht das Drücken des Home-Buttons. Vor expecco 19.2 funktioniert es nur, wenn AssistiveTouch aktiviert ist und sich das Menü in der Mitte des oberen Bildschirmrands befindet. Ab expecco 19.2 verwendet die Funktion kein AssistiveTouch mehr.&lt;br /&gt;
#&#039;&#039;&#039;Hilfe&#039;&#039;&#039;: Öffnet diese Online-Dokumentation auf der allgemeinen Seite zu [[GuiBrowser_Recorder|GUI-Browser Recordern]].&lt;br /&gt;
#&#039;&#039;&#039;Anzeige&#039;&#039;&#039;: Zeigt einen Screenshot des Geräts. Aktionen werden mit der Maus je nach Werkzeug ausgelöst. Wenn eine neue Aktion eingegeben werden kann, hat das Fenster einen grünen Rahmen, sonst ist er rot.&lt;br /&gt;
#&#039;&#039;&#039;Fenster an Bild anpassen&#039;&#039;&#039;: Ändert die Größe des Fensters so, dass der Screenshot vollständig angezeigt werden kann.&lt;br /&gt;
#&#039;&#039;&#039;Bild an Fenster anpassen&#039;&#039;&#039;: Skaliert den Screenshot auf eine Größe, mit der er die volle Größe des Fensters ausnutzt.&lt;br /&gt;
#&#039;&#039;&#039;Ansicht anpassen&#039;&#039;&#039;: Öffnet einen Dialog um die Ansicht anzupassen, falls expecco das Bild nicht richtig darstellt. Sie können die Skalierung anpassen oder das Bild um 90° drehen.&lt;br /&gt;
#&#039;&#039;&#039;Ausrichtung anpassen&#039;&#039;&#039;: Korrigiert das Bild, falls dieses auf dem Kopf stehen sollte. Über den Pfeil rechts daneben kann das Bild auch um 90° gedreht werden, falls dies einmal nötig sein sollte. Ab expecco 19.1 finden Sie diese Funktion in &#039;&#039;Ansicht anpassen&#039;&#039;. Die Ausrichtung des Bildes ist für die Funktion des Recorders unerheblich, dieser arbeitet ausschließlich auf den erhaltenen Elementen.&lt;br /&gt;
#&#039;&#039;&#039;Skalierung&#039;&#039;&#039;: Ändert die Skalierung des Screenshots.&lt;br /&gt;
#&#039;&#039;&#039;Meldungen&#039;&#039;&#039;: Zeigt den Pfad des ausgewählten Elements oder andere Meldungen an. Es gibt ein Kontextmenü, um eine Liste der vorigen Meldungen zu sehen.&lt;br /&gt;
&lt;br /&gt;
====Verwendung====&lt;br /&gt;
Mit jedem Klick im Fenster wird eine Aktion ausgelöst und im Arbeitsbereich des GUI-Browsers aufgezeichnet. Dort können Sie das Aufgenommene abspielen, editieren oder daraus einen neuen Baustein erstellen.&lt;br /&gt;
Aktionen zum Auslösen von Sofkeys finden Sie direkt in der Menüleiste (s.o.). Um Aktionen auf Elemente aufzuzeichen, ändern Sie entweder die Auswahl des Werkzeugs in der Menüleiste (s.o.) und klicken dann auf das Element oder wählen Sie die entsprechende Aktion aus dem Kontextmenü durch einen Rechtsklick auf das entsprechende Element aus. Für Texteingabe ist es zudem möglich, den Cursor über dem Element zu platzieren und den Text einzugeben. Dabei öffnet sich der Eingabedialog für diese Aktion.&lt;br /&gt;
Zur Verwendung des Recorders lesen Sie auch Schritt 2 im Tutorial ([[Mobile_Testing_Tutorial#Schritt_2:_Einen_Baustein_mit_dem_Recorder_erstellen|Android]] bzw. [[Mobile_Testing_Tutorial#Schritt_2:_Einen_Baustein_mit_dem_Recorder_erstellen_.28iOS.29|iOS]]).&lt;br /&gt;
&lt;br /&gt;
====Elemente verbergen====&lt;br /&gt;
Ab expecco 21.2 gibt es im Kontextmenü außerdem die Möglichkeit, das ausgewählte Element im Recorder zu verbergen. Das bedeutet, dass dieses Element fortan nicht mehr ausgewählt werden kann. Diese Funktion eignet sich dazu, Elemente zu ignorieren, die im Vordergrund liegen, um auf Elemente darunter zugreifen zu können. Um diesen Zustand wieder rückgängig zu machen, müssen Sie das entsprechende Element im Baum des GUI-Browsers finden, dort gibt es im Kontextmenü ebenfalls einen solchen Eintrag.&lt;br /&gt;
&lt;br /&gt;
====Automatisches Aktualisieren====&lt;br /&gt;
Der Recorder zeigt kein Livebild des Geräts sondern nur eine Momentaufnahme. Um mit der Anzeige auf dem Gerät übereinzustimmen muss daher nach Änderungen aktualisiert werden. Der Recorder aktualisiert sich automatisch, nachdem er eine Aktion ausgeführt hat. Ab expecco 20.2 sind zudem weitere automatische Updates möglich. Sie können Sie im Menü &#039;&#039;Fenster&#039;&#039; aktivieren.&lt;br /&gt;
&lt;br /&gt;
Zum einen kann kurze Zeit nach dem Ausführen einer Aktion überprüft werden, ob es noch Änderungen nach der ersten Aktualisierung gegeben hat, damit in diesem Fall eine zweite Aktualisierung stattfinden kann. Dies soll das Problem beheben, dass der Recorder nach einer Aktion nicht aktuell ist, weil die Aktualisierung zu früh stattgefunden hat.&lt;br /&gt;
&lt;br /&gt;
Zum anderen kann eine periodische Aktualisierung eingeschaltet werden. Nach einem einstellbaren Interval wird der Recorder automatisch aktualisiert, sollte es Änderungen geben. Dadurch ist die Anzeige im Recorder immer weitgehend aktuell, allerdings entsteht dadurch auch ein Mehraufwand was die Kommunikation mit dem Gerät betrifft.&lt;br /&gt;
&lt;br /&gt;
== AVD Manager und SDK Manager ==&lt;br /&gt;
AVD Manager und SDK Manager sind beides Anwendungen von Android. Im Menü des Mobile Testing Plugins bietet expecco die Möglichkeit, diese zu starten. Ansonsten finden Sie diese Programme bei Ihrer Android-Installation. Mit dem AVD Manager können Sie AVDs, also Konfigurationen für Emulatoren, erstellen, bearbeiten und starten. Mit dem SDK Manager erhalten Sie einen Überblick über Ihre Android-Installation und können diese bei Bedarf erweitern.&lt;br /&gt;
&lt;br /&gt;
= Hybrid-Apps und WebViews =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;!!! WICHTIGER HINWEIS - Wenn Sie Probleme haben, auf den Webview zu wechseln, geben Sie bitte unter den Android Einstellungen - Apps -Standard Apps &amp;quot;Chrome&amp;quot; als &amp;quot;Browser-App&amp;quot; an !!!&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hybrid-Apps enthalten neben den Plattform-nativen Elementen weitere Elemente, die in einen WebView eingebunden sind. Diese Elemente können ebenfalls bedient werden, allerdings muss zuvor in den entsprechenden Kontext gewechselt werden. Mit dem Baustein &amp;quot;&#039;&#039;Get Current Context&#039;&#039;&amp;quot; erhalten Sie den aktuellen Kontext. Zu Beginn ist dies &amp;quot;&#039;&#039;NATIVE_APP&#039;&#039;&amp;quot;, also der Kontext der nativen Elemente. Mit dem Baustein &amp;quot;&#039;&#039;Get Context Handles&#039;&#039;&amp;quot; bekommen Sie eine Collection aller vorhandenen Kontexte. Gibt es einen WebView-Kontext, so heißt dieser &amp;quot;&#039;&#039;WEBVIEW_1&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;WEBVIEW_&amp;lt;package&amp;gt;&#039;&#039;&amp;quot; mit dem Paket des WebViews. Es kann auch mehrere WebView-Kontexte geben. Zu jedem WebView-Kontext gibt es im nativen Kontext ein entsprechendes WebView-Element. Mit dem Baustein &amp;quot;&#039;&#039;Switch to Context&#039;&#039;&amp;quot; können Sie in einen solchen Kontext wechseln und haben fortan nur Zugriff auf die Elemente in diesem Kontext.&lt;br /&gt;
&lt;br /&gt;
Im GUI-Browser werden zum einen oben im Baum die vorhandenen Kontexte angezeigt, zum anderen wird der Baum eines Kontexts unterhalb des entsprechenden WebView-Elements eingefügt.&lt;br /&gt;
&lt;br /&gt;
= XPath anpassen mithilfe des GUI-Browsers =&lt;br /&gt;
Bausteine, die auf einem Gerät fehlerfrei funktionieren, tun dies auf anderen Geräten möglicherweise nicht. Auch können kleine Änderungen der App dazu führen, dass ein Baustein nicht mehr den gewünschten Effekt hat. Man sollte einen Baustein daher so robust formulieren, dass er für eine Vielzahl von Geräten verwendet werden kann und kleine Anpassungen an der App verkraftet. Dazu muss man das grundlegende Funktionsprinzip der Adressierung verstehen. Dies wird im Folgenden am Beispiel der App aus dem Tutorial erläutert.&lt;br /&gt;
&lt;br /&gt;
Die Ansicht der App setzt sich aus einzelnen Elementen zusammen. Dazu gehören die Schaltflächen &amp;quot;&#039;&#039;GTIN-13 (EAN-13)&#039;&#039;&amp;quot; und &amp;quot;&#039;&#039;Verify&#039;&#039;&amp;quot;, das Eingabefeld der Zahl &amp;quot;&#039;&#039;4006381333986&#039;&#039;&amp;quot; und das Ergebnisfeld, in dem OK erscheint, wie auch alle anderen auf der Anzeige sichtbaren Dinge. Diese sichtbaren Elemente sind in unsichtbare Strukturelemente eingebettet. Alle Elemente zusammen sind in einer zusammenhängenden Hierarchie, dem Elementbaum, organisiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingGUIBrowser.png | frame | left | Abb. 1: Funktionen des GUI-Browsers]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
Sie können sich diesen Baum im GUI-Browser ansehen. Wechseln Sie dazu in den GUI-Browser (Abb. 1) und starten Sie eine beliebige Verbindung. Sobald die Verbindung aufgebaut ist, können Sie den gesamten Baum aufklappen (1) (Klick bei gedrückter Strg-Taste). Er enthält alle Elemente der aktuellen Seite der App.&lt;br /&gt;
&lt;br /&gt;
Ein Baustein, der nun ein bestimmtes Element verwendet, muss dieses eindeutig angeben, indem er dessen Position im Elementbaum mit einem Pfad im XPath-Format beschreibt. Dieses Format ist ein verbreiteter Web-Standard für XML-Dokumente und -Datenbanken, eignet sich aber genauso für Pfade im Elementbaum.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie ein Element im Baum auswählen, wird unten der von expecco automatisch generierte XPath (2) für das Element angezeigt, der auch beim Aufzeichnen verwendet wird. Oberhalb davon in der Mitte des Fensters befindet sich eine Liste der Eigenschaften (3) des ausgewählten Elements. Man nennt diese Eigenschaften auch Attribute. Sie beschreiben das Element näher wie beispielsweise seinen Typ, seinen Text oder andere Informationen zu seinem Zustand. Links unten können Sie zur besseren Orientierung im Baum die &#039;&#039;Vorschau&#039;&#039; (4) aktivieren, um sich den Bildausschnitt des Elements anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Der Elementbaum für gleiche Ansicht einer App kann sich je nach Gerät unterscheiden. Es sind diese Unterschiede, die verhindern, eine Aufnahme von einem Gerät unverändert auch auf allen anderen Geräten abzuspielen: Ein XPath, der im einen Elementbaum ein bestimmtes Element identifiziert, beschreibt nicht unbedingt das gleiche Element im Elementbaum auf einem anderen Gerät. Es kann stattdessen passieren, dass der XPath auf kein Element, auf ein falsches Element oder auf mehrere Elemente passt. Dann schlägt der Test fehl oder er verhält sich unerwartet.&lt;br /&gt;
&lt;br /&gt;
Man könnte natürlich für jedes Gerät einen eigenen Testfall schreiben. Das brächte aber unverhältnismäßigen Aufwand bei Testerstellung und -wartung mit sich. Das Problem lässt sich auch anders lösen, da ein jeweiliges Element nicht nur durch genau einen XPath beschrieben wird. Vielmehr erlaubt der Standard mithilfe verschiedener Merkmale unterschiedliche Beschreibungen für ein und dasselbe Element zu formulieren. Das Ziel ist daher, einen Pfad zu finden, der auf allen für den Test verwendeten Geräten funktioniert und überall eindeutig zum richtigen Element führt.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel besteht die Verbindung zur Android-App aus dem Tutorial und der Eintrag des &amp;quot;&#039;&#039;GTIN-13&#039;&#039;&amp;quot;-Buttons ist ausgewählt (5). Dessen automatisch generierter XPath (2) kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[@resource id=&#039;android:id/content&#039;]/android.widget.RelativeLayout/android.widget.Button[@resource-id=&#039;de.exept.expeccomobiledemo:id/gtin_13&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Er ist offensichtlich lang und unübersichtlich. Der sehr viel kürzere Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@text=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
führt zum selben Element.&lt;br /&gt;
&lt;br /&gt;
Für die iOS-App lautet der automatisch generierte XPath für diesen Button beispielsweise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/XCUIElementTypeApplication/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/UIAApplication/UIAWindow[1]/UIAButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und kann kürzer als&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@name=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Sie können den Pfad entsprechend im GUI-Browser ändern und durch &amp;quot;&#039;&#039;Pfad überprüfen&#039;&#039;&amp;quot; (6) feststellen, ob er weiterhin auf das ausgewählte Element zeigt, was expecco mit &amp;quot;&#039;&#039;Verify Path: OK&#039;&#039;&amp;quot; (7) bestätigen sollte. Der erste, sehr viel längere Pfad, beschreibt den gesamten Weg vom obersten Element des Baumes bis hin zum gesuchten Button. Der zweite Pfad hingegen wählt mit &amp;quot;*&amp;quot; zunächst sämtliche Elemente des Baumes und schränkt die Auswahl dann auf genau die Elemente ein, die ein &#039;&#039;text&#039;&#039;- bzw. &#039;&#039;name&#039;&#039;-Attribut mit dem Wert &amp;quot;&#039;&#039;GTIN-13 (EAN-13)&#039;&#039;&amp;quot; besitzen, in unserem Fall also genau der eine Button, den wir suchen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden Android-ähnliche Pfade zur Veranschaulichung verwendet. Die Elemente in iOS-Apps heißen zwar anders, wodurch andere Pfade entstehen; das Prinzip ist jedoch das gleiche.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum1.png | frame | Abb. 2: Elementbaum einer fiktiven App]]&lt;br /&gt;
&lt;br /&gt;
Sie können solche Pfade mit Hilfe weniger Regeln selbst formulieren. Sehen Sie sich den einfachen Baum einer fiktiven Android-App in Abb. 2 an: Die Einrückungen innerhalb des Baumes geben die Hierarchie der Elemente wieder. Ein Element ist ein &#039;&#039;Kind&#039;&#039; eines anderen Elementes, wenn jenes andere Element das nächsthöhere Element mit einem um eins geringeren Einzug ist. Jenes Element ist das &#039;&#039;Elternelement&#039;&#039; des Kindes. Sind mehrere untereinander stehende Elemente gleich eingerückt, so sind sie also alle Kinder desselben Elternelements.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad durch alle Ebenen der Hierarchie zum TextView-Element ist nun:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Elemente sind mit Schrägstrichen voneinander getrennt. Es fällt auf, dass der Name des ersten Elements nicht mit dem im Baum übereinstimmt. Das oberste Element in der Hierarchie heißt immer &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot; (für iOS wäre es &amp;quot;&#039;&#039;AppiumAUT&#039;&#039;&amp;quot;), expecco zeigt im Baum stattdessen den Namen der Verbindung an, damit man mehrere Verbindungen voneinander unterscheiden kann. Die weiteren Elemente tragen jeweils das Präfix &amp;quot;&#039;&#039;android.widget.&#039;&#039;&amp;quot;, das im Baum zur besseren Übersicht nicht angezeigt wird. Bei IOS gibt es kein Präfix, das durch einen Punkt abgetrennt wäre, expecco 2.11 blendet aber entsprechend &amp;quot;&#039;&#039;XCUIElementType&#039;&#039;&amp;quot; am Anfang aus. Mit jedem Schrägstrich führt der Pfad über eine Eltern-Kind-Beziehung in eine tiefere Hierarchie-Ebene, d. h. &amp;quot;&#039;&#039;FrameLayout&#039;&#039;&amp;quot; ist ein Kindelement von &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot;, &amp;quot;&#039;&#039;LinearLayout&#039;&#039;&amp;quot; ist ein Kind von &amp;quot;&#039;&#039;FrameLayout&#039;&#039;&amp;quot; usw. Die in eckigen Klammern geschriebenen Wörter dienen nur als Orientierungshilfe im Baum. Sie gehören nicht zum Typ.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad muss nicht beim Element &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot; beginnen. Man kann den Pfad beginnend mit einem beliebigen Element des Baumes bilden. Man kann also verkürzt auch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
schreiben. Der Pfad führt zum selben &amp;quot;&#039;&#039;TextView&#039;&#039;&amp;quot;-Element, da es nur ein Element dieses Typs gibt. Anders verhält es sich bei dem Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da es zwei Elemente vom Typ &amp;quot;&#039;&#039;Button&#039;&#039;&amp;quot; gibt, passt dieser Pfad auf zwei Elemente, nämlich den Button, der mit &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; markiert ist, und den &#039;&#039;Button&#039;&#039;, der mit &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; markiert ist. Es würde an dieser Stelle aber auch nicht helfen den langen Pfad von &#039;&#039;hierarchy&#039;&#039; aus beginnend anzugeben. Um einen mehrdeutigen Pfad weiter zu differenzieren, kann man explizit ein Element aus einer Menge wählen, indem man den numerischen Index in eckigen Klammern dahinter schreibt. Der Pfad aus dem obigen Beispiel lässt sich damit so anpassen, dass er eindeutig auf den &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; weist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[1].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ihnen fällt sicher auf, dass der Index eine 1 ist obwohl das zweite Element gemeint ist. Das kommt daher, dass die Zählung bei 0 beginnt. Der Button mit der Markierung &amp;quot;An&amp;quot; hat also die Nummer 0 und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Nummer 1.&lt;br /&gt;
&lt;br /&gt;
Dieser Ansatz, einen expliziten Index zu verwenden, hat zwei Nachteile: Zum einen lässt sich an dem Pfad nur schwer ablesen welches Element gemeint ist, zum andern ist der Pfad sehr empfindlich schon gegenüber kleinsten Änderungen, wie zum Beispiel dem Vertauschen der beiden &#039;&#039;Button&#039;&#039;-Elemente oder dem Einfügen eines weiteren &#039;&#039;Button&#039;&#039;-Elements in der App.&lt;br /&gt;
&lt;br /&gt;
Es wäre daher wünschenswert, das gemeinte Element über eine ihm charakteristische Eigenschaft wie einen Attributwert, zu adressieren. Für Android-Apps eignet sich hierfür häufig das Attribut &amp;quot;&#039;&#039;resource-id&#039;&#039;&amp;quot;. Im Idealfall muss bei der Entwicklung der App darauf geachtet werden, dass jedes Element eine eindeutige Id erhält. Die &#039;&#039;resource-id&#039;&#039; hat den großen Vorteil, dass sie unabhängig vom Text des Elements oder der Spracheinstellung des Geräts ist. Für iOS-Apps kann entsprechend das Attribut &amp;quot;&#039;&#039;name&#039;&#039;&amp;quot; verwendet werden, wenn es von der App sinnvoll gesetzt wird. Der XPath-Standard erlaubt solche Auswahlbedingungen zu einem Element anzugeben. Angenommen, der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Eigenschaft &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;off&#039;&#039; und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; hat als &#039;&#039;resource-id&#039;&#039; den Wert &#039;&#039;on&#039;&#039;, dann kann man als eindeutigen Pfad für den &amp;quot;Aus&amp;quot;-&#039;&#039;Button&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[@resource-id=&#039;off&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
formulieren. Wie an dem Beispiel zu sehen werden solche Bedingungen wie ein Index in eckigen Klammern an den Elementtyp angehängt. Der Name eines Attributes wird mit einem &amp;quot;@&amp;quot; eingeleitet und der Wert mit einem &amp;quot;=&amp;quot; in Anführungszeichen angehängt. Ist der Attributwert global eindeutig, kann man den vorausgehenden Pfad sogar durch den globalen Platzhalter * ersetzen, der auf jedes Element passt. Das obige Beispiel mit dem GTIN-13-&#039;&#039;Button&#039;&#039; war ein solcher Fall.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum2.png | frame | Abb. 3: Elementbaum einer fiktiven App mit Erweiterungen]]&lt;br /&gt;
&lt;br /&gt;
Abb. 3 zeigt eine Erweiterung des Beispiels aus Abb. 2. Die App hat nun ein weiteres, nahezu identisches &#039;&#039;LinearLayout&#039;&#039; bekommen. Die &#039;&#039;Buttons&#039;&#039; sind in ihren Attributen jeweils ununterscheidbar. Deshalb funktioniert der vorige Ansatz nicht, einen eindeutigen Pfad nur mithilfe eines Attributwerts zu formulieren. Offensichtlich unterscheiden sich aber ihre benachbarten &#039;&#039;TextViews&#039;&#039;. Es ist möglich die jeweilige &#039;&#039;TextView&#039;&#039; in den Pfad mit aufzunehmen, um einen &#039;&#039;Button&#039;&#039; dennoch eindeutig zu adressieren. Ein Pfad zum &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; unterhalb der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; kann dabei wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView[@resource-id=&#039;push&#039;]/../android.widget.Button[@resource-id=&#039;on&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Teil beschreibt den Pfad zu der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; und der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;push&#039;&#039;. Danach folgt ein Schrägstrich gefolgt von zwei Punkten. Die zwei Punkte sind eine spezielle Elementbezeichnung, die nicht ein Kindelement benennt, sondern zum Elternelement wechselt, in diesem Fall also das &#039;&#039;LinearLayout&#039;&#039;, in dem die &#039;&#039;TextView&#039;&#039; eingebettet ist. Im Kontext dieses &#039;&#039;LinearLayout&#039;&#039; ist der restliche Pfad, nämlich der &#039;&#039;Button&#039;&#039; mit der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;on&#039;&#039;, eindeutig.&lt;br /&gt;
&lt;br /&gt;
Der XPath-Standard bietet noch sehr viel mehr Ausdrucksmittel. Mit der hier knapp vorgestellten Auswahl ist es aber bereits möglich für die meisten praktischen Testfälle gute Pfade zu formulieren. Eine vollständige Einführung in XPath ginge über den Umfang dieser Einführung weit hinaus. Sie finden zahlreiche weiterführende Dokumentationen im Web und in Büchern.&lt;br /&gt;
&lt;br /&gt;
Eine universelle Strategie zum Erstellen guter XPaths gibt es nicht, da sie von den Testanforderungen abhängt. In der Regel ist es sinnvoll, den XPath kurz und dennoch eindeutig zu halten. Häufig lassen sich Elemente über Eigenschaften identifizieren wie beispielsweise ihren Text. Will man aber gerade den Text eines Elements auslesen, kann dieser natürlich nicht im Pfad verwendet werden, da er vorher nicht bekannt ist. Ebenso wird der Text variieren, wenn die App mit verschiedenen Sprachen gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Jeder Baustein, der auf einem Element arbeitet, hat einen Eingangspin für den XPath. Im GUI-Browser finden Sie in der Mitte oben eine Liste von Bausteinen mit Aktionen, die Sie auf das ausgewählte Element anwenden können. Suchen Sie den Baustein &#039;&#039;Click&#039;&#039; (8) im Ordner Elements und wählen Sie ihn aus (Abb. 1). Er wird im rechten Teil unter &amp;quot;&#039;&#039;Test&#039;&#039;&amp;quot; eingefügt, der Pin für den XPath ist mit dem automatisch generierten Pfad des Elements vorbelegt (9). Sie können den Baustein hier auch ausführen. Die Ansicht wechselt dann auf &amp;quot;&#039;&#039;Lauf&#039;&#039;&amp;quot;. Ändert sich durch die Aktion der Zustand Ihrer App, müssen Sie den Baum anschließend aktualisieren (10).&lt;br /&gt;
&lt;br /&gt;
Wenn Sie in der unteren Liste eine Eigenschaft auswählen, wechselt die Anzeige der Bausteine zu &amp;quot;&#039;&#039;Eigenschaften&#039;&#039;&amp;quot;, wo Sie die eigenschaftsbezogenen Bausteine finden. Wie bei den Aktionen können Sie auch hier einen Baustein auswählen, der dann rechts in Test mit dem Pfad des Elements und der ausgewählten Eigenschaft eingetragen wird, sodass Sie ihn direkt ausführen können.&lt;br /&gt;
&lt;br /&gt;
== Weitere Locator-Strategien ==&lt;br /&gt;
Appium bietet neben XPath noch weitere Strategien zur Adressierung von Elementen an. Einige davon stehen Ihnen &#039;&#039;&#039;ab Version 20.1&#039;&#039;&#039; ebenfalls mit expecco zur Verfügung. Diese sind nicht ganz so mächtig wie XPath, dafür aber häufig schneller bei der Auflösung auf dem Gerät. Insbesondere bei der Verwendung mit iPhones, wo die Hierarchie bei jeder XPath-Auflösung erst aufgebaut werden muss, bieten alternative Strategien einen Vorteil für die Laufzeit.&lt;br /&gt;
&lt;br /&gt;
XPath ist weiterhin der Standard, das heißt alle Locator ohne besondere Angabe werden als XPath interpretiert. Um eine der anderen Strategien zu verwenden, schreiben Sie diese mit einem Gleichzeichen vor den gewünschten Locator. Diese Technik können Sie sowohl an den Blöcken verwenden, als auch im GUI-Browser testen.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | AccessibilityId || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Wert des Elements, der dazu dient, die App barrierefrei zu machen. Für iOS ist das das Attribut &#039;&#039;&#039;Accessibility-id&#039;&#039;&#039;, für Android das Attribut &#039;&#039;&#039;content-descr&#039;&#039;&#039;. &#039;&#039;Beispiel: accessibilityId=Löschen&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | className || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Namen der Klasse des Elements. &#039;&#039;Beispiel: className=android.widget.FrameLayout&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | id || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet die Kennung des Elements. Für iOS ist das das Attribut &#039;&#039;&#039;name&#039;&#039;&#039;, für Android das Attribut &#039;&#039;&#039;resource-id&#039;&#039;&#039;. &#039;&#039;Beispiel: id=android:id/text1&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | iOSClassChain&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet die Hierarchie der Elemente ähnlich wie bei XPath. Eine Erklärung zum Aufbau finden Sie [https://github.com/facebookarchive/WebDriverAgent/wiki/Class-Chain-Queries-Construction-Rules hier]. &#039;&#039;Beispiel: iOSClassChain=XCUIElementTypeWindow/XCUIElementTypeButton[`label == &amp;quot;Ok&amp;quot;`]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; padding-right:1em&amp;quot; | iOSNsPredicateString&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet einfache Kriterien, wie Attribute, die auch kombiniert werden können. &#039;&#039;Beispiel: iOSNsPredicateString=type == &#039;XCUIElementTypeButton&#039; AND name == &#039;Weiter&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | name&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Namen des Elements. &#039;&#039;Beispiel: name=Bestätigen&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &#039;&#039;nur für iOS&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Um eine direkte Beschleunigung mit iOS zu erzielen, ohne dass Sie Ihre bisherigen Pfade anpassen müssen, wandelt expecco zudem Pfade, die nur aus einem Element mit Klasse und name-Attribut bestehen, zur Laufzeit automatisch in einen entsprechenden Locator der Strategie iOSNsPredicateString um. Wenn Sie einen Pfad explizit als XPath markieren, wird diese Anpassung nicht vorgenommen.&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span id=&amp;quot;troubleshooting&amp;quot;&amp;gt;&amp;lt;!-- Referenced by error dialog on connection error --&amp;gt;&amp;lt;/span&amp;gt;Probleme und Lösungen=&lt;br /&gt;
== Locator sind versionsabhängig oder variabel ==&lt;br /&gt;
Dann sollten Sie die Locator (xPath) entweder in einer Variablen halten oder ein Locator-Mapping in einem Screenplay Anhang definieren. Es ist auch möglich, lediglich Teile des Locators (z.B. Locator-Pfad eines Elternelements oder Attributwert) in einer Variable zu halten und im Freezevalue des Locator-Pins mit &amp;quot;&#039;&#039;$(varName)&#039;&#039;&amp;quot; einzufügen.&lt;br /&gt;
&lt;br /&gt;
==Unsichtbare UI-Elemente==&lt;br /&gt;
Beachten Sie, dass im [[#Recorder|Recorder]] auch Elemente berücksichtigt werden, die Sie auf dem Bildschirm nicht sehen. Schalten Sie daher das Element-Highlighting an oder nutzen Sie die Follow-Mouse-Funktion und den Elementbaum im GUI-Browser, um festzustellen, ob das richtige Element verwendet wird. Es kann vorkommen, dass unsichtbare Elemente vor anderen Elementen liegen und diese verdecken, so dass die gewünschten Elemente im Recorder nicht ausgewählt werden können. Lesen Sie dazu den Abschnitt [[#Elemente_verbergen|Elemente verbergen]].&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;org.openqa.selenium.StaleElementReferenceException&#039;&#039;==&lt;br /&gt;
Der Fehler &amp;lt;code&amp;gt;org.openqa.selenium.StaleElementReferenceException&amp;lt;/code&amp;gt; tritt immer dann auf, wenn ein Element verwendet wird, das nicht mehr da ist. Wenn das in Ihrem Test passiert und das Element eigentlich da sein sollte, verwenden Sie an der Stelle stattdessen den Locator (XPath), um das Element neu zu holen.&lt;br /&gt;
&lt;br /&gt;
In manchen Fällen kann dieser Fehler auch dann auftreten, wenn Sie am Baustein bereits Locator angegeben haben. Das liegt daran, dass immer zuerst der Locator aufgelöst und das entsprechende Element geholt wird und dann die Aktionen mit dem Element ausgeführt wird. Wenn die App das Element genau zwischen dem Zeitpunkt des Auflösens und Holens und der Ausführung der Aktion aktualisiert und dabei ein neues Element erzeugt, kommt es zu diesem Fehler. Passiert das an einer bestimmten Stelle in Ihrem Test, bleibt nichts anderes als den Fehler abzufangen und es erneut zu versuchen.&lt;br /&gt;
&lt;br /&gt;
==iOS: Kabel nicht zertifiziert==&lt;br /&gt;
In manchen Fällen erscheint beim Verbinden eines iOS-Geräts über USB der Hinweis, das verwendete Kabel sei nicht zertifiziert. In diesem Fall hilft es nur, das entsprechende Kabel auszutauschen.&lt;br /&gt;
==iOS: Alerts beim Verbindungsaufbau==&lt;br /&gt;
Stellen Sie sicher, dass beim Verbindungsaufbau mit einem iOS-Gerät keine Alerts geöffnet sind. Der Aufbau schlägt sonst fehl, da die App nicht in den Vordergrund kommen kann. Siehe auch [[#iOS-Ger.C3.A4t_und_App_vorbereiten|iOS-Gerät und App vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
==iOS: .ipa installieren nicht möglich==&lt;br /&gt;
Beachten Sie, dass auf iOS-Simulatoren keine &#039;&#039;.ipa&#039;&#039;-Dateien sondern nur &#039;&#039;.app&#039;&#039;-Dateien installiert werden können.&lt;br /&gt;
&lt;br /&gt;
==iOS: Erster Verbindungsaufbau funktioniert nicht==&lt;br /&gt;
Wenn auf Ihrem Mac noch kein signierter Build des WebDriverAgents liegt, muss dieser beim ersten Verbindungsaufbau erst erzeugt werden. Das kann in der Regel etwas länger als eine Minute dauern. Standardmäßig verwendet Appium aber einen Timeout von 60000&amp;amp;nbsp;ms um zu warten bis der WebDriverAgent auf dem Gerät startet, so dass der Aufbau in diesen Fällen abgebrochen wird. Sie können den Timeout mit der Capability &#039;&#039;wdaLaunchTimeout&#039;&#039; setzen, z.B. auf &#039;&#039;120000&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Außerdem müssen die Einstellungen für die Signierung passen. Am zuverlässigsten funktioniert das nach unserer Erfahrung, wenn man im Xcode-Projekt des WebDriverAgents auf automatische Signierung stellt und das Team setzt. Siehe dazu die Erklärung im Abschnitt [[#WebDriverAgent-Signierung|WebDriverAgent-Signierung]]. In diesem Fall sollten Sie die Capabilities &#039;&#039;xcodeConfigFile&#039;&#039; bzw. &#039;&#039;xcodeOrgId&#039;&#039; und &#039;&#039;xcodeSigningId&#039;&#039; &#039;&#039;&#039;nicht&#039;&#039;&#039; verwenden, da es sonst zu Konflikten kommen kann. Achtung: Wenn Sie eine Team-ID in den Mobile-Testing-Einstellungen gesetzt haben, setzt expecco diese automatisch als &#039;&#039;xcodeOrgId&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
Achten Sie beim ersten Verbindungsaufbau außerdem auf Ihr Gerät, da Sie dort möglicherweise der Installation per Passwort zustimmen müssen. Auf dem Mac kann die Eingabe des Passworts zur Freigabe des Schlüsselbunds für die Signierung nötig werden, häufig auch mehrmals.&lt;br /&gt;
&lt;br /&gt;
==Android: Gerät nicht im Verbindungsdialog==&lt;br /&gt;
Wenn ein über USB angeschlossenes Android-Gerät nicht im Verbindungsdialog auftaucht, versuchen Sie, den USB-Verbindungstyp zu ändern. In der Regel sollten MTP oder PTP funktionieren. Prüfen Sie nochmal, ob &amp;quot;USB Debugging&amp;quot; in den Entwicklereinstellungen des Geräts aktiviert ist (diese Einstellungen sind bei manchen Geräten zunächst unsichtbar, und müssen durch einen Trick zugänglich gemacht werden). Siehe auch [[#Android-Ger.C3.A4t_vorbereiten|Android-Gerät vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
==Android: Abgeschnittene Elemente unten==&lt;br /&gt;
Bei Android-Geräten, die die Steuerungsleiste bzw. Softkeys automatisch ein- und ausblenden, kann es vorkommen, dass der Recorder im unteren Bereich Elemente abschneidet, die durch die Softkeys verdeckt würden, auch wenn sie zu diesem Zeitpunkt gar nicht angezeigt werden. In diesem Fall hift es, die Softkeys so einzustellen, dass sie in einer permanenten Leiste angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
Bei neueren Android-Versionen gibt es eine solche Einstellung in der Regel nicht. Auch wenn die Steuerelemente permanent eingeblendet sind, liegen sie auf keiner extra Leiste, sondern vor dem Inhalt der App. Es gibt dann im unteren Teil einen Bereich, der nicht bedient werden kann, weil er nicht zum aktiven Bereich der App gezählt wird, weshalb die Elemente von Appium abgeschnitten werden. Dieser Bereich kann auch größer sein als von den Steuerungselementen beansprucht. Bekannt ist dies für Samsung-Geräte mit Android 11. Da die Information über die Größe des App-Bereichs bereits auf Android-Ebene so geliefert wird, können wir hierfür keine Lösung anbieten, sondern können nur hoffen, dass das Problem vom Hersteller behoben wird. Sie können versuchen, ob Sie mit der Einstellung von Gestensteuerung bessere Ergebnisse bekommen, allerdings gibt es hier das gleiche Problem.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;waitForIdleTimeout&amp;quot;&amp;gt;&amp;lt;!-- Referenced by expecco--&amp;gt;&amp;lt;/span&amp;gt; Android: Test hängt beim Suchen eines Elements==&lt;br /&gt;
Der Baustein &#039;&#039;Find Element by XPath&#039;&#039; und alle Element-Bausteine warten bis ein Element zum angegebenen Pfad auftaucht. Den Timeout dafür kann man entweder am Baustein direkt oder in den Umgebungsvariablen ändern. Wenn das Element aber bereits da sein sollte und es dennoch sehr lange dauert, bis der Test weitergeht, kann das am UIAutomator/UIAutomator2 liegen. Dieser wartet, bis die App in den Idle-Zustand geht, bevor er überhaupt nach Elementen sucht. Dies kann länger dauern, wenn die App z.B. im Hintergrund noch Animationen abspielt oder andere Aktionen ausführt. Auch das Holen des Page-Sources z.B. beim Aktualisieren im GUI-Browser oder im Recorder kann dadurch länger dauern. Standardmäßig gibt es hierfür einen Timeout von 10 Sekunden, nach dem nicht weiter auf den Idle-Zustand gewartet wird. Dieser Timeout lässt sich durch eine Einstellung in Appium anpassen (waitForIdleTimeout). Falls Sie einen anderen Wert für diesen Timeout setzen möchten, ist dies ab expecco 21.2 möglich, indem Sie vor dem Test den Smalltalk-Code &amp;lt;code&amp;gt;AppiumTestRunner::TestRunConnection waitForIdleTimeout:2000&amp;lt;/code&amp;gt; ausführen. Der Timeout wird in Millisekunden angegeben, das Beispiel setzt ihn also auf 2 Sekunden.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;startChromedriverTimeout/&amp;gt;Android: Aktualisieren des Trees oder Wechseln zum Webview-Kontext braucht zu lange==&lt;br /&gt;
Speziell mit älteren Geräten kann es vorkommen, dass neuere Chromedriver nicht initialisiert werden können. Das führt dann dazu, dass nicht in den Webview-Kontext gewechselt werden kann. Dies wird von Appium allerdings nur über einen Timeout festgestellt, der standardmäßig bei 4 Minuten liegt. Da expecco auch beim Aufbauen des Trees im GUI-Browser versucht in den Webview-Kontext zu wechseln, kann das zu sehr langen Ladezeiten führen. Da es in Appium keine Möglichkeit gibt, diesen Timeout herunter zu setzen, haben wir die Version, die wir im MobileTestingSupplement bereitstellen, um eine entsprechende Capability erweitert. Ab der Version 1.13.1.0 des [[#Windows|MobileTestingSupplements]] kann mit &#039;&#039;chromedriverStartTimeout&#039;&#039; der Timeout in Millisekunden gesetzt werden. Der Wechsel funktioniert dadurch zwar trotzdem nicht, aber expecco braucht dann nicht mehr so lange beim Aktualisieren des Trees und der Baustein zum Wechseln des Kontextes schlägt schneller fehl. Der Verbindungsdialog fügt diese Capability ab expecco 22.1 automatisch hinzu.&lt;br /&gt;
&lt;br /&gt;
==Keine Aktion bei Klick==&lt;br /&gt;
Der Baustein zum Klicken auf ein Element ist erfolgreich, aber auf dem Gerät wurde keine Aktion ausgeführt.&lt;br /&gt;
:Dies kann vorkommen, wenn das Element von einem anderen Element verdeckt ist und ein Klick auf das Element deshalb nicht möglich ist. In diesem Fall wird von Appium kein Fehler geworfen, sondern es passiert einfach nichts. Wenn Sie dennoch einen Klick an der Position des Elements machen möchten, auch wenn es verdeckt ist, benutzen Sie stattdessen den Baustein &#039;&#039;Tap&#039;&#039; und übergeben Sie diesem die Position des Elements (&#039;&#039;Get Location&#039;&#039;). Wenn Sie stattdessen vor einem Klick prüfen möchten, ob das Element zu diesem Zeitpunkt verdeckt ist, versuchen Sie, ob Ihnen die Eigenschaften &#039;&#039;Is Displayed&#039;&#039; oder &#039;&#039;Is Enabled&#039;&#039; weiterhelfen.&lt;br /&gt;
&lt;br /&gt;
==Kein Update nach Aktion==&lt;br /&gt;
Über den Recorder wurde eine Aktion ausgeführt, für die auch ein Baustein aufgezeichnet wurde, der Recorder zeigt aber immer noch das alte Bild.&lt;br /&gt;
:Der Recorder zeigt kein Livebild des Geräts, sondern immer nur eine Momentaufnahme. Nachdem eine Aktion ausgeführt wurde, aktualisiert sich der Recorder automatisch. Es kann aber vorkommen, dass das Bild schon aktualisiert wurde, bevor die Auswirkungen der Aktion auf dem Gerät vollständig abgeschlossen sind. In diesem Fall sollten Sie den Recorder von Hand aktualisieren über das Symbol mit den blauen Pfeilen. Ab expecco 20.2 können Sie für diesen Fall auch automatisches Aktualisieren einstellen. Siehe auch Beschreibung zum [[#Recorder|Recorder]].&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;clickable&amp;quot; Attribut falsch==&lt;br /&gt;
Ein Element hat im &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; Attribut/Property den Wert &amp;quot;&#039;&#039;false&#039;&#039;&amp;quot;, ist aber dennoch anklickbar.&lt;br /&gt;
:Das &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; Attribute muss explizit vom App-Programmierer gesetzt werden, und hat tatsächlich keine Relevanz für das tatsächliche Verhalten der App. Sie sollten dieses Attribut i.A. in Ihren Tests nicht beachten.&amp;lt;br&amp;gt;Leider existieren viele Apps, bei denen der Programmierer hier &amp;quot;lazy&amp;quot; war.&lt;br /&gt;
&lt;br /&gt;
==Verbindungsaufbau schlägt fehl==&lt;br /&gt;
Schlägt der Verbindungsaufbau mit dem Appium-Server fehl, erhalten Sie in expecco eine Fehlermeldung ähnlicher der unten abgebildeten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingVerbindungsfehler.png]]&lt;br /&gt;
&lt;br /&gt;
Hier sehen Sie die Art des aufgetretenen Fehlers. Klicken Sie auf &amp;quot;&#039;&#039;Details&#039;&#039;&amp;quot; um nähere Informationen zu erhalten. Mögliche Fehler sind:&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.remote.UnreachableBrowserException&#039;&#039;&lt;br /&gt;
:Der angegebene Server läuft nicht oder ist nicht erreichbar. Überprüfen Sie die Serveradresse.&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.WebDriverException&#039;&#039;&lt;br /&gt;
:Lesen Sie in den Details in der ersten Zeile die Meldung hinter &#039;&#039;Original Error&#039;&#039;:&lt;br /&gt;
:*&#039;&#039;Unknown device or simulator UDID&#039;&#039;&lt;br /&gt;
::Entweder ist das Gerät nicht richtig angeschlossen oder die udid stimmt nicht.&lt;br /&gt;
:*&#039;&#039;Unable to launch WebDriverAgent because of xcodebuild failure: xcodebuild failed with code 65&#039;&#039;&lt;br /&gt;
::Dieser Fehler kann verschiedene Ursachen haben. Entweder konnte tatsächlich der WebDriverAgent nicht gebaut werden, weil die Signierungseinstellungen falsch sind oder das passende Provisioning Profile fehlt. Lesen Sie dazu den Abschnitt zur [[#Signierung|Signierung]]. Es kann auch sein, dass der WebDriverAgent auf dem Gerät nicht gestartet werden kann, weil sich beispielsweise ein Alert im Vordergrund befindet oder Sie dem Entwickler nicht vertraut haben.&lt;br /&gt;
:*&#039;&#039;Could not install app: &#039;Command &#039;ios-deploy [...] exited with code 253&#039;&#039;&#039;&lt;br /&gt;
::Die angegebene App kann nicht auf dem iOS-Gerät installiert werden, weil es nicht im Provisioning Profile der App eingetragen ist.&lt;br /&gt;
:*&#039;&#039;Bad app: [...] App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name.&#039;&#039;&#039;&lt;br /&gt;
::Der Pfad zur App ist falsch. Stellen Sie sicher, dass sich die Datei unter dem angegebenen Pfad auf dem Mac befindet.&lt;br /&gt;
:*&#039;&#039;packageAndLaunchActivityFromManifest failed.&#039;&#039;&lt;br /&gt;
::Die angegebene &#039;&#039;apk&#039;&#039;-Datei ist vermutlich kaputt.&lt;br /&gt;
:*&#039;&#039;Could not find app apk at [...]&#039;&#039;&lt;br /&gt;
::Der Pfad zur App ist falsch. Stellen Sie sicher, dass sich die &#039;&#039;apk&#039;&#039;-Datei am angegebenen Pfad befindet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Falls der Fehler nicht durch eine der oben gelisteten Ursachen bedingt ist, kann es sein, dass die auf dem Gerät befindlichen Automation-Anwendungen nicht mehr richtig funktionieren. Hier hilft es, diese vom Mobilgerät zu deinstallieren. Beim nächsten Verbindungsaufbau werden sie dann automatisch neu installiert.&lt;br /&gt;
&lt;br /&gt;
*Für iOS-Geräte ist das der WebDriverAgent, den Sie einfach vom Home-Screen deinstallieren können. Dies behebt in der Regel Probleme durch den Wechsel des verwendeten Macs oder der Xcode-Version.&lt;br /&gt;
&lt;br /&gt;
*Für Android-Geräte ist es der UIAutomator2; hier tritt auf einigen Geräten sporadisch ein Problem auf, die Ursache dafür ist uns z.Z. noch nicht bekannt. Zur Deinstallation navigieren Sie auf dem Gerät zu &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;Anwendungen&#039;&#039;&amp;quot;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; und suchen in der Liste nach folgenden Einträgen:&lt;br /&gt;
    Appium Settings&lt;br /&gt;
    io.appium.uiautomator2.server&lt;br /&gt;
    io.appium.uiautomator2.server.test&lt;br /&gt;
:Klicken Sie auf die jeweilige Anwendung und dann auf &amp;quot;&#039;&#039;Deinstallieren&#039;&#039;&amp;quot;.&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&#039;&#039;Der entsprechende Eintrag heißt auf manchen Geräten möglicherweise etwas anders.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Falls dies nicht hilft, kann eventuell die Ausgabe des Appium-Servers weiterhelfen. Für einen von expecco gestarteten Server finden Sie das Log in der Liste der [[#Laufende_Appium-Server|laufenden Appium-Server]].&lt;br /&gt;
&lt;br /&gt;
==Ich habe keinen Mac==&lt;br /&gt;
Vielleicht hilft Ihnen diese Webseite weiter: [https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10 https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin/en&amp;diff=29662</id>
		<title>Mobile Testing Plugin/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin/en&amp;diff=29662"/>
		<updated>2024-07-23T09:48:46Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Problems and Solutions */ org.openqa.selenium.StaleElementReferenceException&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile_Testing_Plugin|Deutsche Version]] | &#039;&#039;&#039;English Version&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
The &#039;&#039;Mobile Testing Plugin&#039;&#039; adds mechanisms to test and automate Android and iOS devices. This includes both real and emulated devices - it does not matter whether real mobile devices or emulated devices are used. The plugin can (and usually is) used in conjunction with the [[Expecco_GUI_Tests_Extension_Reference|GUI-Browser]], which supports the creation of tests. It can also be used to record test procedures.&lt;br /&gt;
&lt;br /&gt;
[http://appium.io/ Appium] is used to connect to the devices. Appium is a free open source framework for testing and automating mobile applications.&lt;br /&gt;
&lt;br /&gt;
We recommend to go through the [[Mobile_Testing_Tutorial/en|Tutorial]] to familiarize yourself with the Mobile Plugin. This tutorial leads step by step through the creation of a test case using an example and explains the necessary basics.&lt;br /&gt;
&lt;br /&gt;
= Installation and Setup =&lt;br /&gt;
To use the &#039;&#039;Mobile Testing Plugin&#039;&#039;, you must have installed expecco together with the corresponding plugin, and you need the appropriate licenses. expecco communicates with the mobile devices via an Appium server, which either runs on the same computer as expecco, or on a second computer. This must be accessible for expecco.&lt;br /&gt;
&lt;br /&gt;
== Installation Overview ==&lt;br /&gt;
&#039;&#039;&#039;Computer running expecco:&#039;&#039;&#039;&lt;br /&gt;
* Java JDK version 8, 9, 10 or 11&lt;br /&gt;
&#039;&#039;&#039;Computer connected to Android devices :&#039;&#039;&#039;&lt;br /&gt;
* Appium Server, you can install it via the Mobile Testing Supplement (see below), of which we regularly provide a new version&lt;br /&gt;
* Android SDK, you can also get it with the Mobile Testing Supplement&lt;br /&gt;
* Java JDK version 8, 9, 10 or 11&lt;br /&gt;
&#039;&#039;&#039;Computer connected to iOS devices&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
* Appium Server, you can install it via the Mobile Testing Supplement for MacOS (see below), of which we regularly provide a new version&lt;br /&gt;
* Xcode in a version that supports the iOS version used, available from the Apple App Store&lt;br /&gt;
* Java JDK version 8, 9, 10 or 11&lt;br /&gt;
* Apple Developer Certificate incl. matching private key (to sign the WebDriverAgent)&lt;br /&gt;
* Provisioning Profile for the mobile devices to be used&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; Please note that due to the requirements (no connection to non-Apple devices available) iOS devices can only be controlled from a Mac.&lt;br /&gt;
&lt;br /&gt;
Depending on the setup, the above-mentioned computers can also be the same device. expecco can either connect to a remote Appium Server and mobile devices connected to it via the network, or start an Appium Server locally itself and use it with local mobile devices. However, some of expecco&#039;s functions that make it easier to create test cases are only available if the mobile devices are connected to the same computer on which expecco is running. A possible setup may therefore look like the following figure:&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAufbau.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
The following explains how to install Appium and other necessary applications for Windows and Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
The easiest way is to install everything from our Mobile Testing Supplement. However, newer versions do not contain a JDK anymore due to a change in Oracle&#039;s license terms, so you have to install it additionally. Of course, you are free to install Appium directly to use the version you want. However, to then be able to start an Appium server with expecco, a suitable batch file must be available and specified in the [[Mobile_Testing_Plugin/en#Plugin_Configuration|settings]]. However, connections can also be established to other running Appium servers.&lt;br /&gt;
*&#039;&#039;&#039;expecco 24.1&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-24.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.3]&lt;br /&gt;
:Same versions as in the predecessor, but with updated chromedriver versions&lt;br /&gt;
*expecco 23.2: [https://download.exept.de/transfer/h-expecco-23.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.2]&lt;br /&gt;
:Same versions as in the predecessor, but with updated chromedriver versions&lt;br /&gt;
*expecco 23.1: [https://download.exept.de/transfer/h-expecco-23.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.1]&lt;br /&gt;
:Same versions as in the predecessor, but the installer now allows to add Appium to the Autostart.&lt;br /&gt;
*expecco 22.2 and 22.1: [https://download.exept.de/transfer/h-expecco-22.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.2.0]&lt;br /&gt;
:Appium 1.22.3*&lt;br /&gt;
:Node 14.17.5&lt;br /&gt;
:adb 1.0.41 from platform-tools 33.0.2&lt;br /&gt;
:&#039;&#039;* We added the capability&#039;&#039; startChromedriverTimeout &#039;&#039;to Appium, to get a timeout earlier, if Chromedriver cannot be initialized. (see [[#startChromedriverTimeout|Problems and Solutions]])&#039;&#039;&lt;br /&gt;
*expecco 21.2: [https://download.exept.de/transfer/h-expecco-21.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.12.0.0]&lt;br /&gt;
:Contains Appium version 1.22.0, Node still is version 12.13.1.&lt;br /&gt;
*expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.1.0]&lt;br /&gt;
:Only minor changes compared to the previous version.&lt;br /&gt;
*expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.0.0]&lt;br /&gt;
:Compared to the previous version, Appium was updated to version 1.16.0-rc.1 and node 12 is used. &lt;br /&gt;
*expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.8.1.0]&lt;br /&gt;
:This installs Appium in the version 1.12.0 and now additionally contains build-tools in the version 28.0.3 in the android-sdk. Apart from this, it is the same as the previous version.&lt;br /&gt;
*expecco 18.2: [http://download.exept.de/transfer/h-expecco-18.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.7.3.0]&lt;br /&gt;
:This installs Appium in the version 1.8.1. In addition, an installation of &#039;&#039;Android Debug Bridge&#039;&#039; and &#039;&#039;Google USB Driver&#039;&#039; ([https://gsmusbdrivers.com/download/adb-fastboot-drivers/ adb-setup-1.4.3]) is offered. This covers drivers for a broad range of Android devices, and you won&#039;t have to install an individual driver for each device. A &#039;&#039;&#039;JDK is not contained anymore (due to a change in Oracle&#039;s license terms)&#039;&#039;&#039;, you have to download it on your own, e.g. from [https://www.oracle.com/technetwork/java/javase/downloads/index.html Oracle].&lt;br /&gt;
*expecco 18.1: same procedure as for expecco 2.11&lt;br /&gt;
*expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/MobileTestingSupplement_1.6.0.2_Setup.exe Mobile Testing Supplement 1.6.0.2]&lt;br /&gt;
:This installs a Java JDK Version 8, android-sdk and Appium Version 1.6.4. The supplement also offers a universal adb driver ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]). This driver supports a wide range of Android Devise, and avoids the need to search for individual device-specific drivers.&lt;br /&gt;
*expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_1.5.0.0_Setup.exe Mobile Testing Supplement 1.5.0.0]&lt;br /&gt;
:It installs a Java JDK version 8, android-sdk and Appium version 1.4.16. During the installation the graphical user interface of Appium is started, you can close this window immediately. The supplement also offers a universal adb driver (ClockworkMod). This combines drivers for a wide range of Android devices so that you do not have to search for and install a separate driver for each device.&lt;br /&gt;
&lt;br /&gt;
If expecco has to use mobile devices that are connected to another computer, you have to start an Appium server there. You can do this by using the file &amp;lt;code&amp;gt;appium_standalone.cmd&amp;lt;/code&amp;gt;. The server is then started on default port 4723. If you want to use a different port number, start the server with&lt;br /&gt;
&lt;br /&gt;
 appium_standalone.cmd -p &amp;lt;portnummer&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The server is ready, as soon as the line&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Appium REST http interface listener started on 0.0.0.0:4723&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
is displayed, where you can read the used port number at the end.&lt;br /&gt;
&lt;br /&gt;
If your Android device is connected to a remote machine,&lt;br /&gt;
you may want to see the live screen locally using a tool like&lt;br /&gt;
[https://github.com/Genymobile/scrcpy scrcpy].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When Appium is started for the first time – either standalone or by expecco – it may happen that the Windows firewall blocks access to the node server. Allow the access or Appium cannot be started.&lt;br /&gt;
&lt;br /&gt;
== Mac OS ==&lt;br /&gt;
Note: the following can be ignored if you do not plan to test iOS (iPhone) devices. The Mac setup is not needed for Android devices.&lt;br /&gt;
&lt;br /&gt;
=== Xcode ===&lt;br /&gt;
Automation with iOS devices needs [https://developer.apple.com/xcode/ Xcode]. You can install it from the App Store. Please make sure that the version matches the tested iOS versions.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;iOS&#039;&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp;  &lt;br /&gt;
|&#039;&#039;&#039;Xcode&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;macOS&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|10.x&lt;br /&gt;
|8.x&lt;br /&gt;
|10.12 (Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|11.x&lt;br /&gt;
|9.x&lt;br /&gt;
|10.13 (High Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|12.x&lt;br /&gt;
|10.x&lt;br /&gt;
|10.14 (Mojave)&lt;br /&gt;
|-&lt;br /&gt;
|13.x&lt;br /&gt;
|11.x&lt;br /&gt;
|10.15 (Catalina)&lt;br /&gt;
|-&lt;br /&gt;
|14.x&lt;br /&gt;
|12.x&lt;br /&gt;
|11.0 (Big Sur)&lt;br /&gt;
|-&lt;br /&gt;
|15.x&lt;br /&gt;
|13.x&lt;br /&gt;
|12.0 (Monterey)&lt;br /&gt;
|-&lt;br /&gt;
|16.x&lt;br /&gt;
|14.x&lt;br /&gt;
|12.5 (Monterey)&lt;br /&gt;
|}&lt;br /&gt;
This table is only a simplified overview, better see [https://xcodereleases.com/ Xcode releases] or [https://en.wikipedia.org/wiki/Xcode#Version_comparison_table Xcode versions] for the exact versions. For new iOS minor versions, there is usually also a new release of Xcode, e.g. for iOS 10.2 you need at least Xcode 8.2, for iOS 10.3 at least Xcode 8.3, etc. So if you are upgrading to a newer iOS version, you will usually need a newer Xcode version as well. Newer versions of Xcode may not run on older operating systems, which in turn may require an operating system upgrade. If you also want to test older iOS versions, it can be useful to install the corresponding Xcode versions in parallel.&lt;br /&gt;
&lt;br /&gt;
=== Appium ===&lt;br /&gt;
You can install Appium either as command-line tool or use it with [https://github.com/appium/appium-desktop Appium Desktop], which provides a GUI to start the server. Meanwhile there is also Appium 2.0, which is not tested with expecco yet and therefore not recommended to use.&lt;br /&gt;
&lt;br /&gt;
==== Appium Desktop ====&lt;br /&gt;
Download the newest version of [https://github.com/appium/appium-desktop/releases/ Appium Desktop]. For the Mac, it is best to take the dmg file and install it to the applications. When starting &#039;&#039;Appium Server GUI&#039;&#039; you will probably get the error message, that it is not possible for security reasons. In this case, open the context menu of the app file (right click or Ctrl + click) and choose &#039;&#039;Open&#039;&#039; there. Then confirm that you really want to open the application. From now on you can open the application normally.&lt;br /&gt;
&lt;br /&gt;
[[Datei:OpenAppiumServerGUI1.png|text-top]] [[Datei:OpenAppiumServerGUI2.png|text-top]]&lt;br /&gt;
&lt;br /&gt;
Since Xcode 14 there are problems with signing the WebDriverAgent, which Appium loads on the device for the automation. This means that no connection is possible with version 1.22.3-4 of Appium Desktop. In newer versions of WebDriverAgent, this problem is solved, but currently there is no version of Appium Desktop using such a new version (as of November 2022). However, you can manually download a new version (e.g. 4.10.2) and replace the files in Appium. To do this, download one of the two archive files (zip or tar.gz) containing the source code from the [https://github.com/appium/WebDriverAgent/releases/ WebDriverAgent download page]. Then open and extract this file. Copy the contents of the folder &#039;&#039;WebDriverAgent-4.10.2&#039; to&lt;br /&gt;
&lt;br /&gt;
 /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
If you navigate there by Finder, make a context click (right click or Ctrl + click) on the application and choose &#039;&#039;Show Package Contents&#039;&#039; from the menu. Replace all files that are already present with the same name.&lt;br /&gt;
&lt;br /&gt;
==== Install Appium using npm ====&lt;br /&gt;
You can install Appium using npm (Node Package Manager) as well. To do this, you have to install node/npm first. This can be done using [https://github.com/nvm-sh/nvm nvm] (Node Version Manager), which you can get on Github. If the following installation instructions should not work for you, you will find detailed information in the [https://github.com/nvm-sh/nvm#readme Readme] there.&lt;br /&gt;
&lt;br /&gt;
Open a Terminal window. Then clone the Github repository of nvm&lt;br /&gt;
 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash&lt;br /&gt;
and load it&lt;br /&gt;
 export NVM_DIR=&amp;quot;$([ -z &amp;quot;${XDG_CONFIG_HOME-}&amp;quot; ] &amp;amp;&amp;amp; printf %s &amp;quot;${HOME}/.nvm&amp;quot; || printf %s &amp;quot;${XDG_CONFIG_HOME}/nvm&amp;quot;)&amp;quot; [ -s &amp;quot;$NVM_DIR/nvm.sh&amp;quot; ] &amp;amp;&amp;amp; \. &amp;quot;$NVM_DIR/nvm.sh&amp;quot; # This loads nvm&lt;br /&gt;
&lt;br /&gt;
Then execute&lt;br /&gt;
 command -v nvm&lt;br /&gt;
to see if it works. It should print &#039;&#039;nvm&#039;&#039;. If there is no response, execute&lt;br /&gt;
 touch ~/.zshrc&lt;br /&gt;
and try again.&lt;br /&gt;
&lt;br /&gt;
Now you can install node with the following command.&lt;br /&gt;
 nvm install 16.15.1&lt;br /&gt;
As there are problems installing Appium using the newest version of node, we recommend this version.&lt;br /&gt;
&lt;br /&gt;
After node is installed, you can use it to install Appium:&lt;br /&gt;
 npm install -g appium&lt;br /&gt;
&lt;br /&gt;
The Appium server now simply can be started with the command&lt;br /&gt;
 appium&lt;br /&gt;
The output will then be written directly to the terminal.&lt;br /&gt;
&lt;br /&gt;
This version also has problems with signing the WebDriverAgent, like explained in [[#Appium_Desktop | Appium Desktop]]. Therefore download a newer version of WebDriverAgent in this case as well and replace the old files. You will find them at&lt;br /&gt;
 /Users/&amp;lt;user&amp;gt;/.nvm/versions/16.15.1/lib/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
==== Mobile Testing Supplement ====&lt;br /&gt;
We provide older versions of Appium via the Mobile Testing Supplement for Mac OS, with which you can easily install it:&lt;br /&gt;
* &#039;&#039;&#039;expecco 20.2&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-20.2.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement for Mac OS (1.2.2)]&lt;br /&gt;
:Contains Appium version 1.18.3 and uses node 14.&lt;br /&gt;
&lt;br /&gt;
* expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement for Mac OS (1.2.0)]&lt;br /&gt;
:Only a few changes compared to the previous version.&lt;br /&gt;
&lt;br /&gt;
* expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement_for_MacOS.tar.bz2 Mobile Testing Supplement for Mac OS (1.1.98)]&lt;br /&gt;
:Appium is updated to version 1.16.0-rc.1 and node 12 is used.&lt;br /&gt;
&lt;br /&gt;
* expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.96.tar.bz2 Mobile Testing Supplement for Mac OS (1.1.96)]&lt;br /&gt;
:This version contains Appium 1.12.0.&lt;br /&gt;
&lt;br /&gt;
* expecco 18.1: [http://download.exept.de/transfer/h-expecco-18.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.94.tar.bz2 Mobile Testing Supplement for Mac OS (1.1.94)]&lt;br /&gt;
:This version contains Appium 1.8.0.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.11:[http://download.exept.de/transfer/h-expecco-2.11.1/Mobile_Testing_Supplement_for_Mac_OS_1.0.94.tar.bz2 Mobile Testing Supplement for Mac OS (1.0.94)]&lt;br /&gt;
:This version contains Appium 1.6.4.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_for_Mac_OS_1.0.tar.bz2 Mobile Testing Supplement for Mac OS]&lt;br /&gt;
:Diese Version entält Appium 1.4.16.&lt;br /&gt;
&lt;br /&gt;
After you have downloaded the supplement, you can move it to a directory of your choice (e.g. your home directory) and unpack it there. A suitable command in a shell could look like this, adjust the version number accordingly:&lt;br /&gt;
&lt;br /&gt;
 tar -xvpf Mobile_Testing_Supplement_for_Mac_OS_1.1.98.tar.bz2&lt;br /&gt;
&lt;br /&gt;
If your default Xcode installation is the one you want to use, you can start Appium directly from the file in the &#039;&#039;bin&#039;&#039; directory with the appropriate version number:&lt;br /&gt;
&lt;br /&gt;
 Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
If you want to use another Xcode than the one configured as default, you have to tell Appium the corresponding path by using the environment variable &#039;&#039;DEVELOPER_DIR&#039;&#039;. For example, if you have installed Xcode in &#039;&#039;/Applications/Xcode-11.3.app&#039;&#039;, you can start Appium this way:&lt;br /&gt;
&lt;br /&gt;
 DEVELOPER_DIR=&amp;quot;/Applications/Xcode-11.3.app/Contents/Developer&amp;quot; Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
To find out what is set as the default Xcode installation on your system, use this command:&lt;br /&gt;
&lt;br /&gt;
 xcode-select -p&lt;br /&gt;
&lt;br /&gt;
If Appium cannot find your Xcode installation, a message like this appears:&lt;br /&gt;
&#039;&#039;&amp;lt;blockquote&amp;gt;org.openqa.selenium.SessionNotCreatedException - A new session could not be created. (Original error: Could not find path to Xcode, environment variable DEVELOPER_DIR set to: /Applications/Xcode.app but no Xcode found)&amp;lt;/blockquote&amp;gt;&#039;&#039;&lt;br /&gt;
In such a case, restart Appium by specifying a valid &#039;&#039;DEVELOPER_DIR&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Signing WebDriverAgent ====&lt;br /&gt;
For automation, Appium installs an App called WebDriverAgent on the device and therefore has to be able to sign it. You need an Apple account and a respective certificate for this. For evaluation you can use a free account. This has the disadvantage that created profiles are only valid for one week and must be recreated afterwards. Also be careful when sharing the account, as certificates may be revoked or invalidated by automatic generation. As a result, apps that have already been signed can no longer be used.&lt;br /&gt;
&lt;br /&gt;
If you already have a respective certificate and its associated private key in your keychain on the Mac, you can have the WebDriverAgent automatically signed. If not, it is recommended to set and manage the signing using Xcode.&lt;br /&gt;
&lt;br /&gt;
First, connect the device you want to use to your Mac via USB. Make sure both the Mac and the device are in the same network or there will be problems when connection with Appium. Start Xcode and open &#039;&#039;Preferences&#039;&#039;. Go to the Accounts page and create an entry with your account. You can then click on &#039;&#039;Manage Certificates...&#039;&#039; to see the certificates that belong to that account. To run tests, you need an iOS Development Certificate and the associated private key. If you do not already have one, create one. If you already have one, but it is not in your keychain (indicated by &amp;quot;Not in Keychain&amp;quot;), you can import it. You can do that by the [https://support.apple.com/en-us/guide/keychain-access/welcome/mac keychain access] on your Mac, if you have exported it previously from the keychain, where it is stored. The certificate with the associated key should be in the keychain &#039;&#039;Login&#039;&#039;. It can be exported from there as PKCS#12 file (typical ending .p12). To import a certificate into your keychain, select the option &#039;&#039;Import objects&#039;&#039; from the &#039;&#039;File&#039;&#039; menu. If you don&#039;t know where the certificate is stored, you can also revoke it in Xcode and recreate it in your keychain. However, only do this if you know that the old certificate is no longer in use because it can no longer be used afterwards. Now the keychain should contain an iOS development certificate.&lt;br /&gt;
&amp;lt;!--(Den folgenden Teil braucht man wohl nicht mehr, wenn es in Xcode eingestellt ist)From the right-click menu, select Information. Under the details of the certificate you will find the Team ID, which is referred to here as the Organizational Unit. Enter it in the Team ID field of the plug-in&#039;s settings, see [[#Plugin_Configuration|Plugin Configuration]].--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now open the WebDriverAgent project in Xcode. If you have installed the Mobile Testing Supplement, you will find it in this directory at&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
If you have installed Appium Desktop, you will find it at&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;/Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You can use the Finder to navigate to the Xcode project file and open it by double clicking. Note, that you have to perform a context click (right click or Ctrl + click) on the Appium Server GUI app and select &#039;&#039;Show Package Contents&#039;&#039; in the menu, to get to its subdirectory.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingWebDriverAgentXcode.png]]&lt;br /&gt;
&lt;br /&gt;
Select &#039;&#039;WebDriverAgentLib&#039;&#039; and the page &#039;&#039;Signing &amp;amp; Capabilities&#039;&#039;. In the section &#039;&#039;Signing&#039;&#039; set the option &#039;&#039;Automatically manage signing&#039;&#039; and then select a team. Now switch to &#039;&#039;WebDriverAgentRunner&#039;&#039; and do the same there.&lt;br /&gt;
&amp;lt;!-- (The following seems to not be relevant anymore.) Here you should see errors indicating that no Provisioning Profiles have been created or found. Therefore, go to the &#039;&#039;Build Settings&#039;&#039; page and look for the entry &#039;&#039;Product Bundle Identifier&#039;&#039; in the &#039;&#039;Packaging&#039;&#039; section. Change this from com.facebook.WebDriverAgentRunner to something Xcode accepts by changing the prefix. Xcode can now generate a matching Provisioning Profile and the errors on the General page should disappear. After that you can quit Xcode. --&amp;gt;&lt;br /&gt;
By setting the team, the errors showing up for WebDriverAgentRunner should disappear. If Xcode should not be able to create a Provisioning Profile matching the Bundle ID &#039;&#039;com.facebook.WebDriverAgentRunner&#039;&#039;, you can edit the latter so that it fits your certificate. After that you can quit Xcode or you can, like explained further below, directly start the build in Xcode, so the project will be already built when Appium wants to use it.&lt;br /&gt;
&lt;br /&gt;
If you now connect to your device from expecco, the WebDriverAgent will be installed and started on it and then switch to the app to be tested. You may still have to trust the execution of the WebDriverAgent on the device. It maybe a sign that you have to do this, if the app WebDriverAgent first appears on the device and tries to start, but then is uninstalled again. To trust the execution, open the settings during the connection setup on the device and then the entry &#039;&#039;Device management&#039;&#039; under &#039;&#039;General&#039;&#039;. This entry is only visible if a developer app is installed on the device. You may therefore have to wait until the WebDriverAgent is installed before the entry appears. Select the entry of your Apple account and trust it. Since the WebDriverAgent will be uninstalled again if the start did not work, you have to do this during the connection setup. If this is too hectic for you, you can also execute the following code:&lt;br /&gt;
&lt;br /&gt;
 xcodebuild -project Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
 xcodebuild -project /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&lt;br /&gt;
&lt;br /&gt;
This installs the WebDriverAgent on the device without deleting it again.&lt;br /&gt;
&lt;br /&gt;
If there are problems while installing the WebDriverAgent, you can also try and start the build in Xcode. Make sure the right target &#039;&#039;WebDriverAgent&#039;&#039; is selected. Error messages in Xcode might indicate easier what the problem is about. Sometimes it even helps to try for a second time, if it took too long for the first time and got aborted. It may occur, that you are asked several times during the build to enter the password for the keychain.&lt;br /&gt;
&lt;br /&gt;
[[Datei:WebDriverAgentCodesign.png]]&lt;br /&gt;
&lt;br /&gt;
Read also the documentation of Appium on [https://github.com/appium/appium-xcuitest-driver/blob/master/docs/real-device-config.md Setting up tests with iOS devices]. Refer to the [https://support.apple.com/en-us/HT204460 Apple documentation] for details on installing and trusting of apps.&lt;br /&gt;
&lt;br /&gt;
Once the WebDriverAgent is installed on the device, it will be reused for later connections und connecting should work faster. The signed version is then already on your Mac as well and doesn&#039;t have to be built again. This should speed up the connect with other devices as well. If you know, that the connect has to build and sign the WebDriverAgent first, it is advisable to set the capability &#039;&#039;wdaLaunchTimeout&#039;&#039;. This timeout specifies how long Appium waits for the WebDriverAgents to start up on the device and is per default set to 60000&amp;amp;nbsp;ms. Building often takes a little longer than one minute, so the connect attempt will be canceled. A value of 120000 will be more reliable here.&lt;br /&gt;
&lt;br /&gt;
== Plugin Configuration ==&lt;br /&gt;
Before you start, please check the settings of the Mobile Testing Plugin and adjust them if necessary. Select the menu item &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Extensions&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot; (see fig.). By default, these paths are found automatically (1). To adjust a path manually, deactivate the corresponding check mark at the right. You&#039;ll see a drop-down list with some paths to choose from. If an entered path is wrong or cannot be found, the field is marked red and a message appears. Make sure that all paths are specified correctly.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingEinstellungen.png | thumb | 400px | Plugin Configuration]]&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;appium&#039;&#039;&#039;: Enter the path to the executable file with which Appium can be started in the command line. Under Windows this file will usually be called &amp;quot;&amp;lt;code&amp;gt;appium.cmd&amp;lt;/code&amp;gt;&amp;quot;. This path is used when expecco starts an Appium server.&lt;br /&gt;
*&#039;&#039;&#039;node&#039;&#039;&#039;: Enter the path to the executable that starts Node (also called (also called &amp;quot;Node.js&amp;quot;). This path is passed to Appium when a server is started so that Appium can find it independently of the PATH variable. Under Windows this file is usually called &amp;quot;&amp;lt;code&amp;gt;node.exe&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;JAVA_HOME&#039;&#039;&#039;: Enter the path to a JDK (Java Development Kit)here. This path is passed to each Appium server. Leave the field blank to use the value from the environment variable. To specify which Java should be used by expecco, set this path in the Java Bridge settings.&lt;br /&gt;
*&#039;&#039;&#039;ANDROID_HOME&#039;&#039;&#039;: Enter the path to an Android SDK here. This path is passed to each Appium server. Leave the field blank to use the value from the environment variable.&lt;br /&gt;
*&#039;&#039;&#039;adb&#039;&#039;&#039;: The path to the adb command. Under Windows the file is called &amp;quot;&amp;lt;code&amp;gt;adb.exe&amp;lt;/code&amp;gt;&amp;quot;. This file is used by expecco, for example, to get the list of connected devices. This path should be selected automatically, if the command is found in the ANDROID_HOME directory. This is also used by Appium. If expecco and Appium use different versions of adb, conflicts may occur.&lt;br /&gt;
*&#039;&#039;&#039;android.bat&#039;&#039;&#039;: This file is only needed to start the AVD and the SDK Manager, which deal with phone emulators. The file in the ANDROID_HOME directory will be selected automatically, if present there.&lt;br /&gt;
*&#039;&#039;&#039;aapt&#039;&#039;&#039;: The path to the &amp;quot;aapt&amp;quot; command here. Under Windows this file is called &amp;quot;&amp;lt;code&amp;gt;aapt.exe&amp;lt;/code&amp;gt;&amp;quot;. expecco uses &amp;quot;aapt&amp;quot; only in the connection editor to read the package and activities of an &amp;quot;apk&amp;quot; file. The file in the ANDROID_HOME directory will be selected automatically, if present there.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingJavaBridgeEinstellungen.png | thumb | 400px | JDK Configuration]]&lt;br /&gt;
&lt;br /&gt;
Starting with expecco 2.11, there is an additional field called &#039;&#039;Team ID&#039;&#039;. If you run iOS tests, enter the Team ID of your certificate here. This is used for every iOS connection, unless you change the value in the connection settings in individual cases. For information on how to obtain the team ID, please refer to the section on [[#Signing| signing]] for installations on Mac OS. With expecco 2.10 and older, you can only enter the Team ID as capability for each connection setting separately. However, you must use the [[#Extended_View|extended view]] to do this. Enter the capability &#039;&#039;xcodeOrgId&#039;&#039; here and set the Team ID of the certificate as value.&lt;br /&gt;
&lt;br /&gt;
The server address setting at the bottom of the page refers to the behavior of the connection editor. It checks at the end whether the server address ends in &#039;&#039;/wd/hub&#039;&#039; as this is the usual form. If not, a dialog asks how to react. The defined behavior can be viewed and changed here.&lt;br /&gt;
&lt;br /&gt;
Also switch to the entry &#039;&#039;Java Bridge&#039;&#039; (see figure). Here you have to specify the path to your Java installation, which is used by expecco. Enter a JDK here. If you want to use the one from the Mobile Testing Supplement under Windows, the path is&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;C:\Program Files (x86)\exept\Mobile Testing Supplement\jdk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can also use the system settings.&lt;br /&gt;
&lt;br /&gt;
== Prepare Android Device ==&lt;br /&gt;
If you connect an Android device under Windows, you may still need an adb driver for the device. You can usually find a suitable driver on the manufacturer&#039;s website. If you have installed the universal driver from the Mobile Testing Supplement, everything should already work for most devices. In some cases, Windows will automatically try to install a driver when you connect the device for the first time. &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Attention&#039;&#039;&#039;: Before you can control a mobile device with the Appium plugin, you have to allow this debugging!&lt;br /&gt;
&lt;br /&gt;
For Android devices, you can find this option in the settings under &#039;&#039;[https://developer.android.com/studio/debug/dev-options Developer Options]&#039;&#039; called &#039;&#039;USB-Debugging&#039;&#039;. If the developer options are not displayed, you can unlock them by tapping Build Number seven times in About the Phone.&lt;br /&gt;
&lt;br /&gt;
Also enable the &#039;&#039;Stay awake&#039;&#039; feature to prevent the device from turning off the screen during test creation or execution.&lt;br /&gt;
&lt;br /&gt;
For security reasons, USB debugging must be allowed for each computer individually. When connecting the device to the PC via USB, you must agree to the connection on the device. If you haven&#039;t done this for your computer yet, but no corresponding dialog appears on the device, it may help to unplug and reconnect the device. This can happen especially if you have installed the ADB driver while the device was already connected via USB. If this doesn&#039;t help either, open the notifications by dragging them from the top of the screen. There you will find the USB connection and you can open the options. Select another type of connection; usually MTP or PTP should work.&lt;br /&gt;
&lt;br /&gt;
You can also test on an emulator. It does not need to be prepared separately, as it is already designed for USB debugging. It is even possible to start an emulator at the beginning of the test.&lt;br /&gt;
&lt;br /&gt;
To check if a device you have connected to your computer can be used, open the [[#Connection_Editor|connection editor]]. The device should be displayed there.&lt;br /&gt;
&lt;br /&gt;
=== Connection via WLAN ===&lt;br /&gt;
It is possible to connect to Android devices via Wireless LAN. For devices using Android 11 or newer, this can be done wirelessly, else you have to connect initially via USB. Since expecco 22.1, WiFi connections can be established using the [[Mobile_Testing_Plugin/en#Connection_Editor|Connection Editor]]. It is also possible to do this using a command window.&lt;br /&gt;
==== Wireless Connect (Android 11) ====&lt;br /&gt;
In the developer options of your device, enable wireless debugging and open its options. You initially have to pair your machine with the device. To do this, choose &amp;quot;&#039;&#039;Pair device with pairing code&#039;&#039;&amp;quot; to get a pairing code and an IP address with port. Then open a command window (terminal window) on your machine and enter:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb pair &amp;lt;Device IP Address&amp;gt;:&amp;lt;Pairing Port&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
where &amp;lt;tt&amp;gt;&amp;lt;Device IP Address&amp;gt;:&amp;lt;Pairing Port&amp;gt;&amp;lt;/tt&amp;gt; is the IP address and port as shown on the device. After that, you will be asked for the pairing code. If everything went right, the popup on the device should have closed and your machine is added to the list of paired devices. Then enter at the command window:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;Device IP Address&amp;gt;:&amp;lt;Debugging Port&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The IP address is the same as for pairing, but the port is different. Both are shown as IP address &amp;amp; Port on the device. The device should now be connected via WLAN and can be used in the same way as with a USB connection. You can check this by entering &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; or open the connection dialog in expecco. In the list, the device appears with its IP address and port. Remember that the WLAN connection no longer exists when the ADB server or the device is restarted. Restarting the device often disables wireless debugging and the used port is changed. The pairing, however, is permanent and has not to be done again the next time you connect.&lt;br /&gt;
==== Start via USB ====&lt;br /&gt;
First, connect your device via USB. Then open a command window (terminal window) and enter:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The device listens for a TCP/IP connection on port 5555. If you have several devices connected or emulators running, you have to specify which device you mean. Enter in this case:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb devices -l&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
to get a list of all devices, where the first column gives the device&#039;s ID.&lt;br /&gt;
Then, enter:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb -s &amp;lt;deviceID&amp;gt; tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
with the device identification of the desired device. You can now disconnect the USB connection.&amp;lt;br&amp;gt;Now you have to find out the IP address of your device. You can usually find it somewhere in the device&#039;s settings, for example in the Status or WLAN settings of the phone. Then type in:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP address of device&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The device should now be connected via WLAN and can be used in the same way as with a USB connection. You can check this by entering &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; again or open the connection dialog in expecco. In the list, the device appears with its IP address and port. Remember that the WLAN connection no longer exists when the ADB server or the device is restarted.&lt;br /&gt;
&lt;br /&gt;
== Preparing an iOS-Device and App ==&lt;br /&gt;
Control of iOS devices is only possible via a Mac. Please also read the section [[#Mac_OS|Installation under Mac OS]].&lt;br /&gt;
&lt;br /&gt;
Before you can control a mobile device with the Mobile Testing Plugin, you must allow debugging for iOS devices with iOS 8 or higher. Activate the option &amp;quot;&#039;&#039;Enable UI Automation&#039;&#039;&amp;quot; under the &amp;quot;&#039;&#039;Developer&#039;&#039;&amp;quot; menu in the device settings.&amp;lt;br&amp;gt;If you cannot find the &amp;quot;&#039;&#039;Developer&#039;&#039;&amp;quot; entry in the settings, proceed as follows: Connect the device to the Mac via USB. If necessary, you must still agree to the connection on the device. Start Xcode and then select &amp;quot;&#039;&#039;Devices&#039;&#039;&amp;quot; from the menu bar at the top of the screen in the &amp;quot;&#039;&#039;Window&#039;&#039;&amp;quot; menu. A window opens in which a list of the connected devices is displayed. Select your device there. Then the entry &amp;quot;&#039;&#039;Developer&#039;&#039;&amp;quot; should appear in the settings on the device. You may have to exit the settings and restart.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Alert.png | thumb | 270px | Alert unter iOS]]&lt;br /&gt;
It is not possible to establish a connection to the device as long as it shows certain alerts. Such an alert may appear if FaceTime is activated (by displaying a message about SMS charges as shown in the screenshot). Be sure to configure the device so that it does not show such alerts when idle.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.11 and later ===&lt;br /&gt;
You can test any app which is executable or already installed on the device used. If the app is available as a development build, the UDID of the device must be stored in the app. In any case, the WebDriverAgent must be signed for the device. Please read the section about [[#Signing|signing]] under Mac OS.&lt;br /&gt;
&lt;br /&gt;
If you want to use the Home button in a test, you must activate &amp;quot;AssistiveTouch&amp;quot; on the device. You will find this option in the settings under &amp;quot;&#039;&#039;General&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;Operating Help&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;AssistiveTouch&#039;&#039;&amp;quot;. Then place the menu in the middle of the upper edge of the screen. You can then record pressing the Home button with the corresponding menu entry in the recorder or use the &amp;quot;&#039;&#039;Press Home Button&#039;&#039;&amp;quot; block directly.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.10 ===&lt;br /&gt;
The app you want to use must be available as a development build. The UDID of the device must also be stored in the app.&lt;br /&gt;
&lt;br /&gt;
=== Sign the development build ===&lt;br /&gt;
A development build of an app is only allowed for a limited number of devices and cannot be started on other devices. However, it is possible to exchange the certificate and the usable devices in a development build.&lt;br /&gt;
&lt;br /&gt;
* Evaluation with demo app of eXept:&lt;br /&gt;
:We will be happy to provide you with a demo app which is available as a development build and which we can sign for your device. Please send the UDID of your device to your eXept contact person. How to determine the UDID of your device is described in the following section.&lt;br /&gt;
&lt;br /&gt;
* Using your own app for your test device:&lt;br /&gt;
:If you receive a development build (IPA file) from the app developers that is approved for your test device, you can use it directly. To do this, you must tell the developers the UDID of your device so they can enter it. &#039;&#039;&#039;You can use Xcode to read the UDID of a device&#039;&#039;&#039;. Start Xcode and select &#039;&#039;Devices&#039;&#039; from the menu bar at the top of the screen in the &#039;&#039;Window&#039;&#039; menu. A window opens in which a list of the connected devices is displayed. Select your device and search for the &#039;&#039;Identifier&#039;&#039; entry in Properties. The UDID is a 40-digit hexadecimal number.&lt;br /&gt;
&lt;br /&gt;
* Externally developed app for your test device:&lt;br /&gt;
:You can also re-sign apps to make them run on other devices. However, this process is complicated and requires access to an Apple Developer account. A documentation on the procedure is currently in preparation.&lt;br /&gt;
&lt;br /&gt;
:For the evaluation we will gladly support you with the re-signing of your app..&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Log in to the [https://developer.apple.com/ Apple-Webinterface]. Navigate to &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039;. If necessary, create a Developer Certificate and a Provisioning Profile for your device here and download both. If you don&#039;t have a Developer Account yet, create one here: https://developer.apple.com/enroll/. For this you have to register with an Apple-ID.&lt;br /&gt;
&lt;br /&gt;
# Find out Team ID (&#039;&#039;Membership&#039;&#039; -&amp;gt; &#039;&#039;Team ID&#039;&#039;)&lt;br /&gt;
# Under &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039; select development certificate (under &#039;&#039;+&#039;&#039; create, if not available) and download&lt;br /&gt;
# Under &#039;&#039;App ID&#039;&#039; create Wildcard App ID, if not present. Note App ID (AppID = Prefix.ID)&lt;br /&gt;
# Add device, find out UDID (or &#039;&#039;Identifier&#039;&#039;) of the device (&#039;&#039;Xcode&#039;&#039; -&amp;gt; &#039;&#039;Window&#039;&#039; (above in menu bar) -&amp;gt; &#039;&#039;Devices&#039;&#039;)&lt;br /&gt;
# Create commission profiles: &#039;&#039;iOS App Development&#039;&#039; -&amp;gt; Select &#039;&#039;AppID&#039;&#039; -&amp;gt; Select certificate -&amp;gt; Select device -&amp;gt; Create profile name -&amp;gt; Download provisioning profiles.&lt;br /&gt;
# Import the downloaded certificate (&#039;&#039;Downloads&#039;&#039; -&amp;gt; Certificate (.cer)&lt;br /&gt;
# Copy SHA1 fingerprint. Right click on Certificate -&amp;gt; &#039;&#039;Information&#039;&#039;, then scroll to the bottom of the page).&lt;br /&gt;
# Create Entitlements.plist (&#039;&#039;Open Terminal&#039; -&amp;gt; Downloads/Mobile_Testing_Supplement/bin/gen-entitlements_plist &#039;Team-ID&#039; &#039;App ID&#039; Downloads/Mobile_Testing_Supplement/bin/re-sign-ipa &amp;lt;path to ipa (z.B. Downloads/expeccoMobileDemo.ipa)&amp;gt; \&lt;br /&gt;
&amp;quot;&amp;lt;Zertifikat (SHA1-Fingerabdruck, z.B. 76 E8 4B E8 78 D5 D7 F9 2E 09 8B D7 E8 FB CE 30 0C F5 D0 EF)&amp;gt;&amp;quot; \&lt;br /&gt;
&amp;lt;Path to Commission Profile (e.g. /Users/exept_test/Downloads/dut.mobileprovision)&amp;gt; \&lt;br /&gt;
&amp;lt;Path for the result ipa (z.B. Downloads/expeccoMobileDemo_re-signed.ipa)&amp;gt; \&lt;br /&gt;
[Pfad zur entitlements.plist] (z.B. /Users/exept_test/entitlements.plist)&lt;br /&gt;
&lt;br /&gt;
To re-sign, you can use the corresponding script from the Mobile Testing Supplement for Mac OS or any other tool (e.g. isign).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more information about using iOS devices, see also the &lt;br /&gt;
[http://appium.io/slate/en/master/?java#appium-on-real-ios-devices Appium documentation].&lt;br /&gt;
&lt;br /&gt;
=== Native iOS-Apps ===&lt;br /&gt;
You can also use apps that are already natively present on the device. To do this, you must know their bundle ID and then enter it in the connection settings. Here is a small selection of common apps:&lt;br /&gt;
{| style=&amp;quot;text-align:left&amp;quot;&lt;br /&gt;
! App&lt;br /&gt;
!&lt;br /&gt;
! Bundle-ID&lt;br /&gt;
|-&lt;br /&gt;
| App Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.AppStore&lt;br /&gt;
|-&lt;br /&gt;
| Calculator&lt;br /&gt;
| &lt;br /&gt;
| com.apple.calculator&lt;br /&gt;
|-&lt;br /&gt;
| Calendar&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilecal&lt;br /&gt;
|-&lt;br /&gt;
| Camera&lt;br /&gt;
| &lt;br /&gt;
| com.apple.camera&lt;br /&gt;
|-&lt;br /&gt;
| Contacts&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileAddressBook&lt;br /&gt;
|-&lt;br /&gt;
| iTunes Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileStore&lt;br /&gt;
|-&lt;br /&gt;
| Mail&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilemail&lt;br /&gt;
|-&lt;br /&gt;
| Maps&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Maps&lt;br /&gt;
|-&lt;br /&gt;
| Messages&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileSMS&lt;br /&gt;
|-&lt;br /&gt;
| Phone&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilephone&lt;br /&gt;
|-&lt;br /&gt;
| Photos&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobileslideshow&lt;br /&gt;
|-&lt;br /&gt;
| Settings&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Preferences&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
You can find further Bundle-IDs [https://github.com/joeblau/apple-bundle-identifiers here].&lt;br /&gt;
&lt;br /&gt;
= Examples =&lt;br /&gt;
In the demo test suites for expecco you will also find examples for tests with the Mobile Testing Plugin. To do this, select the option &amp;quot;&#039;&#039;Example from File&#039;&#039;&amp;quot; on the start screen and open the folder named &amp;quot;&#039;&#039;mobile&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;TestsuiteMobileTestingDemo&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m01_MobileTestingDemo.ets --&amp;gt;&amp;lt;/span&amp;gt; &#039;&#039;m01_MobileTestingDemo.ets&#039;&#039; ==&lt;br /&gt;
The test suite contains two simple test plans: &amp;quot;&#039;&#039;Simple CalculatorTest&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Complex Calculator and Messaging Test&#039;&#039;&amp;quot;. Both tests use an Android emulator, which you must start before starting. The apps used in the test are part of the basic equipment of the emulator and therefore no longer need to be installed. Since the apps may differ under every Android version, it is important that your emulator runs under Android 6.0. In addition, the language must be set to English.&lt;br /&gt;
&lt;br /&gt;
; Simple CalculatorTest&lt;br /&gt;
: This test connects to the calculator and enters the formula &#039;&#039;2+3&#039;&#039;. The result of the calculator is compared with the expected value &#039;&#039;5&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; Complex Calculator and Messaging Test&lt;br /&gt;
: This test connects to the calculator and then opens the message service. There it waits for an incoming message from the number &#039;&#039;15555215556&#039;&#039;, in which a formula to be calculated is sent. The message is generated before via a socket at the emulator. When the message arrives, it is opened by the test and its contents are read. Then the calculator is opened again, the received formula is entered and the result is read. The test then switches back to the message service and sends the result as an answer.&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;m02_expeccoMobileDemo.ets&#039;&#039; und &#039;&#039;m03_expeccoMobileDemoIOS.ets&#039;&#039; ==&lt;br /&gt;
These are part of the tutorial for the Mobile Testing Plugin. The included test case is incomplete and will be added during the tutorial. Please read the section [[#Tutorial|Tutorial]].&lt;br /&gt;
&lt;br /&gt;
= Tutorial =&lt;br /&gt;
There is a tutorial describing the basic procedure for creating tests with the Mobile Testing Plugin. It is based on a supplied example consisting of a simple app and an expecco test suite.&lt;br /&gt;
&lt;br /&gt;
You find it on the page [[Mobile_Testing_Tutorial/en|Mobile Testing Tutorial]] in two versions for Android and iOS devices.&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsAndroid&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m02_expeccoMobileDemo.ets --&amp;gt;&amp;lt;/span&amp;gt; [[Mobile_Testing_Tutorial/en#First_steps_with_Android|First steps with Android]]&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsIOS&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m03_expeccoMobileDemoIOS.ets --&amp;gt;&amp;lt;/span&amp;gt; [[Mobile_Testing_Tutorial/en#First_steps_with_iOS|First steps with iOS]]&lt;br /&gt;
&lt;br /&gt;
= Dialogs of the Mobile Testing Plugin =&lt;br /&gt;
== Connection Editor ==&lt;br /&gt;
You can use the Connection Editor to quickly define, change, or establish connections. Depending on the task, the dialog has small differences and is opened differently:&lt;br /&gt;
*If you want to establish a connection, access the dialog in the GUI browser by clicking on &#039;&#039;Connect&#039;&#039; and then selecting &#039;&#039;Mobile Testing&#039;&#039;.&lt;br /&gt;
*To change or copy an existing connection in the GUI browser, select it, right-click and select &#039;&#039;Edit Connection&#039;&#039; or &#039;&#039;Copy Connection&#039;&#039; from the context menu.&lt;br /&gt;
*If you do not want to create connection settings for the GUI browser but for use in a test, choose &#039;&#039;Create Connection Settings&#039;&#039; from the Mobile Testing Plugin menu.... This only allows you to create the settings for a connection without creating a connection in the GUI browser.&lt;br /&gt;
&lt;br /&gt;
The Connection Editor menu has several buttons, some of which are only visible when creating connection settings:&lt;br /&gt;
[[Datei:MobileTestingVerbindungseditorMenu.png]]&lt;br /&gt;
#&#039;&#039;Delete Settings&#039;&#039;: Resets all entries. (Only visible when creating settings.)&lt;br /&gt;
#&#039;&#039;Load settings from file&#039;&#039;: Allows to open a saved settings file (*.csf). Its settings are transferred to the dialog. Entries already made without conflict are retained.&lt;br /&gt;
#&#039;&#039;Load settings from attachment&#039;&#039;: Allows you to open an attachment with connection settings from an open project. These settings are applied to the dialog. Entries already made without conflict are retained.&lt;br /&gt;
#&#039;&#039;Save settings to file&#039;&#039; and&lt;br /&gt;
#&#039;&#039;Save settings to attachment&#039;&#039;: Here you can save the entered settings to a file (*.csf) or create them as an attachment in an open project. Both options have a delayed menu in which you can choose to save only a certain part of the settings. (Only visible when creating settings.)&lt;br /&gt;
#&#039;&#039;Advanced View&#039;&#039;: Allows you to switch to the advanced view to make additional settings. Read more about this at the end of this chapter. (Only visible when creating settings.)&lt;br /&gt;
#&#039;&#039;Help&#039;&#039;: A help text for the respective step is shown or hidden on the right side.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The dialog is divided into three steps. In the first step you select the device you want to use, in the second step you select which App should be used and in the last step the settings for the Appium server are made.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep1&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Step 1: Select Device ===&lt;br /&gt;
In the upper part you will see a list of all connected Appium devices that are detected. With the checkbox below you can hide devices that are detected but not ready. If you want to enter a device that is not connected, you can create it with the corresponding button &#039;&#039;Enter Android device&#039;&#039; or &#039;&#039;Enter iOS device&#039;&#039;. However, you need to know the required properties of your device. The device is then created in a second device list and can be selected there. If no list with connected elements can be displayed, various messages are displayed instead:&lt;br /&gt;
*No devices found&lt;br /&gt;
*:expecco could not find any Android devices.&lt;br /&gt;
*:To automatically configure a connection to a device, make sure&lt;br /&gt;
*:*it is connected&lt;br /&gt;
*:*it is turned on&lt;br /&gt;
*:*that it has an appropriate adb driver installed&lt;br /&gt;
*:*it is enabled for debugging (see below).&lt;br /&gt;
*No available devices found&lt;br /&gt;
*:expecco could not find any available Android devices. But not available ones were found, e.g. with the status &amp;quot;unauthorized&amp;quot;.&lt;br /&gt;
*:To configure a connection to a device automatically, make sure that &lt;br /&gt;
*:*it is connected&lt;br /&gt;
*:*it is turned on&lt;br /&gt;
*:*that it has an appropriate adb driver installed&lt;br /&gt;
*:*it is enabled for debugging (see below).&lt;br /&gt;
*:To view unavailable devices, enable this option below.&lt;br /&gt;
*Connection lost&lt;br /&gt;
*:expecco has lost the connection to the adb server. Try to re-establish the connection by clicking on the button.&lt;br /&gt;
*Connection failed&lt;br /&gt;
*:expecco could not connect to the adb server. Possibly it is not running or the specified path is not correct.&lt;br /&gt;
*:Check the adb configuration in the settings and try to start the adb server and establish a connection by clicking on the button.&lt;br /&gt;
*Connect ...&lt;br /&gt;
*:expecco connects to the adb server. This may take a few seconds.&lt;br /&gt;
*Start adb-Server ...&lt;br /&gt;
*:expecco starts the adb-Server. This may take a few seconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--With &#039;&#039;Automation by&#039;&#039; you can specify, which automation engine is to be used. If you leave the setting at &#039;&#039;(Default)&#039;&#039; the corresponding capability is not set at all. Otherwise Appium, Selendroid and from expecco 2.11 XCUITest are available. Selendroid is usually only used for Android devices prior to version 4.1.--&amp;gt;With &#039;&#039;Next&#039;&#039; you get to the next step. If you enter settings for the GUI browser, this is only possible once a device has been selected.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;UnlockingDeveloperOptions&amp;quot;&amp;gt;Note on unlocking&amp;lt;/span&amp;gt;: In newer Android versions the developer options are no longer offered in the settings at first. If your Android device does not show an entry for &amp;quot;&#039;&#039;Developer options&#039;&#039;&amp;quot; in the settings, first select the entry &amp;quot;&#039;&#039;Phone info&#039;&#039;&amp;quot;, then &amp;quot;&#039;&#039;SoftwareVersionsInfo&#039;&#039;&amp;quot; and click on the entry &amp;quot;&#039;&#039;BuildVersion&#039;&#039;&amp;quot; several times.&lt;br /&gt;
&lt;br /&gt;
==== Manage Chromedrivers ====&lt;br /&gt;
If the App you want to automate uses WebViews with Chrome, Appium needs to have access to an appropriate Chromedriver. If you have selected a device in the list, you can use &amp;quot;&#039;&#039;Manage Chromedrivers&#039;&#039;&amp;quot; to see, which Chrome versions are installed on the device and which Chromedriver versions are provided by expecco. With this dialog you can also download required Chromedriver versions. Beware that there may be several Chrome versions on the device. An App doesn&#039;t have to use the version of the installed Chrome browser for its WebViews. The Chromedriver you use should fit your app for everything to work properly. You can also change the path to the Chromedriver in the capabilities generated at the end of the connection editor.&lt;br /&gt;
&lt;br /&gt;
==== Connect WiFi Android Device ====&lt;br /&gt;
&lt;br /&gt;
You can connect to Android devices using WiFi as well. In this case, the device has to be connected to ADB first, see [[Mobile_Testing_Plugin/en#Connection_via_WLAN|Connection via WLAN]]. Since expecco 22.1, the connection editor provides a dialog helping to set this up, which can be used instead of the command window. For devices using Android 11 or newer, you can pair the device with your machine here by specifying the appropriate parameters and then establish the connection by specifying the IP address and port. You can also use this to establish a wireless connection for devices that are connected via USB. When you select the corresponding device in the list, the required information is read out automatically.&lt;br /&gt;
&lt;br /&gt;
Note that establishing a wireless connection is not part of the connection settings. If you want to establish a new connection with the generated settings, you must make sure that the device is connected to ADB with the specified IP address and port so that it can be found. The ADB connection will be lost if the ADB server or the device are restarted. The permission for wireless debugging is also often reset when the device is restarted and the debug port can then change. Therefore, a wireless connection must always be established manually.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep2&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Step 2: Select App===&lt;br /&gt;
Here you can enter information about the app to be tested. You can decide if you want to use an app that is already installed on the device or if you want to install an app for the test. Select the appropriate tab above. Depending on whether you selected an Android or an iOS device in the previous step, the required input will change.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Android&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App on Device&#039;&#039;&lt;br /&gt;
**:If you have selected a connected device in the first step, the packages of all installed apps are automatically retrieved and you can select from the drop-down lists. The installed apps are divided into third-party packages and system packages; select the appropriate package list. This selection does not belong to the settings, but only provides the corresponding package list. You can use the filter to further narrow down the list and then select the desired package. The activities of the selected package are also automatically retrieved and made available as a drop-down list. Select the activity you want to start. As a rule, an activity is automatically entered from the list. If you are not using a connected device, you must enter the package and the activity manually.&lt;br /&gt;
**&#039;&#039;Install App&#039;&#039;&lt;br /&gt;
**:Under &#039;&#039;App&#039;&#039;, enter the path to an app. The path must be valid for the Appium server being used. You can also specify a URL. If you are using a local Appium server, you can use the right button to navigate to the App installation file and enter this path. If possible, the corresponding package and the activity are also entered in the fields below. However, this entry is not necessary.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;iOS&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App on Device&#039;&#039;&lt;br /&gt;
**:Specify the bundle ID of an installed app. You can find out the IDs of the installed apps using Xcode, for example. Start Xcode and select &#039;&#039;Devices&#039;&#039; from the menu bar at the top of the screen in the &#039;&#039;Window&#039;&#039; menu. A window will open displaying a list of connected devices. If you select your device, you will see a list of the apps you have installed in the overview.&lt;br /&gt;
**&#039;&#039;Install App&#039;&#039;&lt;br /&gt;
**:Under &#039;&#039;App&#039;&#039;, enter the path to an app. The path must be valid for the Appium server being used. You can also specify a URL. For the requirements of apps for real devices, please read the section  [[#iOS-Ger.C3.A4t_and_App_Preparing|Preparing an iOS-Device and App]].&lt;br /&gt;
&lt;br /&gt;
In the lower part you can specify whether the app should be reset or uninstalled when the connection is terminated, and whether it should be reset initially. Again, the corresponding capability is not set if you select &#039;&#039;(Default)&#039;&#039;. With &#039;&#039;Next&#039;&#039; you get to the next step.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep3&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Step 3: Server Settings===&lt;br /&gt;
In the last step, a list of all the capabilities that result from your entries in the previous steps is first displayed in the upper part. If you are familiar with Appium and want to set additional capabilities that are not covered by the connection editor, you can click on &#039;&#039;Edit&#039;&#039; to open the extended view. See the section below for more information.&lt;br /&gt;
&lt;br /&gt;
If you enter settings for the GUI browser, you can enter the &#039;&#039;Connection name&#039;&#039; with which the connection is displayed. This is also the name under which devices can use this connection when it is established. If you leave the field blank, a name will be generated. If the box &amp;quot;&#039;&#039;Managed by expecco&#039;&#039;&amp;quot; is checked, expecco will start a local Appium server on a free port, or use a free server that has already been started. To use your own server, turn this feature off and enter the appropriate address. You will get the local default address and already used addresses to choose from.&lt;br /&gt;
&lt;br /&gt;
In older expecco versions the box is labeled &amp;quot;&#039;&#039;Start on demand&#039;&#039;&amp;quot;. In this case, you must also enter an address if you want expecco to start the server. expecco then tries to start an Appium server at the given address when connecting, if none is running there yet. This server will then also be shut down when the connection is terminated. This only works for local addresses. Make sure that you only use port numbers that are free. It is best to only use odd port numbers from the standard port 4723. The following port number is also used when establishing a connection, which could otherwise lead to conflicts.&lt;br /&gt;
&lt;br /&gt;
Depending on how you opened the dialog, there are now different buttons to close it. In any case you have the option to save. This opens a dialog where you can either select an open project to save the settings there as an attachment, or choose to save it to a file that you can then specify. Saving does not close the dialog, allowing you to select another option.&lt;br /&gt;
&lt;br /&gt;
If you have opened the editor for establishing a connection, you can finally click on &#039;&#039;Connect&#039;&#039; or &#039;&#039;Start and connect server&#039;&#039;, depending on whether the check mark for server start is set. For changing or copying a connection in the GUI Browser, this option is called &#039;&#039;Apply&#039;&#039;, since in this case only the connection entry is changed or created, but the connection setup is not started. If necessary, you can do this afterwards via the context menu. If you have changed capabilities of an existing connection, a dialog then prompts you to decide whether these changes should be applied directly by closing the connection and establishing the new connection or not. In this case, the changes only take effect after you reestablish the connection.&lt;br /&gt;
&lt;br /&gt;
To use the connection editor, also read the corresponding section in the respective tutorial in step 1. (Android: [[Mobile_Testing_Tutorial/en#Step_1:_Run_Demo|Run Demo]], iOS: [[Mobile_Testing_Tutorial/en#Step_1:_Run_Demo_2|Run Demo]]).&lt;br /&gt;
&lt;br /&gt;
===Extended View===&lt;br /&gt;
The extended view of the connection editor can be obtained either by clicking on &#039;&#039;Edit&#039;&#039; in the third step or at any time via the corresponding menu item if you have started the editor via the plugin menu. This view displays a list of all configured Appium Capabilities. You can add, change or remove further entries to this list. To add a capability, select it from the drop-down list of the input field. In this list all known capabilities are sorted into the categories &#039;&#039;Common&#039;&#039;, &#039;&#039;Android&#039;&#039; and &#039;&#039;iOS&#039;&#039;. If you have selected a capability, a short information text is displayed. You can also enter a capability manually in the field. Then click on &#039;&#039;Add&#039;&#039; to add the capability to the list. There you can set the value in the right column. To delete an entry, select it and click on &#039;&#039;Remove&#039;&#039;. With &#039;&#039;Back&#039;&#039; you leave the extended view.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingErweiterteAnsicht.png]]&lt;br /&gt;
&lt;br /&gt;
== Running Appium Servers ==&lt;br /&gt;
In the menu of the Mobile Testing Plugin you will find the entry &#039;&#039;Appium-Server...&#039;&#039;. This opens a window with an overview of all Appium servers started by expecco and on which port they are running. By clicking on the icon in the column &#039;&#039;Show Log&#039;&#039; you can view the logfile of the corresponding server. This is deleted when the server is shut down. With the icons in the column &#039;&#039;Exit&#039;&#039; the corresponding server can be terminated. However, this is prevented if expecco still has an open connection via this server. The rightmost column shows for which connection the server is in use. If it reads &#039;&#039;&amp;lt;idle&amp;gt;&#039;&#039;, the server is currently not used by expecco.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAppiumServer.png]]&lt;br /&gt;
&lt;br /&gt;
When opening the editor to start an Appium connection, an Appium server is started immediately to speed up the connection process. For this purpose, expecco always keeps one idle running Appium server. Additional running servers however, which are not in use anymore, will be terminated automatically after a while.&lt;br /&gt;
&lt;br /&gt;
In the menu of the Mobile Testing Plugin you will also find the entry &#039;&#039;Close all Connections and Servers&#039;&#039;. This is intended for cases where connections or servers cannot be terminated in any other way. If possible, always terminate connections in the GUI browser or by executing a corresponding block. Servers that you have started in the server overview should be terminated there; servers that were started with a connection are automatically terminated with this connection.&lt;br /&gt;
&lt;br /&gt;
Note that only servers started and managed by expecco are listed in the overview. Possible other Appium servers that were started in a different way are not recognized.&lt;br /&gt;
&lt;br /&gt;
== Recorder ==&lt;br /&gt;
If the GUI browser is connected to a device, the integrated recorder can be used to record a test section with that device. To start the recorder, select the appropriate connection in the GUI browser and click the Record button. A new window opens for the recorder. The recorded actions are created in the GUI browser work area. It is therefore possible to edit the recorded data in parallel.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingRecorder.png|caption|]]&lt;br /&gt;
&lt;br /&gt;
====Components of the Recorder Window====&lt;br /&gt;
#&#039;&#039;&#039;Continue/Pause Recording&#039;&#039;&#039;: You can pause the recording by clicking the right icon. You will then see a large pause sign in the view. All actions that you perform now in the recorder are executed, but no blocks are recorded. You can switch back to normal recording mode by clicking the left icon.&lt;br /&gt;
#&#039;&#039;&#039;Stop Recording&#039;&#039;&#039;: Stops the recording and closes the recorder window.&lt;br /&gt;
#&#039;&#039;&#039;Update&#039;&#039;&#039;: Gets the current image and element tree from the device. This is necessary if the device takes longer to execute an action or if something changes without being triggered by the recorder. Since expecco 21.2, there is an additional submenu here that can be used to enable automatic update by checking for changes in the background (see also &#039;&#039;Automatic Update&#039;&#039; further below).&lt;br /&gt;
#&#039;&#039;&#039;Follow Mouse&#039;&#039;&#039;: Select the element under the mouse pointer in the GUI browser.&lt;br /&gt;
#&#039;&#039;&#039;Element Highlighting&#039;&#039;&#039;: The element under the mouse is outlined in red.&lt;br /&gt;
#&#039;&#039;&#039;Show Elements&#039;&#039;&#039;: Show the borders of all elements in the view.&lt;br /&gt;
#&#039;&#039;&#039;Tools&#039;&#039;&#039;: Selection, which  tool is used for recording. The selected action is triggered with each click on the view. The following actions are available:&lt;br /&gt;
#*Element Actions:&lt;br /&gt;
#**Click: Short click on the element under cursor. To determine more precisely which element is used, use the Follow Mouse or Element Highlighting function.&lt;br /&gt;
#**Tap with Duration (Element): Similar to click, except that the duration of the click will be recorded as well. This allows the recording of long clicks.&lt;br /&gt;
#**Tap with Position (Element): Similar to click, but additionally records the position inside the element. The position can be recorded relative to the element size or, when pressing Ctrl while clicking, as absolute position from the upper left corner of the element.&lt;br /&gt;
#**Set Text: Allows to set the text of an input field.&lt;br /&gt;
#**Clear Text: Clears the text of an input field.&lt;br /&gt;
#*Device Actions:&lt;br /&gt;
#**Tap (Screen): Triggers a click at the screen position.&lt;br /&gt;
#**Tap with Duration (Screen): Triggers a click at the screen position, which also considers the duration.&lt;br /&gt;
#**Swipe: Swipe in a straight line from the point where you press the mouse button until you release it. The duration is also recorded.&lt;br /&gt;
#:Please note for this actions that the result may differ on different devices, e.g. with different screen resolutions.&lt;br /&gt;
#*Test Flow Blocks&lt;br /&gt;
#**Check Attribute: Compares the value of a specified attribute of the element with a predefined value. The result triggers the corresponding output.&lt;br /&gt;
#**Assert Attribut: Compares the value of a specified attribute of the element with a predefined value. If the values are not equal, the test fails.&lt;br /&gt;
#**Get Attribute: Gets the current value of a specified attribute of the element.&lt;br /&gt;
#*Auto&lt;br /&gt;
#:If the Auto tool is selected, you can use all actions by specific input methods: &#039;&#039;Click&#039;&#039;, &#039;&#039;Tap Element&#039;&#039; and &#039;&#039;Swipe&#039;&#039; still work by clicking, but are distinguished by the duration and movement of the cursor. To trigger a &#039;&#039;Tap&#039;&#039;, hold down Ctrl while clicking. The remaining actions are available in a context menu by right-clicking on the element.&lt;br /&gt;
#&#039;&#039;&#039;Context Actions&#039;&#039;&#039;: Here you can record actions concerning contexts:&lt;br /&gt;
#*Switch to Context: Shows a list of all currently available contexts and you can select to which one you want to switch.&lt;br /&gt;
#*Get Current Context: Gets the handle of the current context.&lt;br /&gt;
#*Get Context Handles: Gets a list of all currently available contexts.&lt;br /&gt;
#&#039;&#039;&#039;Softkeys&#039;&#039;&#039;: Only for Android. Simulates pressing the buttons Back, Home, Menu and Power.&lt;br /&gt;
#&#039;&#039;&#039;Home Button&#039;&#039;&#039;: Only for iOS since expecco 2.11. Allows pressing the Home button.Prior to expecco 19.2, it only works if AssistiveTouch is activated and the menu is located in the middle of the upper screen border. From expecco 19.2 on, the function no longer uses AssistiveTouch.&lt;br /&gt;
#&#039;&#039;&#039;Help&#039;&#039;&#039;: Opens this online documentation on the general page about [[GuiBrowser_Recorder/en|GUI Browser recorders]].&lt;br /&gt;
#&#039;&#039;&#039;View&#039;&#039;&#039;: Shows a screenshot of the device. Actions are triggerd by mouse depending on the selected tool. If a new action can be recorded, the window has a green frame, else it is red.&lt;br /&gt;
#&#039;&#039;&#039;Resize Window to Image&#039;&#039;&#039;: Resizes the recorder window so that the screenshot can be displayed completely.&lt;br /&gt;
#&#039;&#039;&#039;Resize Image to Window&#039;&#039;&#039;: Scales the screenshot to a size that makes use of the full size of the window.&lt;br /&gt;
#&#039;&#039;&#039;Adjust Display&#039;&#039;&#039;: Opens a dialog to adjust the displayed image, if expecco does not show it right. You can correct the scaling or rotate the image by 90°.&lt;br /&gt;
#&#039;&#039;&#039;Correct Orientation&#039;&#039;&#039;: Corrects the image if it is upside down. Using the arrow to the right, the image can also be rotated by 90°, if this should ever be necessary. Since expecco 19.1 you find this functionality under &#039;&#039;Adjust Display&#039;&#039;. The orientation of the image is irrelevant for the functionality of the recorder, it only works on the elements it receives.&lt;br /&gt;
#&#039;&#039;&#039;Scaling&#039;&#039;&#039;: Changes the scaling of the screenshots.&lt;br /&gt;
#&#039;&#039;&#039;Messages&#039;&#039;&#039;: Shows the path of the current selected element or other messages. It has a context menu to show a list of previous messages.&lt;br /&gt;
&lt;br /&gt;
====Usage====&lt;br /&gt;
Each click in the window triggers an action and is recorded in the workspace of the GUI browser. There you can run, edit, or create a new block from what you have recorded. You find the actions to trigger softkeys directly in the menu bar (see above). To record actions on elements, either change the selection of the tool in the menu bar (see above) and then click on the element or select the corresponding action from the context menu by right-clicking on the corresponding element. For text input it is also possible to place the cursor over the element and enter the text. This opens the input dialog for this action. On how to use the recorder, see also step 2 in the tutorial ([[Mobile_Testing_Tutorial/en#Step_2:_Creating_a_Block_with_the_Recorder|Android]] resp. [[Mobile_Testing_Tutorial/en#Step_2:_Creating_a_block_with_the_Recorder_2|iOS]]).&lt;br /&gt;
&lt;br /&gt;
====Hide elements====&lt;br /&gt;
Since expecco 21.2 it is also possible to hide the selected element in the recorder from the context menu. This means that this element cannot be selected from now on. This function is useful for ignoring elements that are in the foreground to be able to access elements below them. To undo this state, you have to find the corresponding element in the tree of the GUI browser, which also has such an entry in the context menu.&lt;br /&gt;
&lt;br /&gt;
====Automatic Update====&lt;br /&gt;
The recorder doesn&#039;t show a live image of the device, but only a snapshot. Therefore an update is needed after changes to match what is displayed on the device. The recorder updates automatically after executing an action. Since expecco 20.2 there are further automatic updates possible. You can enable the, in the menu &amp;quot;View&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
One option is, to check after an action has been executed, if there are further changes after the first update. If so, a second update is triggered. This shall fix the problem, that the recorder is not up to date after an action, because the update has been done too early.&lt;br /&gt;
&lt;br /&gt;
The second option is to enable a periodical update. After a set interval the recorder is automatically updated if there are changes. Thereby the recorder view is mostly up to date, but this causes an overhead regarding the communication to the device.&lt;br /&gt;
&lt;br /&gt;
== AVD Manager und SDK Manager ==&lt;br /&gt;
AVD Manager und SDK Manager sind beides Anwendungen von Android. Im Menü des Mobile Testing Plugins bietet expecco die Möglichkeit, diese zu starten. Ansonsten finden Sie diese Programme bei Ihrer Android-Installation. Mit dem AVD Manager können Sie AVDs, also Konfigurationen für Emulatoren, erstellen, bearbeiten und starten. Mit dem SDK Manager erhalten Sie einen Überblick über Ihre Android-Installation und können diese bei Bedarf erweitern.&lt;br /&gt;
&lt;br /&gt;
= Hybrid Apps and WebViews =&lt;br /&gt;
&#039;&#039;&#039;!!! IMPORTANT NOTICE - If you have problems switching to the webview, please set the &amp;quot;Default Application - Browser App&amp;quot; in Android Settings to &amp;quot;Chrome&amp;quot; !!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hybrid apps contain platform native elements as well as other elements that are integrated in a WebView. These elements can also be used, but you first have to switch to the corresponding context. With the block &#039;&#039;Get Current Context&#039;&#039; you get the current context. Initially this is &#039;&#039;NATIVE_APP&#039;&#039;, i.e. the context of the native elements. With the block &#039;&#039;Get Context Handles&#039;&#039; you get a collection of all existing contexts. If there is a WebView context, it is called &#039;&#039;WEBVIEW_1&#039;&#039; or &#039;&#039;WEBVIEW_&amp;lt;package&amp;gt;&#039;&#039; with the package of the WebView. Several WebView contexts are also possible. For each WebView context, there is a corresponding WebView element in the native context. You can use the &#039;&#039;Switch to Context&#039;&#039; block to switch to such a context and from now on only have access to the elements in this context.&lt;br /&gt;
&lt;br /&gt;
In the GUI browser, the existing contexts are displayed at the top of the tree as well as the tree of a context is inserted below the corresponding WebView element.&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span id=&amp;quot;Customizing XPath using the GUI Browsers&amp;quot;&amp;gt;&amp;lt;!-- name before 01.10.2020--&amp;gt;&amp;lt;/span&amp;gt;Customizing XPath using the GUI Browser=&lt;br /&gt;
Bausteine, die auf einem Gerät fehlerfrei funktionieren, tun dies auf anderen Geräten möglicherweise nicht. Auch können kleine Änderungen der App dazu führen, dass ein Baustein nicht mehr den gewünschten Effekt hat. Man sollte einen Baustein daher so robust formulieren, dass er für eine Vielzahl von Geräten verwendet werden kann und kleine Anpassungen an der App verkraftet. Dazu muss man das grundlegende Funktionsprinzip der Adressierung verstehen. Dies wird im Folgenden am Beispiel der App aus dem Tutorial erläutert.&lt;br /&gt;
&lt;br /&gt;
Die Ansicht der App setzt sich aus einzelnen Elementen zusammen. Dazu gehören die Schaltflächen &#039;&#039;GTIN-13 (EAN-13)&#039;&#039; und &#039;&#039;Verify&#039;&#039;, das Eingabefeld der Zahl &#039;&#039;4006381333986&#039;&#039; und das Ergebnisfeld, in dem OK erscheint, wie auch alle anderen auf der Anzeige sichtbaren Dinge. Diese sichtbaren Elemente sind in unsichtbare Strukturelemente eingebettet. Alle Elemente zusammen sind in einer zusammenhängenden Hierarchie, dem Elementbaum, organisiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingGUIBrowser.png | frame | left | Abb. 1: Funktionen des GUI-Browsers]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
Sie können sich diesen Baum im GUI-Browser ansehen. Wechseln Sie dazu in den GUI-Browser (Abb. 1) und starten Sie eine beliebige Verbindung. Sobald die Verbindung aufgebaut ist, können Sie den gesamten Baum aufklappen (1) (Klick bei gedrückter Strg-Taste). Er enthält alle Elemente der aktuellen Seite der App.&lt;br /&gt;
&lt;br /&gt;
Ein Baustein, der nun ein bestimmtes Element verwendet, muss dieses eindeutig angeben, indem er dessen Position im Elementbaum mit einem Pfad im XPath-Format beschreibt. Dieses Format ist ein verbreiteter Web-Standard für XML-Dokumente und -Datenbanken, eignet sich aber genauso für Pfade im Elementbaum.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie ein Element im Baum auswählen, wird unten der von expecco automatisch generierte XPath (2) für das Element angezeigt, der auch beim Aufzeichnen verwendet wird. Oberhalb davon in der Mitte des Fensters befindet sich eine Liste der Eigenschaften (3) des ausgewählten Elements. Man nennt diese Eigenschaften auch Attribute. Sie beschreiben das Element näher wie beispielsweise seinen Typ, seinen Text oder andere Informationen zu seinem Zustand. Links unten können Sie zur besseren Orientierung im Baum die &#039;&#039;Vorschau&#039;&#039; (4) aktivieren, um sich den Bildausschnitt des Elements anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Der Elementbaum für gleiche Ansicht einer App kann sich je nach Gerät unterscheiden. Es sind diese Unterschiede, die verhindern, eine Aufnahme von einem Gerät unverändert auch auf allen anderen Geräten abzuspielen: Ein XPath, der im einen Elementbaum ein bestimmtes Element identifiziert, beschreibt nicht unbedingt das gleiche Element im Elementbaum auf einem anderen Gerät. Es kann stattdessen passieren, dass der XPath auf kein Element, auf ein falsches Element oder auf mehrere Elemente passt. Dann schlägt der Test fehl oder er verhält sich unerwartet.&lt;br /&gt;
&lt;br /&gt;
Man könnte natürlich für jedes Gerät einen eigenen Testfall schreiben. Das brächte aber unverhältnismäßigen Aufwand bei Testerstellung und -wartung mit sich. Das Problem lässt sich auch anders lösen, da ein jeweiliges Element nicht nur durch genau einen XPath beschrieben wird. Vielmehr erlaubt der Standard mithilfe verschiedener Merkmale unterschiedliche Beschreibungen für ein und dasselbe Element zu formulieren. Das Ziel ist daher, einen Pfad zu finden, der auf allen für den Test verwendeten Geräten funktioniert und überall eindeutig zum richtigen Element führt.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel besteht die Verbindung zur Android-App aus dem Tutorial und der Eintrag des GTIN-13-Buttons ist ausgewählt (5). Dessen automatisch generierter XPath (2) kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[@resource id=&#039;android:id/content&#039;]/android.widget.RelativeLayout/android.widget.Button[@resource-id=&#039;de.exept.expeccomobiledemo:id/gtin_13&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Er ist offensichtlich lang und unübersichtlich. Der sehr viel kürzere Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@text=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
führt zum selben Element.&lt;br /&gt;
&lt;br /&gt;
Für die iOS-App lautet der automatisch generierte XPath für diesen Button beispielsweise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/XCUIElementTypeApplication/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/UIAApplication/UIAWindow[1]/UIAButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und kann kürzer als&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@name=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Sie können den Pfad entsprechend im GUI-Browser ändern und durch &#039;&#039;Pfad überprüfen&#039;&#039; (6) feststellen, ob er weiterhin auf das ausgewählte Element zeigt, was expecco mit &#039;&#039;Verify Path: OK&#039;&#039; (7) bestätigen sollte. Der erste, sehr viel längere Pfad, beschreibt den gesamten Weg vom obersten Element des Baumes bis hin zum gesuchten Button. Der zweite Pfad hingegen wählt mit * zunächst sämtliche Elemente des Baumes und schränkt die Auswahl dann auf genau die Elemente ein, die ein &#039;&#039;text&#039;&#039;- bzw. &#039;&#039;name&#039;&#039;-Attribut mit dem Wert &#039;&#039;GTIN-13 (EAN-13)&#039;&#039; besitzen, in unserem Fall also genau der eine Button, den wir suchen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden Android-ähnliche Pfade zur Veranschaulichung verwendet. Die Elemente in iOS-Apps heißen zwar anders, wodurch andere Pfade entstehen; das Prinzip ist jedoch das gleiche.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum1.png | frame | Abb. 2: Elementbaum einer fiktiven App]]&lt;br /&gt;
&lt;br /&gt;
Sie können solche Pfade mit Hilfe weniger Regeln selbst formulieren. Sehen Sie sich den einfachen Baum einer fiktiven Android-App in Abb. 2 an: Die Einrückungen innerhalb des Baumes geben die Hierarchie der Elemente wieder. Ein Element ist ein &#039;&#039;Kind&#039;&#039; eines anderen Elementes, wenn jenes andere Element das nächsthöhere Element mit einem um eins geringeren Einzug ist. Jenes Element ist das &#039;&#039;Elternelement&#039;&#039; des Kindes. Sind mehrere untereinander stehende Elemente gleich eingerückt, so sind sie also alle Kinder desselben Elternelements.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad durch alle Ebenen der Hierarchie zum TextView-Element ist nun:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Elemente sind mit Schrägstrichen voneinander getrennt. Es fällt auf, dass der Name des ersten Elements nicht mit dem im Baum übereinstimmt. Das oberste Element in der Hierarchie heißt immer &#039;&#039;hierarchy&#039;&#039; (für iOS wäre es &#039;&#039;AppiumAUT&#039;&#039;), expecco zeigt im Baum stattdessen den Namen der Verbindung an, damit man mehrere Verbindungen voneinander unterscheiden kann. Die weiteren Elemente tragen jeweils das Präfix &#039;&#039;android.widget.&#039;&#039;, das im Baum zur besseren Übersicht nicht angezeigt wird. Bei IOS gibt es kein Präfix, das durch einen Punkt abgetrennt wäre, expecco 2.11 blendet aber entsprechend &#039;&#039;XCUIElementType&#039;&#039; am Anfang aus. Mit jedem Schrägstrich führt der Pfad über eine Eltern-Kind-Beziehung in eine tiefere Hierarchie-Ebene, d. h. &#039;&#039;FrameLayout&#039;&#039; ist ein Kindelement von &#039;&#039;hierarchy&#039;&#039;, &#039;&#039;LinearLayout&#039;&#039; ist ein Kind von &#039;&#039;FrameLayout&#039;&#039; usw. Die in eckigen Klammern geschriebenen Wörter dienen nur als Orientierungshilfe im Baum. Sie gehören nicht zum Typ.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad muss nicht beim Element &#039;&#039;hierarchy&#039;&#039; beginnen. Man kann den Pfad beginnend mit einem beliebigen Element des Baumes bilden. Man kann also verkürzt auch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
schreiben. Der Pfad führt zum selben &#039;&#039;TextView&#039;&#039;-Element, da es nur ein Element dieses Typs gibt. Anders verhält es sich bei dem Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da es zwei Elemente vom Typ &#039;&#039;Button&#039;&#039; gibt, passt dieser Pfad auf zwei Elemente, nämlich den Button, der mit &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; markiert ist, und den &#039;&#039;Button&#039;&#039;, der mit &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; markiert ist. Es würde an dieser Stelle aber auch nicht helfen den langen Pfad von &#039;&#039;hierarchy&#039;&#039; aus beginnend anzugeben. Um einen mehrdeutigen Pfad weiter zu differenzieren, kann man explizit ein Element aus einer Menge wählen, indem man den numerischen Index in eckigen Klammern dahinter schreibt. Der Pfad aus dem obigen Beispiel lässt sich damit so anpassen, dass er eindeutig auf den &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; weist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[1].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ihnen fällt sicher auf, dass der Index eine 1 ist obwohl das zweite Element gemeint ist. Das kommt daher, dass die Zählung bei 0 beginnt. Der Button mit der Markierung &amp;quot;An&amp;quot; hat also die Nummer 0 und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Nummer 1.&lt;br /&gt;
&lt;br /&gt;
Dieser Ansatz, einen expliziten Index zu verwenden, hat zwei Nachteile: Zum einen lässt sich an dem Pfad nur schwer ablesen welches Element gemeint ist, zum andern ist der Pfad sehr empfindlich schon gegenüber kleinsten Änderungen, wie zum Beispiel dem Vertauschen der beiden &#039;&#039;Button&#039;&#039;-Elemente oder dem Einfügen eines weiteren &#039;&#039;Button&#039;&#039;-Elements in der App.&lt;br /&gt;
&lt;br /&gt;
Es wäre daher wünschenswert, das gemeinte Element über eine ihm charakteristische Eigenschaft wie einen Attributwert, zu adressieren. Für Android-Apps eignet sich hierfür häufig das Attribut &#039;&#039;resource-id&#039;&#039;. Im Idealfall muss bei der Entwicklung der App darauf geachtet werden, dass jedes Element eine eindeutige Id erhält. Die &#039;&#039;resource-id&#039;&#039; hat den großen Vorteil, dass sie unabhängig vom Text des Elements oder der Spracheinstellung des Geräts ist. Für iOS-Apps kann entsprechend das Attribut &#039;&#039;name&#039;&#039; verwendet werden, wenn es von der App sinnvoll gesetzt wird. Der XPath-Standard erlaubt solche Auswahlbedingungen zu einem Element anzugeben. Angenommen, der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Eigenschaft &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;off&#039;&#039; und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; hat als &#039;&#039;resource-id&#039;&#039; den Wert &#039;&#039;on&#039;&#039;, dann kann man als eindeutigen Pfad für den &amp;quot;Aus&amp;quot;-&#039;&#039;Button&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[@resource-id=&#039;off&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
formulieren. Wie an dem Beispiel zu sehen werden solche Bedingungen wie ein Index in eckigen Klammern an den Elementtyp angehängt. Der Name eines Attributes wird mit einem @ eingeleitet und der Wert mit einem = in Anführungszeichen angehängt. Ist der Attributwert global eindeutig, kann man den vorausgehenden Pfad sogar durch den globalen Platzhalter * ersetzen, der auf jedes Element passt. Das obige Beispiel mit dem GTIN-13-&#039;&#039;Button&#039;&#039; war ein solcher Fall.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum2.png | frame | Abb. 3: Elementbaum einer fiktiven App mit Erweiterungen]]&lt;br /&gt;
&lt;br /&gt;
Abb. 3 zeigt eine Erweiterung des Beispiels aus Abb. 2. Die App hat nun ein weiteres, nahezu identisches &#039;&#039;LinearLayout&#039;&#039; bekommen. Die &#039;&#039;Buttons&#039;&#039; sind in ihren Attributen jeweils ununterscheidbar. Deshalb funktioniert der vorige Ansatz nicht, einen eindeutigen Pfad nur mithilfe eines Attributwerts zu formulieren. Offensichtlich unterscheiden sich aber ihre benachbarten &#039;&#039;TextViews&#039;&#039;. Es ist möglich die jeweilige &#039;&#039;TextView&#039;&#039; in den Pfad mit aufzunehmen, um einen &#039;&#039;Button&#039;&#039; dennoch eindeutig zu adressieren. Ein Pfad zum &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; unterhalb der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; kann dabei wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView[@resource-id=&#039;push&#039;]/../android.widget.Button[@resource-id=&#039;on&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Teil beschreibt den Pfad zu der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; und der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;push&#039;&#039;. Danach folgt ein Schrägstrich gefolgt von zwei Punkten. Die zwei Punkte sind eine spezielle Elementbezeichnung, die nicht ein Kindelement benennt, sondern zum Elternelement wechselt, in diesem Fall also das &#039;&#039;LinearLayout&#039;&#039;, in dem die &#039;&#039;TextView&#039;&#039; eingebettet ist. Im Kontext dieses &#039;&#039;LinearLayout&#039;&#039; ist der restliche Pfad, nämlich der &#039;&#039;Button&#039;&#039; mit der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;on&#039;&#039;, eindeutig.&lt;br /&gt;
&lt;br /&gt;
Der XPath-Standard bietet noch sehr viel mehr Ausdrucksmittel. Mit der hier knapp vorgestellten Auswahl ist es aber bereits möglich für die meisten praktischen Testfälle gute Pfade zu formulieren. Eine vollständige Einführung in XPath ginge über den Umfang dieser Einführung weit hinaus. Sie finden zahlreiche weiterführende Dokumentationen im Web und in Büchern.&lt;br /&gt;
&lt;br /&gt;
Eine universelle Strategie zum Erstellen guter XPaths gibt es nicht, da sie von den Testanforderungen abhängt. In der Regel ist es sinnvoll, den XPath kurz und dennoch eindeutig zu halten. Häufig lassen sich Elemente über Eigenschaften identifizieren wie beispielsweise ihren Text. Will man aber gerade den Text eines Elements auslesen, kann dieser natürlich nicht im Pfad verwendet werden, da er vorher nicht bekannt ist. Ebenso wird der Text variieren, wenn die App mit verschiedenen Sprachen gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Jeder Baustein, der auf einem Element arbeitet, hat einen Eingangspin für den XPath. Im GUI-Browser finden Sie in der Mitte oben eine Liste von Bausteinen mit Aktionen, die Sie auf das ausgewählte Element anwenden können. Suchen Sie den Baustein &#039;&#039;Click&#039;&#039; (8) im Ordner Elements und wählen Sie ihn aus (Abb. 1). Er wird im rechten Teil unter &#039;&#039;Test&#039;&#039; eingefügt, der Pin für den XPath ist mit dem automatisch generierten Pfad des Elements vorbelegt (9). Sie können den Baustein hier auch ausführen. Die Ansicht wechselt dann auf &#039;&#039;Lauf&#039;&#039;. Ändert sich durch die Aktion der Zustand Ihrer App, müssen Sie den Baum anschließend aktualisieren (10).&lt;br /&gt;
&lt;br /&gt;
Wenn Sie in der unteren Liste eine Eigenschaft auswählen, wechselt die Anzeige der Bausteine zu &#039;&#039;Eigenschaften&#039;&#039;, wo Sie die eigenschaftsbezogenen Bausteine finden. Wie bei den Aktionen können Sie auch hier einen Baustein auswählen, der dann rechts in Test mit dem Pfad des Elements und der ausgewählten Eigenschaft eingetragen wird, sodass Sie ihn direkt ausführen können.&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span id=&amp;quot;troubleshooting&amp;quot;&amp;gt;&amp;lt;!-- Referenced by error dialog on connection error --&amp;gt;&amp;lt;/span&amp;gt;Problems and Solutions=&lt;br /&gt;
== Locators depend on the version or are variable ==&lt;br /&gt;
In this case consider to either store the locators (xPath) in a variable or to define a locator mapping inside a screenplay attachment. It is also possible to store just parts of an locator (e.g. locator path of a parent or attribute value) in a variable and add them in the freeze value of the locator pin by &amp;quot;&#039;&#039;$(varName)&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Invisible UI Elements ==&lt;br /&gt;
Note that the [[#Recorder|Recorder]] also considers items that you cannot see on the screen. Therefore, turn on element highlighting or use the follow mouse function and the element tree in the GUI browser to determine if the correct element is used. It can happen, that invisible elements are in front of other elements and cover them, so that the desired element cannot be selected in the recorder. See section [[#Hide_elements|Hide elements]] for a solution to this.&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;org.openqa.selenium.StaleElementReferenceException&#039;&#039;==&lt;br /&gt;
The error &amp;lt;code&amp;gt;org.openqa.selenium.StaleElementReferenceException&amp;lt;/code&amp;gt; occurs whenever an element is used that is no longer there. If that happens during your test and the element should have been there, try using the locator (xPath) instead to fetch the element again.&lt;br /&gt;
&lt;br /&gt;
In some cases this error can also occur even if you already use a locator at the action block. This is because the locator is always resolved first and the corresponding element is fetched and the action is then executed with this element. If the app refreshes the element exactly between the resolving and fetching part and the execution, creating a new element, this error occurs. If it happens at a specific point in your test, your best option is to catch the error and retry.&lt;br /&gt;
&lt;br /&gt;
== iOS: Cable not certified ==&lt;br /&gt;
In some cases, when connecting an iOS device via USB, a message appears indicating that the cable used is not certified. In this case, replacing the respective cable is the only solution.&lt;br /&gt;
&lt;br /&gt;
== iOS: Alerts when connecting ==&lt;br /&gt;
Make sure that no alerts are open when connecting to an iOS device. Otherwise the connection will fail because the app cannot be brought to the foreground. See also [[#Preparing_an_iOS-Device_and_App|Preparing an iOS-Device and App]].&lt;br /&gt;
&lt;br /&gt;
== iOS: .ipa cannot be installed ==&lt;br /&gt;
Note that on iOS simulators no &#039;&#039;.ipa&#039;&#039; files can be installed but only &#039;&#039;.app&#039;&#039; files.&lt;br /&gt;
&lt;br /&gt;
==iOS: First Connect is not working==&lt;br /&gt;
If there is not already a signed build of the WebDriverAgent on your Mac, it has to be created during the first connect. Usually, this can take a little longer than one minute. Per default Appium uses a timeout of 60000&amp;amp;nbsp;ms to wait for the WebDriverAgent to start on the device, so the connect will be canceled in that case. You can set this timeout with the capability &#039;&#039;wdaLaunchTimeout&#039;&#039;, e.g. to &#039;&#039;120000&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Moreover, the signing settings have to be correct. In our experience, the most reliable solution is to set automatic signing in the WebDriverAgent Xcode project an selecting the team there. See the explanation in section [[#Signing_WebDriverAgent|Signing WebDriverAgent]] for that. In this case you should &#039;&#039;&#039;not&#039;&#039;&#039; use the capabilities &#039;&#039;xcodeConfigFile&#039;&#039; resp. &#039;&#039;xcodeOrgId&#039;&#039; and &#039;&#039;xcodeSigningId&#039;&#039;, as they could cause a conflict. Caution: If you have set a Team ID in the Mobile Testing settings, expecco will automatically set this as &#039;&#039;xcodeOrgId&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
Pay attention to your device during the first connect. You might have to agree to the installation by entering your password. On the Mac you might need to enter the password to allow access to the key chain for signing, often several times.&lt;br /&gt;
&lt;br /&gt;
== Android: Device not visible in the connect editor ==&lt;br /&gt;
If an Android device connected via USB does not appear in the connection editor, try changing the USB connection type. Usually MTP or PTP should work. Check again, if &amp;quot;USB Debugging&amp;quot; is enabled in the developer options on the device (these options are disabled on some devices and have to be enabled first using a trick.) See also [[#Prepare_Android_Device|Prepare Android Device]].&lt;br /&gt;
&lt;br /&gt;
== Android: Truncated Elements at Bottom ==&lt;br /&gt;
For Android devices that automatically show and hide the navigation bar/softkeys, the recorder may cut off elements in the lower area that would be hidden by the softkeys, even if they are not displayed at this time. In this case it is advisable to set the softkeys so that they are permanently displayed.&lt;br /&gt;
&lt;br /&gt;
For newer Android versions there usually is no such option. Even if the controls are visible all the time, they don&#039;t have their own space, but are on top of the content of the app. Therefore, there is an area on the lower part of the screen, which cannot be automated, because it is not counted to the active area of the app. Appium will then truncate the elements there. This area can even be larger then the needed by the controls. This is a known issue for Samsung devices with Android 11. Since the information about the size of the app area is already provided on Android level, we cannot offer a solution for this, but can only hope that the problem will be fixed by the manufacturer. You may try to get better results by setting the control to gestures, but this bears the same issue.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;waitForIdleTimeout&amp;quot;&amp;gt;&amp;lt;!-- Referenced by expecco--&amp;gt;&amp;lt;/span&amp;gt; Android: Test Hangs While Finding an Element==&lt;br /&gt;
The block &#039;&#039;Find Element by XPath&#039;&#039; and all element blocks wait until an element is present for the given path. The timeout for this can be set either directly at the block or in the environment variables. However, if the element should already be present, but the test doesn&#039;t continue anyway, the reason could be in the UIAutomator/UIAutomator2. It waits for the app to go to the idle state before it even starts to search for the element. This may take longer, if the app e.g. runs an animation in the background or executes other kinds of actions. Fetching the page source, e.g. when updating in the GUI browser or in the recorder, can also take longer for this reason. There is a default timeout of 10 seconds after which it no longer waits for the idle state. This timeout can be set in Appium (waitForIdleTimeout). If you want to change the value of this timeout, you can do this since expecco 21.2 by executing the Smalltalk code &amp;lt;code&amp;gt;AppiumTestRunner::TestRunConnection waitForIdleTimeout:2000&amp;lt;/code&amp;gt; before the test. The timeout is given in milliseconds, so the example sets it to 2 seconds.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;startChromedriverTimeout/&amp;gt;Android: Updating the Tree or Switching to Webview Context takes too long==&lt;br /&gt;
Especially with older devices it can happen that newer Chromedriver cannot be initialized. This makes it impossible to switch to the webview context. However, this is only detected over a timeout by Appium, which is 4 minutes by default. Since expecco also tries to switch to the webview context when building the tree in the GUI browser, this can lead to very long loading times. Since there is no way to decrease this timeout in Appium, we have added a corresponding capability to the version we provide in the MobileTestingSupplement. Starting with version 1.13.1.0 of the [[#Windows|MobileTestingSupplement]], &#039;&#039;chromedriverStartTimeout&#039;&#039; can be used to set the timeout in milliseconds. The switch still doesn&#039;t work then, but expecco doesn&#039;t take as long to update the tree and the context switch module fails faster. The connection dialog adds this capability automatically starting with expecco 22.1. &lt;br /&gt;
&lt;br /&gt;
== No Action on Click ==&lt;br /&gt;
The block to click on an element is successful, but no action was performed on the device.&lt;br /&gt;
:This can happen if the element is hidden by another element and therefore clicking on the element is not possible. In this case, Appium does not throw an error, but simply nothing happens. If you would like to make a click at the position of the element anyways, even if it is hidden, use the block &#039;&#039;Tap&#039;&#039; instead and pass the location of the element to it (&#039;&#039;Get Location&#039;&#039;). If instead you want to check before a click whether the element is hidden at this moment, try whether the properties &#039;&#039;Is Displayed&#039;&#039; or &#039;&#039;Is Enabled&#039;&#039; might help you.&lt;br /&gt;
&lt;br /&gt;
== No Update After Action ==&lt;br /&gt;
An action was triggered on the recorder and a block has been recorded, but the recorder still shows the old image.&lt;br /&gt;
:The recorder doesn&#039;t show a live image of the device, but only a snapshot. After an action has been executed, the recorder will update automatically. However, it can happen, that the image has already been updated before the effects of the action are fully completed on the device. In this case you should update the recorder by hand using the icon with the blue arrows. Since expecco 20.2 you can also enable automatic updates for this case. See also the description for the [[#Recorder|recorder]].&lt;br /&gt;
&lt;br /&gt;
== Attribute &amp;quot;clickable&amp;quot; is wrong ==&lt;br /&gt;
An element has for the attribute/property &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; the value &amp;quot;&#039;&#039;false&#039;&#039;&amp;quot;, but is actually clickable.&lt;br /&gt;
:The attribute &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; has to be set explicitly by the app developer and does not affect the behavior of the app. You should generally disregard this attribute in your tests. Unfortunately, many apps exist where the programmer was &amp;quot;lazy&amp;quot; about this.&lt;br /&gt;
&lt;br /&gt;
==Connecting Fails==&lt;br /&gt;
If the connection to the Appium server fails, you will receive an error message in expecco similar to the one shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:MobileTestingVerbindungsfehler.png]]&lt;br /&gt;
&lt;br /&gt;
Here you can see the type of error that has occurred. Click on &amp;quot;&#039;&#039;Details&#039;&#039;&amp;quot; to get more information. Possible errors are:&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.remote.UnreachableBrowserException&#039;&#039;&lt;br /&gt;
:The specified server is not running or is not reachable. Check the server address.&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.WebDriverException&#039;&#039;&lt;br /&gt;
:Read the message after &#039;&#039;Original Error&#039;&#039; in the first line of the details:&lt;br /&gt;
:*&#039;&#039;Unknown device or simulator UDID&#039;&#039;&lt;br /&gt;
::Either the device is not connected properly or the udid is not correct.&lt;br /&gt;
:*&#039;&#039;Unable to launch WebDriverAgent because of xcodebuild failure: xcodebuild failed with code 65&#039;&#039;&lt;br /&gt;
::This error can have various causes. Either the WebDriverAgent could actually not be built because the signing settings are wrong or the appropriate provisioning profile is missing. Please read the section about [[#Signing|Signing]].  It is also possible that the WebDriverAgent cannot be started on the device, for example because an alert is in the foreground or you did not trust the developer.&lt;br /&gt;
:*&#039;&#039;Could not install app: &#039;Command &#039;ios-deploy [...] exited with code 253&#039;&#039;&#039;&lt;br /&gt;
::The specified app cannot be installed on the iOS device because it is not entered in the app&#039;s Provisioning Profile.&lt;br /&gt;
:*&#039;&#039;Bad app: [...] App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name.&#039;&#039;&lt;br /&gt;
::The path to the app is wrong. Make sure that the file is located in the specified path on your Mac.&lt;br /&gt;
:*&#039;&#039;packageAndLaunchActivityFromManifest failed.&#039;&#039;&lt;br /&gt;
::The specified &#039;&#039;apk&#039;&#039; file is probably broken.&lt;br /&gt;
:*&#039;&#039;Could not find app apk at [...]&#039;&#039;&lt;br /&gt;
::The path to the app is wrong. Make sure that the &#039;&#039;apk&#039;&#039; file is located in the specified path.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the error is not due to one of the causes listed above, the automation applications on the device may no longer function properly. In this case it helps to uninstall them from the mobile device. They are then automatically reinstalled the next time a connection is established.&lt;br /&gt;
&lt;br /&gt;
*For iOS devices, this is the WebDriverAgent, which you can simply uninstall from the home screen. This usually solves problems caused by changing the used Mac or the Xcode version.&lt;br /&gt;
&lt;br /&gt;
*For Android devices, it is the UIAutomator2; here, a problem occurs sporadically on some devices, the cause is currently unknown to us. To uninstall, on the device, navigate to &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;Applications&#039;&#039;&amp;quot;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; and search the list for the following entries:&lt;br /&gt;
    Appium Settings&lt;br /&gt;
    io.appium.uiautomator2.server&lt;br /&gt;
    io.appium.uiautomator2.server.test&lt;br /&gt;
:Click on the respective application and then on &amp;quot;&#039;&#039;Uninstall&#039;&#039;&amp;quot;.&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&#039;&#039;The corresponding entry may have a slightly different name on some devices.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If this doesn&#039;t help, check the output of the Appium server. For a server started by expecco, you can find the log in the list of [[#Running_Appium_Servers|Running Appium Servers]].&lt;br /&gt;
&lt;br /&gt;
==I do not have a Mac==&lt;br /&gt;
Maybe this site will help you: [https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10 https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin&amp;diff=29661</id>
		<title>Mobile Testing Plugin</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin&amp;diff=29661"/>
		<updated>2024-07-23T09:48:41Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Probleme und Lösungen */ org.openqa.selenium.StaleElementReferenceException&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Deutsche Version&#039;&#039;&#039; | [[Mobile_Testing_Plugin/en|English Version]]&lt;br /&gt;
&lt;br /&gt;
= Einleitung =&lt;br /&gt;
Mit dem &#039;&#039;Mobile Testing Plugin&#039;&#039; können Anwendungen auf Android- und iOS-Geräten getestet werden. Dabei ist es egal, ob reale mobile Endgeräte oder emulierte Geräte verwendet werden. Das Plugin kann (und wird üblicherweise) zusammen mit dem [[Expecco_GUI_Tests_Extension_Reference|GUI-Browser]] verwendet werden, der das Erstellen von Tests unterstützt. Zudem ist damit das Aufzeichnen von Testabläufen möglich.&lt;br /&gt;
&lt;br /&gt;
Zur Verbindung mit den Geräten wird [http://appium.io/ Appium] verwendet. Appium ist ein freies Open-Source-Framework zum Testen und Automatisieren von mobilen Anwendungen.&lt;br /&gt;
&lt;br /&gt;
Zur Einarbeitung in das Mobile Plugin empfehlen wir das [[Mobile_Testing_Tutorial|Tutorial]] zu bearbeiten. Dieses führt anhand eines Beispiels Schritt für Schritt durch die Erstellung eines Testfalls und erklärt die nötigen Grundlagen.&lt;br /&gt;
&lt;br /&gt;
= Installation und Aufbau =&lt;br /&gt;
Zur Verwendung des Mobile Testing Plugins müssen Sie expecco inkl. des Plugins Mobile Testing installiert haben und Sie benötigen die entsprechenden Lizenzen. expecco kommuniziert mit den Mobilgeräten über einen Appium-Server, der entweder auf demselben Rechner wie expecco läuft, oder auf einem zweiten Rechner. Dieser muss für expecco erreichbar sein.&lt;br /&gt;
&lt;br /&gt;
==Installationsübersicht==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rechner, auf dem expecco läuft:&#039;&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rechner, an dem Android-Geräte angeschlossen sind:&#039;&#039;&#039;&lt;br /&gt;
* Appium-Server&#039;&#039;, diesen können Sie über das Mobile Testing Supplement installieren (s.u.), von dem wir regelmäßig einen neue Version zur Verfügung stellen&#039;&#039;&lt;br /&gt;
* Android SDK&#039;&#039;, dieses erhalten Sie ebenfalls mit dem Mobile Testing Supplement&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rechner, an dem iOS-Geräte angeschlossen sind&amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
* Appium-Server&#039;&#039;, diesen können Sie über das Mobile Testing Supplement für Mac OS installieren (s.u.), von dem wir regelmäßig einen neue Version zur Verfügung stellen&#039;&#039;&lt;br /&gt;
* Xcode &#039;&#039;in einer Version, die die verwendete iOS-Version unterstützt, erhältlich über den Apple App Store&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
* Apple-Entwickler-Zertifikat mit zugehörigem privaten Schlüssel &#039;&#039;(zum Signieren des WebDriverAgents)&#039;&#039;&lt;br /&gt;
* Provisioning Profile mit den verwendeten Mobilgeräten&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Je nach Aufbau können die oben genannten Rechner auch das selbe Gerät sein. expecco kann sich sowohl über das Netzwerk mit einem entfernten Appium-Server und dort angeschlossenen Mobilgeräten verbinden, als auch lokal selbst einen Appium-Server starten und diesen mit lokalen Mobilgeräten verwenden. Einige Funktionen von expecco, die die Erstellung von Testfällen erleichtern, sind jedoch nur verfügbar, wenn die Mobilgeräte am selben Rechner angeschlossen sind, auf dem auch expecco läuft. Ein möglicher Aufbau kann daher wie in folgender Abbildung aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAufbau.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird die Installation von Appium und anderer nötiger Programme für Windows und Mac OS erklärt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;: Zum Zeitpunkt der Erstellung dieses Dokuments wurden Versionen bis 11 auf Funktion verifiziert. Neuere Versionen sollten - sofern nicht grundlegende Änderungen von Oracle vorgenommen wurden, ebenfalls funktionieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;: Beachten Sie, dass aufgrund der Voraussetzungen (keine Anbindung an nicht-Apple Geräte verfügbar) iOS-Geräte nur von einem Mac aus angesteuert werden können. Sie benötigen also einen Mac als &amp;quot;Vermittler&amp;quot; (siehe auch unten: [[#Ich habe keinen Mac | &amp;quot;Ich habe keinen Mac&amp;quot;]])&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
Am einfachsten installieren Sie alles mit unserem Mobile Testing Supplement&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;. In neueren Versionen ist allerdings aufgrund geänderter Lizenzbedingungen seitens Oracle kein JDK mehr enthalten, sodass sie dieses zusätzlich installieren müssen. Sie können natürlich Appium auch direkt installieren, um die Version zu verwenden, die Sie möchten. Um dann einen Appium-Server mit expecco starten zu können, muss allerdings eine entsprechende Batchdatei vorhanden sein und in den [[Mobile_Testing_Plugin#Konfiguration_des_Plugins|Einstellungen]] angegeben werden. Verbindungen können aber auch zu anderen laufenden Appium-Servern aufgebaut werden.&lt;br /&gt;
*&#039;&#039;&#039;expecco 24.1&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-24.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.3]&lt;br /&gt;
:Im Vergleich zum Vorgänger aktualisierte Chromedriver Versionen.&lt;br /&gt;
*expecco 23.2: [https://download.exept.de/transfer/h-expecco-23.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.2]&lt;br /&gt;
:Im Vergleich zum Vorgänger aktualisierte Chromedriver Versionen.&lt;br /&gt;
*expecco 23.1: [https://download.exept.de/transfer/h-expecco-23.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.1]&lt;br /&gt;
:Gleiche Versionen wie der Vorgänger, aber der Installer erlaubt nun, Appium zum Autostart hinzuzufügen.&lt;br /&gt;
*expecco 22.2 und 22.1: [https://download.exept.de/transfer/h-expecco-22.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.2.0]&lt;br /&gt;
:Appium 1.22.3*&lt;br /&gt;
:Node 14.17.5&lt;br /&gt;
:adb 1.0.41 aus platform-tools 33.0.2&lt;br /&gt;
:&#039;&#039;* Wir haben Appium um die Capability&#039;&#039; startChromedriverTimeout &#039;&#039;erweitert, um schneller einen Timeout zu bekommen, wenn der Chromedriver nicht gestartet werden kann. (siehe [[#startChromedriverTimeout|Probleme und Lösungen]])&#039;&#039;&lt;br /&gt;
*expecco 21.2: [https://download.exept.de/transfer/h-expecco-21.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.12.0.0]&lt;br /&gt;
:Enthält die Appium-Version 1.22.0, Node ist weiterhin in der Version 12.13.1.&lt;br /&gt;
*expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.1.0]&lt;br /&gt;
:Nur kleine Änderungen im Vergleich zur vorigen Version.&lt;br /&gt;
*expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.0.0]&lt;br /&gt;
:Im Vergleich zur vorigen Version wurde Appium auf die Version 1.16.0-rc.1 aktualisiert und node 12 verwendet. &lt;br /&gt;
*expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.8.1.0]&lt;br /&gt;
:Dieses installiert Appium in der Version 1.12.0 und enthält nun zusätzlich build-tools der Version 28.0.3 im android-sdk. Ansonsten ist es gleich wie die vorige Version.&lt;br /&gt;
*expecco 18.2: [http://download.exept.de/transfer/h-expecco-18.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.7.3.0]&lt;br /&gt;
:Dieses installiert Appium in der Version 1.8.1. Außerdem bietet das Supplement auch an, &#039;&#039;Android Debug Bridge&#039;&#039; und &#039;&#039;Google USB Driver&#039;&#039; ([https://gsmusbdrivers.com/download/adb-fastboot-drivers/ adb-setup-1.4.3]) zu installieren. Damit sind Treiber für ein breites Spektrum an Android-Geräten abgedeckt, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen. Ein &#039;&#039;&#039;JDK ist (aufgrund geänderter Lizenzbedingungen seitens Oracle) nicht mehr enthalten&#039;&#039;&#039;, dieses müssen Sie selbst herunterladen, z.B. von [https://www.oracle.com/technetwork/java/javase/downloads/index.html Oracle].&lt;br /&gt;
*expecco 18.1: wie expecco 2.11&lt;br /&gt;
*expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/MobileTestingSupplement_1.6.0.2_Setup.exe Mobile Testing Supplement 1.6.0.2]&lt;br /&gt;
:Dieses installiert ein Java JDK der Version 8, android-sdk und Appium in der Version 1.6.4. Außerdem bietet das Supplement auch einen universellen adb-Treiber ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]) an. Dieser vereint Treiber für ein breites Spektrum an Android-Geräten, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen.&lt;br /&gt;
*expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_1.5.0.0_Setup.exe Mobile Testing Supplement 1.5.0.0]&lt;br /&gt;
:Dieses installiert ein Java JDK der Version 8, android-sdk und Appium in der Version 1.4.16. Während der Installation wird die grafische Oberfläche von Appium gestartet, dieses Fenster können Sie sofort wieder schließen. Außerdem bietet das Supplement auch einen universellen adb-Treiber ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]) an. Dieser vereint Treiber für ein breites Spektrum an Android-Geräten, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen.&lt;br /&gt;
&lt;br /&gt;
Wenn expecco Mobilgeräte verwenden soll, die an einem anderen Rechner angeschlossen sind, müssen Sie dort einen Appium-Server starten. Dies können Sie mit der Datei &amp;lt;code&amp;gt;appium_standalone.cmd&amp;lt;/code&amp;gt; tun. Der Server wird dann mit dem Standard-Port 4723 gestartet. Falls Sie eine andere Portnummer verwenden wollen, starten Sie den Server mit&lt;br /&gt;
&lt;br /&gt;
 appium_standalone.cmd -p &amp;lt;portnummer&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Server ist bereit, sobald die Zeile&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Appium REST http interface listener started on 0.0.0.0:4723&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
angezeigt wird, wobei Sie am Ende die verwendete Portnummer ablesen können.&lt;br /&gt;
&lt;br /&gt;
Beim ersten Starten von Appium – sowohl im Standalone als auch gestartet von expecco – kann es vorkommen, dass die Windows-Firewall den Node-Server blockiert. Lassen Sie den Zugriff zu, sonst kann Appium nicht gestartet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;) Sie können natürlich auch die Command Line Tools (adb, sdkmanager, avdmanager etc.) einer vorhandenen Android Studio Version verwenden, sowie Appium separat installieren.&lt;br /&gt;
Da sich diese Tools regelmäßig ändern, und es in der Vergangenheit zu Inkompatibilitäten und Fehlern nach Releasewechseln kam, empfehlen wir zu Beginn, das mitgelieferte Paket zu verwenden. Dies ist möglicherweise nicht das aktuellste, wurde aber auf Lauffähigkeit getestet.&lt;br /&gt;
&lt;br /&gt;
Falls das Android Mobilgerät an einem entfernen Rechner angeschlossen ist,&lt;br /&gt;
können Sie den aktuellen Bildschirminhalt z.B. mit dem [https://github.com/Genymobile/scrcpy scrcpy] tool live mitverfolgen.&lt;br /&gt;
&lt;br /&gt;
== Mac OS (nicht erforderlich für Android-Tests)==&lt;br /&gt;
Hinweis: Wenn Sie nicht vorhaben, iOS-Geräte (iPhone, iPad, etc.) zu testen, können Sie das Folgende ignorieren. &#039;&#039;&#039;Der Apple-Rechner sowie das Mac-Setup werden für Android-Geräte nicht benötigt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Xcode ===&lt;br /&gt;
Zur Automatisierung mit iOS-Geräten wird [https://developer.apple.com/xcode/ Xcode] benötigt. Sie erhalten dieses über den App Store. Dabei ist darauf zu achten, dass die Version zu den getesteten iOS-Versionen passt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;iOS&#039;&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp;  &lt;br /&gt;
|&#039;&#039;&#039;Xcode&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;macOS&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|10.x&lt;br /&gt;
|8.x&lt;br /&gt;
|10.12 (Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|11.x&lt;br /&gt;
|9.x&lt;br /&gt;
|10.13 (High Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|12.x&lt;br /&gt;
|10.x&lt;br /&gt;
|10.14 (Mojave)&lt;br /&gt;
|-&lt;br /&gt;
|13.x&lt;br /&gt;
|11.x&lt;br /&gt;
|10.15 (Catalina)&lt;br /&gt;
|-&lt;br /&gt;
|14.x&lt;br /&gt;
|12.x&lt;br /&gt;
|11.0 (Big Sur)&lt;br /&gt;
|-&lt;br /&gt;
|15.x&lt;br /&gt;
|13.x&lt;br /&gt;
|12.0 (Monterey)&lt;br /&gt;
|-&lt;br /&gt;
|16.x&lt;br /&gt;
|14.x&lt;br /&gt;
|12.5 (Monterey)&lt;br /&gt;
|}&lt;br /&gt;
Diese Tabelle gibt nur eine vereinfachte Übersicht, lesen Sie besser unter [https://xcodereleases.com/ Xcode Releases] oder [https://en.wikipedia.org/wiki/Xcode#Version_comparison_table Xcode-Versionen] welche Version Sie brauchen. Für neue iOS Minor-Versionen gibt es in der Regel auch ein Update für Xcode, z.B. brauchen Sie für iOS 10.2 mindestens Xcode 8.2, für iOS 10.3 mindestens Xcode 8.3 usw. &lt;br /&gt;
Wenn Sie also auf eine neuere iOS-Version wechseln, benötigen Sie in der Regel auch eine neuere Xcode-Version. Neuere Versionen von Xcode laufen möglicherweise nicht auf älteren Betriebssystemen, was wiederum eine Aktualisierung des Betriebssystems erforderlich machen kann. Falls Sie auch ältere iOS-Versionen testen wollen kann es sinnvoll sein, die entsprechenden Xcode-Versionen parallel zu installieren.&lt;br /&gt;
&lt;br /&gt;
=== Appium ===&lt;br /&gt;
Der Appium-Server kann entweder als Kommandozeilen-Anwendung installiert werden oder über [https://github.com/appium/appium-desktop Appium Desktop] verwendet werden, welcher den Server über ein GUI zur Verfügung stellt. Mittlerweile gibt es auch Appium 2.0, was wir aber bisher noch nicht mit expecco getestet haben und daher nicht empfehlen.&lt;br /&gt;
&lt;br /&gt;
==== Appium Desktop ====&lt;br /&gt;
Laden Sie die neueste Version von [https://github.com/appium/appium-desktop/releases/ Appium Desktop] herunter. Für den Mac nehmen Sie am besten die dmg-Datei und installieren sie in den Anwendungen. Beim Starten der Anwendung &#039;&#039;Appium Server GUI&#039;&#039; erhalten Sie wahrscheinlich eine Fehlermeldung, dass es aus Sicherheitsgründen nicht möglich ist. Öffnen Sie dann das Kontextmenü auf der Anwendungsdatei (Rechtsklick bzw. Strg + Klick) und wählen Sie dort &#039;&#039;Öffnen&#039;&#039; aus. Bestätigen Sie dann, dass Sie die Anwendung wirklich öffnen wollen. Fortan können Sie die Anwendung normal öffnen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:OpenAppiumServerGUI1.png|text-top]] [[Datei:OpenAppiumServerGUI2.png|text-top]]&lt;br /&gt;
&lt;br /&gt;
Ab Xcode 14 gibt es Probleme beim Signieren des WebDriverAgents, den Appium zur Automatisierung auf das Gerät spielt. Dadurch ist mit der Version 1.22.3-4 von Appium Desktop kein Verbindungsaufbau möglich. Das Problem ist in neueren Versionen des WebDriverAgents behoben, es gibt aber aktuell noch keine Version von Appium Desktop, die eine solche Version enthält (Stand November 2022). Sie können aber manuell eine neue Version herunterladen (z.B. 4.10.2)  und die Dateien in Appium ersetzen. Laden Sie dazu von der [https://github.com/appium/WebDriverAgent/releases/ WebDriverAgent Download-Seite] eine der beiden Archivdateien (zip oder tar.gz) mit dem Source Code herunter. Öffnen und entpacken Sie dann diese Datei. Den Inhalt des Ordners WebDriverAgent-4.10.2 müssen Sie nun nach&lt;br /&gt;
&lt;br /&gt;
 /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
kopieren. Wenn Sie über den Finder dorthin navigieren, machen Sie auf die Anwendung &#039;&#039;Appium Server GUI&#039;&#039; einen Kontextklick (Rechtsklick bzw. Strg + Klick) und wählen Sie im Menü &#039;&#039;Paketinhalt anzeigen&#039;&#039;. Ersetzen Sie alle Dateien, die bereits mit gleichem Namen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
==== Appium über npm installieren ====&lt;br /&gt;
Sie können Appium auch über npm (Node Package Manager) installieren. Dazu müsen Sie erst node/npm installieren. Das geht mit [https://github.com/nvm-sh/nvm nvm] (Node Version Manager) was Sie von Github bekommen. Falls die folgende Installationsanleitung bei Ihnen nicht funktionieren sollte, finden Sie dort ausführlichere Informationen im [https://github.com/nvm-sh/nvm#readme Readme].&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie ein Terminal-Fenster. Klonen Sie dann das Github-Repository von nvm&lt;br /&gt;
 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash&lt;br /&gt;
und laden Sie es&lt;br /&gt;
 export NVM_DIR=&amp;quot;$([ -z &amp;quot;${XDG_CONFIG_HOME-}&amp;quot; ] &amp;amp;&amp;amp; printf %s &amp;quot;${HOME}/.nvm&amp;quot; || printf %s &amp;quot;${XDG_CONFIG_HOME}/nvm&amp;quot;)&amp;quot; [ -s &amp;quot;$NVM_DIR/nvm.sh&amp;quot; ] &amp;amp;&amp;amp; \. &amp;quot;$NVM_DIR/nvm.sh&amp;quot; # This loads nvm&lt;br /&gt;
&lt;br /&gt;
Führen Sie danach&lt;br /&gt;
 command -v nvm&lt;br /&gt;
aus, um zu testen, ob es funktioniert hat. Es sollte &#039;&#039;nvm&#039;&#039; ausgegeben werden. Kommt keine Antwort, führen Sie&lt;br /&gt;
 touch ~/.zshrc&lt;br /&gt;
aus, und versuchen Sie es erneut.&lt;br /&gt;
&lt;br /&gt;
Nun können Sie node mit dem folgenden Befehl installieren.&lt;br /&gt;
 nvm install 16.15.1&lt;br /&gt;
Da es mit der aktuellen Version von node Probleme beim Installieren von Appium gibt, empfehlen wir diese Version.&lt;br /&gt;
&lt;br /&gt;
Nachdem node installiert ist, können Sie Appium darüber installieren:&lt;br /&gt;
 npm install -g appium&lt;br /&gt;
&lt;br /&gt;
Den Appium-Server können Sie nun einfach über den Befehl&lt;br /&gt;
 appium&lt;br /&gt;
starten. Die Ausgabe erfolgt dann direkt im Terminal.&lt;br /&gt;
&lt;br /&gt;
Auch bei dieser Version gibt es das Problem bei der Signierung des WebDriverAgents, wie bei [[#Appium_Desktop | Appium Desktop]] beschrieben. Laden Sie also auch in diesem Fall eine neuere Version des WebDriverAgents herunter und ersetzen Sie die alten Dateien. Diese finden Sie unter&lt;br /&gt;
 /Users/&amp;lt;user&amp;gt;/.nvm/versions/16.15.1/lib/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
==== Mobile Testing Supplement ====&lt;br /&gt;
Ältere Appium-Versionen stellen wir Ihnen über das Mobile Testing Supplement für Mac OS zur Verfügung, mit dem Sie es einfach installieren können:&lt;br /&gt;
* &#039;&#039;&#039;expecco 20.2&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-20.2.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement für Mac OS (1.2.2)]&lt;br /&gt;
:Enthält Appium Version 1.18.3 und verwendet node 14.&lt;br /&gt;
&lt;br /&gt;
* expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement für Mac OS (1.2.0)]&lt;br /&gt;
:Nur wenige Änderungen im Vergleich zur vorigen Version.&lt;br /&gt;
&lt;br /&gt;
* expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement_for_MacOS.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.98)]&lt;br /&gt;
:Im Vergleich zur vorigen Version wurde Appium auf die Version 1.16.0-rc.1 aktualisiert und es wird node 12 verwendet. &lt;br /&gt;
&lt;br /&gt;
* expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.96.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.96)]&lt;br /&gt;
:Diese Version enthält Appium 1.12.0. &lt;br /&gt;
&lt;br /&gt;
* expecco 18.1: [http://download.exept.de/transfer/h-expecco-18.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.94.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.94)]&lt;br /&gt;
:Diese Version enthält Appium 1.8.0.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/Mobile_Testing_Supplement_for_Mac_OS_1.0.94.tar.bz2 Mobile Testing Supplement für Mac OS (1.0.94)]&lt;br /&gt;
:Diese Version enthält Appium 1.6.4.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_for_Mac_OS_1.0.tar.bz2 Mobile Testing Supplement für Mac OS]&lt;br /&gt;
:Diese Version entält Appium 1.4.16.&lt;br /&gt;
&lt;br /&gt;
Nachdem Herunterladen des Supplements, können Sie es in ein Verzeichnis Ihrer Wahl (z. B. Ihr Home-Verzeichnis) verschieben und dort entpacken. Ein geeigneter Befehl in einer Shell könnte wie folgt aussehen, passen Sie dabei die Versionsnummer entsprechend an:&lt;br /&gt;
&lt;br /&gt;
 tar -xvpf Mobile_Testing_Supplement_for_Mac_OS_1.1.98.tar.bz2&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Ihre Standard-Xcode-Installation verwenden wollen, können Sie Appium direkt über die Datei im &#039;&#039;bin&#039;&#039;-Verzeichnis mit der entsprechenden Versionsnummer starten:&lt;br /&gt;
&lt;br /&gt;
 Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
Falls Sie ein anderes Xcode als das als Standard konfigurierte verwenden wollen, müssen Sie Appium den entsprechenden Pfad über die Umgebungsvariable &#039;&#039;DEVELOPER_DIR&#039;&#039; angeben. &lt;br /&gt;
Wenn Sie Xcode z. B. in &#039;&#039;/Applications/Xcode-11.3.app&#039;&#039; installiert haben, müssten Sie Appium so starten:&lt;br /&gt;
&lt;br /&gt;
 DEVELOPER_DIR=&amp;quot;/Applications/Xcode-11.3.app/Contents/Developer&amp;quot; Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
Was als Standard-Xcode-Installation gesetzt ist, zeigt der Befehl:&lt;br /&gt;
&lt;br /&gt;
 xcode-select -p&lt;br /&gt;
&lt;br /&gt;
Wenn Appium Ihre Xcode-Installation nicht findet, erscheint beim Verbinden eine Fehlermeldung in der Art:&lt;br /&gt;
&#039;&#039;&amp;lt;blockquote&amp;gt;org.openqa.selenium.SessionNotCreatedException - A new session could not be created. (Original error: Could not find path to Xcode, environment variable DEVELOPER_DIR set to: /Applications/Xcode.app but no Xcode found)&amp;lt;/blockquote&amp;gt;&#039;&#039;&lt;br /&gt;
Starten Sie in diesem Fall Appium erneut, unter Angabe eines gültigen &#039;&#039;DEVELOPER_DIR&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== WebDriverAgent-Signierung ====&lt;br /&gt;
Zur Automatisierung lädt Appium eine App namens WebDriverAgent auf das Gerät und muss sie dafür signieren können. Dazu brauchen Sie einen Apple-Account und ein entsprechendes Zertifikat. Zur Evaluierung können Sie einen kostenlosen Account verwenden. Dieser hat den Nachteil, dass erstellte Profile nur eine Woche gültig sind und danach neu erstellt werden müssen. Seien Sie auch vorsichtig, wenn Sie sich den Account teilen, da es vorkommen kann, dass Zertifikate widerrufen werden oder durch automatische Generierung ungültig werden. Als Folge können bereits signierte Apps nicht mehr verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie bereits ein entsprechendes Zertifikat mit dem zugehörigen privaten Schlüssel in Ihrer [https://support.apple.com/de-de/guide/keychain-access/welcome/mac Schlüsselbundverwaltung] auf dem Mac haben, können Sie den WebDriverAgent automatisch signieren lassen. Ansonsten empfiehlt es sich, die Signierung über Xcode einzustellen und zu verwalten.&lt;br /&gt;
&lt;br /&gt;
Schließen Sie zuerst das Gerät, das Sie verwenden möchten, über USB an den Mac an. Stellen Sie sicher, dass sich der Mac und das Gerät im selben Netzwerk befinden, ansonsten kann es beim Verbindungsaufbau mit Appium zu Problemen kommen. Starten Sie Xcode und öffnen Sie &#039;&#039;Preferences&#039;&#039;. Wechseln Sie zur Seite der Accounts und legen Sie einen Eintrag mit Ihrem Account an. Anschließend können Sie auf &#039;&#039;Manage Certificates...&#039;&#039; klicken, um die Zertifikate zu sehen, die zu diesem Account gehören. Zum Ausführen von Tests benötigen Sie ein iOS-Development-Zertifikat und den dazugehörigen privaten Schlüssel. Wenn Sie noch keines besitzen, erstellen Sie eines. Wenn Sie bereits eines haben, aber es nicht in Ihrem Schlüsselbund vorhanden ist (erkennbar an dem Hinweis &amp;quot;Not in Keychain&amp;quot;), können Sie es importieren. Das können Sie über die [https://support.apple.com/de-de/guide/keychain-access/welcome/mac Schlüsselbundverwaltung] auf dem Mac machen, wenn Sie es zuvor aus dem Schlüsselbund exportiert haben, in dem es sich befindet. Das Zertifikat mit dem zugehörigen Schlüssel sollte sich im Schlüsselbund &#039;&#039;Anmeldung&#039;&#039; befinden. Dort kann es als PKCS#12-Datei (Endung typischerweise .p12) exportiert werden. Um ein Zertifikat in Ihren Schlüsselbund zu importieren, wählen Sie im Menü &#039;&#039;Ablage&#039;&#039; die Option &#039;&#039;Objekte importieren&#039;&#039;. Falls Sie nicht wissen, wo das Zertifikat gespeichert ist, können Sie es in Xcode auch widerrufen und in Ihrem Schlüsselbund neu anlegen. Machen Sie das jedoch nur, wenn Sie wissen, dass das alte Zertifikat nicht mehr in Verwendung ist, da es danach nicht mehr benutzt werden kann. Nun sollte Ihr Schlüsselbund ein iOS-Development-Zertifikat enthalten.&lt;br /&gt;
&amp;lt;!---(Ich habe den folgenden Teil mal rausgenommen. Man braucht das nicht, wenn es in Xcode eingestellt ist.) Wählen Sie im Rechtsklick-Menü den Punkt &#039;&#039;Informationen&#039;&#039; aus. Unter den Details des Zertifikats finden Sie die Team-ID, die hier als Organisationseinheit bezeichnet wird. Tragen Sie diese in den Einstellungen des Plugins im Feld &#039;&#039;Team-ID&#039;&#039; ein, siehe [[#Konfiguration_des_Plugins|Konfiguration des Plugins]].--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie nun das WebDriverAgent-Projekt in Xcode. Wenn Sie das Mobile Testing Supplement installiert haben, finden Sie es in dessen Verzeichnis unter&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
Wenn Sie Appium Desktop installier haben, finden Sie es unter&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;/Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
Sie können einfach im Finder zu der Xcode-Project-Datei navigieren und Sie über einen Doppelklick öffnen. Beachten Sie dabei, dass Sie dabei auf die Anwendung Appium Server GUI einen Kontextklick (Rechtsklick bzw. Strg + Klick) machen und im Menü &#039;&#039;Paketinhalt anzeigen&#039;&#039; auswählen müssen, um in deren Unterverzeichnis zu gelangen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingWebDriverAgentXcode.png]]&lt;br /&gt;
&lt;br /&gt;
Wählen Sie &#039;&#039;WebDriverAgentLib&#039;&#039; und die Seite &#039;&#039;Signing &amp;amp; Capabilities&#039;&#039; aus. Setzen Sie dort im Abschnitt &#039;&#039;Signing&#039;&#039; die Option &#039;&#039;Automatically manage signing&#039;&#039; und wählen Sie dann ein Team aus. Wechseln Sie nun zu &#039;&#039;WebDriverAgentRunner&#039;&#039; und tun Sie dort dasselbe.&lt;br /&gt;
&amp;lt;!--(Das Folgende scheint nicht mehr aktuell zu sein.) Es sollten an dieser Stelle Fehler angezeigt werden, dass kein Provisioning Profile angelegt oder gefunden wurde. Wechseln Sie deshalb zur Seite &#039;&#039;Build Settings&#039;&#039; und suchen Sie hier im Abschnitt &#039;&#039;Packaging&#039;&#039; den Eintrag &#039;&#039;Product Bundle Identifier&#039;&#039;. Ändern Sie diesen von com.facebook.WebDriverAgentRunner zu etwas, das von Xcode akzeptiert wird, indem Sie den Präfix ändern. Xcode kann nun ein passendes Provisioning Profile generieren und die Fehler auf der General-Seite sollten verschwinden. Danach können Sie Xcode beenden. --&amp;gt;&lt;br /&gt;
Durch das Setzen des Teams sollten die Fehler für den WebDriverAgentRunner verschwinden. Sollte Xcode kein passendes Provisioning Profile für die Bundle ID &#039;&#039;com.facebook.WebDriverAgentRunner&#039;&#039; erstellen können, können Sie diese anpassen, dass sie zu Ihrem Zertifikat passt. Danach können Sie Xcode beenden oder auch, wie weiter unten beschrieben, direkt den Build über Xcode starten, damit das Projekt bereits gebaut ist, wenn Appium es verwenden möchte.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie sich nun von expecco eine Verbindung zu Ihrem Gerät aufbauen, wird der WebDriverAgent darauf installiert und gestartet, um anschließend zur zu testenden App zu wechseln. Eventuell muss auf dem Gerät muss der Ausführung des WebDriverAgents vertraut noch werden. Ein Anzeichnen dafür kann sein, dass die App WebDriverAgent zwar auf dem Gerät erscheint und zu starten versucht, danach aber wieder deinstalliert wird. Öffnen Sie dazu während des Verbindungsaufbaus auf dem Gerät in die Einstellungen und dort unter &#039;&#039;Allgemein&#039;&#039; den Eintrag &#039;&#039;Geräteverwaltung&#039;&#039;. Dieser Eintrag ist nur sichtbar, wenn eine Entwickler-App auf dem Gerät installiert ist. Sie müssen daher möglicherweise warten, bis der WebDriverAgent installiert ist, bevor der Eintrag erscheint. Wählen Sie dort den Eintrag Ihres Apple-Accounts und vertrauen Sie ihm. Da der WebDriverAgent wieder deinstalliert wird, wenn der Start nicht funktioniert hat, müssen Sie dies während des Verbindungsaufbaus tun. Falls Ihnen das zu hektisch ist, können Sie auch folgenden Code ausführen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;xcodebuild -project Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
  xcodebuild -project /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&lt;br /&gt;
&lt;br /&gt;
Damit wird der WebDriverAgent auf dem Gerät installiert ohne dass er wieder gelöscht wird.&lt;br /&gt;
&lt;br /&gt;
Wenn es Probleme beim Installieren des WebDriverAgents gibt, können Sie auch versuchen, den Build über Xcode zu starten. Stellen Sie sicher, dass das richtige Target &#039;&#039;WebDriverAgent&#039;&#039; ausgewählt ist. Fehlermeldungen in Xcode zeigen vielleicht einfacher, wo das Problem liegt. Manchmal hilft es auch, es ein zweites Mal zu versuchen, weil es möglicherweise beim ersten Mal zu lange gedauert hat und abgebrochen wurde. Es kann sein, dass Sie während des Builds mehrmals aufgefordert werden, das Passwort für Ihren Schlüsselbund anzugeben.&lt;br /&gt;
&lt;br /&gt;
[[Datei:WebDriverAgentCodesign.png]]&lt;br /&gt;
&lt;br /&gt;
Lesen Sie auch die Dokumentation von Appium zum [https://github.com/appium/appium-xcuitest-driver/blob/master/docs/real-device-config.md Aufsetzen von Tests mit iOS-Geräten]. In der [https://support.apple.com/en-us/HT204460 Dokumentation von Apple] finden Sie nähere Informationen zum Installieren und Vertrauen von Apps.&lt;br /&gt;
&lt;br /&gt;
Ist der WebDriverAgent einmal auf dem Gerät installiert, wird er für spätere Verbindungen wieder verwendet und der Verbindungsaufbau sollte schneller funktionieren. Ebenso liegt dann die signierte Version bereits auf Ihrem Mac und muss nicht erneut gebaut werden, was die Verbindung zu weiteren Geräten ebenfalls beschleunigt. Wenn Sie wissen, dass bei Ihrem Verbindungsaufbau der WebDriverAgent erst noch signiert und gebaut werden muss, ist es ratsam, die Capability &#039;&#039;wdaLaunchTimeout&#039;&#039; zu setzen. Dieser Timeout, wie lange auf den Start der WebDriverAgents auf dem Gerät gewartet werden soll, liegt standardmäßig bei 60000$nbsp;ms. Der Build dauert aber häufig über eine Minute, sodass der Versuch zum Verbindungsaufbau dann abgebrochen wird. Ein Wert von 120000 hat sich hier als besser erwiesen.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration des Plugins ==&lt;br /&gt;
Bevor Sie loslegen, sollten Sie die Einstellungen des Mobile Testing Plugins überprüfen und ggf. anpassen.&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie im Menü den Punkt &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; und dort unter &amp;quot;&#039;&#039;Erweiterungen&#039;&#039;&amp;quot; den Eintrag &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot; (s. Abb.). Standardmäßig werden diese Pfade automatisch gefunden (1). Um einen Pfad manuell anzupassen, deaktivieren Sie den entsprechenden Haken rechts davon. Sie erhalten in einer Drop-down-Liste einige Pfade zur Auswahl. Ist ein eingetragener Pfad falsch oder kann er nicht gefunden werden, wird das Feld rot markiert und es erscheint ein diesbezüglicher Hinweis. Stellen Sie sicher, dass alle Pfade richtig angegeben sind.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingEinstellungen.png | thumb | 400px | Konfiguration des Plugins]]&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;appium&#039;&#039;&#039;: Geben Sie hier den Pfad zur ausführbaren Datei an mit der Appium in der Kommandozeile gestartet werden kann. Unter Windows wird diese Datei in der Regel &amp;quot;&amp;lt;code&amp;gt;appium.cmd&amp;lt;/code&amp;gt;&amp;quot; heißen. Dieser Pfad wird benutzt, wenn expecco einen Appium-Server startet.&lt;br /&gt;
*&#039;&#039;&#039;node&#039;&#039;&#039;: Geben Sie hier den Pfad zur ausführbaren Datei an, die Node (auch &amp;quot;Node.js&amp;quot;) startet. Dieser Pfad wird beim Starten eines Servers an Appium weitergegeben, damit Appium ihn unabhängig von der PATH-Variablen findet. Unter Windows heißt diese Datei in der Regel &amp;quot;&amp;lt;code&amp;gt;node.exe&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;JAVA_HOME&#039;&#039;&#039;: Geben Sie hier den Pfad zu einem JDK an. Dieser Pfad wird an jeden Appium-Server weitergegeben. Lassen Sie das Feld frei, um den Wert aus der Umgebungsvariablen zu verwenden. Um einzustellen, welches Java von expecco verwendet werden soll, setzen Sie diesen Pfad in den Einstellungen für die Java Bridge.&lt;br /&gt;
*&#039;&#039;&#039;ANDROID_HOME&#039;&#039;&#039;: Geben Sie hier den Pfad zu einem SDK von Android an. Dieser Pfad wird an jeden Appium-Server weitergegeben. Lassen Sie das Feld frei, um den Wert aus der Umgebungsvariablen zu verwenden.&lt;br /&gt;
*&#039;&#039;&#039;adb&#039;&#039;&#039;: Hier steht der Pfad zum adb-Befehl. Unter Windows heißt die Datei adb.exe. Diese wird von expecco beispielsweise verwendet, um die Liste der angeschlossenen Geräte zu erhalten. Diesen Pfad sollten Sie automatisch wählen lassen, da dann der Befehl im ANDROID_HOME-Verzeichnis verwendet wird. Dieser wird auch von Appium verwendet. Falls expecco und Appium jedoch verschiedene Versionen von adb verwenden kann es zu Konflikten kommen.&lt;br /&gt;
*&#039;&#039;&#039;android.bat&#039;&#039;&#039;: Diese Datei wird nur benötigt, um damit den AVD und den SDK Manager zu starten. Automatisch wird hier die Datei im ANDROID_HOME-Verzeichnis gesucht.&lt;br /&gt;
*&#039;&#039;&#039;aapt&#039;&#039;&#039;: Geben Sie hier den Pfad zum aapt-Befehl an. Unter Windows heißt diese Datei &#039;&#039;aapt.exe&#039;&#039;. expecco verwendet aapt nur im Verbindungseditor, um das Paket und die Activities einer apk-Datei zu lesen. Automatisch wird hier die Datei im ANDROID_HOME-Verzeichnis gesucht.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingJavaBridgeEinstellungen.png | thumb | 400px | Konfiguration des JDKs]]&lt;br /&gt;
&lt;br /&gt;
Ab expecco 2.11 gibt es das Feld &#039;&#039;Team-ID&#039;&#039;. Wenn Sie iOS-Tests ausführen, tragen Sie hier die Team-ID Ihres Zertifikats ein. Diese wird für jede iOS-Verbindung verwendet, außer Sie setzen den Wert im Einzelfall in den Verbindungseinstellungen um. Wie Sie die Team-ID erhalten, lesen Sie im Abschnitt zur [[#Signierung|Signierung]] ber der Installation auf Mac OS. Mit expecco 2.10 können Sie die Team-ID nur für jede Verbindungseinstellung extra als Capability eintragen. Dazu müssen Sie jedoch die [[#Erweiterte_Ansicht|erweiterte Ansicht]] verwenden. Geben Sie hier die Capability &#039;&#039;xcodeOrgId&#039;&#039; an und setzen Sie als Wert die Team-ID des Zertifikats.&lt;br /&gt;
&lt;br /&gt;
Die Einstellung zur Serveradresse unten auf der Seite bezieht sich auf das Verhalten des Verbindungseditors. Dieser prüft am Ende, ob die Serveradresse auf &#039;&#039;/wd/hub&#039;&#039; endet, da dies die übliche Form ist. Falls nicht, wird in einem Dialog gefragt, wie darauf reagiert werden soll. Das festgelegte Verhalten kann hier eingesehen und verändert werden.&lt;br /&gt;
&lt;br /&gt;
Wechseln Sie ebenfalls zum Eintrag &#039;&#039;Java Bridge&#039;&#039; (s. Abb.). Hier muss der Pfad zu Ihrer Java-Installation angegeben werden, die von expecco benutzt wird. Tragen Sie hier ein JDK ein. Falls Sie unter Windows das aus dem Mobile Testing Supplement verwenden möchten, lautet der Pfad&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;C:\Program Files (x86)\exept\Mobile Testing Supplement\jdk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Sie können auch die Systemeinstellungen verwenden.&lt;br /&gt;
&lt;br /&gt;
== Android-Gerät vorbereiten ==&lt;br /&gt;
Wenn Sie ein Android-Gerät unter Windows anschließen benötigen Sie möglicherweise noch einen adb-Treiber für das Gerät. Einen passenden Treiber finden Sie üblicherweise auf der jeweiligen Webseite des Herstellers. Haben Sie den Universal-Treiber aus dem Mobile Testing Supplement installiert, sollte für die meisten Geräte bereits alles funktionieren. In einigen Fällen versucht auch Windows automatisch einen Treiber zu installieren, wenn Sie das Gerät zum ersten mal anschließen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===USB-Debugging Einschalten===&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Bevor Sie ein Mobilgerät mit dem Appium-Plugin ansteuern können, müssen Sie für dieses Debugging erlauben!&lt;br /&gt;
&lt;br /&gt;
Für Android-Geräte finden Sie diese Option in den Einstellungen unter &#039;&#039;[https://www.droidwiki.org/wiki/Entwickleroptionen Entwickleroptionen]&#039;&#039; mit dem Namen &#039;&#039;[https://www.droidwiki.org/USB-Debugging USB-Debugging]&#039;&#039;. Falls die Entwickleroptionen nicht angezeigt werden, können Sie diese freischalten, indem Sie unter &amp;quot;&#039;&#039;Über das Telefon&#039;&#039;&amp;quot; siebenmal auf &amp;quot;&#039;&#039;Build-Nummer&#039;&#039;&amp;quot; tippen.&lt;br /&gt;
&lt;br /&gt;
===Wach bleiben Aktivieren===&lt;br /&gt;
Aktivieren Sie auch die Funktion &#039;&#039;Wach bleiben&#039;&#039;, damit das Gerät nicht während der Testerstellung oder -ausführung den Bildschirm abschaltet.&lt;br /&gt;
&lt;br /&gt;
Aus Sicherheitsgründen muss USB-Debugging für jeden Computer einzeln zugelassen werden. Beim Verbinden des Geräts mit dem PC über USB müssen Sie dabei am Gerät der Verbindung zustimmen. Falls Sie dies für Ihren Computer noch nicht getan haben, aber auf dem Gerät kein entsprechender Dialog erscheint, kann es helfen, das Gerät aus- und wieder einzustecken. Das kann insbesondere dann passieren, wenn Sie den ADB-Treiber installiert haben während das Gerät bereits über USB angeschlossen war. Falls auch das nicht hilft, öffnen Sie die Benachrichtigungen, indem Sie sie vom oberen Bildschirmrand herunter ziehen. Dort finden Sie die USB-Verbindung und Sie können die Optionen dazu öffnen. Wählen Sie einen anderen Verbindungstypen aus; in der Regel sollten MTP oder PTP funktionieren.&lt;br /&gt;
&lt;br /&gt;
Sie können auch auf einem Emulator testen. Dieser muss nicht gesondert vorbereitet werden, da er bereits für USB-Debugging ausgelegt ist. Es ist sogar möglich, einen Emulator bei Testbeginn zu starten.&lt;br /&gt;
&lt;br /&gt;
Um zu überprüfen, ob ein Gerät, das Sie an Ihren Rechner angeschlossen haben, verwendet werden kann, öffnen Sie den [[#Verbindungseditor|Verbindungseditor]]. Das Gerät sollte dort angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Verbindung über WLAN ===&lt;br /&gt;
Es ist auch möglich, Android-Geräte über WLAN zu verbinden. Für Geräte mit Android 11 oder neuer ist dies direkt über WLAN möglich, im anderen Fall müssen Sie das Gerät zuerst über USB verbinden. Ab expecco 22.1 können Sie eine WLAN-Verbindung über den [[Mobile Testing Plugin#Verbindungseditor|Verbindungseditor]] aufbauen. Ansonsten ist es auch über die Eingabeaufforderung möglich.&lt;br /&gt;
==== Drahtlos verbinden über die Eingabeaufforderung mit expecco Versionen vor 22.1 (ab Android 11) ====&lt;br /&gt;
Mit expecco ab Version 22.1 funktioniert das einfacher über den Verbindungseditor.&lt;br /&gt;
&lt;br /&gt;
Erlauben Sie in den Entwickleroptionen des Geräts Debugging über WLAN und öffnen Sie dessen Optionen. Sie müssen zuerst das Gerät mit dem  Rechner koppeln. Wählen Sie dazu &amp;quot;&#039;&#039;Gerät mit einem Kopplungscode koppeln&#039;&#039;&amp;quot;, um einen Kopplungscode und eine IP-Adresse mit Port zu erhalten. Öffnen Sie dann auf dem Rechner die Eingabeaufforderung und geben Sie dort ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb pair &amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Kopplungsport&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
wobei Sie &amp;lt;tt&amp;gt;&amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Kopplungsport&amp;gt;&amp;lt;/tt&amp;gt; durch die auf dem Gerät angezeigte IP-Adresse &amp;amp; Port ersetzen. Danach werden Sie aufgefordert, den Kopplungscode einzugeben. Wenn alles geklappt hat, sollte sich das Popup auf dem Gerät schließen und der Rechner als gekoppeltes Gerät angezeigt werden. Geben Sie dann in der Eingabeaufforderung ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Debug-Port&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die IP-Adresse ist hier noch die gleiche wie beim Koppeln, aber der Port ist ein anderer. Beides wird als IP-Adresse &amp;amp; Port auf dem Gerät angezeigt. Damit sollte das Gerät nun über WLAN verbunden sein und kann genauso verwendet werden, wie mit USB-Verbindung. Sie können dies überprüfen, indem Sie entweder &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; eingeben oder in expecco den Verbindungsdialog öffnen. In der Liste taucht das Gerät mit seiner IP-Adresse und dem Port auf. Bedenken Sie, dass die WLAN-Verbindung nicht mehr besteht, wenn der ADB-Server oder das Gerät neu gestartet werden. Häufig wird beim Neustart des Geräts auch die Erlaubnis für das Debugging über WLAN wieder zurückgesetzt und der verwendete Port ändert sich. Die Kopplung bleibt aber bestehen und muss beim nächsten Verbinden nicht noch einmal durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==== WLAN Verbindung über USB starten (Android 10 und früher) ====&lt;br /&gt;
Verbinden Sie zunächst das Gerät über USB mit dem Rechner. Öffnen Sie dann die Eingabeaufforderung und geben Sie dort ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit lauscht das Gerät auf eine TCP/IP-Verbindung an Port 5555. Sollten Sie mehrere Geräte angeschlossen oder Emulatoren laufen haben, müssen Sie genauer angeben, welches Gerät Sie meinen. Geben Sie in diesem Fall ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb devices -l&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Sie erhalten eine Liste aller Geräte, wobei die erste Spalte deren Kennung ist. Schreiben Sie dann stattdessen&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb -s &amp;lt;Gerätekennung&amp;gt; tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
mit der Gerätekennung des gewünschten Geräts. Sie können die USB-Verbindung nun trennen. Jetzt müssen Sie die IP-Adresse Ihres Gerätes in Erfahrung bringen. Sie finden diese üblicherweise irgendwo in den Einstellungen des Geräts, beispielsweise beim Status oder in den WLAN-Einstellungen. Geben Sie dann ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP-Adresse des Geräts&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit sollte das Gerät nun über WLAN verbunden sein und kann genauso verwendet werden, wie mit USB-Verbindung. Sie können dies überprüfen, indem Sie wieder &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; eingeben oder in expecco den Verbindungsdialog öffnen. In der Liste taucht das Gerät mit seiner IP-Adresse und dem Port auf. Bedenken Sie, dass die WLAN-Verbindung nicht mehr besteht, wenn der ADB-Server oder das Gerät neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
=== Verbindung zu einem Emulator ===&lt;br /&gt;
Sie benötigen dazu den Emulator selbst, sowie mindestens ein AVD (Android Virtual Device). Hinweise zu Installation finden Sie in der [https://developer.android.com/studio/run/emulator Android Studio Dokumentation].&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Android Studio bereits mit den Defaulteinstellungen installiert haben &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;, sollte der Emulator bereits mitinstalliert sein. Falls nicht, wählen Sie in Android Studio &amp;quot;&#039;&#039;Configure&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;SDK Manager&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Android SDK&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;SDK Tools&#039;&#039;&amp;quot; - &#039;&#039;Android Emulator&#039;&#039;&amp;quot;, sowie dort die &amp;quot;&#039;&#039;Platform Tools&#039;&#039;&amp;quot;.&lt;br /&gt;
Alternativ geht das auch über die Kommandzeile mit dem &amp;quot;sdkmanager&amp;quot; Kommando.&lt;br /&gt;
&lt;br /&gt;
Als nächstes benötigen Sie mindestens ein AVD; auch dies geht am einfachsten über den Dialog in Android Studio:&lt;br /&gt;
wählen sie &amp;quot;&#039;&#039;Configure&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;AVD Manager&#039;&#039;&amp;quot; und folgen den Anweisungen (Deviceauswahl, Platform und Android Version).  &lt;br /&gt;
&lt;br /&gt;
Auch wenn Sie den Emulator automatisieren benötigen sie Appium; installieren Sie dieses entweder mit dem Mobile Testing Supplement, oder direkt von der Appium homepage (https://github.com/appium/appium-desktop/releases).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;Android Studio selbst wird nicht von expecco benötigt; es bietet aber kompfortable Dialoge zum Installieren von Paketen und AVDs.&lt;br /&gt;
&lt;br /&gt;
== iOS-Gerät und App vorbereiten ==&lt;br /&gt;
Das Ansteuern von iOS-Geräten ist nur über einen Mac möglich. Lesen Sie daher auch den Abschnitt zur [[#Mac_OS|Installation unter Mac OS]].&lt;br /&gt;
&lt;br /&gt;
Bevor Sie ein Mobilgerät mit dem Mobile Testing Plugin ansteuern können, müssen Sie für iOS-Geräte ab iOS 8 Debugging erlauben. Aktivieren Sie dazu die Option &#039;&#039;Enable UI Automation&#039;&#039; unter dem Menüpunkt &#039;&#039;Entwickler&#039;&#039; in den Einstellungen des Geräts. Falls Sie den Eintrag &#039;&#039;Entwickler&#039;&#039; in den Einstellungen nicht finden, gehen Sie wie folgt vor: Schließen Sie das Gerät über USB an den Mac an. Dabei müssen Sie ggf. am Gerät noch der Verbindung zustimmen. Starten Sie Xcode und wählen Sie dann in der Menüleiste am oberen Bildschirmrand im Menü &#039;&#039;Window&#039;&#039; den Eintrag &#039;&#039;Devices&#039;&#039;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wählen Sie dort Ihr Gerät aus. Danach sollte der Eintrag &#039;&#039;Entwickler&#039;&#039; in den Einstellungen auf dem Gerät auftauchen. Dazu müssen Sie möglicherweise die Einstellungen beenden und neu starten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Alert.png | thumb | 270px | Beispiel für einen Alert unter iOS]]&lt;br /&gt;
Ein Verbindungsaufbau zu dem Gerät ist nicht möglich solange es bestimmte Alerts zeigt. Ein solcher Alert kann z.&amp;amp;#x202f;B. erscheinen wenn FaceTime aktiviert ist, indem ein Hinweis auf anfallende SMS-Gebühren angezeigt wird (siehe Screenshot). Achten Sie darauf, das Gerät so zu konfigurieren, dass es im Leerlauf keine solchen Alerts zeigt.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.11 und später ===&lt;br /&gt;
Sie können beliebige Apps testen, die auf dem verwendeten Gerät lauffähig oder bereits installiert sind. Wenn die App als Development-Build vorliegt, muss die UDID des Geräts in der App hinterlegt sein. In jedem Fall muss der WebDriverAgent für das Gerät signiert werden. Lesen Sie dazu den Abschnitt zur [[#Signierung|Signierung]] unter Mac OS.&lt;br /&gt;
&lt;br /&gt;
Falls Sie in einem Test den Home-Button verwenden wollen, müssen Sie auf dem Gerät AssistiveTouch aktivieren. Sie finden diese Option in den Einstellungen unter &#039;&#039;Allgemein&#039;&#039; &amp;gt; &#039;&#039;Bedienungshilfen&#039;&#039; &amp;gt; &#039;&#039;AssistiveTouch&#039;&#039;. Platzieren Sie dann das Menü in der Mitte des oberen Bildschirmrands. Sie können das Drücken des Home-Buttons dann mit dem entsprechenden Menüeintrag im Recorder aufzeichnen oder direkt den Baustein &#039;&#039;Press Home Button&#039;&#039; benutzen.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.10 ===&lt;br /&gt;
Die App, die Sie verwenden wollen, muss als Development-Build vorliegen. Außerdem muss die UDID des Geräts in der App hinterlegt sein.&lt;br /&gt;
&lt;br /&gt;
=== Development-Build signieren ===&lt;br /&gt;
Ein Development-Build einer App ist nur für eine begrenzte Zahl von Geräten zugelassen und kann auf anderen Geräten nicht gestartet werden. Es ist aber möglich, das Zertifikat und die verwendbaren Geräte in einem Development-Build auszutauschen.&lt;br /&gt;
&lt;br /&gt;
* Evaluierung mit Demo-App von eXept:&lt;br /&gt;
:Gerne stellen wir Ihnen eine Demo-App zur Verfügung, die als Development-Build vorliegt und die wir für Ihr Gerät signieren können. Senden Sie dazu bitte Ihrem eXept-Ansprechpartner die UDID Ihres Gerätes zu. Wie Sie die UDID Ihres Gerätes ermitteln können, ist im folgenden Abschnitt beschrieben.&lt;br /&gt;
&lt;br /&gt;
* Eigene App für Ihr Testgerät verwenden:&lt;br /&gt;
:Wenn Sie von den App-Entwicklern einen Development-Build (IPA-Datei) erhalten, der für Ihr Testgerät zugelassen ist, können Sie diesen direkt verwenden. Dazu müssen Sie den Entwicklern die UDID Ihres Geräts mitteilen, damit sie diese eintragen können. &#039;&#039;&#039;Sie können die UDID eines Gerätes mithilfe von Xcode auslesen&#039;&#039;&#039;. Starten Sie dazu Xcode und wählen Sie in der Menüleiste am oberen Bildschirmrand im Menü &#039;&#039;Window&#039;&#039; den Eintrag &#039;&#039;Devices&#039;&#039;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wählen Sie Ihr Gerät aus und suchen Sie in Eigenschaften den Eintrag &#039;&#039;Identifier&#039;&#039;. Die UDID ist eine 40-stellige Hexadezimalzahl.&lt;br /&gt;
&lt;br /&gt;
* Extern entwickelte App für Ihr Testgerät umsignieren:&lt;br /&gt;
:Es können auch Apps umsigniert werden, damit Sie auf anderen Geräten lauffähig sind. Dieser Vorgang ist jedoch kompliziert und setzt insbesondere einen Zugang zu einem Apple-Developer-Account voraus. Eine Dokumentation zur Vorgehensweise ist derzeit in Vorbereitung.&lt;br /&gt;
&lt;br /&gt;
:Für die Evaluierung unterstützen wir Sie gerne beim Umsignieren Ihrer App.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Melden Sie sich beim [https://developer.apple.com/ Apple-Webinterface] an. Navigieren Sie zu &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039;. Erzeugen Sie hier ggf. ein Developer-Zertifikat und ein Provisioning Profile für Ihr Gerät und laden Sie beide herunter. Sollten Sie noch keinen Developer Account haben, erstellen Sie hier einen: https://developer.apple.com/enroll/. Hierzu müssen Sie sich mit einer Apple-ID anmelden.&lt;br /&gt;
&lt;br /&gt;
# Team-ID herausfinden (&#039;&#039;Membership&#039;&#039; -&amp;gt; &#039;&#039;Team ID&#039;&#039;)&lt;br /&gt;
# Unter &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039; Development-Zertifikat auswählen (unter &#039;&#039;+&#039;&#039; anlegen, falls nicht vorhanden) und herunterladen.&lt;br /&gt;
# Unter &#039;&#039;App ID&#039;&#039; Wildcard-App-ID erzeugen, falls nicht vorhanden. App-ID notieren (AppID = Prefix.ID)&lt;br /&gt;
# Gerät hinzufügen, dazu UDID (bzw. &#039;&#039;Identifier&#039;&#039;) des Geräts herausfinden (&#039;&#039;Xcode&#039;&#039; -&amp;gt; &#039;&#039;Window&#039;&#039; (oben in Menüleiste) -&amp;gt; &#039;&#039;Devices&#039;&#039;)&lt;br /&gt;
# Provisionen Profile erstellen: &#039;&#039;iOS App Development&#039;&#039; -&amp;gt; &#039;&#039;AppID&#039;&#039; auswählen -&amp;gt; Zertifikat wählen -&amp;gt; Gerät auswählen -&amp;gt; Profilname anlegen -&amp;gt; Provisioning Profile herunterladen.&lt;br /&gt;
# Das heruntergeladene Zertifikat importieren (&#039;&#039;Downloads&#039;&#039; -&amp;gt; Zertifikat (.cer)&lt;br /&gt;
# SHA1-Fingerabdruck kopieren. Dazu Rechtsklick auf Zertifikat -&amp;gt; &#039;&#039;Information&#039;&#039;, anschließend bis zum Ende der Seite scrollen).&lt;br /&gt;
# Entitlements.plist erstellen (&#039;&#039;Terminal&#039; öffnen -&amp;gt; Downloads/Mobile_Testing_Supplement/bin/gen-entitlements_plist &#039;Team-ID&#039; &#039;App ID&#039; Downloads/Mobile_Testing_Supplement/bin/re-sign-ipa &amp;lt;Pfad zum ipa (z.B. Downloads/expeccoMobileDemo.ipa)&amp;gt; \&lt;br /&gt;
&amp;quot;&amp;lt;Zertifikat (SHA1-Fingerabdruck, z.B. 76 E8 4B E8 78 D5 D7 F9 2E 09 8B D7 E8 FB CE 30 0C F5 D0 EF)&amp;gt;&amp;quot; \&lt;br /&gt;
&amp;lt;Pfad zum Provisionen Profile (z.B. /Users/exept_test/Downloads/dut.mobileprovision)&amp;gt; \&lt;br /&gt;
&amp;lt;Pfad für das Ergebnis-ipa (z.B. Downloads/expeccoMobileDemo_re-signed.ipa)&amp;gt; \&lt;br /&gt;
[Pfad zur entitlements.plist] (z.B. /Users/exept_test/entitlements.plist)&lt;br /&gt;
&lt;br /&gt;
Zum Umsignieren können Sie das entsprechende Skript aus dem Mobile Testing Supplement für Mac OS oder jedes beliebige andere Tool (z.B. isign) verwenden.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zur Verwendung von iOS-Geräten finden Sie auch in der [http://appium.io/slate/en/master/?java#appium-on-real-ios-devices Dokumentation von Appium].&lt;br /&gt;
&lt;br /&gt;
=== Native iOS-Apps ===&lt;br /&gt;
Sie können auch Apps verwenden, die bereits nativ auf dem Gerät vorhanden sind. Dazu müssen Sie deren Bundle-ID kennen und diese dann in die Verbindungseinstellungen eintragen. Hier eine kleine Auswahl gängiger Apps:&lt;br /&gt;
{| style=&amp;quot;text-align:left&amp;quot;&lt;br /&gt;
! App&lt;br /&gt;
!&lt;br /&gt;
! Bundle-ID&lt;br /&gt;
|-&lt;br /&gt;
| App Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.AppStore&lt;br /&gt;
|-&lt;br /&gt;
| Calculator&lt;br /&gt;
| &lt;br /&gt;
| com.apple.calculator&lt;br /&gt;
|-&lt;br /&gt;
| Calendar&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilecal&lt;br /&gt;
|-&lt;br /&gt;
| Camera&lt;br /&gt;
| &lt;br /&gt;
| com.apple.camera&lt;br /&gt;
|-&lt;br /&gt;
| Contacts&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileAddressBook&lt;br /&gt;
|-&lt;br /&gt;
| iTunes Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileStore&lt;br /&gt;
|-&lt;br /&gt;
| Mail&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilemail&lt;br /&gt;
|-&lt;br /&gt;
| Maps&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Maps&lt;br /&gt;
|-&lt;br /&gt;
| Messages&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileSMS&lt;br /&gt;
|-&lt;br /&gt;
| Phone&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilephone&lt;br /&gt;
|-&lt;br /&gt;
| Photos&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobileslideshow&lt;br /&gt;
|-&lt;br /&gt;
| Settings&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Preferences&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Weitere Bundle-IDs finden Sie [https://github.com/joeblau/apple-bundle-identifiers hier].&lt;br /&gt;
&lt;br /&gt;
= Beispiele =&lt;br /&gt;
Bei den Demo-Testsuiten für expecco finden Sie auch Beispiele für Tests mit dem Mobile Testing Plugin. Wählen Sie dazu auf dem Startbildschirm die Option &amp;quot;&#039;&#039;Beispiel aus Datei&#039;&#039;&amp;quot; und öffnen Sie den Ordner &amp;quot;&#039;&#039;mobile&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;TestsuiteMobileTestingDemo&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m01_MobileTestingDemo.ets --&amp;gt;&amp;lt;/span&amp;gt; &#039;&#039;m01_MobileTestingDemo.ets&#039;&#039; ==&lt;br /&gt;
Die Testsuite enthält zwei einfache Testpläne: &amp;quot;&#039;&#039;Simple CalculatorTest&#039;&#039;&amp;quot; und &amp;quot;&#039;&#039;Complex Calculator and Messaging Test&#039;&#039;&amp;quot;. Beide Tests verwenden einen Android-Emulator, den Sie vor Beginn starten müssen. Die Apps, die im Test verwendet werden, gehören zur Grundausstattung des Emulators und müssen daher nicht mehr installiert werden. Da sich die Apps unter jeder Android-Version unterscheiden können, ist es wichtig, dass Ihr Emulator unter Android 6.0 läuft. Außerdem muss die Sprache auf Englisch gestellt sein.&lt;br /&gt;
&lt;br /&gt;
; Simple CalculatorTest&lt;br /&gt;
: Dieser Test verbindet sich mit dem Taschenrechner und gibt die Formel &#039;&#039;2+3&#039;&#039; ein. Das Ergebnis des Rechners wird mit dem erwarteten Wert &#039;&#039;5&#039;&#039; verglichen.&lt;br /&gt;
&lt;br /&gt;
; Complex Calculator and Messaging Test&lt;br /&gt;
: Dieser Test verbindet sich mit dem Taschenrechner und öffnet anschließend den Nachrichtendienst. Dort wartet er auf eine einkommende Nachricht von der Nummer &#039;&#039;15555215556&#039;&#039;, in der eine zu berechnende Formel gesendet wird. Die Nachricht wird zuvor über einen Socket beim Emulator erzeugt. Nach dem Eintreffen der Nachricht wird diese vom Test geöffnet und deren Inhalt gelesen. Danach wird wieder der Taschenrechner geöffnet, die erhaltene Formel eingegeben und das Ergebnis gelesen. Anschließend wechselt der Test wieder zum Nachrichtendienst und sendet das Ergebnis als Antwort.&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;m02_expeccoMobileDemo.ets&#039;&#039; und &#039;&#039;m03_expeccoMobileDemoIOS.ets&#039;&#039; ==&lt;br /&gt;
Diese sind Bestandteil des Tutorials zum Mobile Testing Plugin. Der jeweils enthaltene Testfall ist unvollständig und wird im Zuge des Tutorials ergänzt. Lesen Sie dazu den Abschnitt [[#Tutorial|Tutorial]].&lt;br /&gt;
&lt;br /&gt;
= Tutorial =&lt;br /&gt;
Es gibt ein Tutorial, das das grundsätzliche Vorgehen zur Erstellung von Tests mit dem Mobile Testing Plugin beschreibt. Grundlage dafür ist ein mitgeliefertes Beispiel, bestehend aus einer einfachen App und einer expecco-Testsuite.&lt;br /&gt;
&lt;br /&gt;
Sie finden es auf der Seite [[Mobile_Testing_Tutorial|Mobile Testing Tutorial]] in zwei Versionen für Android und für iOS.&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsAndroid&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m02_expeccoMobileDemo.ets --&amp;gt;&amp;lt;/span&amp;gt;[[Mobile_Testing_Tutorial#Erste_Schritte_mit_Android|Erste Schritte mit Android]]&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsIOS&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m03_expeccoMobileDemoIOS.ets --&amp;gt;&amp;lt;/span&amp;gt;[[Mobile_Testing_Tutorial#Erste_Schritte_mit_iOS|Erste Schritte mit iOS]]&lt;br /&gt;
&lt;br /&gt;
= Dialoge des Mobile Testing Plugins =&lt;br /&gt;
== Verbindungseditor ==&lt;br /&gt;
Mithilfe des Verbindungseditors können Sie schnell Verbindungen definieren, ändern oder aufbauen. Je nach Aufgabe weist der Dialog kleine Unterschiede auf und wird unterschiedlich geöffnet:&lt;br /&gt;
*Um eine Verbindung aufzubauen, klicken Sie im GUI-Browser auf &amp;quot;&#039;&#039;Verbinden&#039;&amp;quot;&#039; klicken und wählen dann &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot;.&lt;br /&gt;
*Um eine bestehende Verbindung im GUI-Browser zu ändern oder zu kopieren, wählen Sie diese aus, machen einen Rechtsklick und wählen im Kontextmenü &amp;quot;&#039;&#039;Verbindung bearbeiten&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;Verbindung kopieren&#039;&#039;&amp;quot; aus.&lt;br /&gt;
*Wollen Sie Verbindungseinstellungen nicht für den GUI-Browser sondern zur Verwendung in einem Test erstellen, wählen Sie im Menü des Mobile Testing Plugins den Punkt &amp;quot;&#039;&#039;Verbindungseinstellungen erstellen...&#039;&#039;&amp;quot;. Darüber können nur die Einstellungen für eine Verbindung erstellt werden, ohne dass eine Verbindung tatsächlich angelegt wird.&lt;br /&gt;
&lt;br /&gt;
Einige der Schaltflächen sind nur beim Erstellen von Verbindungseinstellungen sichtbar:&lt;br /&gt;
[[Datei:MobileTestingVerbindungseditorMenu.png]]&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen löschen&#039;&#039;&amp;quot;: Setzt alle Einträge zurück. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen aus Datei laden&#039;&#039;&amp;quot;: Erlaubt das Öffnen einer gespeicherten Einstellungsdatei (*.csf). Deren Einstellungen werden in den Dialog übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen aus Anhang laden&#039;&#039;&amp;quot;: Erlaubt das Öffnen eines Anhangs mit Verbindungseinstellungen aus einem geöffneten Projekt. Diese Einstellungen werden in den Dialog übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen in Datei speichern&#039;&#039;&amp;quot; sowie&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen in Anhang speichern&#039;&#039;&amp;quot;: Hier können Sie die eingetragenen Einstellungen in eine Datei (*.csf) speichern oder als Anhang in einem geöffneten Projekt anlegen. Beide Optionen besitzen ein verzögertes Menü, in dem Sie auswählen können, nur einen bestimmten Teil der Einstellungen zu speichern. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Erweiterte Ansicht&#039;&#039;&amp;quot;: Damit können Sie in die erweiterte Ansicht wechseln, um zusätzliche Einstellungen vorzunehmen. Lesen Sie dazu mehr am Ende des Kapitels. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Hilfe&#039;&#039;&amp;quot;: An der rechten Seite wird ein Hilfetext zum jeweiligen Schritt ein- oder ausgeblendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Dialog ist in drei Schritte unterteilt. Im ersten Schritt wählen Sie das Gerät, das Sie verwenden möchten, im zweiten Schritt wählen Sie aus, welche App verwendet werden soll und im letzten Schritt erfolgen die Einstellungen zum Appium-Server.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep1&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 1: Gerät auswählen===&lt;br /&gt;
Im oberen Teil erhalten Sie eine Liste aller angeschlossenen Appium-Geräte, die erkannt werden. Mit der Checkbox darunter können Sie die Geräte ausblenden, die zwar erkannt werden, aber nicht bereit sind. Falls Sie ein Gerät eintragen wollen, das nicht angeschlossen ist, können Sie dies mit dem entsprechenden Knopf &amp;quot;&#039;&#039;Android-Gerät eingeben&#039;&#039;&amp;quot; bzw. &amp;quot;&#039;&#039;iOS-Gerät eingeben&#039;&#039;&amp;quot; anlegen. Dazu müssen Sie jedoch die benötigten Eigenschaften Ihres Geräts kennen. Das Gerät wird dann in einer zweiten Geräteliste angelegt und kann dort ausgewählt werden. Wenn keine Liste mit angeschlossenen Elementen angezeigt werden kann, werden stattdessen verschiedene Meldungen angezeigt:&lt;br /&gt;
*Keine Geräte gefunden&lt;br /&gt;
*:expecco konnte kein Android-Geräte finden.&lt;br /&gt;
*:Um eine Verbindung zu einem Gerät automatisch zu konfigurieren, stellen Sie sicher, dass es&lt;br /&gt;
*:*angeschlossen ist&lt;br /&gt;
*:*eingeschaltet ist&lt;br /&gt;
*:*einen passenden adb-Treiber installiert hat&lt;br /&gt;
*:*für Debugging freigeschaltet ist (siehe unten).&lt;br /&gt;
*Keine verfügbaren Geräte gefunden&lt;br /&gt;
*:expecco konnte keine verfügbaren Android-Geräte finden. Es wurden aber nicht verfügbare gefunden, z.B. mit dem Status &amp;quot;unauthorized&amp;quot;.&lt;br /&gt;
*:Um eine Verbindung zu einem Gerät automatisch zu konfigurieren, stellen Sie sicher, dass es&lt;br /&gt;
*:*angeschlossen ist&lt;br /&gt;
*:*eingeschaltet ist&lt;br /&gt;
*:*einen passenden adb-Treiber installiert hat&lt;br /&gt;
*:*für Debugging freigeschaltet ist (siehe unten).&lt;br /&gt;
*:Um nicht verfügbare Geräte anzuzeigen, aktivieren Sie unten diese Option.&lt;br /&gt;
*Verbindung verloren&lt;br /&gt;
*:expecco hat die Verbindung zum adb-Server verloren. Versuchen Sie die Verbindung wieder herzustellen, indem Sie auf den Button klicken.&lt;br /&gt;
*Verbindung fehlgeschlagen&lt;br /&gt;
*:expecco konnte sich nicht mit dem adb-Server verbinden. Möglicherweise läuft er nicht oder der angegebene Pfad stimmt nicht.&lt;br /&gt;
*:Überprüfen Sie die adb-Konfiguration in den Einstellungen und versuchen Sie den adb-Server zu starten und eine Verbindung herzustellen indem Sie auf den Knopf klicken.&lt;br /&gt;
*Verbinden ...&lt;br /&gt;
*:expecco verbindet sich mit dem adb-Server. Dies kann einige Sekunden dauern.&lt;br /&gt;
*adb-Server starten ...&lt;br /&gt;
*:expecco startet den adb-Server. Dies kann einige Sekunden dauern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Bei &amp;quot;&#039;&#039;Automatisierung durch&#039;&#039;&amp;quot; können Sie angeben, welche Automation-Engine verwendet werden soll. Lassen Sie die Einstellung auf &amp;quot;&#039;&#039;(Default)&#039;&#039;&amp;quot; wird die entsprechende Capability gar nicht gesetzt. Ansonsten stehen Appium, Selendroid und ab expecco 2.11 XCUITest zur Verfügung. In der Regel wird Selendroid nur für Android-Geräte vor Version 4.1 gebraucht.--&amp;gt;Mit &amp;quot;&#039;&#039;Weiter&#039;&#039;&amp;quot; gelangen Sie zum nächsten Schritt. Wenn Sie Einstellungen für den GUI-Browser eingeben, ist das erst möglich, wenn ein Gerät ausgewählt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;UnlockingDeveloperOptions&amp;quot;&amp;gt;Anmerkung zum Freischalten&amp;lt;/span&amp;gt;: In jüngeren Android Versionen werden die Entwickleroptionen zunächst nicht mehr in den Einstellungen angeboten. Falls ihr Android Gerät in den Einstellungen keinen Eintrag zu &amp;quot;&#039;&#039;Entwickleroptionen&#039;&#039;&amp;quot; zeigt, wählen Sie zunächst den Eintrag &amp;quot;&#039;&#039;Telefoninfo&#039;&#039;&amp;quot;, dann &amp;quot;&#039;&#039;SoftwareVersionsInfo&#039;&#039;&amp;quot; und klicken darin mehrfach auf den Eintrag &amp;quot;&#039;&#039;BuildVersion&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Chromedriver verwalten ====&lt;br /&gt;
Wenn die App, die Sie bedienen wollen, WebViews mit Chrome benutzt, benötigt Appium Zugriff auf einen passenden Chromedriver. Wenn Sie ein Gerät in der Liste auswählen, können Sie über &amp;quot;&#039;&#039;Chromedriver verwalten&#039;&#039;&amp;quot; sehen, welche Chrome-Versionen auf dem Gerät vorhanden sind und welche Chromedriver-Versionen durch expecco zur Verfügung stehen. Über diesen Dialog können Sie auch benötigte Chromedriver-Versionen herunterladen. Beachten Sie, dass auf dem Gerät verschiedene Chrome-Versionen vorhanden sein können, da die Apps in ihren WebViews nicht die gleiche Chrome-Version verwenden müssen, wie die als Browser installierte. Damit alles funktioniert, sollte der verwendete Chromedriver zur entsprechenden App passen. Sie können den Pfad zum Chromedriver auch am Ende des Verbindungsdialogs in den erstellten Capabilities ändern.&lt;br /&gt;
&lt;br /&gt;
==== WLAN-Android-Geräte verbinden ====&lt;br /&gt;
Sie können sich auch über WLAN zu Android-Geräten verbinden. Dazu muss das Gerät zunächst mit adb verbunden werden, siehe [[Mobile_Testing_Plugin#Verbindung_.C3.BCber_WLAN|Verbindung über WLAN]]. Ab expecco 22.1 bietet der Verbindungseditor hierfür einen Dialog, der Ihnen dabei hilft und den Sie anstatt der Eingabeaufforderung verwenden können. Für Geräte mit Android 11 oder höher können Sie hier das Gerät mit dem Rechner zu koppeln, indem Sie die entsprechenden Parameter angeben und anschließend die Verbindung unter Angabe von IP-Adresse und Port aufbauen. Sie können damit auch für Geräte, die über USB verbunden sind, eine WLAN-Verbindung aufbauen. Wenn Sie das entsprechende Gerät in der Liste auswählen, werden die benötigten Angaben automatisch ausgelesen.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass der Aufbau einer WLAN-Verbindung nicht Teil der Verbindungseinstellungen ist. Wenn Sie mit den erzeugten Einstellungen eine neue Verbindung aufbauen wollen, müssen Sie sicherstellen, dass das Gerät über mit der angegebenen IP-Adresse und dem Port mit adb verbunden ist, damit es gefunden wird. Die ADB-Verbindung geht verloren, wenn der ADB-Server oder das Gerät neu gestartet werden. Die Erlaubnis für das WLAN-Debugging wird beim Neustart des Geräts auch häufig zurückgesetzt und der Debug-Port kann dann wechseln. Daher muss eine WLAN-Verbindung immer manuell hergestellt werden.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep2&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 2: App auswählen===&lt;br /&gt;
Hier können Sie Angaben zur App machen, die getestet werden soll. Dabei können Sie entscheiden, ob Sie eine App verwenden wollen, die bereits auf dem Gerät installiert ist, oder ob für den Test eine App installiert werden soll. Wählen Sie oben den entsprechenden Reiter aus. Je nachdem, ob Sie im vorigen Schritt ein Android- oder ein iOS-Gerät ausgewählt haben, ändert sich die erforderte Eingabe.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Android&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App auf dem Gerät&#039;&#039;&lt;br /&gt;
**:Wenn Sie im ersten Schritt ein angeschlossenes Gerät ausgewählt haben, werden die Pakete aller installierten Apps automatisch abgerufen und Sie können die Auswahl aus den Drop-down-Listen treffen. Die installierten Apps sind in Fremdpakete und Systempakete unterteilt; wählen Sie die entsprechende Paketliste aus. Diese Auswahl gehört nicht zu den Einstellungen, sondern stellt nur die entsprechende Paketliste zur Verfügung. Sie können den Filter benutzen, um die Liste weiter einzuschränken und dann das gewünschte Paket auswählen. Die Activities des ausgwählten Pakets werden ebenfalls automatisch abgerufen und als Drop-down-Liste zur Verfügung gestellt. Wählen Sie die Activity aus, die gestartet werden soll. In der Regel wird automatisch eine Activity aus der Liste eingetragen. Falls Sie kein verbundenes Gerät verwenden, müssen Sie die Eingabe des Pakets und der Activity von Hand vornehmen.&lt;br /&gt;
**&#039;&#039;App installieren&#039;&#039;&lt;br /&gt;
**:Geben Sie bei &amp;quot;&#039;&#039;App&#039;&#039;&amp;quot; den Pfad zu einer App an. Der Pfad muss für den Appium-Server gültig sein, der verwendet wird. Sie können auch eine URL angeben. Benutzen Sie einen lokalen Appium-Server, können Sie den rechten Butten benutzen, um zu der Installationsdatei der App zu navigieren und diesen Pfad einzutragen. Wenn möglich werden dabei auch das entsprechende Paket und die Activity in den Feldern darunter eingetragen. Diese Angabe ist aber nicht notwendig.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;iOS&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App auf dem Gerät&#039;&#039;&lt;br /&gt;
**:Geben Sie die Bundle-ID einer installierten App an. Sie können die IDs der installierten Apps bspw. mithilfe von Xcode erfahren. Starten Sie dazu Xcode und wählen Sie in der Menüleiste am oberen Bildschirmrand im Menü &amp;quot;&#039;&#039;Window&#039;&#039;&amp;quot; den Eintrag &amp;quot;&#039;&#039;Devices&#039;&#039;&amp;quot;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wenn Sie Ihr Gerät auswählen, sehen Sie in der Übersicht eine Auflistung der von Ihnen installierten Apps.&lt;br /&gt;
**&#039;&#039;App installieren&#039;&#039;&lt;br /&gt;
**:Geben Sie bei &amp;quot;&#039;&#039;App&#039;&#039;&amp;quot; den Pfad zu einer App an. Der Pfad muss für den Appium-Server gültig sein, der verwendet wird. Sie können auch eine URL angeben. Zu den Vorraussetzungen an Apps für reale Geräte lesen Sie bitte den Abschnitt [[#iOS-Ger.C3.A4t_und_App_vorbereiten|iOS-Geräte und App vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
Im unteren Teil können Sie festlegen, ob die App beim Verbindungsabbau zurückgesetzt bzw. deinstalliert werden soll, und ob sie initial zurückgesetzt werden soll. Auch hier wird die entsprechende Capability gar nicht gesetzt, wenn Sie &amp;quot;&#039;&#039;(Default)&#039;&#039;&amp;quot; auswählen. Mit &amp;quot;&#039;&#039;Weiter&#039;&#039;&amp;quot; gelangen Sie zum nächsten Schritt.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep3&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 3: Servereinstellungen===&lt;br /&gt;
Im letzten Schritt befindet sich zunächst im oberen Teil eine Liste aller Capabilities, die sich aus Ihren Angaben der vorigen Schritte ergeben. Wenn Sie sich mit Appium auskennen und noch zusätzliche Capabilities setzen möchten, die der Verbindungseditor nicht abdeckt, können Sie durch Klicken auf &amp;quot;&#039;&#039;Bearbeiten&#039;&#039;&amp;quot; in die erweiterte Ansicht gelangen. Lesen Sie dazu den Abschnitt weiter unten.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Einstellungen für den GUI-Browser eingeben, können Sie den &#039;&#039;Verbindungsnamen&#039;&#039; eintragen, mit dem die Verbindung angezeigt wird. Dies ist auch der Name unter dem Bausteine diese Verbindung verwenden können, wenn sie aufgebaut ist. Wenn Sie das Feld frei lassen, wird ein Name generiert. Wenn der Haken für &amp;quot;&#039;&#039;Von expecco gesteuert&#039;&#039;&amp;quot; gesetzt ist, wird expecco einen lokalen Appium-Server an einem freien Port starten, oder einen bereits gestarteten freien Server verwenden. Um einen eigenen Server zu verwenden, schalten Sie diese Funktion ab und geben Sie die entsprechende Adresse ein. Sie erhalten die lokale Standard-Adresse und bereits verwendete Adressen zur Auswahl.&lt;br /&gt;
&lt;br /&gt;
In älteren expecco-Versionen ist der Haken mit &amp;quot;&#039;&#039;Bei Bedarf starten&#039;&#039;&amp;quot; beschriftet. In diesem Fall müssen Sie auch eine Adresse angeben, wenn expecco den Server starten soll. expecco versucht dann beim Verbinden einen Appium-Server an der angegebenen Adresse zu starten, wenn dort noch keiner läuft. Dieser Server wird dann beim Beenden der Verbindung ebenfalls heruntergefahren. Dies funktioniert nur für lokale Adressen. Achten Sie darauf, nur Portnummern zu verwenden, die auch frei sind. Verwenden Sie am besten nur ungerade Portnummern ab dem Standardport 4723. Beim Verbindungsaufbau wird ebenfalls die folgende Portnummer verwendet, wodurch es sonst zu Konflikten kommen könnte. &lt;br /&gt;
&lt;br /&gt;
Je nachdem, wie Sie den Dialog geöffnet haben, gibt es nun verschiedene Schaltflächen um ihn abzuschließen. In jedem Fall haben Sie die Option zu speichern. Dabei öffnet sich ein Dialog, indem Sie entweder ein geöffnet Projekt auswählen können, um die Einstellungen dort als Anhang zu speichern, oder auswählen es in einer Datei zu speichern, die Sie anschließend angeben können. Durch das Speichern wird der Dialog nicht beendet, wodurch Sie anschließend noch eine andere Option auswählen könnten.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie den Editor zum Verbindungsaufbau geöffnet haben, können Sie abschließend auf &amp;quot;&#039;&#039;Verbinden&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;Server starten und verbinden&#039;&#039;&amp;quot; klicken, je nachdem, ob der Haken für den Serverstart gesetzt ist. Für das Ändern oder Kopieren einer Verbindung im GUI-Brower heißt diese Option &amp;quot;&#039;&#039;Übernehmen&#039;&#039;&amp;quot;, da in diesem Fall nur der Verbindungseintrag geändert bzw. neu angelegt wird, der Verbindungsaufbau aber nicht gestartet wird. Das können Sie bei Bedarf anschließend über das Kontextmenü tun. Falls Sie Capabilities einer bestehenden Verbindung geändert haben, fordert Sie anschließend ein Dialog auf zu entscheiden, ob diese Änderungen direkt übernommen werden sollen, indem die Verbindung abgebaut und mit den neuen Verbindungen aufgebaut wird, oder nicht. In diesem Fall werden die Änderungen erst wirksam, nachdem Sie die Verbindung neu aufbauen.&lt;br /&gt;
&lt;br /&gt;
Zur Verwendung des Verbindungseditors lesen Sie auch den entsprechenden Abschnitt im jeweiligen Tutorial in Schritt 1 (Android: [[Mobile_Testing_Tutorial#Schritt_1:_Demo_ausf.C3.BChren|Demo ausführen]], iOS: [[Mobile_Testing_Tutorial#Schritt_1:_Demo_ausf.C3.BChren_.28iOS.29|Demo ausführen (iOS)]]).&lt;br /&gt;
&lt;br /&gt;
===Erweiterte Ansicht===&lt;br /&gt;
Die erweiterte Ansicht des Verbindungseditors erhalten Sie entweder durch Klicken auf &amp;quot;&#039;&#039;Bearbeiten&#039;&#039;&amp;quot; im dritten Schritt oder jederzeit über den entsprechenden Menüeintrag, wenn Sie den Editor über das Plugin-Menü gestartet haben. In dieser Ansicht erhalten Sie eine Liste aller eingestellten Appium-Capabilities. Zu dieser können Sie weitere hinzufügen, Einträge ändern oder entfernen. Um eine Capability hinzuzufügen, wählen Sie diese aus der Drop-down-Liste des Eingabefelds aus. In dieser befinden sich alle bekannten Capabilities sortiert in die Kategorien &#039;&#039;Common&#039;&#039;, &#039;&#039;Android&#039;&#039; und &#039;&#039;iOS&#039;&#039;. Haben Sie eine Capability ausgewählt, wird ein kurzer Informationstext dazu angezeigt. Sie können in das Feld auch von Hand eine Capability eingeben. Klicken Sie dann auf &amp;quot;&#039;&#039;Hinzufügen&#039;&#039;&amp;quot;, um die Capabilitiy in die Liste einzutragen. Dort können Sie in der rechten Spalte den Wert setzen. Um einen Entrag zu löschen, wählen Sie diesen aus und klicken Sie auf &amp;quot;&#039;&#039;Entfernen&#039;&#039;&amp;quot;. Mit &amp;quot;&#039;&#039;Zurück&#039;&#039;&amp;quot; verlassen Sie die erweiterte Ansicht.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingErweiterteAnsicht.png]]&lt;br /&gt;
&lt;br /&gt;
== Laufende Appium-Server ==&lt;br /&gt;
Im Menü des Mobile Testing Plugins finden Sie den Eintrag &amp;quot;&#039;&#039;Appium-Server...&#039;&#039;&amp;quot;. Mit diesem öffnen Sie ein Fenster mit einer Übersicht aller Appium-Server, die von expecco gestartet wurden und auf welchem Port diese laufen. Durch Klicken auf das Icon in der Spalte &amp;quot;&#039;&#039;Log anzeigen&#039;&#039;&amp;quot; können Sie das Logfile des entsprechenden Servers anschauen. Dieses wird beim Beenden des Servers wieder gelöscht. Mit den Icons in der Spalte &amp;quot;&#039;&#039;Beenden&#039;&#039;&amp;quot; kann der entsprechenden Server beendet werden. Allerdings wird dies verhindert, wenn expecco über diesen Server noch eine offene Verbindung hat. Für welche Verbindung ein Server verwendet wird, sehen Sie in der rechten Spalte. Steht dort &#039;&#039;&amp;lt;idle&amp;gt;&#039;&#039; wird er zur Zeit nicht von expecco verwendet.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAppiumServer.png]]&lt;br /&gt;
&lt;br /&gt;
Beim Öffnen des Editors um eine Appium-Verbindung aufzubauen, wird direkt ein Appium-Server gestartet, um den folgenden Verbindungsaufbau zu beschleunigen. Zu diesem Zweck hält sich expecco auch immer einen freien Appium-Server offen. Weitere laufende Server, die nicht mehr verwendet werden, werden jedoch nach einiger Zeit automatisch beendet.&lt;br /&gt;
&lt;br /&gt;
Im Menü des Mobile Testing Plugins finden Sie auch den Eintrag &amp;quot;&#039;&#039;Alle Verbindungen und Server beenden&#039;&#039;&amp;quot;. Dies ist für den Fall gedacht, dass Verbindungen oder Server auf andere Weise nicht beendet werden können. Beenden Sie Verbindungen wenn möglich immer im GUI-Browser oder durch Ausführen eines entsprechenden Bausteins. Server, die Sie in der Server-Übersicht gestartet haben, beenden Sie dort; Server, die mit einer Verbindung gestartet wurden, werden automatisch mit dieser beendet.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass in der Übersicht nur Server aufgelistet sind, die von expecco gestartet und verwaltet werden. Mögliche andere Appium-Server, die auf andere Art gestartet wurden, werden nicht erkannt.&lt;br /&gt;
&lt;br /&gt;
== Recorder ==&lt;br /&gt;
Besteht im GUI-Browser eine Verbindung zu einem Gerät, kann der integrierte Recorder verwendet werden, um mit diesem Gerät einen Testabschnitt aufzunehmen. Sie starten den Recorder, indem Sie im GUI-Browser die entsprechende Verbindung auswählen und dann auf den Aufnahme-Knopf klicken. Für den Recorder öffnet sich ein neues Fenster. Die aufgezeichneten Aktionen werden im Arbeitsbereich des GUI-Browsers angelegt. Daher ist es möglich, das Aufgenommene parallel zu editieren.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingRecorder.png|caption|]]&lt;br /&gt;
&lt;br /&gt;
====Komponenten des Recorderfensters====&lt;br /&gt;
#&#039;&#039;&#039;Aufnahme fortsetzen/pausieren&#039;&#039;&#039;: Über das rechte Symbol können Sie die Aufnahme pausieren. Sie sehen dann ein großes Pause-Symbol in der Anzeige. Alle Aktionen, die Sie währenddessen im Recorder machen werden zwar ausgeführt, es werden aber keine Bausteine aufgezeichnet. Über das linke Symbol können Sie dann wieder in den normalen Aufnahmemodus wechseln.&lt;br /&gt;
#&#039;&#039;&#039;Aufnahme stoppen&#039;&#039;&#039;: Stoppt die Aufnahme und schließt das Recorderfenster.&lt;br /&gt;
#&#039;&#039;&#039;Aktualisieren&#039;&#039;&#039;: Holt das aktuelle Bild und den aktuellen Elementbaum vom Gerät. Dies wird nötig, wenn das Gerät zur Ausführung einer Aktion länger braucht oder sich etwas ohne das Anstoßen durch den Recorder ändert. Seit expecco 21.2 gibt es hier zusätzlich ein Untermenü, mit dem automatisches Aktualisieren angeschaltet werden kann, indem im Hintergrund auf Änderungen geprüft wird (siehe auch &#039;&#039;Automatisches Aktualisieren&#039;&#039; weiter unten).&lt;br /&gt;
#&#039;&#039;&#039;Follow-Mouse&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird im GUI-Browser ausgewählt.&lt;br /&gt;
#&#039;&#039;&#039;Element-Highlighting&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird rot umrandet.&lt;br /&gt;
#&#039;&#039;&#039;Elemente einzeichnen&#039;&#039;&#039;: Die Rahmen aller Elemente der Ansicht werden angezeigt.&lt;br /&gt;
#&#039;&#039;&#039;Werkzeuge&#039;&#039;&#039;: Auswahl, mit welchem Werkzeug aufgenommen werden soll. Die gewählte Aktion wird bei einem Klick auf die Anzeige ausgelöst. Dabei stehen folgende Aktionen zur Verfügung:&lt;br /&gt;
#*Aktionen auf Elemente:&lt;br /&gt;
#**Klicken: Kurzer Klick auf das Element, über dem der Cursor steht. Zur genaueren Bestimmung, welches Element verwendet wird, benutzen Sie die Funktion Follow-Mouse oder Element-Highlighting.&lt;br /&gt;
#**Antippen mit Dauer (Element): Ähnlich zum Klicken, nur dass zusätzlich die Dauer des Klicks aufgezeichnet wird. Dadurch sind auch längere Klicks möglich.&lt;br /&gt;
#**Antippen mit Position (Element): Ähnlich zum Klicken, aber zusätzlich wird die Position innerhalb des Elements aufgenommen. Die Position kann relativ zur Größe des Elements aufgenommen werden oder, wenn Sie dabei Strg gedrückt halten, absolut zur linken oberen Ecke des Elements.&lt;br /&gt;
#**Text setzen: Ermöglicht das Setzen eines Textes in Eingabefelder.&lt;br /&gt;
#**Text löschen: Löscht den Text eines Eingabefelds.&lt;br /&gt;
#*Aktionen auf das Gerät:&lt;br /&gt;
#**Antippen (Bildschirm): Löst einen Klick auf die Bildschirmposition aus.&lt;br /&gt;
#**Antippen mit Dauer (Bildschirm): Löst einen Klick auf die Bildschirmposition aus, bei dem auch die Dauer berücksichtigt wird.&lt;br /&gt;
#**Wischen: Wischen in einer geraden Linie vom Punkt des Drückens des Mausknopfes bis zum Loslassen. Die Dauer wird ebenfalls aufgezeichnet.&lt;br /&gt;
#:Beachten Sie bei diesen Aktionen, dass das Ergebnis sich auf verschiedenen Geräten unterscheiden kann, bspw. bei verschiedenen Bildschirmauflösungen.&lt;br /&gt;
#*Erstellen von Testablauf-Bausteinen&lt;br /&gt;
#**Attribut prüfen: Vergleicht den Wert eines festgelegten Attributs des Elements mit einem vorgegebenen Wert. Das Ergebnis triggert den entsprechenden Ausgang.&lt;br /&gt;
#**Attribut zusichern: Vergleicht den Wert eines festgelegten Attributs des Elements mit einem vorgegebenen Wert. Bei Ungleichheit schlägt der Test fehl.&lt;br /&gt;
#**Attribut holen: Liest den aktuellen Wert eines Attributs aus.&lt;br /&gt;
#*Automatisch&lt;br /&gt;
#:Ist das Auto-Werkzeug ausgewählt, können alle Aktionen durch spezifische Eingabeweise benutzt werden: &#039;&#039;Klicken&#039;&#039;, &#039;&#039;Element antippen&#039;&#039; und &#039;&#039;Wischen&#039;&#039; funktionieren weiterhin durch Klicken, wobei sie anhand der Dauer und der Bewegung des Cursors unterschieden werden. Um ein &#039;&#039;Antippen&#039;&#039; auszulösen, halten Sie beim Klicken Strg gedrückt. Die übrigen Aktionen erhalten Sie durch einen Rechtsklick auf das Element in einem Kontextmenü.&lt;br /&gt;
#&#039;&#039;&#039;Kontext-Aktionen&#039;&#039;&#039;: Hier können Sie Aktionen aufzeichnen, die Kontexte betreffen:&lt;br /&gt;
#*Zu Kontext wechseln: Bietet eine Liste der aktuell verfügbaren Kontexte und Sie können auswählen, zu welchem gewechselt werden soll.&lt;br /&gt;
#*Aktuellen Kontext holen: Holt den Handle des aktuellen Kontexts.&lt;br /&gt;
#*Kontext-Handles holen: Holt eine Liste aller aktuell verfügbaren Kontext-Handles.&lt;br /&gt;
#&#039;&#039;&#039;Softkeys&#039;&#039;&#039;: Nur unter Android. Simuliert das Drücken der Knöpfe Zurück, Home, Fensterliste und Power.&lt;br /&gt;
#&#039;&#039;&#039;Home-Button&#039;&#039;&#039;: Nur unter iOS ab expecco 2.11. Ermöglicht das Drücken des Home-Buttons. Vor expecco 19.2 funktioniert es nur, wenn AssistiveTouch aktiviert ist und sich das Menü in der Mitte des oberen Bildschirmrands befindet. Ab expecco 19.2 verwendet die Funktion kein AssistiveTouch mehr.&lt;br /&gt;
#&#039;&#039;&#039;Hilfe&#039;&#039;&#039;: Öffnet diese Online-Dokumentation auf der allgemeinen Seite zu [[GuiBrowser_Recorder|GUI-Browser Recordern]].&lt;br /&gt;
#&#039;&#039;&#039;Anzeige&#039;&#039;&#039;: Zeigt einen Screenshot des Geräts. Aktionen werden mit der Maus je nach Werkzeug ausgelöst. Wenn eine neue Aktion eingegeben werden kann, hat das Fenster einen grünen Rahmen, sonst ist er rot.&lt;br /&gt;
#&#039;&#039;&#039;Fenster an Bild anpassen&#039;&#039;&#039;: Ändert die Größe des Fensters so, dass der Screenshot vollständig angezeigt werden kann.&lt;br /&gt;
#&#039;&#039;&#039;Bild an Fenster anpassen&#039;&#039;&#039;: Skaliert den Screenshot auf eine Größe, mit der er die volle Größe des Fensters ausnutzt.&lt;br /&gt;
#&#039;&#039;&#039;Ansicht anpassen&#039;&#039;&#039;: Öffnet einen Dialog um die Ansicht anzupassen, falls expecco das Bild nicht richtig darstellt. Sie können die Skalierung anpassen oder das Bild um 90° drehen.&lt;br /&gt;
#&#039;&#039;&#039;Ausrichtung anpassen&#039;&#039;&#039;: Korrigiert das Bild, falls dieses auf dem Kopf stehen sollte. Über den Pfeil rechts daneben kann das Bild auch um 90° gedreht werden, falls dies einmal nötig sein sollte. Ab expecco 19.1 finden Sie diese Funktion in &#039;&#039;Ansicht anpassen&#039;&#039;. Die Ausrichtung des Bildes ist für die Funktion des Recorders unerheblich, dieser arbeitet ausschließlich auf den erhaltenen Elementen.&lt;br /&gt;
#&#039;&#039;&#039;Skalierung&#039;&#039;&#039;: Ändert die Skalierung des Screenshots.&lt;br /&gt;
#&#039;&#039;&#039;Meldungen&#039;&#039;&#039;: Zeigt den Pfad des ausgewählten Elements oder andere Meldungen an. Es gibt ein Kontextmenü, um eine Liste der vorigen Meldungen zu sehen.&lt;br /&gt;
&lt;br /&gt;
====Verwendung====&lt;br /&gt;
Mit jedem Klick im Fenster wird eine Aktion ausgelöst und im Arbeitsbereich des GUI-Browsers aufgezeichnet. Dort können Sie das Aufgenommene abspielen, editieren oder daraus einen neuen Baustein erstellen.&lt;br /&gt;
Aktionen zum Auslösen von Sofkeys finden Sie direkt in der Menüleiste (s.o.). Um Aktionen auf Elemente aufzuzeichen, ändern Sie entweder die Auswahl des Werkzeugs in der Menüleiste (s.o.) und klicken dann auf das Element oder wählen Sie die entsprechende Aktion aus dem Kontextmenü durch einen Rechtsklick auf das entsprechende Element aus. Für Texteingabe ist es zudem möglich, den Cursor über dem Element zu platzieren und den Text einzugeben. Dabei öffnet sich der Eingabedialog für diese Aktion.&lt;br /&gt;
Zur Verwendung des Recorders lesen Sie auch Schritt 2 im Tutorial ([[Mobile_Testing_Tutorial#Schritt_2:_Einen_Baustein_mit_dem_Recorder_erstellen|Android]] bzw. [[Mobile_Testing_Tutorial#Schritt_2:_Einen_Baustein_mit_dem_Recorder_erstellen_.28iOS.29|iOS]]).&lt;br /&gt;
&lt;br /&gt;
====Elemente verbergen====&lt;br /&gt;
Ab expecco 21.2 gibt es im Kontextmenü außerdem die Möglichkeit, das ausgewählte Element im Recorder zu verbergen. Das bedeutet, dass dieses Element fortan nicht mehr ausgewählt werden kann. Diese Funktion eignet sich dazu, Elemente zu ignorieren, die im Vordergrund liegen, um auf Elemente darunter zugreifen zu können. Um diesen Zustand wieder rückgängig zu machen, müssen Sie das entsprechende Element im Baum des GUI-Browsers finden, dort gibt es im Kontextmenü ebenfalls einen solchen Eintrag.&lt;br /&gt;
&lt;br /&gt;
====Automatisches Aktualisieren====&lt;br /&gt;
Der Recorder zeigt kein Livebild des Geräts sondern nur eine Momentaufnahme. Um mit der Anzeige auf dem Gerät übereinzustimmen muss daher nach Änderungen aktualisiert werden. Der Recorder aktualisiert sich automatisch, nachdem er eine Aktion ausgeführt hat. Ab expecco 20.2 sind zudem weitere automatische Updates möglich. Sie können Sie im Menü &#039;&#039;Fenster&#039;&#039; aktivieren.&lt;br /&gt;
&lt;br /&gt;
Zum einen kann kurze Zeit nach dem Ausführen einer Aktion überprüft werden, ob es noch Änderungen nach der ersten Aktualisierung gegeben hat, damit in diesem Fall eine zweite Aktualisierung stattfinden kann. Dies soll das Problem beheben, dass der Recorder nach einer Aktion nicht aktuell ist, weil die Aktualisierung zu früh stattgefunden hat.&lt;br /&gt;
&lt;br /&gt;
Zum anderen kann eine periodische Aktualisierung eingeschaltet werden. Nach einem einstellbaren Interval wird der Recorder automatisch aktualisiert, sollte es Änderungen geben. Dadurch ist die Anzeige im Recorder immer weitgehend aktuell, allerdings entsteht dadurch auch ein Mehraufwand was die Kommunikation mit dem Gerät betrifft.&lt;br /&gt;
&lt;br /&gt;
== AVD Manager und SDK Manager ==&lt;br /&gt;
AVD Manager und SDK Manager sind beides Anwendungen von Android. Im Menü des Mobile Testing Plugins bietet expecco die Möglichkeit, diese zu starten. Ansonsten finden Sie diese Programme bei Ihrer Android-Installation. Mit dem AVD Manager können Sie AVDs, also Konfigurationen für Emulatoren, erstellen, bearbeiten und starten. Mit dem SDK Manager erhalten Sie einen Überblick über Ihre Android-Installation und können diese bei Bedarf erweitern.&lt;br /&gt;
&lt;br /&gt;
= Hybrid-Apps und WebViews =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;!!! WICHTIGER HINWEIS - Wenn Sie Probleme haben, auf den Webview zu wechseln, geben Sie bitte unter den Android Einstellungen - Apps -Standard Apps &amp;quot;Chrome&amp;quot; als &amp;quot;Browser-App&amp;quot; an !!!&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hybrid-Apps enthalten neben den Plattform-nativen Elementen weitere Elemente, die in einen WebView eingebunden sind. Diese Elemente können ebenfalls bedient werden, allerdings muss zuvor in den entsprechenden Kontext gewechselt werden. Mit dem Baustein &amp;quot;&#039;&#039;Get Current Context&#039;&#039;&amp;quot; erhalten Sie den aktuellen Kontext. Zu Beginn ist dies &amp;quot;&#039;&#039;NATIVE_APP&#039;&#039;&amp;quot;, also der Kontext der nativen Elemente. Mit dem Baustein &amp;quot;&#039;&#039;Get Context Handles&#039;&#039;&amp;quot; bekommen Sie eine Collection aller vorhandenen Kontexte. Gibt es einen WebView-Kontext, so heißt dieser &amp;quot;&#039;&#039;WEBVIEW_1&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;WEBVIEW_&amp;lt;package&amp;gt;&#039;&#039;&amp;quot; mit dem Paket des WebViews. Es kann auch mehrere WebView-Kontexte geben. Zu jedem WebView-Kontext gibt es im nativen Kontext ein entsprechendes WebView-Element. Mit dem Baustein &amp;quot;&#039;&#039;Switch to Context&#039;&#039;&amp;quot; können Sie in einen solchen Kontext wechseln und haben fortan nur Zugriff auf die Elemente in diesem Kontext.&lt;br /&gt;
&lt;br /&gt;
Im GUI-Browser werden zum einen oben im Baum die vorhandenen Kontexte angezeigt, zum anderen wird der Baum eines Kontexts unterhalb des entsprechenden WebView-Elements eingefügt.&lt;br /&gt;
&lt;br /&gt;
= XPath anpassen mithilfe des GUI-Browsers =&lt;br /&gt;
Bausteine, die auf einem Gerät fehlerfrei funktionieren, tun dies auf anderen Geräten möglicherweise nicht. Auch können kleine Änderungen der App dazu führen, dass ein Baustein nicht mehr den gewünschten Effekt hat. Man sollte einen Baustein daher so robust formulieren, dass er für eine Vielzahl von Geräten verwendet werden kann und kleine Anpassungen an der App verkraftet. Dazu muss man das grundlegende Funktionsprinzip der Adressierung verstehen. Dies wird im Folgenden am Beispiel der App aus dem Tutorial erläutert.&lt;br /&gt;
&lt;br /&gt;
Die Ansicht der App setzt sich aus einzelnen Elementen zusammen. Dazu gehören die Schaltflächen &amp;quot;&#039;&#039;GTIN-13 (EAN-13)&#039;&#039;&amp;quot; und &amp;quot;&#039;&#039;Verify&#039;&#039;&amp;quot;, das Eingabefeld der Zahl &amp;quot;&#039;&#039;4006381333986&#039;&#039;&amp;quot; und das Ergebnisfeld, in dem OK erscheint, wie auch alle anderen auf der Anzeige sichtbaren Dinge. Diese sichtbaren Elemente sind in unsichtbare Strukturelemente eingebettet. Alle Elemente zusammen sind in einer zusammenhängenden Hierarchie, dem Elementbaum, organisiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingGUIBrowser.png | frame | left | Abb. 1: Funktionen des GUI-Browsers]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
Sie können sich diesen Baum im GUI-Browser ansehen. Wechseln Sie dazu in den GUI-Browser (Abb. 1) und starten Sie eine beliebige Verbindung. Sobald die Verbindung aufgebaut ist, können Sie den gesamten Baum aufklappen (1) (Klick bei gedrückter Strg-Taste). Er enthält alle Elemente der aktuellen Seite der App.&lt;br /&gt;
&lt;br /&gt;
Ein Baustein, der nun ein bestimmtes Element verwendet, muss dieses eindeutig angeben, indem er dessen Position im Elementbaum mit einem Pfad im XPath-Format beschreibt. Dieses Format ist ein verbreiteter Web-Standard für XML-Dokumente und -Datenbanken, eignet sich aber genauso für Pfade im Elementbaum.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie ein Element im Baum auswählen, wird unten der von expecco automatisch generierte XPath (2) für das Element angezeigt, der auch beim Aufzeichnen verwendet wird. Oberhalb davon in der Mitte des Fensters befindet sich eine Liste der Eigenschaften (3) des ausgewählten Elements. Man nennt diese Eigenschaften auch Attribute. Sie beschreiben das Element näher wie beispielsweise seinen Typ, seinen Text oder andere Informationen zu seinem Zustand. Links unten können Sie zur besseren Orientierung im Baum die &#039;&#039;Vorschau&#039;&#039; (4) aktivieren, um sich den Bildausschnitt des Elements anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Der Elementbaum für gleiche Ansicht einer App kann sich je nach Gerät unterscheiden. Es sind diese Unterschiede, die verhindern, eine Aufnahme von einem Gerät unverändert auch auf allen anderen Geräten abzuspielen: Ein XPath, der im einen Elementbaum ein bestimmtes Element identifiziert, beschreibt nicht unbedingt das gleiche Element im Elementbaum auf einem anderen Gerät. Es kann stattdessen passieren, dass der XPath auf kein Element, auf ein falsches Element oder auf mehrere Elemente passt. Dann schlägt der Test fehl oder er verhält sich unerwartet.&lt;br /&gt;
&lt;br /&gt;
Man könnte natürlich für jedes Gerät einen eigenen Testfall schreiben. Das brächte aber unverhältnismäßigen Aufwand bei Testerstellung und -wartung mit sich. Das Problem lässt sich auch anders lösen, da ein jeweiliges Element nicht nur durch genau einen XPath beschrieben wird. Vielmehr erlaubt der Standard mithilfe verschiedener Merkmale unterschiedliche Beschreibungen für ein und dasselbe Element zu formulieren. Das Ziel ist daher, einen Pfad zu finden, der auf allen für den Test verwendeten Geräten funktioniert und überall eindeutig zum richtigen Element führt.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel besteht die Verbindung zur Android-App aus dem Tutorial und der Eintrag des &amp;quot;&#039;&#039;GTIN-13&#039;&#039;&amp;quot;-Buttons ist ausgewählt (5). Dessen automatisch generierter XPath (2) kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[@resource id=&#039;android:id/content&#039;]/android.widget.RelativeLayout/android.widget.Button[@resource-id=&#039;de.exept.expeccomobiledemo:id/gtin_13&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Er ist offensichtlich lang und unübersichtlich. Der sehr viel kürzere Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@text=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
führt zum selben Element.&lt;br /&gt;
&lt;br /&gt;
Für die iOS-App lautet der automatisch generierte XPath für diesen Button beispielsweise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/XCUIElementTypeApplication/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/UIAApplication/UIAWindow[1]/UIAButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und kann kürzer als&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@name=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Sie können den Pfad entsprechend im GUI-Browser ändern und durch &amp;quot;&#039;&#039;Pfad überprüfen&#039;&#039;&amp;quot; (6) feststellen, ob er weiterhin auf das ausgewählte Element zeigt, was expecco mit &amp;quot;&#039;&#039;Verify Path: OK&#039;&#039;&amp;quot; (7) bestätigen sollte. Der erste, sehr viel längere Pfad, beschreibt den gesamten Weg vom obersten Element des Baumes bis hin zum gesuchten Button. Der zweite Pfad hingegen wählt mit &amp;quot;*&amp;quot; zunächst sämtliche Elemente des Baumes und schränkt die Auswahl dann auf genau die Elemente ein, die ein &#039;&#039;text&#039;&#039;- bzw. &#039;&#039;name&#039;&#039;-Attribut mit dem Wert &amp;quot;&#039;&#039;GTIN-13 (EAN-13)&#039;&#039;&amp;quot; besitzen, in unserem Fall also genau der eine Button, den wir suchen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden Android-ähnliche Pfade zur Veranschaulichung verwendet. Die Elemente in iOS-Apps heißen zwar anders, wodurch andere Pfade entstehen; das Prinzip ist jedoch das gleiche.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum1.png | frame | Abb. 2: Elementbaum einer fiktiven App]]&lt;br /&gt;
&lt;br /&gt;
Sie können solche Pfade mit Hilfe weniger Regeln selbst formulieren. Sehen Sie sich den einfachen Baum einer fiktiven Android-App in Abb. 2 an: Die Einrückungen innerhalb des Baumes geben die Hierarchie der Elemente wieder. Ein Element ist ein &#039;&#039;Kind&#039;&#039; eines anderen Elementes, wenn jenes andere Element das nächsthöhere Element mit einem um eins geringeren Einzug ist. Jenes Element ist das &#039;&#039;Elternelement&#039;&#039; des Kindes. Sind mehrere untereinander stehende Elemente gleich eingerückt, so sind sie also alle Kinder desselben Elternelements.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad durch alle Ebenen der Hierarchie zum TextView-Element ist nun:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Elemente sind mit Schrägstrichen voneinander getrennt. Es fällt auf, dass der Name des ersten Elements nicht mit dem im Baum übereinstimmt. Das oberste Element in der Hierarchie heißt immer &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot; (für iOS wäre es &amp;quot;&#039;&#039;AppiumAUT&#039;&#039;&amp;quot;), expecco zeigt im Baum stattdessen den Namen der Verbindung an, damit man mehrere Verbindungen voneinander unterscheiden kann. Die weiteren Elemente tragen jeweils das Präfix &amp;quot;&#039;&#039;android.widget.&#039;&#039;&amp;quot;, das im Baum zur besseren Übersicht nicht angezeigt wird. Bei IOS gibt es kein Präfix, das durch einen Punkt abgetrennt wäre, expecco 2.11 blendet aber entsprechend &amp;quot;&#039;&#039;XCUIElementType&#039;&#039;&amp;quot; am Anfang aus. Mit jedem Schrägstrich führt der Pfad über eine Eltern-Kind-Beziehung in eine tiefere Hierarchie-Ebene, d. h. &amp;quot;&#039;&#039;FrameLayout&#039;&#039;&amp;quot; ist ein Kindelement von &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot;, &amp;quot;&#039;&#039;LinearLayout&#039;&#039;&amp;quot; ist ein Kind von &amp;quot;&#039;&#039;FrameLayout&#039;&#039;&amp;quot; usw. Die in eckigen Klammern geschriebenen Wörter dienen nur als Orientierungshilfe im Baum. Sie gehören nicht zum Typ.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad muss nicht beim Element &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot; beginnen. Man kann den Pfad beginnend mit einem beliebigen Element des Baumes bilden. Man kann also verkürzt auch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
schreiben. Der Pfad führt zum selben &amp;quot;&#039;&#039;TextView&#039;&#039;&amp;quot;-Element, da es nur ein Element dieses Typs gibt. Anders verhält es sich bei dem Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da es zwei Elemente vom Typ &amp;quot;&#039;&#039;Button&#039;&#039;&amp;quot; gibt, passt dieser Pfad auf zwei Elemente, nämlich den Button, der mit &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; markiert ist, und den &#039;&#039;Button&#039;&#039;, der mit &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; markiert ist. Es würde an dieser Stelle aber auch nicht helfen den langen Pfad von &#039;&#039;hierarchy&#039;&#039; aus beginnend anzugeben. Um einen mehrdeutigen Pfad weiter zu differenzieren, kann man explizit ein Element aus einer Menge wählen, indem man den numerischen Index in eckigen Klammern dahinter schreibt. Der Pfad aus dem obigen Beispiel lässt sich damit so anpassen, dass er eindeutig auf den &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; weist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[1].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ihnen fällt sicher auf, dass der Index eine 1 ist obwohl das zweite Element gemeint ist. Das kommt daher, dass die Zählung bei 0 beginnt. Der Button mit der Markierung &amp;quot;An&amp;quot; hat also die Nummer 0 und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Nummer 1.&lt;br /&gt;
&lt;br /&gt;
Dieser Ansatz, einen expliziten Index zu verwenden, hat zwei Nachteile: Zum einen lässt sich an dem Pfad nur schwer ablesen welches Element gemeint ist, zum andern ist der Pfad sehr empfindlich schon gegenüber kleinsten Änderungen, wie zum Beispiel dem Vertauschen der beiden &#039;&#039;Button&#039;&#039;-Elemente oder dem Einfügen eines weiteren &#039;&#039;Button&#039;&#039;-Elements in der App.&lt;br /&gt;
&lt;br /&gt;
Es wäre daher wünschenswert, das gemeinte Element über eine ihm charakteristische Eigenschaft wie einen Attributwert, zu adressieren. Für Android-Apps eignet sich hierfür häufig das Attribut &amp;quot;&#039;&#039;resource-id&#039;&#039;&amp;quot;. Im Idealfall muss bei der Entwicklung der App darauf geachtet werden, dass jedes Element eine eindeutige Id erhält. Die &#039;&#039;resource-id&#039;&#039; hat den großen Vorteil, dass sie unabhängig vom Text des Elements oder der Spracheinstellung des Geräts ist. Für iOS-Apps kann entsprechend das Attribut &amp;quot;&#039;&#039;name&#039;&#039;&amp;quot; verwendet werden, wenn es von der App sinnvoll gesetzt wird. Der XPath-Standard erlaubt solche Auswahlbedingungen zu einem Element anzugeben. Angenommen, der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Eigenschaft &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;off&#039;&#039; und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; hat als &#039;&#039;resource-id&#039;&#039; den Wert &#039;&#039;on&#039;&#039;, dann kann man als eindeutigen Pfad für den &amp;quot;Aus&amp;quot;-&#039;&#039;Button&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[@resource-id=&#039;off&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
formulieren. Wie an dem Beispiel zu sehen werden solche Bedingungen wie ein Index in eckigen Klammern an den Elementtyp angehängt. Der Name eines Attributes wird mit einem &amp;quot;@&amp;quot; eingeleitet und der Wert mit einem &amp;quot;=&amp;quot; in Anführungszeichen angehängt. Ist der Attributwert global eindeutig, kann man den vorausgehenden Pfad sogar durch den globalen Platzhalter * ersetzen, der auf jedes Element passt. Das obige Beispiel mit dem GTIN-13-&#039;&#039;Button&#039;&#039; war ein solcher Fall.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum2.png | frame | Abb. 3: Elementbaum einer fiktiven App mit Erweiterungen]]&lt;br /&gt;
&lt;br /&gt;
Abb. 3 zeigt eine Erweiterung des Beispiels aus Abb. 2. Die App hat nun ein weiteres, nahezu identisches &#039;&#039;LinearLayout&#039;&#039; bekommen. Die &#039;&#039;Buttons&#039;&#039; sind in ihren Attributen jeweils ununterscheidbar. Deshalb funktioniert der vorige Ansatz nicht, einen eindeutigen Pfad nur mithilfe eines Attributwerts zu formulieren. Offensichtlich unterscheiden sich aber ihre benachbarten &#039;&#039;TextViews&#039;&#039;. Es ist möglich die jeweilige &#039;&#039;TextView&#039;&#039; in den Pfad mit aufzunehmen, um einen &#039;&#039;Button&#039;&#039; dennoch eindeutig zu adressieren. Ein Pfad zum &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; unterhalb der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; kann dabei wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView[@resource-id=&#039;push&#039;]/../android.widget.Button[@resource-id=&#039;on&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Teil beschreibt den Pfad zu der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; und der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;push&#039;&#039;. Danach folgt ein Schrägstrich gefolgt von zwei Punkten. Die zwei Punkte sind eine spezielle Elementbezeichnung, die nicht ein Kindelement benennt, sondern zum Elternelement wechselt, in diesem Fall also das &#039;&#039;LinearLayout&#039;&#039;, in dem die &#039;&#039;TextView&#039;&#039; eingebettet ist. Im Kontext dieses &#039;&#039;LinearLayout&#039;&#039; ist der restliche Pfad, nämlich der &#039;&#039;Button&#039;&#039; mit der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;on&#039;&#039;, eindeutig.&lt;br /&gt;
&lt;br /&gt;
Der XPath-Standard bietet noch sehr viel mehr Ausdrucksmittel. Mit der hier knapp vorgestellten Auswahl ist es aber bereits möglich für die meisten praktischen Testfälle gute Pfade zu formulieren. Eine vollständige Einführung in XPath ginge über den Umfang dieser Einführung weit hinaus. Sie finden zahlreiche weiterführende Dokumentationen im Web und in Büchern.&lt;br /&gt;
&lt;br /&gt;
Eine universelle Strategie zum Erstellen guter XPaths gibt es nicht, da sie von den Testanforderungen abhängt. In der Regel ist es sinnvoll, den XPath kurz und dennoch eindeutig zu halten. Häufig lassen sich Elemente über Eigenschaften identifizieren wie beispielsweise ihren Text. Will man aber gerade den Text eines Elements auslesen, kann dieser natürlich nicht im Pfad verwendet werden, da er vorher nicht bekannt ist. Ebenso wird der Text variieren, wenn die App mit verschiedenen Sprachen gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Jeder Baustein, der auf einem Element arbeitet, hat einen Eingangspin für den XPath. Im GUI-Browser finden Sie in der Mitte oben eine Liste von Bausteinen mit Aktionen, die Sie auf das ausgewählte Element anwenden können. Suchen Sie den Baustein &#039;&#039;Click&#039;&#039; (8) im Ordner Elements und wählen Sie ihn aus (Abb. 1). Er wird im rechten Teil unter &amp;quot;&#039;&#039;Test&#039;&#039;&amp;quot; eingefügt, der Pin für den XPath ist mit dem automatisch generierten Pfad des Elements vorbelegt (9). Sie können den Baustein hier auch ausführen. Die Ansicht wechselt dann auf &amp;quot;&#039;&#039;Lauf&#039;&#039;&amp;quot;. Ändert sich durch die Aktion der Zustand Ihrer App, müssen Sie den Baum anschließend aktualisieren (10).&lt;br /&gt;
&lt;br /&gt;
Wenn Sie in der unteren Liste eine Eigenschaft auswählen, wechselt die Anzeige der Bausteine zu &amp;quot;&#039;&#039;Eigenschaften&#039;&#039;&amp;quot;, wo Sie die eigenschaftsbezogenen Bausteine finden. Wie bei den Aktionen können Sie auch hier einen Baustein auswählen, der dann rechts in Test mit dem Pfad des Elements und der ausgewählten Eigenschaft eingetragen wird, sodass Sie ihn direkt ausführen können.&lt;br /&gt;
&lt;br /&gt;
== Weitere Locator-Strategien ==&lt;br /&gt;
Appium bietet neben XPath noch weitere Strategien zur Adressierung von Elementen an. Einige davon stehen Ihnen &#039;&#039;&#039;ab Version 20.1&#039;&#039;&#039; ebenfalls mit expecco zur Verfügung. Diese sind nicht ganz so mächtig wie XPath, dafür aber häufig schneller bei der Auflösung auf dem Gerät. Insbesondere bei der Verwendung mit iPhones, wo die Hierarchie bei jeder XPath-Auflösung erst aufgebaut werden muss, bieten alternative Strategien einen Vorteil für die Laufzeit.&lt;br /&gt;
&lt;br /&gt;
XPath ist weiterhin der Standard, das heißt alle Locator ohne besondere Angabe werden als XPath interpretiert. Um eine der anderen Strategien zu verwenden, schreiben Sie diese mit einem Gleichzeichen vor den gewünschten Locator. Diese Technik können Sie sowohl an den Blöcken verwenden, als auch im GUI-Browser testen.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | AccessibilityId || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Wert des Elements, der dazu dient, die App barrierefrei zu machen. Für iOS ist das das Attribut &#039;&#039;&#039;Accessibility-id&#039;&#039;&#039;, für Android das Attribut &#039;&#039;&#039;content-descr&#039;&#039;&#039;. &#039;&#039;Beispiel: accessibilityId=Löschen&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | className || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Namen der Klasse des Elements. &#039;&#039;Beispiel: className=android.widget.FrameLayout&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | id || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet die Kennung des Elements. Für iOS ist das das Attribut &#039;&#039;&#039;name&#039;&#039;&#039;, für Android das Attribut &#039;&#039;&#039;resource-id&#039;&#039;&#039;. &#039;&#039;Beispiel: id=android:id/text1&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | iOSClassChain&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet die Hierarchie der Elemente ähnlich wie bei XPath. Eine Erklärung zum Aufbau finden Sie [https://github.com/facebookarchive/WebDriverAgent/wiki/Class-Chain-Queries-Construction-Rules hier]. &#039;&#039;Beispiel: iOSClassChain=XCUIElementTypeWindow/XCUIElementTypeButton[`label == &amp;quot;Ok&amp;quot;`]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; padding-right:1em&amp;quot; | iOSNsPredicateString&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet einfache Kriterien, wie Attribute, die auch kombiniert werden können. &#039;&#039;Beispiel: iOSNsPredicateString=type == &#039;XCUIElementTypeButton&#039; AND name == &#039;Weiter&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | name&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Namen des Elements. &#039;&#039;Beispiel: name=Bestätigen&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &#039;&#039;nur für iOS&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Um eine direkte Beschleunigung mit iOS zu erzielen, ohne dass Sie Ihre bisherigen Pfade anpassen müssen, wandelt expecco zudem Pfade, die nur aus einem Element mit Klasse und name-Attribut bestehen, zur Laufzeit automatisch in einen entsprechenden Locator der Strategie iOSNsPredicateString um. Wenn Sie einen Pfad explizit als XPath markieren, wird diese Anpassung nicht vorgenommen.&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span id=&amp;quot;troubleshooting&amp;quot;&amp;gt;&amp;lt;!-- Referenced by error dialog on connection error --&amp;gt;&amp;lt;/span&amp;gt;Probleme und Lösungen=&lt;br /&gt;
== Locator sind versionsabhängig oder variabel ==&lt;br /&gt;
Dann sollten Sie die Locator (xPath) entweder in einer Variablen halten oder ein Locator-Mapping in einem Screenplay Anhang definieren. Es ist auch möglich, lediglich Teile des Locators (z.B. Locator-Pfad eines Elternelements oder Attributwert) in einer Variable zu halten und im Freezevalue des Locator-Pins mit &amp;quot;&#039;&#039;$(varName)&#039;&#039;&amp;quot; einzufügen.&lt;br /&gt;
&lt;br /&gt;
==Unsichtbare UI-Elemente==&lt;br /&gt;
Beachten Sie, dass im [[#Recorder|Recorder]] auch Elemente berücksichtigt werden, die Sie auf dem Bildschirm nicht sehen. Schalten Sie daher das Element-Highlighting an oder nutzen Sie die Follow-Mouse-Funktion und den Elementbaum im GUI-Browser, um festzustellen, ob das richtige Element verwendet wird. Es kann vorkommen, dass unsichtbare Elemente vor anderen Elementen liegen und diese verdecken, so dass die gewünschten Elemente im Recorder nicht ausgewählt werden können. Lesen Sie dazu den Abschnitt [[#Elemente_verbergen|Elemente verbergen]].&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;org.openqa.selenium.StaleElementReferenceException&#039;&#039;==&lt;br /&gt;
Der Fehler &amp;lt;code&amp;gt;org.openqa.selenium.StaleElementReferenceException&amp;lt;/code&amp;gt; tritt immer dann auf, wenn ein Element verwendet wird, das nicht mehr da ist. Wenn das in Ihrem Test passiert und das Element eigentlich da sein sollte, verwenden Sie an der Stelle stattdessen den Locator (XPath), um das Element neu zu holen.&lt;br /&gt;
&lt;br /&gt;
In manchen Fällen kann dieser Fehler auch dann auftreten, wenn Sie am Baustein bereits Locator angegeben haben. Das liegt daran, dass immer zuerst der Locator aufgelöst und das entsprechende Element geholt wird und dann die Aktionen mit dem Element ausgeführt wird. Wenn die App das Element genau zwischen dem Zeitpunkt des Auflösens und Holens und der Ausführung der Aktion aktualisiert und dabei ein neues Element erzeugt, kommt es zu diesem Fehler. Passiert das an einer bestimmten Stelle in Ihrem Test, bleibt nichts anderes als den Fehler abzufangen und es erneut zu versuchen.&lt;br /&gt;
&lt;br /&gt;
==iOS: Kabel nicht zertifiziert==&lt;br /&gt;
In manchen Fällen erscheint beim Verbinden eines iOS-Geräts über USB der Hinweis, das verwendete Kabel sei nicht zertifiziert. In diesem Fall hilft es nur, das entsprechende Kabel auszutauschen.&lt;br /&gt;
==iOS: Alerts beim Verbindungsaufbau==&lt;br /&gt;
Stellen Sie sicher, dass beim Verbindungsaufbau mit einem iOS-Gerät keine Alerts geöffnet sind. Der Aufbau schlägt sonst fehl, da die App nicht in den Vordergrund kommen kann. Siehe auch [[#iOS-Ger.C3.A4t_und_App_vorbereiten|iOS-Gerät und App vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
==iOS: .ipa installieren nicht möglich==&lt;br /&gt;
Beachten Sie, dass auf iOS-Simulatoren keine &#039;&#039;.ipa&#039;&#039;-Dateien sondern nur &#039;&#039;.app&#039;&#039;-Dateien installiert werden können.&lt;br /&gt;
&lt;br /&gt;
==iOS: Erster Verbindungsaufbau funktioniert nicht==&lt;br /&gt;
Wenn auf Ihrem Mac noch kein signierter Build des WebDriverAgents liegt, muss dieser beim ersten Verbindungsaufbau erst erzeugt werden. Das kann in der Regel etwas länger als eine Minute dauern. Standardmäßig verwendet Appium aber einen Timeout von 60000&amp;amp;nbsp;ms um zu warten bis der WebDriverAgent auf dem Gerät startet, so dass der Aufbau in diesen Fällen abgebrochen wird. Sie können den Timeout mit der Capability &#039;&#039;wdaLaunchTimeout&#039;&#039; setzen, z.B. auf &#039;&#039;120000&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Außerdem müssen die Einstellungen für die Signierung passen. Am zuverlässigsten funktioniert das nach unserer Erfahrung, wenn man im Xcode-Projekt des WebDriverAgents auf automatische Signierung stellt und das Team setzt. Siehe dazu die Erklärung im Abschnitt [[#WebDriverAgent-Signierung|WebDriverAgent-Signierung]]. In diesem Fall sollten Sie die Capabilities &#039;&#039;xcodeConfigFile&#039;&#039; bzw. &#039;&#039;xcodeOrgId&#039;&#039; und &#039;&#039;xcodeSigningId&#039;&#039; &#039;&#039;&#039;nicht&#039;&#039;&#039; verwenden, da es sonst zu Konflikten kommen kann. Achtung: Wenn Sie eine Team-ID in den Mobile-Testing-Einstellungen gesetzt haben, setzt expecco diese automatisch als &#039;&#039;xcodeOrgId&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
Achten Sie beim ersten Verbindungsaufbau außerdem auf Ihr Gerät, da Sie dort möglicherweise der Installation per Passwort zustimmen müssen. Auf dem Mac kann die Eingabe des Passworts zur Freigabe des Schlüsselbunds für die Signierung nötig werden, häufig auch mehrmals.&lt;br /&gt;
&lt;br /&gt;
==Android: Gerät nicht im Verbindungsdialog==&lt;br /&gt;
Wenn ein über USB angeschlossenes Android-Gerät nicht im Verbindungsdialog auftaucht, versuchen Sie, den USB-Verbindungstyp zu ändern. In der Regel sollten MTP oder PTP funktionieren. Prüfen Sie nochmal, ob &amp;quot;USB Debugging&amp;quot; in den Entwicklereinstellungen des Geräts aktiviert ist (diese Einstellungen sind bei manchen Geräten zunächst unsichtbar, und müssen durch einen Trick zugänglich gemacht werden). Siehe auch [[#Android-Ger.C3.A4t_vorbereiten|Android-Gerät vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
==Android: Abgeschnittene Elemente unten==&lt;br /&gt;
Bei Android-Geräten, die die Steuerungsleiste bzw. Softkeys automatisch ein- und ausblenden, kann es vorkommen, dass der Recorder im unteren Bereich Elemente abschneidet, die durch die Softkeys verdeckt würden, auch wenn sie zu diesem Zeitpunkt gar nicht angezeigt werden. In diesem Fall hift es, die Softkeys so einzustellen, dass sie in einer permanenten Leiste angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
Bei neueren Android-Versionen gibt es eine solche Einstellung in der Regel nicht. Auch wenn die Steuerelemente permanent eingeblendet sind, liegen sie auf keiner extra Leiste, sondern vor dem Inhalt der App. Es gibt dann im unteren Teil einen Bereich, der nicht bedient werden kann, weil er nicht zum aktiven Bereich der App gezählt wird, weshalb die Elemente von Appium abgeschnitten werden. Dieser Bereich kann auch größer sein als von den Steuerungselementen beansprucht. Bekannt ist dies für Samsung-Geräte mit Android 11. Da die Information über die Größe des App-Bereichs bereits auf Android-Ebene so geliefert wird, können wir hierfür keine Lösung anbieten, sondern können nur hoffen, dass das Problem vom Hersteller behoben wird. Sie können versuchen, ob Sie mit der Einstellung von Gestensteuerung bessere Ergebnisse bekommen, allerdings gibt es hier das gleiche Problem.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;waitForIdleTimeout&amp;quot;&amp;gt;&amp;lt;!-- Referenced by expecco--&amp;gt;&amp;lt;/span&amp;gt; Android: Test hängt beim Suchen eines Elements==&lt;br /&gt;
Der Baustein &#039;&#039;Find Element by XPath&#039;&#039; und alle Element-Bausteine warten bis ein Element zum angegebenen Pfad auftaucht. Den Timeout dafür kann man entweder am Baustein direkt oder in den Umgebungsvariablen ändern. Wenn das Element aber bereits da sein sollte und es dennoch sehr lange dauert, bis der Test weitergeht, kann das am UIAutomator/UIAutomator2 liegen. Dieser wartet, bis die App in den Idle-Zustand geht, bevor er überhaupt nach Elementen sucht. Dies kann länger dauern, wenn die App z.B. im Hintergrund noch Animationen abspielt oder andere Aktionen ausführt. Auch das Holen des Page-Sources z.B. beim Aktualisieren im GUI-Browser oder im Recorder kann dadurch länger dauern. Standardmäßig gibt es hierfür einen Timeout von 10 Sekunden, nach dem nicht weiter auf den Idle-Zustand gewartet wird. Dieser Timeout lässt sich durch eine Einstellung in Appium anpassen (waitForIdleTimeout). Falls Sie einen anderen Wert für diesen Timeout setzen möchten, ist dies ab expecco 21.2 möglich, indem Sie vor dem Test den Smalltalk-Code &amp;lt;code&amp;gt;AppiumTestRunner::TestRunConnection waitForIdleTimeout:2000&amp;lt;/code&amp;gt; ausführen. Der Timeout wird in Millisekunden angegeben, das Beispiel setzt ihn also auf 2 Sekunden.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;startChromedriverTimeout/&amp;gt;Android: Aktualisieren des Trees oder Wechseln zum Webview-Kontext braucht zu lange==&lt;br /&gt;
Speziell mit älteren Geräten kann es vorkommen, dass neuere Chromedriver nicht initialisiert werden können. Das führt dann dazu, dass nicht in den Webview-Kontext gewechselt werden kann. Dies wird von Appium allerdings nur über einen Timeout festgestellt, der standardmäßig bei 4 Minuten liegt. Da expecco auch beim Aufbauen des Trees im GUI-Browser versucht in den Webview-Kontext zu wechseln, kann das zu sehr langen Ladezeiten führen. Da es in Appium keine Möglichkeit gibt, diesen Timeout herunter zu setzen, haben wir die Version, die wir im MobileTestingSupplement bereitstellen, um eine entsprechende Capability erweitert. Ab der Version 1.13.1.0 des [[#Windows|MobileTestingSupplements]] kann mit &#039;&#039;chromedriverStartTimeout&#039;&#039; der Timeout in Millisekunden gesetzt werden. Der Wechsel funktioniert dadurch zwar trotzdem nicht, aber expecco braucht dann nicht mehr so lange beim Aktualisieren des Trees und der Baustein zum Wechseln des Kontextes schlägt schneller fehl. Der Verbindungsdialog fügt diese Capability ab expecco 22.1 automatisch hinzu.&lt;br /&gt;
&lt;br /&gt;
==Keine Aktion bei Klick==&lt;br /&gt;
Der Baustein zum Klicken auf ein Element ist erfolgreich, aber auf dem Gerät wurde keine Aktion ausgeführt.&lt;br /&gt;
:Dies kann vorkommen, wenn das Element von einem anderen Element verdeckt ist und ein Klick auf das Element deshalb nicht möglich ist. In diesem Fall wird von Appium kein Fehler geworfen, sondern es passiert einfach nichts. Wenn Sie dennoch einen Klick an der Position des Elements machen möchten, auch wenn es verdeckt ist, benutzen Sie stattdessen den Baustein &#039;&#039;Tap&#039;&#039; und übergeben Sie diesem die Position des Elements (&#039;&#039;Get Location&#039;&#039;). Wenn Sie stattdessen vor einem Klick prüfen möchten, ob das Element zu diesem Zeitpunkt verdeckt ist, versuchen Sie, ob Ihnen die Eigenschaften &#039;&#039;Is Displayed&#039;&#039; oder &#039;&#039;Is Enabled&#039;&#039; weiterhelfen.&lt;br /&gt;
&lt;br /&gt;
==Kein Update nach Aktion==&lt;br /&gt;
Über den Recorder wurde eine Aktion ausgeführt, für die auch ein Baustein aufgezeichnet wurde, der Recorder zeigt aber immer noch das alte Bild.&lt;br /&gt;
:Der Recorder zeigt kein Livebild des Geräts, sondern immer nur eine Momentaufnahme. Nachdem eine Aktion ausgeführt wurde, aktualisiert sich der Recorder automatisch. Es kann aber vorkommen, dass das Bild schon aktualisiert wurde, bevor die Auswirkungen der Aktion auf dem Gerät vollständig abgeschlossen sind. In diesem Fall sollten Sie den Recorder von Hand aktualisieren über das Symbol mit den blauen Pfeilen. Ab expecco 20.2 können Sie für diesen Fall auch automatisches Aktualisieren einstellen. Siehe auch Beschreibung zum [[#Recorder|Recorder]].&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;clickable&amp;quot; Attribut falsch==&lt;br /&gt;
Ein Element hat im &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; Attribut/Property den Wert &amp;quot;&#039;&#039;false&#039;&#039;&amp;quot;, ist aber dennoch anklickbar.&lt;br /&gt;
:Das &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; Attribute muss explizit vom App-Programmierer gesetzt werden, und hat tatsächlich keine Relevanz für das tatsächliche Verhalten der App. Sie sollten dieses Attribut i.A. in Ihren Tests nicht beachten.&amp;lt;br&amp;gt;Leider existieren viele Apps, bei denen der Programmierer hier &amp;quot;lazy&amp;quot; war.&lt;br /&gt;
&lt;br /&gt;
==Verbindungsaufbau schlägt fehl==&lt;br /&gt;
Schlägt der Verbindungsaufbau mit dem Appium-Server fehl, erhalten Sie in expecco eine Fehlermeldung ähnlicher der unten abgebildeten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingVerbindungsfehler.png]]&lt;br /&gt;
&lt;br /&gt;
Hier sehen Sie die Art des aufgetretenen Fehlers. Klicken Sie auf &amp;quot;&#039;&#039;Details&#039;&#039;&amp;quot; um nähere Informationen zu erhalten. Mögliche Fehler sind:&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.remote.UnreachableBrowserException&#039;&#039;&lt;br /&gt;
:Der angegebene Server läuft nicht oder ist nicht erreichbar. Überprüfen Sie die Serveradresse.&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.WebDriverException&#039;&#039;&lt;br /&gt;
:Lesen Sie in den Details in der ersten Zeile die Meldung hinter &#039;&#039;Original Error&#039;&#039;:&lt;br /&gt;
:*&#039;&#039;Unknown device or simulator UDID&#039;&#039;&lt;br /&gt;
::Entweder ist das Gerät nicht richtig angeschlossen oder die udid stimmt nicht.&lt;br /&gt;
:*&#039;&#039;Unable to launch WebDriverAgent because of xcodebuild failure: xcodebuild failed with code 65&#039;&#039;&lt;br /&gt;
::Dieser Fehler kann verschiedene Ursachen haben. Entweder konnte tatsächlich der WebDriverAgent nicht gebaut werden, weil die Signierungseinstellungen falsch sind oder das passende Provisioning Profile fehlt. Lesen Sie dazu den Abschnitt zur [[#Signierung|Signierung]]. Es kann auch sein, dass der WebDriverAgent auf dem Gerät nicht gestartet werden kann, weil sich beispielsweise ein Alert im Vordergrund befindet oder Sie dem Entwickler nicht vertraut haben.&lt;br /&gt;
:*&#039;&#039;Could not install app: &#039;Command &#039;ios-deploy [...] exited with code 253&#039;&#039;&#039;&lt;br /&gt;
::Die angegebene App kann nicht auf dem iOS-Gerät installiert werden, weil es nicht im Provisioning Profile der App eingetragen ist.&lt;br /&gt;
:*&#039;&#039;Bad app: [...] App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name.&#039;&#039;&#039;&lt;br /&gt;
::Der Pfad zur App ist falsch. Stellen Sie sicher, dass sich die Datei unter dem angegebenen Pfad auf dem Mac befindet.&lt;br /&gt;
:*&#039;&#039;packageAndLaunchActivityFromManifest failed.&#039;&#039;&lt;br /&gt;
::Die angegebene &#039;&#039;apk&#039;&#039;-Datei ist vermutlich kaputt.&lt;br /&gt;
:*&#039;&#039;Could not find app apk at [...]&#039;&#039;&lt;br /&gt;
::Der Pfad zur App ist falsch. Stellen Sie sicher, dass sich die &#039;&#039;apk&#039;&#039;-Datei am angegebenen Pfad befindet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Falls der Fehler nicht durch eine der oben gelisteten Ursachen bedingt ist, kann es sein, dass die auf dem Gerät befindlichen Automation-Anwendungen nicht mehr richtig funktionieren. Hier hilft es, diese vom Mobilgerät zu deinstallieren. Beim nächsten Verbindungsaufbau werden sie dann automatisch neu installiert.&lt;br /&gt;
&lt;br /&gt;
*Für iOS-Geräte ist das der WebDriverAgent, den Sie einfach vom Home-Screen deinstallieren können. Dies behebt in der Regel Probleme durch den Wechsel des verwendeten Macs oder der Xcode-Version.&lt;br /&gt;
&lt;br /&gt;
*Für Android-Geräte ist es der UIAutomator2; hier tritt auf einigen Geräten sporadisch ein Problem auf, die Ursache dafür ist uns z.Z. noch nicht bekannt. Zur Deinstallation navigieren Sie auf dem Gerät zu &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;Anwendungen&#039;&#039;&amp;quot;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; und suchen in der Liste nach folgenden Einträgen:&lt;br /&gt;
    Appium Settings&lt;br /&gt;
    io.appium.uiautomator2.server&lt;br /&gt;
    io.appium.uiautomator2.server.test&lt;br /&gt;
:Klicken Sie auf die jeweilige Anwendung und dann auf &amp;quot;&#039;&#039;Deinstallieren&#039;&#039;&amp;quot;.&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&#039;&#039;Der entsprechende Eintrag heißt auf manchen Geräten möglicherweise etwas anders.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Falls dies nicht hilft, kann eventuell die Ausgabe des Appium-Servers weiterhelfen. Für einen von expecco gestarteten Server finden Sie das Log in der Liste der [[#Laufende_Appium-Server|laufenden Appium-Server]].&lt;br /&gt;
&lt;br /&gt;
==Ich habe keinen Mac==&lt;br /&gt;
Vielleicht hilft Ihnen diese Webseite weiter: [https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10 https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=CompoundBlock_Element&amp;diff=29657</id>
		<title>CompoundBlock Element</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=CompoundBlock_Element&amp;diff=29657"/>
		<updated>2024-07-17T12:33:01Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Editoren */ translated&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
Ein zusammengesetzter Aktionsblock (englisch &amp;quot;&#039;&#039;Compound Action&#039;&#039;&amp;quot;) beschreibt das Verhalten einer [[Block_Element|Aktion]] graphisch als Aktivitätsdiagramm. Diese Diagramme sind vergleichbar mit den [[#Relation_zu_UML_Aktivit.C3.A4tsdiagrammen|Datenflussdiagrammen]] wie in UML2.0 definiert. Sie haben außerdem viele Eigenschaften gemein mit [[#Relation_zu_Petrinetzen|Petrinetzen]]. Das Diagramm besteht aus Unteraktionen, welche als [[DiagramElements-Step|&#039;&#039;Schritte&#039;&#039;]] bezeichnet werden.&lt;br /&gt;
&lt;br /&gt;
Die Ausführung wird durch eine Kombination von Daten- und Kontrollflüssen gesteuert, die durch Verbindungen zwischen den Schritten übertragen werden:&lt;br /&gt;
* Als Datenfluss wird die Übergabe von Werten (Resultate, Messwerte, Objekte, Dokumente etc.) von einem Schritt zum nächsten bezeichnet. Ein Datenfluss läuft über Verbindungen vom [[DiagramElements-Pin#Output_Pin|Ausgangspin]] (Pin = &amp;quot;Stecker/Sockel&amp;quot;) eines Schritts zum [[DiagramElements-Pin#Input_Pin|Eingangspin]] eines anderen.&lt;br /&gt;
* Kontrollflüsse sind Informationen zum Endestatus eines Schrittes, die verwendet werden können, um die Aktion eines nächsten Schritts zu starten. Sie laufen über Verbindungen vom [[DiagramElements-Pin#Enable_Output_Pin|Trigger-Ausgang]] eines Schrittes zum [[DiagramElements-Pin#Enable_Input_Pin|Trigger-Eingang]] eines anderen.&lt;br /&gt;
Beide können die Ausführung eines Folgeschritts auslösen.&lt;br /&gt;
&lt;br /&gt;
== Diagrammelemente ==&lt;br /&gt;
Als &amp;quot;&#039;&#039;Diagrammelemente&#039;&#039;&amp;quot; werden die Bestandteile eines Aktivitätsdiagramms bezeichnet. Sie definieren das Verhalten des [[Compound Block|Zusammengesetzten Aktionsblocks]] und werden im [[Compound Network Editor|Netzwerkeditor]] bearbeitet.&lt;br /&gt;
&lt;br /&gt;
== Einführendes Beispiel eines Aktivitätsdiagramms ==&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel erläutert die Hauptkomponenten eines Aktivitätsdiagramms:&lt;br /&gt;
&lt;br /&gt;
[[Bild:diagram-elements.jpg|760px|Ein Aktivitätsdiagramm]]&lt;br /&gt;
&lt;br /&gt;
Das Diagramm beschreibt den Test einer E-Mail-Übertragung. Zuerst erzeugt der Schritt &amp;quot;Create Unique ID&amp;quot; eine sog. UUID und stellt diese an seinem Ausgangspin zur Verfügung. Diese UUID wird später gebraucht, um den korrekten Empfang der E-Mail zu verifizieren. Die UUID wird vom Schritt &amp;quot;Send E-Mail [SMTP]&amp;quot; empfangen, welcher eine E-Mail mittels dem SMTP Protokoll verschickt, und die UUID als Subject verwendet. Als nächstes sorgt der &amp;quot;Time [Delay]&amp;quot; Schritt für eine Verzögerung von 5 Sekunden (in denen die E-Mail übermittelt wird). Am Ende prüft der Schritt &amp;quot;Check for incoming Mail&amp;quot; ob eine E-Mail mit dem angegebenen Subject angekommen ist, wozu obige UUID gebraucht wird.&lt;br /&gt;
Der Test wird einen Fehler melden, falls eine solche E-Mail nicht gefunden wird.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie bitte, dass die graphische Darstellung des Diagramms im Grunde der UML-Notation entspricht. Allerdings werden um die Lesbarkeit zu erhöhen, und um wichtige Aspekte der Ausführung hervorzuheben einige Element etwas anders bzw. zusätzlich annotiert dargestellt. Insbesondere werden die Stereotypen der Pins durch unterschiedliche Pin-Darstellungen hervorgehoben, anstatt durch textuelle &amp;quot;&amp;lt;&amp;lt;stereotype&amp;gt;&amp;gt;&amp;quot;-labels, wie in UML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Originaltext: Die Definition des Aktivitätsdiagramms entspricht weitgehend der UML-Notation. Einzelne, für die Ausführung wichtige Eigenschaften werden allerdings graphisch hervorgehoben, wodurch sich das Bild im Detail von der UML-Notation leicht unterscheidet. Zum Beispiel werden die Trigger- und Puffer Eigenschaften der Pins durch verschiedene graphische Symbole angezeigt - zu diesen gibt es in der UML-Notation kein Gegenstück, da die UML-Notation derlei semantische Details unbeachtet bzw. durch Benutzerspezifische, nicht standardisierte Stereotypdefinitionen offen lässt (Stand UML2.0).--&amp;gt;&lt;br /&gt;
=== [[DiagramElements-Step|Schritt]] (7) ===&lt;br /&gt;
&lt;br /&gt;
Als &amp;quot;&#039;&#039;Schritt&#039;&#039;&amp;quot; wird eine Aktion (Aktionsbaustein) bezeichnet, welcher in ein Diagramm platziert wurde. Diese Aktion kann ihrerseits entweder ein sog. [[Elementary Block|Elementablock]] sein (wie z.B. &amp;quot;Create Unique ID&amp;quot;), welche ihre Aktion durch eine textuellen Programmcode definiert, oder wieder ein [[Compound Block|zusammengesetzter Block]] (wie z.B. &amp;quot;Check Incoming Mail&amp;quot;), welcher durch ein eigenes Aktivitätsdiagramm definiert wurde. Für das Diagrammnetzwerk in welches der Aktionsblock platziert wurde ist kein Unterschied im Verhalten sichtbar: ein Diagramm, welches einen Aktionsblock beinhaltet (d.h. einen Schritt enthält) sieht kein unterschiedliches Verhalten in Abhängigkeit der effektiven Realisierung seiner Schritte. Tatsächlich gibt es auch keine Unterschiede in der graphischen Darstellung, so dass es auch für den Entwickler eines zusammengesetzten Blocks keinen Unterschied macht (er muss nicht wissen, wie die Interna einer Aktion aufgebaut sind). Alle Schritte werden gleichermaßen durch die Verfügbarkeit von Eingangsdaten gestartet, führen ihre Bearbeitung durch, und liefern ihre Resultate an den Ausgangspins. Details zum Verhalten von Schritten sind in einem [[DiagramElements-Step | separaten Document]] nachzulesen.&lt;br /&gt;
&lt;br /&gt;
=== Autostart (1) ===&lt;br /&gt;
&lt;br /&gt;
Ein Schritt mit der Autostart Option wird automatisch gestartet, sobald das umgebende Netzwerk ausgeführt wird. Schritte ohne Autostart-Option werden lediglich ausgeführt, sobald Daten an den Eingangspins des Schrittes erscheinen. Autostart wird insbesondere für Schritte benötigt, welche keine Eingangspins haben, oder welche nicht durch einen Kontrollfluss gestartet werden. Auch Schritte, deren Eingang lediglich konstante Parameter darstellen müssen so gestartet werden. Im obigen Diagramm trifft dies für den linken &amp;quot;Create Unique ID&amp;quot; Schritt zu.&lt;br /&gt;
&lt;br /&gt;
Im Diagrammeditor werden Schritte mit Autostart mit einem speziellen Icon am linken oberen Rand dargestellt; falls Sie die Standard-UML-Notation bevorzugen, können Sie auch einen START-Block aus der Bibliothek verwenden und dessen Trigger-Ausgangspin mit dem zuerst auszuführenden Schritt verbinden.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Pin|Pin]] (3, 6, 9) ===&lt;br /&gt;
&lt;br /&gt;
[[DiagramElements-Pin|Pins]] dienen zur Weitergabe von Daten und Triggerinformationen zwischen Schritten. Diese Pins können entweder [[DiagramElements-Pin#Output Pin|Ausgangespins]] (3) sein, um Daten zu senden, oder [[DiagramElements-Pin#Input Pin|Eingangspins]] (9), um Daten zu empfangen. Weitere Pins dienen dazu besondere Situationen wie z.B. [[DiagramElements-Pin#Exception Output Pin|Ausnahmebehandlung]] zu melden. Im obigen Diagramm, ist der Exception-Ausgang des &amp;quot;Check Incoming Mail&amp;quot; Schritts mit dem Trigger-Eingang des &amp;quot;FAIL&amp;quot; Schrittes verbunden.&lt;br /&gt;
Kontrollflusspins (Trigger und Status) sind vertikal angeordnet, wohingegen Datenflüsse als horizontal Pins dargestellt werden.&lt;br /&gt;
Eingangspins sind immer oben oder links, Ausgangspins immer unten oder rechts angeordnet.&lt;br /&gt;
Pins werden entsprechend ihrem Verhalten leicht unterschiedlich dargestellt; insbesondere auf das Puffer- und Triggerverhalten wird durch ausgefüllt vs. nicht gefüllt hingewiesen, da diese wichtig sind für die Ausführung. Pins werden in einem [[DiagramElements-Pin | separaten Dokument]] detailliert beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Connection|Verbindung]] (4,8) ===&lt;br /&gt;
&lt;br /&gt;
Verbindungen dienen zum Weiterleiten von Daten oder Kontrollinformationen zu einem oder mehreren Eingangspins (eines oder mehrerer Folgeschritte).&lt;br /&gt;
Im Sinne von UML sind alle Verbindungen in expecco immer &amp;quot;Objektverbindungen&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Datenflussverbindung (4) ====&lt;br /&gt;
&lt;br /&gt;
Diese befördern Daten (-Objekte) von einem Ausgangspin zu einem Eingangspins eines Folgeschritts. Im obigen Beispiel sendet der erste Schritt die erzeugte UUID an zwei weitere Schritte.&lt;br /&gt;
Datenflusspins sind immer links und rechts angeordnet (horizontale Pins).&lt;br /&gt;
&lt;br /&gt;
==== Kontrollflussverbindung (8) ====&lt;br /&gt;
&lt;br /&gt;
Diese dienen dazu, die Ausführung unabhängig von Daten (aber abhängig von der Ausführung eines Schrittes) zu kontrollieren. Im Beispiel werden die Schritte rechts im Bild sequentiell ausgeführt, wozu der Triggerausgang eines Schrittes mit dem Triggereingang eines Folgeschrittes verbunden wurde.&lt;br /&gt;
Kontrollflusspins sind immer oben und unten angeordnet (vertikale Pins).&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Freeze Value|Freeze Value (Vorbelegungswert)]] (6) ===&lt;br /&gt;
&lt;br /&gt;
Eingangswerte eines Pins können mit einem statischen Wert vorbelegt werden (Konstante).&lt;br /&gt;
Im Beispiel sind der Text der E-Mail, die E-Mail-Adresse, die Wartezeit und auch die Fehlermeldung auf diese Weise &amp;quot;eingefroren&amp;quot;.&lt;br /&gt;
Ein vorbelegter Pin sollte typischerweise als nicht-triggernd und nicht-konsumierend (sogenannter &amp;quot;&#039;&#039;Parameterpin&#039;&#039;&amp;quot;) konfiguriert werden, wofür es einen besonderen Menüeintrag gibt (außerdem werden beim &amp;quot;&#039;&#039;Einfrieren&#039;&#039;&amp;quot; die Pins vom Editor automatisch als solche umdefiniert). Details zum Triggerverhalten und zum Konsumieren von Eingangswerten finden sie im Dokument: [[DiagramElements-Pin#Input Pin|&amp;quot;&#039;&#039;Verhalten von Eingangspins&#039;&#039;&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Freeze Value|Vorbelegung aus Umgebungsvariablen]] (5) ===&lt;br /&gt;
&lt;br /&gt;
Eingangswerte eines Pins können ebenfalls aus einer Variable gelesen werden. Diese Variablen werden in einer sogenannten &amp;quot;&#039;&#039;Variablenumgebung&#039;&#039;&amp;quot; bereit gestellt, welche im umgebenden zusammengesetzten Bausteinen oder der [[TestSuite Element|Testsuite]] definiert werden. Im obigen Beispiel werden der Name des E-Mail-Kontos sowie der E-Mail-Serverhost aus solchen Variablen gelesen (und entsprechende Einträge in der Variablenumgebung der Testsuite vorausgesetzt). Wie auch reguläre Vorbelegungen sollte der Pin als nicht-triggernd und nicht-konsumierend definiert werden (i.e. &amp;quot;&#039;&#039;Parameterpin&#039;&#039;&amp;quot;). Lesen Sie dazu ebenfalls das Kapitel [[DiagramElements-Pin#Input Pin|&amp;quot;&#039;&#039;Verhalten von Eingangspins&#039;&#039;&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Annotation|Annotation]] (2) ===&lt;br /&gt;
&lt;br /&gt;
Annotationen dienen dazu, Kommentare oder Zusatzinformationen für Entwickler oder Tester im Diagramm mit abzulegen. Möglich sind sowohl textuelle Annotation, als auch importierte Grafiken (Bilder im GIF-, JPEG- oder PNG-Format). Sie können auch dazu genutzt werden, um wichtige Teile des Diagramms farblich hervorzuheben, indem Sie eine leere Textannotation mit einer Hintergrundfarbe unter Teile ihres Diagramms legen.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Probe|Messfühler]] ===&lt;br /&gt;
&lt;br /&gt;
Messfühler (im obigen Diagramm nicht gezeigt) dienen dazu Pin-Werte aufzuzeichnen und/oder zu validieren. Messfühler bieten einen komfortablen und lesbaren Mechanismus um Werte auf ihre Gültigkeit zu prüfen.&lt;br /&gt;
&lt;br /&gt;
== Semantik ==&lt;br /&gt;
=== Relation zu IEC1131 ===&lt;br /&gt;
Expeccos Aktivitätsdiagramme ähneln stark den Funktionblöcken der IEC1131-3 FBD Sprache (siehe ua. [https://en.wikipedia.org/wiki/Function_block_diagram Wikipedia]).&lt;br /&gt;
Sowohl die grafische Darstellung als auch das Ausführungsverhalten sind vergleichbar. Ingenieure mit einem SPS Hintergrund werden keine Probleme haben, Expeccos Aktionsdefinitionen und zusammengesetzte Aktionen zu verstehen.&lt;br /&gt;
&lt;br /&gt;
=== Relation zu Petrinetzen ===&lt;br /&gt;
Ein Petri-Netz [https://de.wikipedia.org/wiki/Petri-Netz (siehe Wikipedia)] ist ein Netzwerk, das aus Knoten (&#039;&#039;Stellen&#039;&#039; oder auch &#039;&#039;Plätze&#039;&#039; genannt, mit möglicher Aktionsbehandlung) und Übergängen besteht. In klassischen Petri-Netzen bewegen sich anonyme Tokens entlang von Verbindungen. Übergänge kontrollieren das Auslösen (Triggern) der folgenden Aktionsschritte abhängig von der Ankunft von Tokens auf der Eingangsseite, und geben Tokens an die Ausgangsseite weiter.&lt;br /&gt;
&lt;br /&gt;
Expecco kombiniert die Übergangs- und Stellenfunktionalität in einem einzelnen Schrittelement um die grafische Representation dichter zu machen (und auch um eine Ähnlichkeit mit UML-2-Aktivitätsdiagrammen und anderen flussbasierten Diagrammen zu bekommen). Semantisch verhalten sie sich jedoch gleich und jedes Diagramm könnte mit separaten Elementen umgeschrieben werden (durch sammeln der Eingaben und Weitergabe eines Tupels mit Tokens an die Stelle).&lt;br /&gt;
&lt;br /&gt;
[[Datei:Beispiel.png]]&lt;br /&gt;
&lt;br /&gt;
Ein expecco-Schritt mit mehreren Eingabepins entspricht einem Petri-Netz-Übergang mit mehreren Eingaben gefolgt von einer Petri-Netz-Aktion. Wie bei einem Übergang in einem Petri-Netz kann die Eingangsseite eines Schrittes so konfiguriert werden, dass entweder irgendein Eingabewert oder alle Eingabewerte vorliegen müssen. In expecco wird das als &amp;quot;&#039;&#039;Aktivierungsbedingung&#039;&#039;&amp;quot; des Schritts bezeichnet und ist genauer in der [[DiagramElements-Step|Dokumentation zum Schritt]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;Höhere Petri-Netze&#039;&#039;&amp;quot; sind Petri-Netze, die andere Petri-Netze als Stellen enthalten, was in expecco genau den zusammengesetzten Aktionen entspricht.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;&#039;&#039;Farbige Petri-Netze&#039;&#039;&amp;quot; sind Petri-Netze, bei denen keine einfachen anonymen Tokens weitergereicht werden, sondern Datenobjekte (oder Referenzen darauf, wie in expecco).&lt;br /&gt;
&lt;br /&gt;
Deshalb sind expecco-Diagramme in Standard-Petri-Netz-Notation &amp;quot;&#039;&#039;Höhere farbige Petri-Netze&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Relation zu UML Aktivitätsdiagrammen ===&lt;br /&gt;
&lt;br /&gt;
Zusammengesetzte Aktionen in expecco sind isomorph zu UML-Aktivitätsdiagrammen mit einer bestimmten vordefinierten Sammlung an Stereotypen für Verbindungen, Pins und Aktionsschritte. Diese Stereotypen sind in expecco fest einprogrammiert und definieren die Semantik des Auslösens von Aktionen, der Ausführungsreihenfolge von Datenverbindungen und der optionalen parallelen Ausführung von Schritten. Die grafische Representation ist leicht anders; die leicht umständlichen &amp;lt;&amp;lt;Stereotyp&amp;gt;&amp;gt;-Vermerke werden durch verschiedene Pin-Darstellungen (gefüllt/leer usw.) ersetzt. Außerdem sind alle Verbindungen in expecco Objekt-Verbindungen und alle Pins erhalten und erzeugen Objekte als Werte.&lt;br /&gt;
&lt;br /&gt;
=== Relation zu Flussdiagrammen ===&lt;br /&gt;
Aktivitätsdiagramme können als Obermenge von Flussdiagrammen betrachtet werden. Dazu werden die Aktionen lediglich über Kontrollflussverbindungen (Trigger-in/Trigger-out) verbunden (Daten werden hierbei über Variablen ausgetauscht).&lt;br /&gt;
&lt;br /&gt;
Die Wenn-Dann bedingte Verzeigung eines Flussdiagramms entspricht einem 2-Wege-If Aktionsblock (aus der Standardbibliothek). Schleifen werden durch Verbindungen der Trigger-out mit einem Trigger-in eines vorhergehenden Schrittes definiert.&lt;br /&gt;
&lt;br /&gt;
== Editoren ==&lt;br /&gt;
Das Aktivitätsdiagramm, das das Verhalten eines zusammengesetzten Bausteins definiert, kann im [[CompoundBlock Editor-CompoundWorksheet Editor|&#039;&#039;Netzwerkeditor&#039;&#039;]] – auch &amp;quot;&#039;&#039;Diagrammeditor&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;Netzwerkdiagrammeditor&#039;&#039;&amp;quot; genannt – bearbeitet werden. Dieser Editor zeigt die &amp;quot;Innenansicht&amp;quot; des Bausteins. Die Schnittstelle eines zusammengesetzten Bausteins (d.h. Anzahl und Art der Pins) kann hingegen als &amp;quot;Außenansicht&amp;quot; angesehen werden und wird im [[Scheme Editor|&#039;&#039;Schema Editor&#039;&#039;]] gezeigt und definiert.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[Tree Elements | Tree Elements]]&lt;br /&gt;
&lt;br /&gt;
[[Block Element]], [[DiagramElements-Step/en|Schritt]], [[DiagramElements-Connection|Verbindung]],&lt;br /&gt;
[[ElementaryBlock_Element|Elementaraktion]], &lt;br /&gt;
&lt;br /&gt;
Zurück zur [[Online Documentation#Tree Elements|Online Documentation]].&lt;br /&gt;
&lt;br /&gt;
[[Category: Tree Elements]]&lt;br /&gt;
[[Category: Incomplete]]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=CompoundBlock_Element&amp;diff=29656</id>
		<title>CompoundBlock Element</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=CompoundBlock_Element&amp;diff=29656"/>
		<updated>2024-07-17T12:19:57Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Relation zu UML Aktivitätsdiagrammen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
Ein zusammengesetzter Aktionsblock (englisch &amp;quot;&#039;&#039;Compound Action&#039;&#039;&amp;quot;) beschreibt das Verhalten einer [[Block_Element|Aktion]] graphisch als Aktivitätsdiagramm. Diese Diagramme sind vergleichbar mit den [[#Relation_zu_UML_Aktivit.C3.A4tsdiagrammen|Datenflussdiagrammen]] wie in UML2.0 definiert. Sie haben außerdem viele Eigenschaften gemein mit [[#Relation_zu_Petrinetzen|Petrinetzen]]. Das Diagramm besteht aus Unteraktionen, welche als [[DiagramElements-Step|&#039;&#039;Schritte&#039;&#039;]] bezeichnet werden.&lt;br /&gt;
&lt;br /&gt;
Die Ausführung wird durch eine Kombination von Daten- und Kontrollflüssen gesteuert, die durch Verbindungen zwischen den Schritten übertragen werden:&lt;br /&gt;
* Als Datenfluss wird die Übergabe von Werten (Resultate, Messwerte, Objekte, Dokumente etc.) von einem Schritt zum nächsten bezeichnet. Ein Datenfluss läuft über Verbindungen vom [[DiagramElements-Pin#Output_Pin|Ausgangspin]] (Pin = &amp;quot;Stecker/Sockel&amp;quot;) eines Schritts zum [[DiagramElements-Pin#Input_Pin|Eingangspin]] eines anderen.&lt;br /&gt;
* Kontrollflüsse sind Informationen zum Endestatus eines Schrittes, die verwendet werden können, um die Aktion eines nächsten Schritts zu starten. Sie laufen über Verbindungen vom [[DiagramElements-Pin#Enable_Output_Pin|Trigger-Ausgang]] eines Schrittes zum [[DiagramElements-Pin#Enable_Input_Pin|Trigger-Eingang]] eines anderen.&lt;br /&gt;
Beide können die Ausführung eines Folgeschritts auslösen.&lt;br /&gt;
&lt;br /&gt;
== Diagrammelemente ==&lt;br /&gt;
Als &amp;quot;&#039;&#039;Diagrammelemente&#039;&#039;&amp;quot; werden die Bestandteile eines Aktivitätsdiagramms bezeichnet. Sie definieren das Verhalten des [[Compound Block|Zusammengesetzten Aktionsblocks]] und werden im [[Compound Network Editor|Netzwerkeditor]] bearbeitet.&lt;br /&gt;
&lt;br /&gt;
== Einführendes Beispiel eines Aktivitätsdiagramms ==&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel erläutert die Hauptkomponenten eines Aktivitätsdiagramms:&lt;br /&gt;
&lt;br /&gt;
[[Bild:diagram-elements.jpg|760px|Ein Aktivitätsdiagramm]]&lt;br /&gt;
&lt;br /&gt;
Das Diagramm beschreibt den Test einer E-Mail-Übertragung. Zuerst erzeugt der Schritt &amp;quot;Create Unique ID&amp;quot; eine sog. UUID und stellt diese an seinem Ausgangspin zur Verfügung. Diese UUID wird später gebraucht, um den korrekten Empfang der E-Mail zu verifizieren. Die UUID wird vom Schritt &amp;quot;Send E-Mail [SMTP]&amp;quot; empfangen, welcher eine E-Mail mittels dem SMTP Protokoll verschickt, und die UUID als Subject verwendet. Als nächstes sorgt der &amp;quot;Time [Delay]&amp;quot; Schritt für eine Verzögerung von 5 Sekunden (in denen die E-Mail übermittelt wird). Am Ende prüft der Schritt &amp;quot;Check for incoming Mail&amp;quot; ob eine E-Mail mit dem angegebenen Subject angekommen ist, wozu obige UUID gebraucht wird.&lt;br /&gt;
Der Test wird einen Fehler melden, falls eine solche E-Mail nicht gefunden wird.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie bitte, dass die graphische Darstellung des Diagramms im Grunde der UML-Notation entspricht. Allerdings werden um die Lesbarkeit zu erhöhen, und um wichtige Aspekte der Ausführung hervorzuheben einige Element etwas anders bzw. zusätzlich annotiert dargestellt. Insbesondere werden die Stereotypen der Pins durch unterschiedliche Pin-Darstellungen hervorgehoben, anstatt durch textuelle &amp;quot;&amp;lt;&amp;lt;stereotype&amp;gt;&amp;gt;&amp;quot;-labels, wie in UML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Originaltext: Die Definition des Aktivitätsdiagramms entspricht weitgehend der UML-Notation. Einzelne, für die Ausführung wichtige Eigenschaften werden allerdings graphisch hervorgehoben, wodurch sich das Bild im Detail von der UML-Notation leicht unterscheidet. Zum Beispiel werden die Trigger- und Puffer Eigenschaften der Pins durch verschiedene graphische Symbole angezeigt - zu diesen gibt es in der UML-Notation kein Gegenstück, da die UML-Notation derlei semantische Details unbeachtet bzw. durch Benutzerspezifische, nicht standardisierte Stereotypdefinitionen offen lässt (Stand UML2.0).--&amp;gt;&lt;br /&gt;
=== [[DiagramElements-Step|Schritt]] (7) ===&lt;br /&gt;
&lt;br /&gt;
Als &amp;quot;&#039;&#039;Schritt&#039;&#039;&amp;quot; wird eine Aktion (Aktionsbaustein) bezeichnet, welcher in ein Diagramm platziert wurde. Diese Aktion kann ihrerseits entweder ein sog. [[Elementary Block|Elementablock]] sein (wie z.B. &amp;quot;Create Unique ID&amp;quot;), welche ihre Aktion durch eine textuellen Programmcode definiert, oder wieder ein [[Compound Block|zusammengesetzter Block]] (wie z.B. &amp;quot;Check Incoming Mail&amp;quot;), welcher durch ein eigenes Aktivitätsdiagramm definiert wurde. Für das Diagrammnetzwerk in welches der Aktionsblock platziert wurde ist kein Unterschied im Verhalten sichtbar: ein Diagramm, welches einen Aktionsblock beinhaltet (d.h. einen Schritt enthält) sieht kein unterschiedliches Verhalten in Abhängigkeit der effektiven Realisierung seiner Schritte. Tatsächlich gibt es auch keine Unterschiede in der graphischen Darstellung, so dass es auch für den Entwickler eines zusammengesetzten Blocks keinen Unterschied macht (er muss nicht wissen, wie die Interna einer Aktion aufgebaut sind). Alle Schritte werden gleichermaßen durch die Verfügbarkeit von Eingangsdaten gestartet, führen ihre Bearbeitung durch, und liefern ihre Resultate an den Ausgangspins. Details zum Verhalten von Schritten sind in einem [[DiagramElements-Step | separaten Document]] nachzulesen.&lt;br /&gt;
&lt;br /&gt;
=== Autostart (1) ===&lt;br /&gt;
&lt;br /&gt;
Ein Schritt mit der Autostart Option wird automatisch gestartet, sobald das umgebende Netzwerk ausgeführt wird. Schritte ohne Autostart-Option werden lediglich ausgeführt, sobald Daten an den Eingangspins des Schrittes erscheinen. Autostart wird insbesondere für Schritte benötigt, welche keine Eingangspins haben, oder welche nicht durch einen Kontrollfluss gestartet werden. Auch Schritte, deren Eingang lediglich konstante Parameter darstellen müssen so gestartet werden. Im obigen Diagramm trifft dies für den linken &amp;quot;Create Unique ID&amp;quot; Schritt zu.&lt;br /&gt;
&lt;br /&gt;
Im Diagrammeditor werden Schritte mit Autostart mit einem speziellen Icon am linken oberen Rand dargestellt; falls Sie die Standard-UML-Notation bevorzugen, können Sie auch einen START-Block aus der Bibliothek verwenden und dessen Trigger-Ausgangspin mit dem zuerst auszuführenden Schritt verbinden.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Pin|Pin]] (3, 6, 9) ===&lt;br /&gt;
&lt;br /&gt;
[[DiagramElements-Pin|Pins]] dienen zur Weitergabe von Daten und Triggerinformationen zwischen Schritten. Diese Pins können entweder [[DiagramElements-Pin#Output Pin|Ausgangespins]] (3) sein, um Daten zu senden, oder [[DiagramElements-Pin#Input Pin|Eingangspins]] (9), um Daten zu empfangen. Weitere Pins dienen dazu besondere Situationen wie z.B. [[DiagramElements-Pin#Exception Output Pin|Ausnahmebehandlung]] zu melden. Im obigen Diagramm, ist der Exception-Ausgang des &amp;quot;Check Incoming Mail&amp;quot; Schritts mit dem Trigger-Eingang des &amp;quot;FAIL&amp;quot; Schrittes verbunden.&lt;br /&gt;
Kontrollflusspins (Trigger und Status) sind vertikal angeordnet, wohingegen Datenflüsse als horizontal Pins dargestellt werden.&lt;br /&gt;
Eingangspins sind immer oben oder links, Ausgangspins immer unten oder rechts angeordnet.&lt;br /&gt;
Pins werden entsprechend ihrem Verhalten leicht unterschiedlich dargestellt; insbesondere auf das Puffer- und Triggerverhalten wird durch ausgefüllt vs. nicht gefüllt hingewiesen, da diese wichtig sind für die Ausführung. Pins werden in einem [[DiagramElements-Pin | separaten Dokument]] detailliert beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Connection|Verbindung]] (4,8) ===&lt;br /&gt;
&lt;br /&gt;
Verbindungen dienen zum Weiterleiten von Daten oder Kontrollinformationen zu einem oder mehreren Eingangspins (eines oder mehrerer Folgeschritte).&lt;br /&gt;
Im Sinne von UML sind alle Verbindungen in expecco immer &amp;quot;Objektverbindungen&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Datenflussverbindung (4) ====&lt;br /&gt;
&lt;br /&gt;
Diese befördern Daten (-Objekte) von einem Ausgangspin zu einem Eingangspins eines Folgeschritts. Im obigen Beispiel sendet der erste Schritt die erzeugte UUID an zwei weitere Schritte.&lt;br /&gt;
Datenflusspins sind immer links und rechts angeordnet (horizontale Pins).&lt;br /&gt;
&lt;br /&gt;
==== Kontrollflussverbindung (8) ====&lt;br /&gt;
&lt;br /&gt;
Diese dienen dazu, die Ausführung unabhängig von Daten (aber abhängig von der Ausführung eines Schrittes) zu kontrollieren. Im Beispiel werden die Schritte rechts im Bild sequentiell ausgeführt, wozu der Triggerausgang eines Schrittes mit dem Triggereingang eines Folgeschrittes verbunden wurde.&lt;br /&gt;
Kontrollflusspins sind immer oben und unten angeordnet (vertikale Pins).&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Freeze Value|Freeze Value (Vorbelegungswert)]] (6) ===&lt;br /&gt;
&lt;br /&gt;
Eingangswerte eines Pins können mit einem statischen Wert vorbelegt werden (Konstante).&lt;br /&gt;
Im Beispiel sind der Text der E-Mail, die E-Mail-Adresse, die Wartezeit und auch die Fehlermeldung auf diese Weise &amp;quot;eingefroren&amp;quot;.&lt;br /&gt;
Ein vorbelegter Pin sollte typischerweise als nicht-triggernd und nicht-konsumierend (sogenannter &amp;quot;&#039;&#039;Parameterpin&#039;&#039;&amp;quot;) konfiguriert werden, wofür es einen besonderen Menüeintrag gibt (außerdem werden beim &amp;quot;&#039;&#039;Einfrieren&#039;&#039;&amp;quot; die Pins vom Editor automatisch als solche umdefiniert). Details zum Triggerverhalten und zum Konsumieren von Eingangswerten finden sie im Dokument: [[DiagramElements-Pin#Input Pin|&amp;quot;&#039;&#039;Verhalten von Eingangspins&#039;&#039;&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Freeze Value|Vorbelegung aus Umgebungsvariablen]] (5) ===&lt;br /&gt;
&lt;br /&gt;
Eingangswerte eines Pins können ebenfalls aus einer Variable gelesen werden. Diese Variablen werden in einer sogenannten &amp;quot;&#039;&#039;Variablenumgebung&#039;&#039;&amp;quot; bereit gestellt, welche im umgebenden zusammengesetzten Bausteinen oder der [[TestSuite Element|Testsuite]] definiert werden. Im obigen Beispiel werden der Name des E-Mail-Kontos sowie der E-Mail-Serverhost aus solchen Variablen gelesen (und entsprechende Einträge in der Variablenumgebung der Testsuite vorausgesetzt). Wie auch reguläre Vorbelegungen sollte der Pin als nicht-triggernd und nicht-konsumierend definiert werden (i.e. &amp;quot;&#039;&#039;Parameterpin&#039;&#039;&amp;quot;). Lesen Sie dazu ebenfalls das Kapitel [[DiagramElements-Pin#Input Pin|&amp;quot;&#039;&#039;Verhalten von Eingangspins&#039;&#039;&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Annotation|Annotation]] (2) ===&lt;br /&gt;
&lt;br /&gt;
Annotationen dienen dazu, Kommentare oder Zusatzinformationen für Entwickler oder Tester im Diagramm mit abzulegen. Möglich sind sowohl textuelle Annotation, als auch importierte Grafiken (Bilder im GIF-, JPEG- oder PNG-Format). Sie können auch dazu genutzt werden, um wichtige Teile des Diagramms farblich hervorzuheben, indem Sie eine leere Textannotation mit einer Hintergrundfarbe unter Teile ihres Diagramms legen.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Probe|Messfühler]] ===&lt;br /&gt;
&lt;br /&gt;
Messfühler (im obigen Diagramm nicht gezeigt) dienen dazu Pin-Werte aufzuzeichnen und/oder zu validieren. Messfühler bieten einen komfortablen und lesbaren Mechanismus um Werte auf ihre Gültigkeit zu prüfen.&lt;br /&gt;
&lt;br /&gt;
== Semantik ==&lt;br /&gt;
=== Relation zu IEC1131 ===&lt;br /&gt;
Expeccos Aktivitätsdiagramme ähneln stark den Funktionblöcken der IEC1131-3 FBD Sprache (siehe ua. [https://en.wikipedia.org/wiki/Function_block_diagram Wikipedia]).&lt;br /&gt;
Sowohl die grafische Darstellung als auch das Ausführungsverhalten sind vergleichbar. Ingenieure mit einem SPS Hintergrund werden keine Probleme haben, Expeccos Aktionsdefinitionen und zusammengesetzte Aktionen zu verstehen.&lt;br /&gt;
&lt;br /&gt;
=== Relation zu Petrinetzen ===&lt;br /&gt;
Ein Petri-Netz [https://de.wikipedia.org/wiki/Petri-Netz (siehe Wikipedia)] ist ein Netzwerk, das aus Knoten (&#039;&#039;Stellen&#039;&#039; oder auch &#039;&#039;Plätze&#039;&#039; genannt, mit möglicher Aktionsbehandlung) und Übergängen besteht. In klassischen Petri-Netzen bewegen sich anonyme Tokens entlang von Verbindungen. Übergänge kontrollieren das Auslösen (Triggern) der folgenden Aktionsschritte abhängig von der Ankunft von Tokens auf der Eingangsseite, und geben Tokens an die Ausgangsseite weiter.&lt;br /&gt;
&lt;br /&gt;
Expecco kombiniert die Übergangs- und Stellenfunktionalität in einem einzelnen Schrittelement um die grafische Representation dichter zu machen (und auch um eine Ähnlichkeit mit UML-2-Aktivitätsdiagrammen und anderen flussbasierten Diagrammen zu bekommen). Semantisch verhalten sie sich jedoch gleich und jedes Diagramm könnte mit separaten Elementen umgeschrieben werden (durch sammeln der Eingaben und Weitergabe eines Tupels mit Tokens an die Stelle).&lt;br /&gt;
&lt;br /&gt;
[[Datei:Beispiel.png]]&lt;br /&gt;
&lt;br /&gt;
Ein expecco-Schritt mit mehreren Eingabepins entspricht einem Petri-Netz-Übergang mit mehreren Eingaben gefolgt von einer Petri-Netz-Aktion. Wie bei einem Übergang in einem Petri-Netz kann die Eingangsseite eines Schrittes so konfiguriert werden, dass entweder irgendein Eingabewert oder alle Eingabewerte vorliegen müssen. In expecco wird das als &amp;quot;&#039;&#039;Aktivierungsbedingung&#039;&#039;&amp;quot; des Schritts bezeichnet und ist genauer in der [[DiagramElements-Step|Dokumentation zum Schritt]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;Höhere Petri-Netze&#039;&#039;&amp;quot; sind Petri-Netze, die andere Petri-Netze als Stellen enthalten, was in expecco genau den zusammengesetzten Aktionen entspricht.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;&#039;&#039;Farbige Petri-Netze&#039;&#039;&amp;quot; sind Petri-Netze, bei denen keine einfachen anonymen Tokens weitergereicht werden, sondern Datenobjekte (oder Referenzen darauf, wie in expecco).&lt;br /&gt;
&lt;br /&gt;
Deshalb sind expecco-Diagramme in Standard-Petri-Netz-Notation &amp;quot;&#039;&#039;Höhere farbige Petri-Netze&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Relation zu UML Aktivitätsdiagrammen ===&lt;br /&gt;
&lt;br /&gt;
Zusammengesetzte Aktionen in expecco sind isomorph zu UML-Aktivitätsdiagrammen mit einer bestimmten vordefinierten Sammlung an Stereotypen für Verbindungen, Pins und Aktionsschritte. Diese Stereotypen sind in expecco fest einprogrammiert und definieren die Semantik des Auslösens von Aktionen, der Ausführungsreihenfolge von Datenverbindungen und der optionalen parallelen Ausführung von Schritten. Die grafische Representation ist leicht anders; die leicht umständlichen &amp;lt;&amp;lt;Stereotyp&amp;gt;&amp;gt;-Vermerke werden durch verschiedene Pin-Darstellungen (gefüllt/leer usw.) ersetzt. Außerdem sind alle Verbindungen in expecco Objekt-Verbindungen und alle Pins erhalten und erzeugen Objekte als Werte.&lt;br /&gt;
&lt;br /&gt;
=== Relation zu Flussdiagrammen ===&lt;br /&gt;
Aktivitätsdiagramme können als Obermenge von Flussdiagrammen betrachtet werden. Dazu werden die Aktionen lediglich über Kontrollflussverbindungen (Trigger-in/Trigger-out) verbunden (Daten werden hierbei über Variablen ausgetauscht).&lt;br /&gt;
&lt;br /&gt;
Die Wenn-Dann bedingte Verzeigung eines Flussdiagramms entspricht einem 2-Wege-If Aktionsblock (aus der Standardbibliothek). Schleifen werden durch Verbindungen der Trigger-out mit einem Trigger-in eines vorhergehenden Schrittes definiert.&lt;br /&gt;
&lt;br /&gt;
== Editoren ==&lt;br /&gt;
The activity diagram which defines the behavior of a compound block&lt;br /&gt;
is edited in the [[CompoundBlock Editor-CompoundWorksheet Editor/en|&#039;&#039;network editor&#039;&#039;]], also called &amp;quot;&#039;&#039;diagram editor&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;network diagram editor&#039;&#039;&amp;quot;.&lt;br /&gt;
This editor presents the &amp;quot;internal view&amp;quot; of the block.&lt;br /&gt;
In contrast, the interface of an compound block (e.g. number and type of pins) can be regarded as its &amp;quot;external view&amp;quot; and is presented and defined in the [[Scheme Editor/en|&#039;&#039;schema editor&#039;&#039;]].&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[Tree Elements | Tree Elements]]&lt;br /&gt;
&lt;br /&gt;
[[Block Element]], [[DiagramElements-Step/en|Schritt]], [[DiagramElements-Connection|Verbindung]],&lt;br /&gt;
[[ElementaryBlock_Element|Elementaraktion]], &lt;br /&gt;
&lt;br /&gt;
Zurück zur [[Online Documentation#Tree Elements|Online Documentation]].&lt;br /&gt;
&lt;br /&gt;
[[Category: Tree Elements]]&lt;br /&gt;
[[Category: Incomplete]]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=CompoundBlock_Element&amp;diff=29655</id>
		<title>CompoundBlock Element</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=CompoundBlock_Element&amp;diff=29655"/>
		<updated>2024-07-17T12:01:05Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Relation zu Petrinetzen */ translated&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
Ein zusammengesetzter Aktionsblock (englisch &amp;quot;&#039;&#039;Compound Action&#039;&#039;&amp;quot;) beschreibt das Verhalten einer [[Block_Element|Aktion]] graphisch als Aktivitätsdiagramm. Diese Diagramme sind vergleichbar mit den [[#Relation_zu_UML_Aktivit.C3.A4tsdiagrammen|Datenflussdiagrammen]] wie in UML2.0 definiert. Sie haben außerdem viele Eigenschaften gemein mit [[#Relation_zu_Petrinetzen|Petrinetzen]]. Das Diagramm besteht aus Unteraktionen, welche als [[DiagramElements-Step|&#039;&#039;Schritte&#039;&#039;]] bezeichnet werden.&lt;br /&gt;
&lt;br /&gt;
Die Ausführung wird durch eine Kombination von Daten- und Kontrollflüssen gesteuert, die durch Verbindungen zwischen den Schritten übertragen werden:&lt;br /&gt;
* Als Datenfluss wird die Übergabe von Werten (Resultate, Messwerte, Objekte, Dokumente etc.) von einem Schritt zum nächsten bezeichnet. Ein Datenfluss läuft über Verbindungen vom [[DiagramElements-Pin#Output_Pin|Ausgangspin]] (Pin = &amp;quot;Stecker/Sockel&amp;quot;) eines Schritts zum [[DiagramElements-Pin#Input_Pin|Eingangspin]] eines anderen.&lt;br /&gt;
* Kontrollflüsse sind Informationen zum Endestatus eines Schrittes, die verwendet werden können, um die Aktion eines nächsten Schritts zu starten. Sie laufen über Verbindungen vom [[DiagramElements-Pin#Enable_Output_Pin|Trigger-Ausgang]] eines Schrittes zum [[DiagramElements-Pin#Enable_Input_Pin|Trigger-Eingang]] eines anderen.&lt;br /&gt;
Beide können die Ausführung eines Folgeschritts auslösen.&lt;br /&gt;
&lt;br /&gt;
== Diagrammelemente ==&lt;br /&gt;
Als &amp;quot;&#039;&#039;Diagrammelemente&#039;&#039;&amp;quot; werden die Bestandteile eines Aktivitätsdiagramms bezeichnet. Sie definieren das Verhalten des [[Compound Block|Zusammengesetzten Aktionsblocks]] und werden im [[Compound Network Editor|Netzwerkeditor]] bearbeitet.&lt;br /&gt;
&lt;br /&gt;
== Einführendes Beispiel eines Aktivitätsdiagramms ==&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel erläutert die Hauptkomponenten eines Aktivitätsdiagramms:&lt;br /&gt;
&lt;br /&gt;
[[Bild:diagram-elements.jpg|760px|Ein Aktivitätsdiagramm]]&lt;br /&gt;
&lt;br /&gt;
Das Diagramm beschreibt den Test einer E-Mail-Übertragung. Zuerst erzeugt der Schritt &amp;quot;Create Unique ID&amp;quot; eine sog. UUID und stellt diese an seinem Ausgangspin zur Verfügung. Diese UUID wird später gebraucht, um den korrekten Empfang der E-Mail zu verifizieren. Die UUID wird vom Schritt &amp;quot;Send E-Mail [SMTP]&amp;quot; empfangen, welcher eine E-Mail mittels dem SMTP Protokoll verschickt, und die UUID als Subject verwendet. Als nächstes sorgt der &amp;quot;Time [Delay]&amp;quot; Schritt für eine Verzögerung von 5 Sekunden (in denen die E-Mail übermittelt wird). Am Ende prüft der Schritt &amp;quot;Check for incoming Mail&amp;quot; ob eine E-Mail mit dem angegebenen Subject angekommen ist, wozu obige UUID gebraucht wird.&lt;br /&gt;
Der Test wird einen Fehler melden, falls eine solche E-Mail nicht gefunden wird.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie bitte, dass die graphische Darstellung des Diagramms im Grunde der UML-Notation entspricht. Allerdings werden um die Lesbarkeit zu erhöhen, und um wichtige Aspekte der Ausführung hervorzuheben einige Element etwas anders bzw. zusätzlich annotiert dargestellt. Insbesondere werden die Stereotypen der Pins durch unterschiedliche Pin-Darstellungen hervorgehoben, anstatt durch textuelle &amp;quot;&amp;lt;&amp;lt;stereotype&amp;gt;&amp;gt;&amp;quot;-labels, wie in UML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Originaltext: Die Definition des Aktivitätsdiagramms entspricht weitgehend der UML-Notation. Einzelne, für die Ausführung wichtige Eigenschaften werden allerdings graphisch hervorgehoben, wodurch sich das Bild im Detail von der UML-Notation leicht unterscheidet. Zum Beispiel werden die Trigger- und Puffer Eigenschaften der Pins durch verschiedene graphische Symbole angezeigt - zu diesen gibt es in der UML-Notation kein Gegenstück, da die UML-Notation derlei semantische Details unbeachtet bzw. durch Benutzerspezifische, nicht standardisierte Stereotypdefinitionen offen lässt (Stand UML2.0).--&amp;gt;&lt;br /&gt;
=== [[DiagramElements-Step|Schritt]] (7) ===&lt;br /&gt;
&lt;br /&gt;
Als &amp;quot;&#039;&#039;Schritt&#039;&#039;&amp;quot; wird eine Aktion (Aktionsbaustein) bezeichnet, welcher in ein Diagramm platziert wurde. Diese Aktion kann ihrerseits entweder ein sog. [[Elementary Block|Elementablock]] sein (wie z.B. &amp;quot;Create Unique ID&amp;quot;), welche ihre Aktion durch eine textuellen Programmcode definiert, oder wieder ein [[Compound Block|zusammengesetzter Block]] (wie z.B. &amp;quot;Check Incoming Mail&amp;quot;), welcher durch ein eigenes Aktivitätsdiagramm definiert wurde. Für das Diagrammnetzwerk in welches der Aktionsblock platziert wurde ist kein Unterschied im Verhalten sichtbar: ein Diagramm, welches einen Aktionsblock beinhaltet (d.h. einen Schritt enthält) sieht kein unterschiedliches Verhalten in Abhängigkeit der effektiven Realisierung seiner Schritte. Tatsächlich gibt es auch keine Unterschiede in der graphischen Darstellung, so dass es auch für den Entwickler eines zusammengesetzten Blocks keinen Unterschied macht (er muss nicht wissen, wie die Interna einer Aktion aufgebaut sind). Alle Schritte werden gleichermaßen durch die Verfügbarkeit von Eingangsdaten gestartet, führen ihre Bearbeitung durch, und liefern ihre Resultate an den Ausgangspins. Details zum Verhalten von Schritten sind in einem [[DiagramElements-Step | separaten Document]] nachzulesen.&lt;br /&gt;
&lt;br /&gt;
=== Autostart (1) ===&lt;br /&gt;
&lt;br /&gt;
Ein Schritt mit der Autostart Option wird automatisch gestartet, sobald das umgebende Netzwerk ausgeführt wird. Schritte ohne Autostart-Option werden lediglich ausgeführt, sobald Daten an den Eingangspins des Schrittes erscheinen. Autostart wird insbesondere für Schritte benötigt, welche keine Eingangspins haben, oder welche nicht durch einen Kontrollfluss gestartet werden. Auch Schritte, deren Eingang lediglich konstante Parameter darstellen müssen so gestartet werden. Im obigen Diagramm trifft dies für den linken &amp;quot;Create Unique ID&amp;quot; Schritt zu.&lt;br /&gt;
&lt;br /&gt;
Im Diagrammeditor werden Schritte mit Autostart mit einem speziellen Icon am linken oberen Rand dargestellt; falls Sie die Standard-UML-Notation bevorzugen, können Sie auch einen START-Block aus der Bibliothek verwenden und dessen Trigger-Ausgangspin mit dem zuerst auszuführenden Schritt verbinden.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Pin|Pin]] (3, 6, 9) ===&lt;br /&gt;
&lt;br /&gt;
[[DiagramElements-Pin|Pins]] dienen zur Weitergabe von Daten und Triggerinformationen zwischen Schritten. Diese Pins können entweder [[DiagramElements-Pin#Output Pin|Ausgangespins]] (3) sein, um Daten zu senden, oder [[DiagramElements-Pin#Input Pin|Eingangspins]] (9), um Daten zu empfangen. Weitere Pins dienen dazu besondere Situationen wie z.B. [[DiagramElements-Pin#Exception Output Pin|Ausnahmebehandlung]] zu melden. Im obigen Diagramm, ist der Exception-Ausgang des &amp;quot;Check Incoming Mail&amp;quot; Schritts mit dem Trigger-Eingang des &amp;quot;FAIL&amp;quot; Schrittes verbunden.&lt;br /&gt;
Kontrollflusspins (Trigger und Status) sind vertikal angeordnet, wohingegen Datenflüsse als horizontal Pins dargestellt werden.&lt;br /&gt;
Eingangspins sind immer oben oder links, Ausgangspins immer unten oder rechts angeordnet.&lt;br /&gt;
Pins werden entsprechend ihrem Verhalten leicht unterschiedlich dargestellt; insbesondere auf das Puffer- und Triggerverhalten wird durch ausgefüllt vs. nicht gefüllt hingewiesen, da diese wichtig sind für die Ausführung. Pins werden in einem [[DiagramElements-Pin | separaten Dokument]] detailliert beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Connection|Verbindung]] (4,8) ===&lt;br /&gt;
&lt;br /&gt;
Verbindungen dienen zum Weiterleiten von Daten oder Kontrollinformationen zu einem oder mehreren Eingangspins (eines oder mehrerer Folgeschritte).&lt;br /&gt;
Im Sinne von UML sind alle Verbindungen in expecco immer &amp;quot;Objektverbindungen&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Datenflussverbindung (4) ====&lt;br /&gt;
&lt;br /&gt;
Diese befördern Daten (-Objekte) von einem Ausgangspin zu einem Eingangspins eines Folgeschritts. Im obigen Beispiel sendet der erste Schritt die erzeugte UUID an zwei weitere Schritte.&lt;br /&gt;
Datenflusspins sind immer links und rechts angeordnet (horizontale Pins).&lt;br /&gt;
&lt;br /&gt;
==== Kontrollflussverbindung (8) ====&lt;br /&gt;
&lt;br /&gt;
Diese dienen dazu, die Ausführung unabhängig von Daten (aber abhängig von der Ausführung eines Schrittes) zu kontrollieren. Im Beispiel werden die Schritte rechts im Bild sequentiell ausgeführt, wozu der Triggerausgang eines Schrittes mit dem Triggereingang eines Folgeschrittes verbunden wurde.&lt;br /&gt;
Kontrollflusspins sind immer oben und unten angeordnet (vertikale Pins).&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Freeze Value|Freeze Value (Vorbelegungswert)]] (6) ===&lt;br /&gt;
&lt;br /&gt;
Eingangswerte eines Pins können mit einem statischen Wert vorbelegt werden (Konstante).&lt;br /&gt;
Im Beispiel sind der Text der E-Mail, die E-Mail-Adresse, die Wartezeit und auch die Fehlermeldung auf diese Weise &amp;quot;eingefroren&amp;quot;.&lt;br /&gt;
Ein vorbelegter Pin sollte typischerweise als nicht-triggernd und nicht-konsumierend (sogenannter &amp;quot;&#039;&#039;Parameterpin&#039;&#039;&amp;quot;) konfiguriert werden, wofür es einen besonderen Menüeintrag gibt (außerdem werden beim &amp;quot;&#039;&#039;Einfrieren&#039;&#039;&amp;quot; die Pins vom Editor automatisch als solche umdefiniert). Details zum Triggerverhalten und zum Konsumieren von Eingangswerten finden sie im Dokument: [[DiagramElements-Pin#Input Pin|&amp;quot;&#039;&#039;Verhalten von Eingangspins&#039;&#039;&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Freeze Value|Vorbelegung aus Umgebungsvariablen]] (5) ===&lt;br /&gt;
&lt;br /&gt;
Eingangswerte eines Pins können ebenfalls aus einer Variable gelesen werden. Diese Variablen werden in einer sogenannten &amp;quot;&#039;&#039;Variablenumgebung&#039;&#039;&amp;quot; bereit gestellt, welche im umgebenden zusammengesetzten Bausteinen oder der [[TestSuite Element|Testsuite]] definiert werden. Im obigen Beispiel werden der Name des E-Mail-Kontos sowie der E-Mail-Serverhost aus solchen Variablen gelesen (und entsprechende Einträge in der Variablenumgebung der Testsuite vorausgesetzt). Wie auch reguläre Vorbelegungen sollte der Pin als nicht-triggernd und nicht-konsumierend definiert werden (i.e. &amp;quot;&#039;&#039;Parameterpin&#039;&#039;&amp;quot;). Lesen Sie dazu ebenfalls das Kapitel [[DiagramElements-Pin#Input Pin|&amp;quot;&#039;&#039;Verhalten von Eingangspins&#039;&#039;&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Annotation|Annotation]] (2) ===&lt;br /&gt;
&lt;br /&gt;
Annotationen dienen dazu, Kommentare oder Zusatzinformationen für Entwickler oder Tester im Diagramm mit abzulegen. Möglich sind sowohl textuelle Annotation, als auch importierte Grafiken (Bilder im GIF-, JPEG- oder PNG-Format). Sie können auch dazu genutzt werden, um wichtige Teile des Diagramms farblich hervorzuheben, indem Sie eine leere Textannotation mit einer Hintergrundfarbe unter Teile ihres Diagramms legen.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Probe|Messfühler]] ===&lt;br /&gt;
&lt;br /&gt;
Messfühler (im obigen Diagramm nicht gezeigt) dienen dazu Pin-Werte aufzuzeichnen und/oder zu validieren. Messfühler bieten einen komfortablen und lesbaren Mechanismus um Werte auf ihre Gültigkeit zu prüfen.&lt;br /&gt;
&lt;br /&gt;
== Semantik ==&lt;br /&gt;
=== Relation zu IEC1131 ===&lt;br /&gt;
Expeccos Aktivitätsdiagramme ähneln stark den Funktionblöcken der IEC1131-3 FBD Sprache (siehe ua. [https://en.wikipedia.org/wiki/Function_block_diagram Wikipedia]).&lt;br /&gt;
Sowohl die grafische Darstellung als auch das Ausführungsverhalten sind vergleichbar. Ingenieure mit einem SPS Hintergrund werden keine Probleme haben, Expeccos Aktionsdefinitionen und zusammengesetzte Aktionen zu verstehen.&lt;br /&gt;
&lt;br /&gt;
=== Relation zu Petrinetzen ===&lt;br /&gt;
Ein Petri-Netz [https://de.wikipedia.org/wiki/Petri-Netz (siehe Wikipedia)] ist ein Netzwerk, das aus Knoten (&#039;&#039;Stellen&#039;&#039; oder auch &#039;&#039;Plätze&#039;&#039; genannt, mit möglicher Aktionsbehandlung) und Übergängen besteht. In klassischen Petri-Netzen bewegen sich anonyme Tokens entlang von Verbindungen. Übergänge kontrollieren das Auslösen (Triggern) der folgenden Aktionsschritte abhängig von der Ankunft von Tokens auf der Eingangsseite, und geben Tokens an die Ausgangsseite weiter.&lt;br /&gt;
&lt;br /&gt;
Expecco kombiniert die Übergangs- und Stellenfunktionalität in einem einzelnen Schrittelement um die grafische Representation dichter zu machen (und auch um eine Ähnlichkeit mit UML-2-Aktivitätsdiagrammen und anderen flussbasierten Diagrammen zu bekommen). Semantisch verhalten sie sich jedoch gleich und jedes Diagramm könnte mit separaten Elementen umgeschrieben werden (durch sammeln der Eingaben und Weitergabe eines Tupels mit Tokens an die Stelle).&lt;br /&gt;
&lt;br /&gt;
[[Datei:Beispiel.png]]&lt;br /&gt;
&lt;br /&gt;
Ein expecco-Schritt mit mehreren Eingabepins entspricht einem Petri-Netz-Übergang mit mehreren Eingaben gefolgt von einer Petri-Netz-Aktion. Wie bei einem Übergang in einem Petri-Netz kann die Eingangsseite eines Schrittes so konfiguriert werden, dass entweder irgendein Eingabewert oder alle Eingabewerte vorliegen müssen. In expecco wird das als &amp;quot;&#039;&#039;Aktivierungsbedingung&#039;&#039;&amp;quot; des Schritts bezeichnet und ist genauer in der [[DiagramElements-Step|Dokumentation zum Schritt]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;Höhere Petri-Netze&#039;&#039;&amp;quot; sind Petri-Netze, die andere Petri-Netze als Stellen enthalten, was in expecco genau den zusammengesetzten Aktionen entspricht.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;&#039;&#039;Farbige Petri-Netze&#039;&#039;&amp;quot; sind Petri-Netze, bei denen keine einfachen anonymen Tokens weitergereicht werden, sondern Datenobjekte (oder Referenzen darauf, wie in expecco).&lt;br /&gt;
&lt;br /&gt;
Deshalb sind expecco-Diagramme in Standard-Petri-Netz-Notation &amp;quot;&#039;&#039;Höhere farbige Petri-Netze&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Relation zu UML Aktivitätsdiagrammen ===&lt;br /&gt;
 --- to be written&lt;br /&gt;
&lt;br /&gt;
=== Relation zu Flussdiagrammen ===&lt;br /&gt;
Aktivitätsdiagramme können als Obermenge von Flussdiagrammen betrachtet werden. Dazu werden die Aktionen lediglich über Kontrollflussverbindungen (Trigger-in/Trigger-out) verbunden (Daten werden hierbei über Variablen ausgetauscht).&lt;br /&gt;
&lt;br /&gt;
Die Wenn-Dann bedingte Verzeigung eines Flussdiagramms entspricht einem 2-Wege-If Aktionsblock (aus der Standardbibliothek). Schleifen werden durch Verbindungen der Trigger-out mit einem Trigger-in eines vorhergehenden Schrittes definiert.&lt;br /&gt;
&lt;br /&gt;
== Editoren ==&lt;br /&gt;
The activity diagram which defines the behavior of a compound block&lt;br /&gt;
is edited in the [[CompoundBlock Editor-CompoundWorksheet Editor/en|&#039;&#039;network editor&#039;&#039;]], also called &amp;quot;&#039;&#039;diagram editor&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;network diagram editor&#039;&#039;&amp;quot;.&lt;br /&gt;
This editor presents the &amp;quot;internal view&amp;quot; of the block.&lt;br /&gt;
In contrast, the interface of an compound block (e.g. number and type of pins) can be regarded as its &amp;quot;external view&amp;quot; and is presented and defined in the [[Scheme Editor/en|&#039;&#039;schema editor&#039;&#039;]].&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[Tree Elements | Tree Elements]]&lt;br /&gt;
&lt;br /&gt;
[[Block Element]], [[DiagramElements-Step/en|Schritt]], [[DiagramElements-Connection|Verbindung]],&lt;br /&gt;
[[ElementaryBlock_Element|Elementaraktion]], &lt;br /&gt;
&lt;br /&gt;
Zurück zur [[Online Documentation#Tree Elements|Online Documentation]].&lt;br /&gt;
&lt;br /&gt;
[[Category: Tree Elements]]&lt;br /&gt;
[[Category: Incomplete]]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=CompoundBlock_Element&amp;diff=29653</id>
		<title>CompoundBlock Element</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=CompoundBlock_Element&amp;diff=29653"/>
		<updated>2024-07-17T10:28:20Z</updated>

		<summary type="html">&lt;p&gt;Matilk: restructuring&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
Ein zusammengesetzter Aktionsblock (englisch &amp;quot;&#039;&#039;Compound Action&#039;&#039;&amp;quot;) beschreibt das Verhalten einer [[Block_Element|Aktion]] graphisch als Aktivitätsdiagramm. Diese Diagramme sind vergleichbar mit den [[#Relation_zu_UML_Aktivit.C3.A4tsdiagrammen|Datenflussdiagrammen]] wie in UML2.0 definiert. Sie haben außerdem viele Eigenschaften gemein mit [[#Relation_zu_Petrinetzen|Petrinetzen]]. Das Diagramm besteht aus Unteraktionen, welche als [[DiagramElements-Step|&#039;&#039;Schritte&#039;&#039;]] bezeichnet werden.&lt;br /&gt;
&lt;br /&gt;
Die Ausführung wird durch eine Kombination von Daten- und Kontrollflüssen gesteuert, die durch Verbindungen zwischen den Schritten übertragen werden:&lt;br /&gt;
* Als Datenfluss wird die Übergabe von Werten (Resultate, Messwerte, Objekte, Dokumente etc.) von einem Schritt zum nächsten bezeichnet. Ein Datenfluss läuft über Verbindungen vom [[DiagramElements-Pin#Output_Pin|Ausgangspin]] (Pin = &amp;quot;Stecker/Sockel&amp;quot;) eines Schritts zum [[DiagramElements-Pin#Input_Pin|Eingangspin]] eines anderen.&lt;br /&gt;
* Kontrollflüsse sind Informationen zum Endestatus eines Schrittes, die verwendet werden können, um die Aktion eines nächsten Schritts zu starten. Sie laufen über Verbindungen vom [[DiagramElements-Pin#Enable_Output_Pin|Trigger-Ausgang]] eines Schrittes zum [[DiagramElements-Pin#Enable_Input_Pin|Trigger-Eingang]] eines anderen.&lt;br /&gt;
Beide können die Ausführung eines Folgeschritts auslösen.&lt;br /&gt;
&lt;br /&gt;
== Diagrammelemente ==&lt;br /&gt;
Als &amp;quot;&#039;&#039;Diagrammelemente&#039;&#039;&amp;quot; werden die Bestandteile eines Aktivitätsdiagramms bezeichnet. Sie definieren das Verhalten des [[Compound Block|Zusammengesetzten Aktionsblocks]] und werden im [[Compound Network Editor|Netzwerkeditor]] bearbeitet.&lt;br /&gt;
&lt;br /&gt;
== Einführendes Beispiel eines Aktivitätsdiagramms ==&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel erläutert die Hauptkomponenten eines Aktivitätsdiagramms:&lt;br /&gt;
&lt;br /&gt;
[[Bild:diagram-elements.jpg|760px|Ein Aktivitätsdiagramm]]&lt;br /&gt;
&lt;br /&gt;
Das Diagramm beschreibt den Test einer E-Mail-Übertragung. Zuerst erzeugt der Schritt &amp;quot;Create Unique ID&amp;quot; eine sog. UUID und stellt diese an seinem Ausgangspin zur Verfügung. Diese UUID wird später gebraucht, um den korrekten Empfang der E-Mail zu verifizieren. Die UUID wird vom Schritt &amp;quot;Send E-Mail [SMTP]&amp;quot; empfangen, welcher eine E-Mail mittels dem SMTP Protokoll verschickt, und die UUID als Subject verwendet. Als nächstes sorgt der &amp;quot;Time [Delay]&amp;quot; Schritt für eine Verzögerung von 5 Sekunden (in denen die E-Mail übermittelt wird). Am Ende prüft der Schritt &amp;quot;Check for incoming Mail&amp;quot; ob eine E-Mail mit dem angegebenen Subject angekommen ist, wozu obige UUID gebraucht wird.&lt;br /&gt;
Der Test wird einen Fehler melden, falls eine solche E-Mail nicht gefunden wird.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie bitte, dass die graphische Darstellung des Diagramms im Grunde der UML-Notation entspricht. Allerdings werden um die Lesbarkeit zu erhöhen, und um wichtige Aspekte der Ausführung hervorzuheben einige Element etwas anders bzw. zusätzlich annotiert dargestellt. Insbesondere werden die Stereotypen der Pins durch unterschiedliche Pin-Darstellungen hervorgehoben, anstatt durch textuelle &amp;quot;&amp;lt;&amp;lt;stereotype&amp;gt;&amp;gt;&amp;quot;-labels, wie in UML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Originaltext: Die Definition des Aktivitätsdiagramms entspricht weitgehend der UML-Notation. Einzelne, für die Ausführung wichtige Eigenschaften werden allerdings graphisch hervorgehoben, wodurch sich das Bild im Detail von der UML-Notation leicht unterscheidet. Zum Beispiel werden die Trigger- und Puffer Eigenschaften der Pins durch verschiedene graphische Symbole angezeigt - zu diesen gibt es in der UML-Notation kein Gegenstück, da die UML-Notation derlei semantische Details unbeachtet bzw. durch Benutzerspezifische, nicht standardisierte Stereotypdefinitionen offen lässt (Stand UML2.0).--&amp;gt;&lt;br /&gt;
=== [[DiagramElements-Step|Schritt]] (7) ===&lt;br /&gt;
&lt;br /&gt;
Als &amp;quot;&#039;&#039;Schritt&#039;&#039;&amp;quot; wird eine Aktion (Aktionsbaustein) bezeichnet, welcher in ein Diagramm platziert wurde. Diese Aktion kann ihrerseits entweder ein sog. [[Elementary Block|Elementablock]] sein (wie z.B. &amp;quot;Create Unique ID&amp;quot;), welche ihre Aktion durch eine textuellen Programmcode definiert, oder wieder ein [[Compound Block|zusammengesetzter Block]] (wie z.B. &amp;quot;Check Incoming Mail&amp;quot;), welcher durch ein eigenes Aktivitätsdiagramm definiert wurde. Für das Diagrammnetzwerk in welches der Aktionsblock platziert wurde ist kein Unterschied im Verhalten sichtbar: ein Diagramm, welches einen Aktionsblock beinhaltet (d.h. einen Schritt enthält) sieht kein unterschiedliches Verhalten in Abhängigkeit der effektiven Realisierung seiner Schritte. Tatsächlich gibt es auch keine Unterschiede in der graphischen Darstellung, so dass es auch für den Entwickler eines zusammengesetzten Blocks keinen Unterschied macht (er muss nicht wissen, wie die Interna einer Aktion aufgebaut sind). Alle Schritte werden gleichermaßen durch die Verfügbarkeit von Eingangsdaten gestartet, führen ihre Bearbeitung durch, und liefern ihre Resultate an den Ausgangspins. Details zum Verhalten von Schritten sind in einem [[DiagramElements-Step | separaten Document]] nachzulesen.&lt;br /&gt;
&lt;br /&gt;
=== Autostart (1) ===&lt;br /&gt;
&lt;br /&gt;
Ein Schritt mit der Autostart Option wird automatisch gestartet, sobald das umgebende Netzwerk ausgeführt wird. Schritte ohne Autostart-Option werden lediglich ausgeführt, sobald Daten an den Eingangspins des Schrittes erscheinen. Autostart wird insbesondere für Schritte benötigt, welche keine Eingangspins haben, oder welche nicht durch einen Kontrollfluss gestartet werden. Auch Schritte, deren Eingang lediglich konstante Parameter darstellen müssen so gestartet werden. Im obigen Diagramm trifft dies für den linken &amp;quot;Create Unique ID&amp;quot; Schritt zu.&lt;br /&gt;
&lt;br /&gt;
Im Diagrammeditor werden Schritte mit Autostart mit einem speziellen Icon am linken oberen Rand dargestellt; falls Sie die Standard-UML-Notation bevorzugen, können Sie auch einen START-Block aus der Bibliothek verwenden und dessen Trigger-Ausgangspin mit dem zuerst auszuführenden Schritt verbinden.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Pin|Pin]] (3, 6, 9) ===&lt;br /&gt;
&lt;br /&gt;
[[DiagramElements-Pin|Pins]] dienen zur Weitergabe von Daten und Triggerinformationen zwischen Schritten. Diese Pins können entweder [[DiagramElements-Pin#Output Pin|Ausgangespins]] (3) sein, um Daten zu senden, oder [[DiagramElements-Pin#Input Pin|Eingangspins]] (9), um Daten zu empfangen. Weitere Pins dienen dazu besondere Situationen wie z.B. [[DiagramElements-Pin#Exception Output Pin|Ausnahmebehandlung]] zu melden. Im obigen Diagramm, ist der Exception-Ausgang des &amp;quot;Check Incoming Mail&amp;quot; Schritts mit dem Trigger-Eingang des &amp;quot;FAIL&amp;quot; Schrittes verbunden.&lt;br /&gt;
Kontrollflusspins (Trigger und Status) sind vertikal angeordnet, wohingegen Datenflüsse als horizontal Pins dargestellt werden.&lt;br /&gt;
Eingangspins sind immer oben oder links, Ausgangspins immer unten oder rechts angeordnet.&lt;br /&gt;
Pins werden entsprechend ihrem Verhalten leicht unterschiedlich dargestellt; insbesondere auf das Puffer- und Triggerverhalten wird durch ausgefüllt vs. nicht gefüllt hingewiesen, da diese wichtig sind für die Ausführung. Pins werden in einem [[DiagramElements-Pin | separaten Dokument]] detailliert beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Connection|Verbindung]] (4,8) ===&lt;br /&gt;
&lt;br /&gt;
Verbindungen dienen zum Weiterleiten von Daten oder Kontrollinformationen zu einem oder mehreren Eingangspins (eines oder mehrerer Folgeschritte).&lt;br /&gt;
Im Sinne von UML sind alle Verbindungen in expecco immer &amp;quot;Objektverbindungen&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Datenflussverbindung (4) ====&lt;br /&gt;
&lt;br /&gt;
Diese befördern Daten (-Objekte) von einem Ausgangspin zu einem Eingangspins eines Folgeschritts. Im obigen Beispiel sendet der erste Schritt die erzeugte UUID an zwei weitere Schritte.&lt;br /&gt;
Datenflusspins sind immer links und rechts angeordnet (horizontale Pins).&lt;br /&gt;
&lt;br /&gt;
==== Kontrollflussverbindung (8) ====&lt;br /&gt;
&lt;br /&gt;
Diese dienen dazu, die Ausführung unabhängig von Daten (aber abhängig von der Ausführung eines Schrittes) zu kontrollieren. Im Beispiel werden die Schritte rechts im Bild sequentiell ausgeführt, wozu der Triggerausgang eines Schrittes mit dem Triggereingang eines Folgeschrittes verbunden wurde.&lt;br /&gt;
Kontrollflusspins sind immer oben und unten angeordnet (vertikale Pins).&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Freeze Value|Freeze Value (Vorbelegungswert)]] (6) ===&lt;br /&gt;
&lt;br /&gt;
Eingangswerte eines Pins können mit einem statischen Wert vorbelegt werden (Konstante).&lt;br /&gt;
Im Beispiel sind der Text der E-Mail, die E-Mail-Adresse, die Wartezeit und auch die Fehlermeldung auf diese Weise &amp;quot;eingefroren&amp;quot;.&lt;br /&gt;
Ein vorbelegter Pin sollte typischerweise als nicht-triggernd und nicht-konsumierend (sogenannter &amp;quot;&#039;&#039;Parameterpin&#039;&#039;&amp;quot;) konfiguriert werden, wofür es einen besonderen Menüeintrag gibt (außerdem werden beim &amp;quot;&#039;&#039;Einfrieren&#039;&#039;&amp;quot; die Pins vom Editor automatisch als solche umdefiniert). Details zum Triggerverhalten und zum Konsumieren von Eingangswerten finden sie im Dokument: [[DiagramElements-Pin#Input Pin|&amp;quot;&#039;&#039;Verhalten von Eingangspins&#039;&#039;&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Freeze Value|Vorbelegung aus Umgebungsvariablen]] (5) ===&lt;br /&gt;
&lt;br /&gt;
Eingangswerte eines Pins können ebenfalls aus einer Variable gelesen werden. Diese Variablen werden in einer sogenannten &amp;quot;&#039;&#039;Variablenumgebung&#039;&#039;&amp;quot; bereit gestellt, welche im umgebenden zusammengesetzten Bausteinen oder der [[TestSuite Element|Testsuite]] definiert werden. Im obigen Beispiel werden der Name des E-Mail-Kontos sowie der E-Mail-Serverhost aus solchen Variablen gelesen (und entsprechende Einträge in der Variablenumgebung der Testsuite vorausgesetzt). Wie auch reguläre Vorbelegungen sollte der Pin als nicht-triggernd und nicht-konsumierend definiert werden (i.e. &amp;quot;&#039;&#039;Parameterpin&#039;&#039;&amp;quot;). Lesen Sie dazu ebenfalls das Kapitel [[DiagramElements-Pin#Input Pin|&amp;quot;&#039;&#039;Verhalten von Eingangspins&#039;&#039;&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Annotation|Annotation]] (2) ===&lt;br /&gt;
&lt;br /&gt;
Annotationen dienen dazu, Kommentare oder Zusatzinformationen für Entwickler oder Tester im Diagramm mit abzulegen. Möglich sind sowohl textuelle Annotation, als auch importierte Grafiken (Bilder im GIF-, JPEG- oder PNG-Format). Sie können auch dazu genutzt werden, um wichtige Teile des Diagramms farblich hervorzuheben, indem Sie eine leere Textannotation mit einer Hintergrundfarbe unter Teile ihres Diagramms legen.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Probe|Messfühler]] ===&lt;br /&gt;
&lt;br /&gt;
Messfühler (im obigen Diagramm nicht gezeigt) dienen dazu Pin-Werte aufzuzeichnen und/oder zu validieren. Messfühler bieten einen komfortablen und lesbaren Mechanismus um Werte auf ihre Gültigkeit zu prüfen.&lt;br /&gt;
&lt;br /&gt;
== Semantik ==&lt;br /&gt;
=== Relation zu IEC1131 ===&lt;br /&gt;
Expeccos Aktivitätsdiagramme ähneln stark den Funktionblöcken der IEC1131-3 FBD Sprache (siehe ua. [https://en.wikipedia.org/wiki/Function_block_diagram Wikipedia]).&lt;br /&gt;
Sowohl die grafische Darstellung als auch das Ausführungsverhalten sind vergleichbar. Ingenieure mit einem SPS Hintergrund werden keine Probleme haben, Expeccos Aktionsdefinitionen und zusammengesetzte Aktionen zu verstehen.&lt;br /&gt;
&lt;br /&gt;
=== Relation zu Petrinetzen ===&lt;br /&gt;
A Petri Net [http://en.wikipedia.org/wiki/Petri_net| -&amp;gt;Wikipedia] is a network consisting of places (with possible action processing) and transitions. In a classical petri net, anonymous tokens travel along connections and transitions control the firing (triggering) of following action steps depending on the arrival of tokens at their input side, and passing tokens to their output side. Expecco has combined the transition and place functionality into a single step item, in order to make the graphical representation more dense (and also for its similarity with UML-2 activity diagrams and other flow based diagrams). However, semantically, they behave the same, and any diagram could be rewritten by using separate items (collecting inputs and passing a tuple of tokens on to the place).&lt;br /&gt;
&lt;br /&gt;
[[Datei:Beispiel.png]]&lt;br /&gt;
&lt;br /&gt;
An expecco step with multiple input pins corresponds to a Petri Net transition with multiple inputs followed by a Petri Net action. Similar to transitions in a Petri Net, the input side of a step can be configured to require either any input or all input values to be present. In expecco, this is called the step&#039;s &amp;quot;&#039;&#039;trigger condition&#039;&#039;&amp;quot; and described in detail in the [[DiagramElements-Step|step documentation]].&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;Higher order Petri Nets&#039;&#039;&amp;quot; are Petri Nets containing other Petri Nets as places, which is exactly what a compound block is in expecco.&lt;br /&gt;
&amp;quot;&#039;&#039;Coloured Petri Nets&#039;&#039;&amp;quot; are Petri Nets where not simple anonymous tokens are passed around, but data objects (or references to them, as in expecco).&lt;br /&gt;
&lt;br /&gt;
Thus, in standard Petri Net notation, expecco&#039;s diagrams are therefore &amp;quot;&#039;&#039;higher ordered colored Petri Nets&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Relation zu UML Aktivitätsdiagrammen ===&lt;br /&gt;
 --- to be written&lt;br /&gt;
&lt;br /&gt;
=== Relation zu Flussdiagrammen ===&lt;br /&gt;
Aktivitätsdiagramme können als Obermenge von Flussdiagrammen betrachtet werden. Dazu werden die Aktionen lediglich über Kontrollflussverbindungen (Trigger-in/Trigger-out) verbunden (Daten werden hierbei über Variablen ausgetauscht).&lt;br /&gt;
&lt;br /&gt;
Die Wenn-Dann bedingte Verzeigung eines Flussdiagramms entspricht einem 2-Wege-If Aktionsblock (aus der Standardbibliothek). Schleifen werden durch Verbindungen der Trigger-out mit einem Trigger-in eines vorhergehenden Schrittes definiert.&lt;br /&gt;
&lt;br /&gt;
== Editoren ==&lt;br /&gt;
The activity diagram which defines the behavior of a compound block&lt;br /&gt;
is edited in the [[CompoundBlock Editor-CompoundWorksheet Editor/en|&#039;&#039;network editor&#039;&#039;]], also called &amp;quot;&#039;&#039;diagram editor&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;network diagram editor&#039;&#039;&amp;quot;.&lt;br /&gt;
This editor presents the &amp;quot;internal view&amp;quot; of the block.&lt;br /&gt;
In contrast, the interface of an compound block (e.g. number and type of pins) can be regarded as its &amp;quot;external view&amp;quot; and is presented and defined in the [[Scheme Editor/en|&#039;&#039;schema editor&#039;&#039;]].&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[Tree Elements | Tree Elements]]&lt;br /&gt;
&lt;br /&gt;
[[Block Element]], [[DiagramElements-Step/en|Schritt]], [[DiagramElements-Connection|Verbindung]],&lt;br /&gt;
[[ElementaryBlock_Element|Elementaraktion]], &lt;br /&gt;
&lt;br /&gt;
Zurück zur [[Online Documentation#Tree Elements|Online Documentation]].&lt;br /&gt;
&lt;br /&gt;
[[Category: Tree Elements]]&lt;br /&gt;
[[Category: Incomplete]]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=CompoundBlock_Element/en&amp;diff=29652</id>
		<title>CompoundBlock Element/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=CompoundBlock_Element/en&amp;diff=29652"/>
		<updated>2024-07-16T11:51:10Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Diagram Elements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Compound Action Block&#039;&#039;&amp;quot; describes an [[Block_Element/en|action]]&#039;s behavior with an activity diagram. The diagram is similar to [[#Relationship_to_UML_Activity_Diagrams|data flow diagrams]] as used in UML2.0 and also has many features in common with [[#Relationship_to_Petri_Nets|Petri Nets]]. The diagram consists of sub actions called [[DiagramElements-Step|&#039;&#039;steps&#039;&#039;]].&lt;br /&gt;
&lt;br /&gt;
The execution is controlled via a combination of data and control flows which are passed via inter-step connections:&lt;br /&gt;
&lt;br /&gt;
* Data flows are defined as values (results, measurement values, objects, documents etc.) being passed from one step to another. These flows are defined by interconnections from a step&#039;s [[DiagramElements-Pin#Output Pin|output pin]] to another step&#039;s [[DiagramElements-Pin#Input Pin|input pin]]. &lt;br /&gt;
&lt;br /&gt;
* Control flows are defined as &amp;quot;&#039;&#039;action finished&#039;&#039;&amp;quot; information being used to trigger another step&#039;s action. These flows are defined by interconnections from a step&#039;s [[DiagramElements-Pin#Enable_Output_Pin|&#039;&#039;Trigger Output Pin&#039;&#039;]] to another step&#039;s [[DiagramElements-Pin#Enable_Input_Pin|&#039;&#039;Trigger Input Pin&#039;&#039;]].&amp;lt;br&amp;gt;(these are also occasionally called &amp;quot;&#039;&#039;Enable Output Pin&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Enable Input Pin&#039;&#039;&amp;quot; in this documentation).&lt;br /&gt;
&lt;br /&gt;
Both can trigger the execution of a subsequent step.&lt;br /&gt;
&lt;br /&gt;
== Diagram Elements ==&lt;br /&gt;
Diagram elements are the elements in an activity diagram. They define the behavior of the [[Compound Block|compound action block]] and are manipulated in the [[Compound_Network_Editor/en|network editor]].&lt;br /&gt;
&lt;br /&gt;
== Introductory Activity Diagram Example ==&lt;br /&gt;
&lt;br /&gt;
The following example shows the major components of an activity diagram.&lt;br /&gt;
&lt;br /&gt;
[[Bild:diagram-elements.jpg|760px|An activity diagram]]&lt;br /&gt;
&lt;br /&gt;
The diagram models a test of an e-mail transmission:&lt;br /&gt;
* First, the step &amp;quot;Create Unique ID&amp;quot; creates a so-called [[Glossary/en#UUID_.28Universal_Unique_Identifier.29 |UUID]] (Universal Unique Identifier) at its output pin, which is used later to check whether the correct e-mail has arrived.&lt;br /&gt;
* The UUID is delivered to the step &amp;quot;Send E-Mail [SMTP]&amp;quot;, which sends an e-mail via SMTP ([https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol &amp;quot;Simple Mail Transfer Protocol&amp;quot;]) using the UUID as subject.&lt;br /&gt;
* Next, the &amp;quot;Time [Delay]&amp;quot; step waits for 5 seconds.&lt;br /&gt;
* Finally, &amp;quot;Check for incoming Mail&amp;quot; checks whether an e-mail has arrived with the given UUID as subject. If there is no such e-mail the test will fail.&lt;br /&gt;
&lt;br /&gt;
Notice that the definition of activity diagrams in expecco corresponds largely with the UML notation. However, to emphasize important aspects and to make the diagram easier to read, some elements differ slightly from the standard UML notation. Especially, pin stereotypes are rendered directly as different pin style instead of adding extra &amp;quot;&amp;lt;&amp;lt;stereotype&amp;gt;&amp;gt;&amp;quot; labels.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Originaltext: Die Definition des Aktivitätsdiagramms entspricht weitgehend der UML-Notation. Einzelne, für die Ausführung wichtige Eigenschaften werden allerdings graphisch hervorgehoben, wodurch sich das Bild im Detail von der UML-Notation leicht unterscheidet. Zum Beispiel werden die Trigger- und Puffer Eigenschaften der Pins durch verschiedene graphische Symbole angezeigt - zu diesen gibt es in der UML-Notation kein Gegenstück, da die UML-Notation derlei semantische Details unbeachtet bzw. durch Benutzerspezifische, nicht standardisierte Stereotypdefinitionen offen lässt (Stand UML2.0).--&amp;gt;&lt;br /&gt;
=== [[DiagramElements-Step|Step]] (7) ===&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;&#039;&#039;step&#039;&#039;&amp;quot; is a action block which is placed into an activity diagram. These blocks can be either [[Elementary Block|elementary blocks]] (such as &amp;quot;Create Unique ID&amp;quot;) which are defined by a piece of source code or [[Compound Block|compound blocks]] (such as &amp;quot;Check Incoming Mail&amp;quot;) which are defined by their own activity diagram. To the network where a block is placed, there is no difference in the behavior. The network which uses an action (i.e. places a step) does not need to know how the internals of the action are implemented. Actually, there is not even a visual difference in the diagram. All are triggered by the availability of input data, perform an operation, and generate results on their output(s). &lt;br /&gt;
&lt;br /&gt;
Steps are described in detail in a [[DiagramElements-Step | separate document]].&lt;br /&gt;
&lt;br /&gt;
=== Autostart (1) ===&lt;br /&gt;
&lt;br /&gt;
A step with autostart option will be triggered automatically, whenever the containing activity diagram network is executed. Without the autostart option, steps are only started when input data arrives at the step&#039;s input pin(s). Autostart is required for steps which have no input and are not triggered by a control flow connection. In the above diagram, this is the case for the leftmost &amp;quot;Create Unique ID&amp;quot; step.&lt;br /&gt;
&lt;br /&gt;
The diagram editor renders auto started blocks with a special icon at its top-left corner; if you prefer the standard UML notation, you can place a separate START block and connect its trigger pins.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Pin|Pin]] (3, 6, 9) ===&lt;br /&gt;
&lt;br /&gt;
[[DiagramElements-Pin|Pins]] are used to exchange data and trigger information between steps. &lt;br /&gt;
These pins can be [[DiagramElements-Pin#Output Pin|output pins]] (3) to send data or [[DiagramElements-Pin#Input Pin|input pins]] (9) to receive data. &lt;br /&gt;
Other pins are used for special tasks like [[DiagramElements-Pin#Exception Output Pin|exception handling]];&lt;br /&gt;
in the above diagram, the vertical exception output of the &amp;quot;Check Incoming Mail&amp;quot; step is connected to the trigger input of the &amp;quot;FAIL&amp;quot; notifying step.&lt;br /&gt;
&lt;br /&gt;
Control-flow pins (trigger and status) are oriented vertically, whereas data-flow pins are oriented horizontally.&lt;br /&gt;
Input pins are always located at the top or left, whereas output pins are located at the right or bottom.&lt;br /&gt;
&lt;br /&gt;
Pins are rendered according to their behavior during execution;&lt;br /&gt;
especially consuming vs. non-consuming input behaviour&lt;br /&gt;
and buffered vs. non-buffered output behavior &lt;br /&gt;
is drawn (filled vs. unfilled) to highlight these important facts. &lt;br /&gt;
&lt;br /&gt;
Pins are described in detail in a [[DiagramElements-Pin | separate document]].&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Connection|Connection]] (4,8) ===&lt;br /&gt;
&lt;br /&gt;
Connections are used to interconnect steps to pass data or control information from an output pin to one or more input pins.&lt;br /&gt;
In the UML sense, all connections are object connections.&lt;br /&gt;
&lt;br /&gt;
==== Data Flow Connection (4) ====&lt;br /&gt;
&lt;br /&gt;
These connections deliver data from a step&#039;s output pin to another step&#039;s input pin. In the example, the first step sends the generated UUID to two other steps.&lt;br /&gt;
Data flow pins are always located at the left and right of a step (horizontal pins), and the left pins are always inputs, whereas the right pins are always outputs.&lt;br /&gt;
&lt;br /&gt;
==== Control Flow Connection (8) ====&lt;br /&gt;
&lt;br /&gt;
These connections are used to control the execution order in an activity diagram. In the example the steps on the right are executed sequential.&lt;br /&gt;
Control flow pins are always located at the top and bottom of a step (vertical pins), and pins at the top are always inputs, whereas pins at the bottom are always outputs.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Freeze Value|Freeze Value]] (6) ===&lt;br /&gt;
&lt;br /&gt;
The data which is read by a pin can be &#039;&#039;frozen&#039;&#039; to a static value (constant). In the above example, the &amp;quot;message text&amp;quot;, the &amp;quot;e-mail address&amp;quot;, the &amp;quot;waiting time&amp;quot; and also the &amp;quot;failure message&amp;quot; are &#039;&#039;frozen&#039;&#039;.&lt;br /&gt;
A frozen pin should typically be configured to be non-triggering and non-consuming (so called &amp;quot;&#039;&#039;parameter pin&#039;&#039;&amp;quot;). For details on triggering and consumption of values, please read the chapter on [[DiagramElements-Pin#Input_Pin_Trigger_Attributes |&amp;quot;&#039;&#039;Input Pin Trigger Behavior&#039;&#039;&amp;quot;]] in the [[DiagramElements-Pin | &amp;quot;&#039;&#039;pin documentation&#039;&#039;&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Freeze Value|Environment Freeze Value]] (5) ===&lt;br /&gt;
&lt;br /&gt;
The data for a pin can also read from a variable. These can be defined in the environment of the compound block or the [[Testsuite Element|testsuite]]. In the example, the user name and the server are fetched from such variables. A frozen pin should typically be configured to be non-triggering and non-consuming (so called &amp;quot;&#039;&#039;parameter pin&#039;&#039;&amp;quot;). For details on triggering and consumption of values, please read the chapter on [[DiagramElements-Pin#Input Pin| &amp;quot;&#039;&#039;Input Pin Trigger Behavior&#039;&#039;&amp;quot;]] in the [[DiagramElements-Pin | &amp;quot;&#039;&#039;pin documentation&#039;&#039;&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Annotation|Annotation]] (2) ===&lt;br /&gt;
&lt;br /&gt;
In order to comment a diagram, or to place additional notes for developers and testers, annotations can be used. Annotations can be either text fields or imported graphics (GIF, JPEG or PNG images). You can highlight important parts of the diagram by using an empty text annotation with a non-white background color.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Probe|Probes]] ===&lt;br /&gt;
&lt;br /&gt;
Probes (not shown in the above diagram) allow for pin-values to be recorded and/or checked for being valid. Probes provide an easy to use and concise mechanism for value checking.&lt;br /&gt;
&lt;br /&gt;
== Semantics ==&lt;br /&gt;
&lt;br /&gt;
=== Relationship to IEC1131 Function Block Diagrams ===&lt;br /&gt;
Expecco&#039;s compound action block execution model has many similarities with [https://en.wikipedia.org/wiki/IEC_61131 IEC-61131-3] (also IEC-1131-3 or EN 61131-3) [https://en.wikipedia.org/wiki/Function_block_diagram Function Block Diagrams]&lt;br /&gt;
which is a wellknown standard in programmable logic controller programming.&lt;br /&gt;
&lt;br /&gt;
Input values are read initially, the step execution is controlled by data flow, and output values are written&lt;br /&gt;
at the end of the action&#039;s execution. However, differences exist in the data types, which are more polymorphic in expecco, and additional pin attributes (such as eg. mailbox pins).&lt;br /&gt;
&lt;br /&gt;
=== Relationship to Petri Nets ===&lt;br /&gt;
A Petri Net [http://en.wikipedia.org/wiki/Petri%20net (see Wikipedia)] is a network consisting of places (with possible action processing) and transitions. In a classical petri net, anonymous tokens travel along connections and transitions control the firing (triggering) of following action steps depending on the arrival of tokens at their input side, and passing tokens to their output side.&lt;br /&gt;
&lt;br /&gt;
Expecco has combined the transition and place functionality into a single step item, in order to make the graphical representation more dense (and also for its similarity with UML-2 activity diagrams and other flow based diagrams). However, semantically, they behave the same, and any diagram could be rewritten by using separate items (collecting inputs and passing a tuple of tokens on to the place).&lt;br /&gt;
&lt;br /&gt;
[[Datei:Beispiel.png]]&lt;br /&gt;
&lt;br /&gt;
An expecco step with multiple input pins corresponds to a Petri Net transition with multiple inputs followed by a Petri Net action. Similar to transitions in a Petri Net, the input side of a step can be configured to require either any input or all input values to be present. In expecco, this is called the step&#039;s &amp;quot;&#039;&#039;trigger condition&#039;&#039;&amp;quot; and described in detail in the [[DiagramElements-Step|step documentation]].&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;Higher order Petri Nets&#039;&#039;&amp;quot; are Petri Nets containing other Petri Nets as places, which is exactly what a compound block is in expecco.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;&#039;&#039;Coloured Petri Nets&#039;&#039;&amp;quot; are Petri Nets where not simple anonymous tokens are passed around, but data objects (or references to them, as in expecco).&lt;br /&gt;
&lt;br /&gt;
Thus, in standard Petri Net notation, expecco&#039;s diagrams are therefore &amp;quot;&#039;&#039;Higher Order Colored Petri Nets&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Relationship to UML Activity Diagrams ===&lt;br /&gt;
Compound actions in expecco are isomorph to UML activity diagrams with a particular predefined set of stereotypes for connections, pins and action steps. These stereotypes are hardcoded in expecco, and define the semantics of action triggering, queueing behaviour of data connections, and the optional parallel execution of steps. The graphical representation is slightly different, to replace the somewhat clumsy &amp;lt;&amp;lt;stereotype&amp;gt;&amp;gt; annotations by different pin images (filled/unfilled etc.). Also, all connections in expecco are object-connections, and all pins receive and generate objects as values.&lt;br /&gt;
&lt;br /&gt;
=== Relationship to Flow Chart Diagrams ===&lt;br /&gt;
Activity diagrams can also be seen as a superset of flow chart diagrams. Flow charts can be translated into an activity diagram in which only control flow connections are used. Vice versa: an activity diagram which uses only control flow connections and uses no parallelism can be translated back into a flow chart diagram.&lt;br /&gt;
&lt;br /&gt;
The if-then-else conditional branches of a traditional flow chart diagram correspond to the 2-way if action blocks of the expecco standard library. Loops are implemented by connecting a trigger output pin to a previous step&#039;s trigger input pin.&lt;br /&gt;
&lt;br /&gt;
== Editors ==&lt;br /&gt;
The activity diagram which defines the behavior of a compound block&lt;br /&gt;
is edited in the &amp;quot;[[CompoundBlock Editor-CompoundWorksheet Editor/en|&#039;&#039;Network editor&#039;&#039;]]&amp;quot;, also called &amp;quot;&#039;&#039;Diagram Editor&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Network Diagram Editor&#039;&#039;&amp;quot;.&lt;br /&gt;
This editor presents the &amp;quot;&#039;&#039;internal view&#039;&#039;&amp;quot; of the block.&lt;br /&gt;
In contrast, the interface of a compound block (e.g. number and type of pins) can be regarded as its &amp;quot;&#039;&#039;external view&#039;&#039;&amp;quot; and is presented and defined in the &amp;quot;[[Scheme Editor/en|&#039;&#039;Schema Editor&#039;&#039;]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
[[Tree Elements | Tree Elements]]&lt;br /&gt;
&lt;br /&gt;
[[Block Element]], [[DiagramElements-Step/en|Step]], [[DiagramElements-Connection|Connection]],&lt;br /&gt;
[[ElementaryBlock_Element|Elementary Action]], &lt;br /&gt;
&lt;br /&gt;
Back to [[Online Documentation#Tree Elements|Online Documentation]].&lt;br /&gt;
&lt;br /&gt;
[[Category: Tree Elements]]&lt;br /&gt;
[[Category: Incomplete]]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=CompoundBlock_Element&amp;diff=29651</id>
		<title>CompoundBlock Element</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=CompoundBlock_Element&amp;diff=29651"/>
		<updated>2024-07-16T11:50:33Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Diagrammelemente */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
Ein zusammengesetzter Aktionsblock (englisch &amp;quot;&#039;&#039;Compound Action&#039;&#039;&amp;quot;) beschreibt das Verhalten einer [[Block_Element|Aktion]] graphisch als Aktivitätsdiagramm. Diese Diagramme sind vergleichbar mit den [[#Relation_zu_UML_Aktivit.C3.A4tsdiagrammen|Datenflussdiagrammen]] wie in UML2.0 definiert. Sie haben außerdem viele Eigenschaften gemein mit [[#Relation_zu_Petrinetzen|Petrinetzen]]. Das Diagramm besteht aus Unteraktionen, welche als [[DiagramElements-Step|&#039;&#039;Schritte&#039;&#039;]] bezeichnet werden.&lt;br /&gt;
&lt;br /&gt;
Die Ausführung wird durch eine Kombination von Daten- und Kontrollflüssen gesteuert, die durch Verbindungen zwischen den Schritten übertragen werden:&lt;br /&gt;
* Als Datenfluss wird die Übergabe von Werten (Resultate, Messwerte, Objekte, Dokumente etc.) von einem Schritt zum nächsten bezeichnet. Ein Datenfluss läuft über Verbindungen vom [[DiagramElements-Pin#Output_Pin|Ausgangspin]] (Pin = &amp;quot;Stecker/Sockel&amp;quot;) eines Schritts zum [[DiagramElements-Pin#Input_Pin|Eingangspin]] eines anderen.&lt;br /&gt;
* Kontrollflüsse sind Informationen zum Endestatus eines Schrittes, die verwendet werden können, um die Aktion eines nächsten Schritts zu starten. Sie laufen über Verbindungen vom [[DiagramElements-Pin#Enable_Output_Pin|Trigger-Ausgang]] eines Schrittes zum [[DiagramElements-Pin#Enable_Input_Pin|Trigger-Eingang]] eines anderen.&lt;br /&gt;
Beide können die Ausführung eines Folgeschritts auslösen.&lt;br /&gt;
&lt;br /&gt;
== Diagrammelemente ==&lt;br /&gt;
Als &amp;quot;&#039;&#039;Diagrammelemente&#039;&#039;&amp;quot; werden die Bestandteile eines Aktivitätsdiagramms bezeichnet. Sie definieren das Verhalten des [[Compound Block|Zusammengesetzten Aktionsblocks]] und werden im [[Compound Network Editor|Netzwerkeditor]] bearbeitet.&lt;br /&gt;
&lt;br /&gt;
== Einführendes Beispiel eines Aktivitätsdiagramms ==&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel erläutert die Hauptkomponenten eines Aktivitätsdiagramms:&lt;br /&gt;
&lt;br /&gt;
[[Bild:diagram-elements.jpg|760px|Ein Aktivitätsdiagramm]]&lt;br /&gt;
&lt;br /&gt;
Das Diagramm beschreibt den Test einer E-Mail-Übertragung. Zuerst erzeugt der Schritt &amp;quot;Create Unique ID&amp;quot; eine sog. UUID und stellt diese an seinem Ausgangspin zur Verfügung. Diese UUID wird später gebraucht, um den korrekten Empfang der E-Mail zu verifizieren. Die UUID wird vom Schritt &amp;quot;Send E-Mail [SMTP]&amp;quot; empfangen, welcher eine E-Mail mittels dem SMTP Protokoll verschickt, und die UUID als Subject verwendet. Als nächstes sorgt der &amp;quot;Time [Delay]&amp;quot; Schritt für eine Verzögerung von 5 Sekunden (in denen die E-Mail übermittelt wird). Am Ende prüft der Schritt &amp;quot;Check for incoming Mail&amp;quot; ob eine E-Mail mit dem angegebenen Subject angekommen ist, wozu obige UUID gebraucht wird.&lt;br /&gt;
Der Test wird einen Fehler melden, falls eine solche E-Mail nicht gefunden wird.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie bitte, dass die graphische Darstellung des Diagramms im Grunde der UML-Notation entspricht. Allerdings werden um die Lesbarkeit zu erhöhen, und um wichtige Aspekte der Ausführung hervorzuheben einige Element etwas anders bzw. zusätzlich annotiert dargestellt. Insbesondere werden die Stereotypen der Pins durch unterschiedliche Pin-Darstellungen hervorgehoben, anstatt durch textuelle &amp;quot;&amp;lt;&amp;lt;stereotype&amp;gt;&amp;gt;&amp;quot;-labels, wie in UML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Originaltext: Die Definition des Aktivitätsdiagramms entspricht weitgehend der UML-Notation. Einzelne, für die Ausführung wichtige Eigenschaften werden allerdings graphisch hervorgehoben, wodurch sich das Bild im Detail von der UML-Notation leicht unterscheidet. Zum Beispiel werden die Trigger- und Puffer Eigenschaften der Pins durch verschiedene graphische Symbole angezeigt - zu diesen gibt es in der UML-Notation kein Gegenstück, da die UML-Notation derlei semantische Details unbeachtet bzw. durch Benutzerspezifische, nicht standardisierte Stereotypdefinitionen offen lässt (Stand UML2.0).--&amp;gt;&lt;br /&gt;
=== [[DiagramElements-Step|Schritt]] (7) ===&lt;br /&gt;
&lt;br /&gt;
Als &amp;quot;&#039;&#039;Schritt&#039;&#039;&amp;quot; wird eine Aktion (Aktionsbaustein) bezeichnet, welcher in ein Diagramm platziert wurde. Diese Aktion kann ihrerseits entweder ein sog. [[Elementary Block|Elementablock]] sein (wie z.B. &amp;quot;Create Unique ID&amp;quot;), welche ihre Aktion durch eine textuellen Programmcode definiert, oder wieder ein [[Compound Block|zusammengesetzter Block]] (wie z.B. &amp;quot;Check Incoming Mail&amp;quot;), welcher durch ein eigenes Aktivitätsdiagramm definiert wurde. Für das Diagrammnetzwerk in welches der Aktionsblock platziert wurde ist kein Unterschied im Verhalten sichtbar: ein Diagramm, welches einen Aktionsblock beinhaltet (d.h. einen Schritt enthält) sieht kein unterschiedliches Verhalten in Abhängigkeit der effektiven Realisierung seiner Schritte. Tatsächlich gibt es auch keine Unterschiede in der graphischen Darstellung, so dass es auch für den Entwickler eines zusammengesetzten Blocks keinen Unterschied macht (er muss nicht wissen, wie die Interna einer Aktion aufgebaut sind). Alle Schritte werden gleichermaßen durch die Verfügbarkeit von Eingangsdaten gestartet, führen ihre Bearbeitung durch, und liefern ihre Resultate an den Ausgangspins. Details zum Verhalten von Schritten sind in einem [[DiagramElements-Step | separaten Document]] nachzulesen.&lt;br /&gt;
&lt;br /&gt;
=== Autostart (1) ===&lt;br /&gt;
&lt;br /&gt;
Ein Schritt mit der Autostart Option wird automatisch gestartet, sobald das umgebende Netzwerk ausgeführt wird. Schritte ohne Autostart-Option werden lediglich ausgeführt, sobald Daten an den Eingangspins des Schrittes erscheinen. Autostart wird insbesondere für Schritte benötigt, welche keine Eingangspins haben, oder welche nicht durch einen Kontrollfluss gestartet werden. Auch Schritte, deren Eingang lediglich konstante Parameter darstellen müssen so gestartet werden. Im obigen Diagramm trifft dies für den linken &amp;quot;Create Unique ID&amp;quot; Schritt zu.&lt;br /&gt;
&lt;br /&gt;
Im Diagrammeditor werden Schritte mit Autostart mit einem speziellen Icon am linken oberen Rand dargestellt; falls Sie die Standard-UML-Notation bevorzugen, können Sie auch einen START-Block aus der Bibliothek verwenden und dessen Trigger-Ausgangspin mit dem zuerst auszuführenden Schritt verbinden.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Pin|Pin]] (3, 6, 9) ===&lt;br /&gt;
&lt;br /&gt;
[[DiagramElements-Pin|Pins]] dienen zur Weitergabe von Daten und Triggerinformationen zwischen Schritten. Diese Pins können entweder [[DiagramElements-Pin#Output Pin|Ausgangespins]] (3) sein, um Daten zu senden, oder [[DiagramElements-Pin#Input Pin|Eingangspins]] (9), um Daten zu empfangen. Weitere Pins dienen dazu besondere Situationen wie z.B. [[DiagramElements-Pin#Exception Output Pin|Ausnahmebehandlung]] zu melden. Im obigen Diagramm, ist der Exception-Ausgang des &amp;quot;Check Incoming Mail&amp;quot; Schritts mit dem Trigger-Eingang des &amp;quot;FAIL&amp;quot; Schrittes verbunden.&lt;br /&gt;
Kontrollflusspins (Trigger und Status) sind vertikal angeordnet, wohingegen Datenflüsse als horizontal Pins dargestellt werden.&lt;br /&gt;
Eingangspins sind immer oben oder links, Ausgangspins immer unten oder rechts angeordnet.&lt;br /&gt;
Pins werden entsprechend ihrem Verhalten leicht unterschiedlich dargestellt; insbesondere auf das Puffer- und Triggerverhalten wird durch ausgefüllt vs. nicht gefüllt hingewiesen, da diese wichtig sind für die Ausführung. Pins werden in einem [[DiagramElements-Pin | separaten Dokument]] detailliert beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Connection|Verbindung]] (4,8) ===&lt;br /&gt;
&lt;br /&gt;
Verbindungen dienen zum Weiterleiten von Daten oder Kontrollinformationen zu einem oder mehreren Eingangspins (eines oder mehrerer Folgeschritte).&lt;br /&gt;
Im Sinne von UML sind alle Verbindungen in expecco immer &amp;quot;Objektverbindungen&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Datenflussverbindung (4) ====&lt;br /&gt;
&lt;br /&gt;
Diese befördern Daten (-Objekte) von einem Ausgangspin zu einem Eingangspins eines Folgeschritts. Im obigen Beispiel sendet der erste Schritt die erzeugte UUID an zwei weitere Schritte.&lt;br /&gt;
Datenflusspins sind immer links und rechts angeordnet (horizontale Pins).&lt;br /&gt;
&lt;br /&gt;
==== Kontrollflussverbindung (8) ====&lt;br /&gt;
&lt;br /&gt;
Diese dienen dazu, die Ausführung unabhängig von Daten (aber abhängig von der Ausführung eines Schrittes) zu kontrollieren. Im Beispiel werden die Schritte rechts im Bild sequentiell ausgeführt, wozu der Triggerausgang eines Schrittes mit dem Triggereingang eines Folgeschrittes verbunden wurde.&lt;br /&gt;
Kontrollflusspins sind immer oben und unten angeordnet (vertikale Pins).&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Freeze Value|Freeze Value (Vorbelegungswert)]] (6) ===&lt;br /&gt;
&lt;br /&gt;
Eingangswerte eines Pins können mit einem statischen Wert vorbelegt werden (Konstante).&lt;br /&gt;
Im Beispiel sind der Text der E-Mail, die E-Mail-Adresse, die Wartezeit und auch die Fehlermeldung auf diese Weise &amp;quot;eingefroren&amp;quot;.&lt;br /&gt;
Ein vorbelegter Pin sollte typischerweise als nicht-triggernd und nicht-konsumierend (sogenannter &amp;quot;&#039;&#039;Parameterpin&#039;&#039;&amp;quot;) konfiguriert werden, wofür es einen besonderen Menüeintrag gibt (außerdem werden beim &amp;quot;&#039;&#039;Einfrieren&#039;&#039;&amp;quot; die Pins vom Editor automatisch als solche umdefiniert). Details zum Triggerverhalten und zum Konsumieren von Eingangswerten finden sie im Dokument: [[DiagramElements-Pin#Input Pin|&amp;quot;&#039;&#039;Verhalten von Eingangspins&#039;&#039;&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Freeze Value|Vorbelegung aus Umgebungsvariablen]] (5) ===&lt;br /&gt;
&lt;br /&gt;
Eingangswerte eines Pins können ebenfalls aus einer Variable gelesen werden. Diese Variablen werden in einer sogenannten &amp;quot;&#039;&#039;Variablenumgebung&#039;&#039;&amp;quot; bereit gestellt, welche im umgebenden zusammengesetzten Bausteinen oder der [[TestSuite Element|Testsuite]] definiert werden. Im obigen Beispiel werden der Name des E-Mail-Kontos sowie der E-Mail-Serverhost aus solchen Variablen gelesen (und entsprechende Einträge in der Variablenumgebung der Testsuite vorausgesetzt). Wie auch reguläre Vorbelegungen sollte der Pin als nicht-triggernd und nicht-konsumierend definiert werden (i.e. &amp;quot;&#039;&#039;Parameterpin&#039;&#039;&amp;quot;). Lesen Sie dazu ebenfalls das Kapitel [[DiagramElements-Pin#Input Pin|&amp;quot;&#039;&#039;Verhalten von Eingangspins&#039;&#039;&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Annotation|Annotation]] (2) ===&lt;br /&gt;
&lt;br /&gt;
Annotationen dienen dazu, Kommentare oder Zusatzinformationen für Entwickler oder Tester im Diagramm mit abzulegen. Möglich sind sowohl textuelle Annotation, als auch importierte Grafiken (Bilder im GIF-, JPEG- oder PNG-Format). Sie können auch dazu genutzt werden, um wichtige Teile des Diagramms farblich hervorzuheben, indem Sie eine leere Textannotation mit einer Hintergrundfarbe unter Teile ihres Diagramms legen.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Probe|Messfühler]] ===&lt;br /&gt;
&lt;br /&gt;
Messfühler (im obigen Diagramm nicht gezeigt) dienen dazu Pin-Werte aufzuzeichnen und/oder zu validieren. Messfühler bieten einen komfortablen und lesbaren Mechanismus um Werte auf ihre Gültigkeit zu prüfen.&lt;br /&gt;
&lt;br /&gt;
== Relation zu IEC1131 ==&lt;br /&gt;
Expeccos Aktivitätsdiagramme ähneln stark den Funktionblöcken der IEC1131-3 FBD Sprache (siehe ua. [https://en.wikipedia.org/wiki/Function_block_diagram Wikipedia]).&lt;br /&gt;
Sowohl die grafische Darstellung als auch das Ausführungsverhalten sind vergleichbar. Ingenieure mit einem SPS Hintergrund werden keine Probleme haben, Expeccos Aktionsdefinitionen und zusammengesetzte Aktionen zu verstehen.&lt;br /&gt;
&lt;br /&gt;
== Relation zu Petrinetzen ==&lt;br /&gt;
A Petri Net [http://en.wikipedia.org/wiki/Petri_net| -&amp;gt;Wikipedia] is a network consisting of places (with possible action processing) and transitions. In a classical petri net, anonymous tokens travel along connections and transitions control the firing (triggering) of following action steps depending on the arrival of tokens at their input side, and passing tokens to their output side. Expecco has combined the transition and place functionality into a single step item, in order to make the graphical representation more dense (and also for its similarity with UML-2 activity diagrams and other flow based diagrams). However, semantically, they behave the same, and any diagram could be rewritten by using separate items (collecting inputs and passing a tuple of tokens on to the place).&lt;br /&gt;
&lt;br /&gt;
[[Datei:Beispiel.png]]&lt;br /&gt;
&lt;br /&gt;
An expecco step with multiple input pins corresponds to a Petri Net transition with multiple inputs followed by a Petri Net action. Similar to transitions in a Petri Net, the input side of a step can be configured to require either any input or all input values to be present. In expecco, this is called the step&#039;s &amp;quot;&#039;&#039;trigger condition&#039;&#039;&amp;quot; and described in detail in the [[DiagramElements-Step|step documentation]].&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;Higher order Petri Nets&#039;&#039;&amp;quot; are Petri Nets containing other Petri Nets as places, which is exactly what a compound block is in expecco.&lt;br /&gt;
&amp;quot;&#039;&#039;Coloured Petri Nets&#039;&#039;&amp;quot; are Petri Nets where not simple anonymous tokens are passed around, but data objects (or references to them, as in expecco).&lt;br /&gt;
&lt;br /&gt;
Thus, in standard Petri Net notation, expecco&#039;s diagrams are therefore &amp;quot;&#039;&#039;higher ordered colored Petri Nets&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Relation zu UML Aktivitätsdiagrammen ==&lt;br /&gt;
 --- to be written&lt;br /&gt;
&lt;br /&gt;
== Relation zu Flussdiagrammen ==&lt;br /&gt;
Aktivitätsdiagramme können als Obermenge von Flussdiagrammen betrachtet werden. Dazu werden die Aktionen lediglich über Kontrollflussverbindungen (Trigger-in/Trigger-out) verbunden (Daten werden hierbei über Variablen ausgetauscht).&lt;br /&gt;
&lt;br /&gt;
Die Wenn-Dann bedingte Verzeigung eines Flussdiagramms entspricht einem 2-Wege-If Aktionsblock (aus der Standardbibliothek). Schleifen werden durch Verbindungen der Trigger-out mit einem Trigger-in eines vorhergehenden Schrittes definiert.&lt;br /&gt;
&lt;br /&gt;
== Editoren ==&lt;br /&gt;
The activity diagram which defines the behavior of a compound block&lt;br /&gt;
is edited in the [[CompoundBlock Editor-CompoundWorksheet Editor/en|&#039;&#039;network editor&#039;&#039;]], also called &amp;quot;&#039;&#039;diagram editor&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;network diagram editor&#039;&#039;&amp;quot;.&lt;br /&gt;
This editor presents the &amp;quot;internal view&amp;quot; of the block.&lt;br /&gt;
In contrast, the interface of an compound block (e.g. number and type of pins) can be regarded as its &amp;quot;external view&amp;quot; and is presented and defined in the [[Scheme Editor/en|&#039;&#039;schema editor&#039;&#039;]].&lt;br /&gt;
&lt;br /&gt;
[[Category: Tree Elements]]&lt;br /&gt;
[[Category: Incomplete]]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=CompoundBlock_Element/en&amp;diff=29650</id>
		<title>CompoundBlock Element/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=CompoundBlock_Element/en&amp;diff=29650"/>
		<updated>2024-07-16T10:56:23Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Compound Action Block&#039;&#039;&amp;quot; describes an [[Block_Element/en|action]]&#039;s behavior with an activity diagram. The diagram is similar to [[#Relationship_to_UML_Activity_Diagrams|data flow diagrams]] as used in UML2.0 and also has many features in common with [[#Relationship_to_Petri_Nets|Petri Nets]]. The diagram consists of sub actions called [[DiagramElements-Step|&#039;&#039;steps&#039;&#039;]].&lt;br /&gt;
&lt;br /&gt;
The execution is controlled via a combination of data and control flows which are passed via inter-step connections:&lt;br /&gt;
&lt;br /&gt;
* Data flows are defined as values (results, measurement values, objects, documents etc.) being passed from one step to another. These flows are defined by interconnections from a step&#039;s [[DiagramElements-Pin#Output Pin|output pin]] to another step&#039;s [[DiagramElements-Pin#Input Pin|input pin]]. &lt;br /&gt;
&lt;br /&gt;
* Control flows are defined as &amp;quot;&#039;&#039;action finished&#039;&#039;&amp;quot; information being used to trigger another step&#039;s action. These flows are defined by interconnections from a step&#039;s [[DiagramElements-Pin#Enable_Output_Pin|&#039;&#039;Trigger Output Pin&#039;&#039;]] to another step&#039;s [[DiagramElements-Pin#Enable_Input_Pin|&#039;&#039;Trigger Input Pin&#039;&#039;]].&amp;lt;br&amp;gt;(these are also occasionally called &amp;quot;&#039;&#039;Enable Output Pin&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Enable Input Pin&#039;&#039;&amp;quot; in this documentation).&lt;br /&gt;
&lt;br /&gt;
Both can trigger the execution of a subsequent step.&lt;br /&gt;
&lt;br /&gt;
== Diagram Elements ==&lt;br /&gt;
Diagram elements are the elements in an activity diagram. They define the behavior of the [[Compound Block|compound action block]] and are manipulated in the [[Network Editor/en|network editor]].&lt;br /&gt;
&lt;br /&gt;
== Introductory Activity Diagram Example ==&lt;br /&gt;
&lt;br /&gt;
The following example shows the major components of an activity diagram.&lt;br /&gt;
&lt;br /&gt;
[[Bild:diagram-elements.jpg|760px|An activity diagram]]&lt;br /&gt;
&lt;br /&gt;
The diagram models a test of an e-mail transmission:&lt;br /&gt;
* First, the step &amp;quot;Create Unique ID&amp;quot; creates a so-called [[Glossary/en#UUID_.28Universal_Unique_Identifier.29 |UUID]] (Universal Unique Identifier) at its output pin, which is used later to check whether the correct e-mail has arrived.&lt;br /&gt;
* The UUID is delivered to the step &amp;quot;Send E-Mail [SMTP]&amp;quot;, which sends an e-mail via SMTP ([https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol &amp;quot;Simple Mail Transfer Protocol&amp;quot;]) using the UUID as subject.&lt;br /&gt;
* Next, the &amp;quot;Time [Delay]&amp;quot; step waits for 5 seconds.&lt;br /&gt;
* Finally, &amp;quot;Check for incoming Mail&amp;quot; checks whether an e-mail has arrived with the given UUID as subject. If there is no such e-mail the test will fail.&lt;br /&gt;
&lt;br /&gt;
Notice that the definition of activity diagrams in expecco corresponds largely with the UML notation. However, to emphasize important aspects and to make the diagram easier to read, some elements differ slightly from the standard UML notation. Especially, pin stereotypes are rendered directly as different pin style instead of adding extra &amp;quot;&amp;lt;&amp;lt;stereotype&amp;gt;&amp;gt;&amp;quot; labels.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Originaltext: Die Definition des Aktivitätsdiagramms entspricht weitgehend der UML-Notation. Einzelne, für die Ausführung wichtige Eigenschaften werden allerdings graphisch hervorgehoben, wodurch sich das Bild im Detail von der UML-Notation leicht unterscheidet. Zum Beispiel werden die Trigger- und Puffer Eigenschaften der Pins durch verschiedene graphische Symbole angezeigt - zu diesen gibt es in der UML-Notation kein Gegenstück, da die UML-Notation derlei semantische Details unbeachtet bzw. durch Benutzerspezifische, nicht standardisierte Stereotypdefinitionen offen lässt (Stand UML2.0).--&amp;gt;&lt;br /&gt;
=== [[DiagramElements-Step|Step]] (7) ===&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;&#039;&#039;step&#039;&#039;&amp;quot; is a action block which is placed into an activity diagram. These blocks can be either [[Elementary Block|elementary blocks]] (such as &amp;quot;Create Unique ID&amp;quot;) which are defined by a piece of source code or [[Compound Block|compound blocks]] (such as &amp;quot;Check Incoming Mail&amp;quot;) which are defined by their own activity diagram. To the network where a block is placed, there is no difference in the behavior. The network which uses an action (i.e. places a step) does not need to know how the internals of the action are implemented. Actually, there is not even a visual difference in the diagram. All are triggered by the availability of input data, perform an operation, and generate results on their output(s). &lt;br /&gt;
&lt;br /&gt;
Steps are described in detail in a [[DiagramElements-Step | separate document]].&lt;br /&gt;
&lt;br /&gt;
=== Autostart (1) ===&lt;br /&gt;
&lt;br /&gt;
A step with autostart option will be triggered automatically, whenever the containing activity diagram network is executed. Without the autostart option, steps are only started when input data arrives at the step&#039;s input pin(s). Autostart is required for steps which have no input and are not triggered by a control flow connection. In the above diagram, this is the case for the leftmost &amp;quot;Create Unique ID&amp;quot; step.&lt;br /&gt;
&lt;br /&gt;
The diagram editor renders auto started blocks with a special icon at its top-left corner; if you prefer the standard UML notation, you can place a separate START block and connect its trigger pins.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Pin|Pin]] (3, 6, 9) ===&lt;br /&gt;
&lt;br /&gt;
[[DiagramElements-Pin|Pins]] are used to exchange data and trigger information between steps. &lt;br /&gt;
These pins can be [[DiagramElements-Pin#Output Pin|output pins]] (3) to send data or [[DiagramElements-Pin#Input Pin|input pins]] (9) to receive data. &lt;br /&gt;
Other pins are used for special tasks like [[DiagramElements-Pin#Exception Output Pin|exception handling]];&lt;br /&gt;
in the above diagram, the vertical exception output of the &amp;quot;Check Incoming Mail&amp;quot; step is connected to the trigger input of the &amp;quot;FAIL&amp;quot; notifying step.&lt;br /&gt;
&lt;br /&gt;
Control-flow pins (trigger and status) are oriented vertically, whereas data-flow pins are oriented horizontally.&lt;br /&gt;
Input pins are always located at the top or left, whereas output pins are located at the right or bottom.&lt;br /&gt;
&lt;br /&gt;
Pins are rendered according to their behavior during execution;&lt;br /&gt;
especially consuming vs. non-consuming input behaviour&lt;br /&gt;
and buffered vs. non-buffered output behavior &lt;br /&gt;
is drawn (filled vs. unfilled) to highlight these important facts. &lt;br /&gt;
&lt;br /&gt;
Pins are described in detail in a [[DiagramElements-Pin | separate document]].&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Connection|Connection]] (4,8) ===&lt;br /&gt;
&lt;br /&gt;
Connections are used to interconnect steps to pass data or control information from an output pin to one or more input pins.&lt;br /&gt;
In the UML sense, all connections are object connections.&lt;br /&gt;
&lt;br /&gt;
==== Data Flow Connection (4) ====&lt;br /&gt;
&lt;br /&gt;
These connections deliver data from a step&#039;s output pin to another step&#039;s input pin. In the example, the first step sends the generated UUID to two other steps.&lt;br /&gt;
Data flow pins are always located at the left and right of a step (horizontal pins), and the left pins are always inputs, whereas the right pins are always outputs.&lt;br /&gt;
&lt;br /&gt;
==== Control Flow Connection (8) ====&lt;br /&gt;
&lt;br /&gt;
These connections are used to control the execution order in an activity diagram. In the example the steps on the right are executed sequential.&lt;br /&gt;
Control flow pins are always located at the top and bottom of a step (vertical pins), and pins at the top are always inputs, whereas pins at the bottom are always outputs.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Freeze Value|Freeze Value]] (6) ===&lt;br /&gt;
&lt;br /&gt;
The data which is read by a pin can be &#039;&#039;frozen&#039;&#039; to a static value (constant). In the above example, the &amp;quot;message text&amp;quot;, the &amp;quot;e-mail address&amp;quot;, the &amp;quot;waiting time&amp;quot; and also the &amp;quot;failure message&amp;quot; are &#039;&#039;frozen&#039;&#039;.&lt;br /&gt;
A frozen pin should typically be configured to be non-triggering and non-consuming (so called &amp;quot;&#039;&#039;parameter pin&#039;&#039;&amp;quot;). For details on triggering and consumption of values, please read the chapter on [[DiagramElements-Pin#Input_Pin_Trigger_Attributes |&amp;quot;&#039;&#039;Input Pin Trigger Behavior&#039;&#039;&amp;quot;]] in the [[DiagramElements-Pin | &amp;quot;&#039;&#039;pin documentation&#039;&#039;&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Freeze Value|Environment Freeze Value]] (5) ===&lt;br /&gt;
&lt;br /&gt;
The data for a pin can also read from a variable. These can be defined in the environment of the compound block or the [[Testsuite Element|testsuite]]. In the example, the user name and the server are fetched from such variables. A frozen pin should typically be configured to be non-triggering and non-consuming (so called &amp;quot;&#039;&#039;parameter pin&#039;&#039;&amp;quot;). For details on triggering and consumption of values, please read the chapter on [[DiagramElements-Pin#Input Pin| &amp;quot;&#039;&#039;Input Pin Trigger Behavior&#039;&#039;&amp;quot;]] in the [[DiagramElements-Pin | &amp;quot;&#039;&#039;pin documentation&#039;&#039;&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Annotation|Annotation]] (2) ===&lt;br /&gt;
&lt;br /&gt;
In order to comment a diagram, or to place additional notes for developers and testers, annotations can be used. Annotations can be either text fields or imported graphics (GIF, JPEG or PNG images). You can highlight important parts of the diagram by using an empty text annotation with a non-white background color.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Probe|Probes]] ===&lt;br /&gt;
&lt;br /&gt;
Probes (not shown in the above diagram) allow for pin-values to be recorded and/or checked for being valid. Probes provide an easy to use and concise mechanism for value checking.&lt;br /&gt;
&lt;br /&gt;
== Semantics ==&lt;br /&gt;
&lt;br /&gt;
=== Relationship to IEC1131 Function Block Diagrams ===&lt;br /&gt;
Expecco&#039;s compound action block execution model has many similarities with [https://en.wikipedia.org/wiki/IEC_61131 IEC-61131-3] (also IEC-1131-3 or EN 61131-3) [https://en.wikipedia.org/wiki/Function_block_diagram Function Block Diagrams]&lt;br /&gt;
which is a wellknown standard in programmable logic controller programming.&lt;br /&gt;
&lt;br /&gt;
Input values are read initially, the step execution is controlled by data flow, and output values are written&lt;br /&gt;
at the end of the action&#039;s execution. However, differences exist in the data types, which are more polymorphic in expecco, and additional pin attributes (such as eg. mailbox pins).&lt;br /&gt;
&lt;br /&gt;
=== Relationship to Petri Nets ===&lt;br /&gt;
A Petri Net [http://en.wikipedia.org/wiki/Petri%20net (see Wikipedia)] is a network consisting of places (with possible action processing) and transitions. In a classical petri net, anonymous tokens travel along connections and transitions control the firing (triggering) of following action steps depending on the arrival of tokens at their input side, and passing tokens to their output side.&lt;br /&gt;
&lt;br /&gt;
Expecco has combined the transition and place functionality into a single step item, in order to make the graphical representation more dense (and also for its similarity with UML-2 activity diagrams and other flow based diagrams). However, semantically, they behave the same, and any diagram could be rewritten by using separate items (collecting inputs and passing a tuple of tokens on to the place).&lt;br /&gt;
&lt;br /&gt;
[[Datei:Beispiel.png]]&lt;br /&gt;
&lt;br /&gt;
An expecco step with multiple input pins corresponds to a Petri Net transition with multiple inputs followed by a Petri Net action. Similar to transitions in a Petri Net, the input side of a step can be configured to require either any input or all input values to be present. In expecco, this is called the step&#039;s &amp;quot;&#039;&#039;trigger condition&#039;&#039;&amp;quot; and described in detail in the [[DiagramElements-Step|step documentation]].&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;Higher order Petri Nets&#039;&#039;&amp;quot; are Petri Nets containing other Petri Nets as places, which is exactly what a compound block is in expecco.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;&#039;&#039;Coloured Petri Nets&#039;&#039;&amp;quot; are Petri Nets where not simple anonymous tokens are passed around, but data objects (or references to them, as in expecco).&lt;br /&gt;
&lt;br /&gt;
Thus, in standard Petri Net notation, expecco&#039;s diagrams are therefore &amp;quot;&#039;&#039;Higher Order Colored Petri Nets&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Relationship to UML Activity Diagrams ===&lt;br /&gt;
Compound actions in expecco are isomorph to UML activity diagrams with a particular predefined set of stereotypes for connections, pins and action steps. These stereotypes are hardcoded in expecco, and define the semantics of action triggering, queueing behaviour of data connections, and the optional parallel execution of steps. The graphical representation is slightly different, to replace the somewhat clumsy &amp;lt;&amp;lt;stereotype&amp;gt;&amp;gt; annotations by different pin images (filled/unfilled etc.). Also, all connections in expecco are object-connections, and all pins receive and generate objects as values.&lt;br /&gt;
&lt;br /&gt;
=== Relationship to Flow Chart Diagrams ===&lt;br /&gt;
Activity diagrams can also be seen as a superset of flow chart diagrams. Flow charts can be translated into an activity diagram in which only control flow connections are used. Vice versa: an activity diagram which uses only control flow connections and uses no parallelism can be translated back into a flow chart diagram.&lt;br /&gt;
&lt;br /&gt;
The if-then-else conditional branches of a traditional flow chart diagram correspond to the 2-way if action blocks of the expecco standard library. Loops are implemented by connecting a trigger output pin to a previous step&#039;s trigger input pin.&lt;br /&gt;
&lt;br /&gt;
== Editors ==&lt;br /&gt;
The activity diagram which defines the behavior of a compound block&lt;br /&gt;
is edited in the &amp;quot;[[CompoundBlock Editor-CompoundWorksheet Editor/en|&#039;&#039;Network editor&#039;&#039;]]&amp;quot;, also called &amp;quot;&#039;&#039;Diagram Editor&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Network Diagram Editor&#039;&#039;&amp;quot;.&lt;br /&gt;
This editor presents the &amp;quot;&#039;&#039;internal view&#039;&#039;&amp;quot; of the block.&lt;br /&gt;
In contrast, the interface of a compound block (e.g. number and type of pins) can be regarded as its &amp;quot;&#039;&#039;external view&#039;&#039;&amp;quot; and is presented and defined in the &amp;quot;[[Scheme Editor/en|&#039;&#039;Schema Editor&#039;&#039;]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
[[Tree Elements | Tree Elements]]&lt;br /&gt;
&lt;br /&gt;
[[Block Element]], [[DiagramElements-Step/en|Step]], [[DiagramElements-Connection|Connection]],&lt;br /&gt;
[[ElementaryBlock_Element|Elementary Action]], &lt;br /&gt;
&lt;br /&gt;
Back to [[Online Documentation#Tree Elements|Online Documentation]].&lt;br /&gt;
&lt;br /&gt;
[[Category: Tree Elements]]&lt;br /&gt;
[[Category: Incomplete]]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=CompoundBlock_Element&amp;diff=29649</id>
		<title>CompoundBlock Element</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=CompoundBlock_Element&amp;diff=29649"/>
		<updated>2024-07-16T10:54:17Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Einführung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
Ein zusammengesetzter Aktionsblock (englisch &amp;quot;&#039;&#039;Compound Action&#039;&#039;&amp;quot;) beschreibt das Verhalten einer [[Block_Element|Aktion]] graphisch als Aktivitätsdiagramm. Diese Diagramme sind vergleichbar mit den [[#Relation_zu_UML_Aktivit.C3.A4tsdiagrammen|Datenflussdiagrammen]] wie in UML2.0 definiert. Sie haben außerdem viele Eigenschaften gemein mit [[#Relation_zu_Petrinetzen|Petrinetzen]]. Das Diagramm besteht aus Unteraktionen, welche als [[DiagramElements-Step|&#039;&#039;Schritte&#039;&#039;]] bezeichnet werden.&lt;br /&gt;
&lt;br /&gt;
Die Ausführung wird durch eine Kombination von Daten- und Kontrollflüssen gesteuert, die durch Verbindungen zwischen den Schritten übertragen werden:&lt;br /&gt;
* Als Datenfluss wird die Übergabe von Werten (Resultate, Messwerte, Objekte, Dokumente etc.) von einem Schritt zum nächsten bezeichnet. Ein Datenfluss läuft über Verbindungen vom [[DiagramElements-Pin#Output_Pin|Ausgangspin]] (Pin = &amp;quot;Stecker/Sockel&amp;quot;) eines Schritts zum [[DiagramElements-Pin#Input_Pin|Eingangspin]] eines anderen.&lt;br /&gt;
* Kontrollflüsse sind Informationen zum Endestatus eines Schrittes, die verwendet werden können, um die Aktion eines nächsten Schritts zu starten. Sie laufen über Verbindungen vom [[DiagramElements-Pin#Enable_Output_Pin|Trigger-Ausgang]] eines Schrittes zum [[DiagramElements-Pin#Enable_Input_Pin|Trigger-Eingang]] eines anderen.&lt;br /&gt;
Beide können die Ausführung eines Folgeschritts auslösen.&lt;br /&gt;
&lt;br /&gt;
== Diagrammelemente ==&lt;br /&gt;
Als &amp;quot;&#039;&#039;Diagrammelemente&#039;&#039;&amp;quot; werden die Bestandteile eines Aktivitätsdiagramms bezeichnet. Sie definieren das Verhalten des [[Compound Block|Zusammengesetzten Aktionsblocks]] und werden im [[Network Editor|Netzwerkeditor]] bearbeitet.&lt;br /&gt;
&lt;br /&gt;
== Einführendes Beispiel eines Aktivitätsdiagramms ==&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel erläutert die Hauptkomponenten eines Aktivitätsdiagramms:&lt;br /&gt;
&lt;br /&gt;
[[Bild:diagram-elements.jpg|760px|Ein Aktivitätsdiagramm]]&lt;br /&gt;
&lt;br /&gt;
Das Diagramm beschreibt den Test einer E-Mail-Übertragung. Zuerst erzeugt der Schritt &amp;quot;Create Unique ID&amp;quot; eine sog. UUID und stellt diese an seinem Ausgangspin zur Verfügung. Diese UUID wird später gebraucht, um den korrekten Empfang der E-Mail zu verifizieren. Die UUID wird vom Schritt &amp;quot;Send E-Mail [SMTP]&amp;quot; empfangen, welcher eine E-Mail mittels dem SMTP Protokoll verschickt, und die UUID als Subject verwendet. Als nächstes sorgt der &amp;quot;Time [Delay]&amp;quot; Schritt für eine Verzögerung von 5 Sekunden (in denen die E-Mail übermittelt wird). Am Ende prüft der Schritt &amp;quot;Check for incoming Mail&amp;quot; ob eine E-Mail mit dem angegebenen Subject angekommen ist, wozu obige UUID gebraucht wird.&lt;br /&gt;
Der Test wird einen Fehler melden, falls eine solche E-Mail nicht gefunden wird.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie bitte, dass die graphische Darstellung des Diagramms im Grunde der UML-Notation entspricht. Allerdings werden um die Lesbarkeit zu erhöhen, und um wichtige Aspekte der Ausführung hervorzuheben einige Element etwas anders bzw. zusätzlich annotiert dargestellt. Insbesondere werden die Stereotypen der Pins durch unterschiedliche Pin-Darstellungen hervorgehoben, anstatt durch textuelle &amp;quot;&amp;lt;&amp;lt;stereotype&amp;gt;&amp;gt;&amp;quot;-labels, wie in UML.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Originaltext: Die Definition des Aktivitätsdiagramms entspricht weitgehend der UML-Notation. Einzelne, für die Ausführung wichtige Eigenschaften werden allerdings graphisch hervorgehoben, wodurch sich das Bild im Detail von der UML-Notation leicht unterscheidet. Zum Beispiel werden die Trigger- und Puffer Eigenschaften der Pins durch verschiedene graphische Symbole angezeigt - zu diesen gibt es in der UML-Notation kein Gegenstück, da die UML-Notation derlei semantische Details unbeachtet bzw. durch Benutzerspezifische, nicht standardisierte Stereotypdefinitionen offen lässt (Stand UML2.0).--&amp;gt;&lt;br /&gt;
=== [[DiagramElements-Step|Schritt]] (7) ===&lt;br /&gt;
&lt;br /&gt;
Als &amp;quot;&#039;&#039;Schritt&#039;&#039;&amp;quot; wird eine Aktion (Aktionsbaustein) bezeichnet, welcher in ein Diagramm platziert wurde. Diese Aktion kann ihrerseits entweder ein sog. [[Elementary Block|Elementablock]] sein (wie z.B. &amp;quot;Create Unique ID&amp;quot;), welche ihre Aktion durch eine textuellen Programmcode definiert, oder wieder ein [[Compound Block|zusammengesetzter Block]] (wie z.B. &amp;quot;Check Incoming Mail&amp;quot;), welcher durch ein eigenes Aktivitätsdiagramm definiert wurde. Für das Diagrammnetzwerk in welches der Aktionsblock platziert wurde ist kein Unterschied im Verhalten sichtbar: ein Diagramm, welches einen Aktionsblock beinhaltet (d.h. einen Schritt enthält) sieht kein unterschiedliches Verhalten in Abhängigkeit der effektiven Realisierung seiner Schritte. Tatsächlich gibt es auch keine Unterschiede in der graphischen Darstellung, so dass es auch für den Entwickler eines zusammengesetzten Blocks keinen Unterschied macht (er muss nicht wissen, wie die Interna einer Aktion aufgebaut sind). Alle Schritte werden gleichermaßen durch die Verfügbarkeit von Eingangsdaten gestartet, führen ihre Bearbeitung durch, und liefern ihre Resultate an den Ausgangspins. Details zum Verhalten von Schritten sind in einem [[DiagramElements-Step | separaten Document]] nachzulesen.&lt;br /&gt;
&lt;br /&gt;
=== Autostart (1) ===&lt;br /&gt;
&lt;br /&gt;
Ein Schritt mit der Autostart Option wird automatisch gestartet, sobald das umgebende Netzwerk ausgeführt wird. Schritte ohne Autostart-Option werden lediglich ausgeführt, sobald Daten an den Eingangspins des Schrittes erscheinen. Autostart wird insbesondere für Schritte benötigt, welche keine Eingangspins haben, oder welche nicht durch einen Kontrollfluss gestartet werden. Auch Schritte, deren Eingang lediglich konstante Parameter darstellen müssen so gestartet werden. Im obigen Diagramm trifft dies für den linken &amp;quot;Create Unique ID&amp;quot; Schritt zu.&lt;br /&gt;
&lt;br /&gt;
Im Diagrammeditor werden Schritte mit Autostart mit einem speziellen Icon am linken oberen Rand dargestellt; falls Sie die Standard-UML-Notation bevorzugen, können Sie auch einen START-Block aus der Bibliothek verwenden und dessen Trigger-Ausgangspin mit dem zuerst auszuführenden Schritt verbinden.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Pin|Pin]] (3, 6, 9) ===&lt;br /&gt;
&lt;br /&gt;
[[DiagramElements-Pin|Pins]] dienen zur Weitergabe von Daten und Triggerinformationen zwischen Schritten. Diese Pins können entweder [[DiagramElements-Pin#Output Pin|Ausgangespins]] (3) sein, um Daten zu senden, oder [[DiagramElements-Pin#Input Pin|Eingangspins]] (9), um Daten zu empfangen. Weitere Pins dienen dazu besondere Situationen wie z.B. [[DiagramElements-Pin#Exception Output Pin|Ausnahmebehandlung]] zu melden. Im obigen Diagramm, ist der Exception-Ausgang des &amp;quot;Check Incoming Mail&amp;quot; Schritts mit dem Trigger-Eingang des &amp;quot;FAIL&amp;quot; Schrittes verbunden.&lt;br /&gt;
Kontrollflusspins (Trigger und Status) sind vertikal angeordnet, wohingegen Datenflüsse als horizontal Pins dargestellt werden.&lt;br /&gt;
Eingangspins sind immer oben oder links, Ausgangspins immer unten oder rechts angeordnet.&lt;br /&gt;
Pins werden entsprechend ihrem Verhalten leicht unterschiedlich dargestellt; insbesondere auf das Puffer- und Triggerverhalten wird durch ausgefüllt vs. nicht gefüllt hingewiesen, da diese wichtig sind für die Ausführung. Pins werden in einem [[DiagramElements-Pin | separaten Dokument]] detailliert beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Connection|Verbindung]] (4,8) ===&lt;br /&gt;
&lt;br /&gt;
Verbindungen dienen zum Weiterleiten von Daten oder Kontrollinformationen zu einem oder mehreren Eingangspins (eines oder mehrerer Folgeschritte).&lt;br /&gt;
Im Sinne von UML sind alle Verbindungen in expecco immer &amp;quot;Objektverbindungen&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Datenflussverbindung (4) ====&lt;br /&gt;
&lt;br /&gt;
Diese befördern Daten (-Objekte) von einem Ausgangspin zu einem Eingangspins eines Folgeschritts. Im obigen Beispiel sendet der erste Schritt die erzeugte UUID an zwei weitere Schritte.&lt;br /&gt;
Datenflusspins sind immer links und rechts angeordnet (horizontale Pins).&lt;br /&gt;
&lt;br /&gt;
==== Kontrollflussverbindung (8) ====&lt;br /&gt;
&lt;br /&gt;
Diese dienen dazu, die Ausführung unabhängig von Daten (aber abhängig von der Ausführung eines Schrittes) zu kontrollieren. Im Beispiel werden die Schritte rechts im Bild sequentiell ausgeführt, wozu der Triggerausgang eines Schrittes mit dem Triggereingang eines Folgeschrittes verbunden wurde.&lt;br /&gt;
Kontrollflusspins sind immer oben und unten angeordnet (vertikale Pins).&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Freeze Value|Freeze Value (Vorbelegungswert)]] (6) ===&lt;br /&gt;
&lt;br /&gt;
Eingangswerte eines Pins können mit einem statischen Wert vorbelegt werden (Konstante).&lt;br /&gt;
Im Beispiel sind der Text der E-Mail, die E-Mail-Adresse, die Wartezeit und auch die Fehlermeldung auf diese Weise &amp;quot;eingefroren&amp;quot;.&lt;br /&gt;
Ein vorbelegter Pin sollte typischerweise als nicht-triggernd und nicht-konsumierend (sogenannter &amp;quot;&#039;&#039;Parameterpin&#039;&#039;&amp;quot;) konfiguriert werden, wofür es einen besonderen Menüeintrag gibt (außerdem werden beim &amp;quot;&#039;&#039;Einfrieren&#039;&#039;&amp;quot; die Pins vom Editor automatisch als solche umdefiniert). Details zum Triggerverhalten und zum Konsumieren von Eingangswerten finden sie im Dokument: [[DiagramElements-Pin#Input Pin|&amp;quot;&#039;&#039;Verhalten von Eingangspins&#039;&#039;&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Freeze Value|Vorbelegung aus Umgebungsvariablen]] (5) ===&lt;br /&gt;
&lt;br /&gt;
Eingangswerte eines Pins können ebenfalls aus einer Variable gelesen werden. Diese Variablen werden in einer sogenannten &amp;quot;&#039;&#039;Variablenumgebung&#039;&#039;&amp;quot; bereit gestellt, welche im umgebenden zusammengesetzten Bausteinen oder der [[TestSuite Element|Testsuite]] definiert werden. Im obigen Beispiel werden der Name des E-Mail-Kontos sowie der E-Mail-Serverhost aus solchen Variablen gelesen (und entsprechende Einträge in der Variablenumgebung der Testsuite vorausgesetzt). Wie auch reguläre Vorbelegungen sollte der Pin als nicht-triggernd und nicht-konsumierend definiert werden (i.e. &amp;quot;&#039;&#039;Parameterpin&#039;&#039;&amp;quot;). Lesen Sie dazu ebenfalls das Kapitel [[DiagramElements-Pin#Input Pin|&amp;quot;&#039;&#039;Verhalten von Eingangspins&#039;&#039;&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Annotation|Annotation]] (2) ===&lt;br /&gt;
&lt;br /&gt;
Annotationen dienen dazu, Kommentare oder Zusatzinformationen für Entwickler oder Tester im Diagramm mit abzulegen. Möglich sind sowohl textuelle Annotation, als auch importierte Grafiken (Bilder im GIF-, JPEG- oder PNG-Format). Sie können auch dazu genutzt werden, um wichtige Teile des Diagramms farblich hervorzuheben, indem Sie eine leere Textannotation mit einer Hintergrundfarbe unter Teile ihres Diagramms legen.&lt;br /&gt;
&lt;br /&gt;
=== [[DiagramElements-Probe|Messfühler]] ===&lt;br /&gt;
&lt;br /&gt;
Messfühler (im obigen Diagramm nicht gezeigt) dienen dazu Pin-Werte aufzuzeichnen und/oder zu validieren. Messfühler bieten einen komfortablen und lesbaren Mechanismus um Werte auf ihre Gültigkeit zu prüfen.&lt;br /&gt;
&lt;br /&gt;
== Relation zu IEC1131 ==&lt;br /&gt;
Expeccos Aktivitätsdiagramme ähneln stark den Funktionblöcken der IEC1131-3 FBD Sprache (siehe ua. [https://en.wikipedia.org/wiki/Function_block_diagram Wikipedia]).&lt;br /&gt;
Sowohl die grafische Darstellung als auch das Ausführungsverhalten sind vergleichbar. Ingenieure mit einem SPS Hintergrund werden keine Probleme haben, Expeccos Aktionsdefinitionen und zusammengesetzte Aktionen zu verstehen.&lt;br /&gt;
&lt;br /&gt;
== Relation zu Petrinetzen ==&lt;br /&gt;
A Petri Net [http://en.wikipedia.org/wiki/Petri_net| -&amp;gt;Wikipedia] is a network consisting of places (with possible action processing) and transitions. In a classical petri net, anonymous tokens travel along connections and transitions control the firing (triggering) of following action steps depending on the arrival of tokens at their input side, and passing tokens to their output side. Expecco has combined the transition and place functionality into a single step item, in order to make the graphical representation more dense (and also for its similarity with UML-2 activity diagrams and other flow based diagrams). However, semantically, they behave the same, and any diagram could be rewritten by using separate items (collecting inputs and passing a tuple of tokens on to the place).&lt;br /&gt;
&lt;br /&gt;
[[Datei:Beispiel.png]]&lt;br /&gt;
&lt;br /&gt;
An expecco step with multiple input pins corresponds to a Petri Net transition with multiple inputs followed by a Petri Net action. Similar to transitions in a Petri Net, the input side of a step can be configured to require either any input or all input values to be present. In expecco, this is called the step&#039;s &amp;quot;&#039;&#039;trigger condition&#039;&#039;&amp;quot; and described in detail in the [[DiagramElements-Step|step documentation]].&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;Higher order Petri Nets&#039;&#039;&amp;quot; are Petri Nets containing other Petri Nets as places, which is exactly what a compound block is in expecco.&lt;br /&gt;
&amp;quot;&#039;&#039;Coloured Petri Nets&#039;&#039;&amp;quot; are Petri Nets where not simple anonymous tokens are passed around, but data objects (or references to them, as in expecco).&lt;br /&gt;
&lt;br /&gt;
Thus, in standard Petri Net notation, expecco&#039;s diagrams are therefore &amp;quot;&#039;&#039;higher ordered colored Petri Nets&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Relation zu UML Aktivitätsdiagrammen ==&lt;br /&gt;
 --- to be written&lt;br /&gt;
&lt;br /&gt;
== Relation zu Flussdiagrammen ==&lt;br /&gt;
Aktivitätsdiagramme können als Obermenge von Flussdiagrammen betrachtet werden. Dazu werden die Aktionen lediglich über Kontrollflussverbindungen (Trigger-in/Trigger-out) verbunden (Daten werden hierbei über Variablen ausgetauscht).&lt;br /&gt;
&lt;br /&gt;
Die Wenn-Dann bedingte Verzeigung eines Flussdiagramms entspricht einem 2-Wege-If Aktionsblock (aus der Standardbibliothek). Schleifen werden durch Verbindungen der Trigger-out mit einem Trigger-in eines vorhergehenden Schrittes definiert.&lt;br /&gt;
&lt;br /&gt;
== Editoren ==&lt;br /&gt;
The activity diagram which defines the behavior of a compound block&lt;br /&gt;
is edited in the [[CompoundBlock Editor-CompoundWorksheet Editor/en|&#039;&#039;network editor&#039;&#039;]], also called &amp;quot;&#039;&#039;diagram editor&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;network diagram editor&#039;&#039;&amp;quot;.&lt;br /&gt;
This editor presents the &amp;quot;internal view&amp;quot; of the block.&lt;br /&gt;
In contrast, the interface of an compound block (e.g. number and type of pins) can be regarded as its &amp;quot;external view&amp;quot; and is presented and defined in the [[Scheme Editor/en|&#039;&#039;schema editor&#039;&#039;]].&lt;br /&gt;
&lt;br /&gt;
[[Category: Tree Elements]]&lt;br /&gt;
[[Category: Incomplete]]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin/en&amp;diff=29634</id>
		<title>Mobile Testing Plugin/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin/en&amp;diff=29634"/>
		<updated>2024-07-11T09:37:37Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Windows */ new supplement&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile_Testing_Plugin|Deutsche Version]] | &#039;&#039;&#039;English Version&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
The &#039;&#039;Mobile Testing Plugin&#039;&#039; adds mechanisms to test and automate Android and iOS devices. This includes both real and emulated devices - it does not matter whether real mobile devices or emulated devices are used. The plugin can (and usually is) used in conjunction with the [[Expecco_GUI_Tests_Extension_Reference|GUI-Browser]], which supports the creation of tests. It can also be used to record test procedures.&lt;br /&gt;
&lt;br /&gt;
[http://appium.io/ Appium] is used to connect to the devices. Appium is a free open source framework for testing and automating mobile applications.&lt;br /&gt;
&lt;br /&gt;
We recommend to go through the [[Mobile_Testing_Tutorial/en|Tutorial]] to familiarize yourself with the Mobile Plugin. This tutorial leads step by step through the creation of a test case using an example and explains the necessary basics.&lt;br /&gt;
&lt;br /&gt;
= Installation and Setup =&lt;br /&gt;
To use the &#039;&#039;Mobile Testing Plugin&#039;&#039;, you must have installed expecco together with the corresponding plugin, and you need the appropriate licenses. expecco communicates with the mobile devices via an Appium server, which either runs on the same computer as expecco, or on a second computer. This must be accessible for expecco.&lt;br /&gt;
&lt;br /&gt;
== Installation Overview ==&lt;br /&gt;
&#039;&#039;&#039;Computer running expecco:&#039;&#039;&#039;&lt;br /&gt;
* Java JDK version 8, 9, 10 or 11&lt;br /&gt;
&#039;&#039;&#039;Computer connected to Android devices :&#039;&#039;&#039;&lt;br /&gt;
* Appium Server, you can install it via the Mobile Testing Supplement (see below), of which we regularly provide a new version&lt;br /&gt;
* Android SDK, you can also get it with the Mobile Testing Supplement&lt;br /&gt;
* Java JDK version 8, 9, 10 or 11&lt;br /&gt;
&#039;&#039;&#039;Computer connected to iOS devices&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
* Appium Server, you can install it via the Mobile Testing Supplement for MacOS (see below), of which we regularly provide a new version&lt;br /&gt;
* Xcode in a version that supports the iOS version used, available from the Apple App Store&lt;br /&gt;
* Java JDK version 8, 9, 10 or 11&lt;br /&gt;
* Apple Developer Certificate incl. matching private key (to sign the WebDriverAgent)&lt;br /&gt;
* Provisioning Profile for the mobile devices to be used&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; Please note that due to the requirements (no connection to non-Apple devices available) iOS devices can only be controlled from a Mac.&lt;br /&gt;
&lt;br /&gt;
Depending on the setup, the above-mentioned computers can also be the same device. expecco can either connect to a remote Appium Server and mobile devices connected to it via the network, or start an Appium Server locally itself and use it with local mobile devices. However, some of expecco&#039;s functions that make it easier to create test cases are only available if the mobile devices are connected to the same computer on which expecco is running. A possible setup may therefore look like the following figure:&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAufbau.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
The following explains how to install Appium and other necessary applications for Windows and Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
The easiest way is to install everything from our Mobile Testing Supplement. However, newer versions do not contain a JDK anymore due to a change in Oracle&#039;s license terms, so you have to install it additionally. Of course, you are free to install Appium directly to use the version you want. However, to then be able to start an Appium server with expecco, a suitable batch file must be available and specified in the [[Mobile_Testing_Plugin/en#Plugin_Configuration|settings]]. However, connections can also be established to other running Appium servers.&lt;br /&gt;
*&#039;&#039;&#039;expecco 24.1&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-24.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.3]&lt;br /&gt;
:Same versions as in the predecessor, but with updated chromedriver versions&lt;br /&gt;
*expecco 23.2: [https://download.exept.de/transfer/h-expecco-23.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.2]&lt;br /&gt;
:Same versions as in the predecessor, but with updated chromedriver versions&lt;br /&gt;
*expecco 23.1: [https://download.exept.de/transfer/h-expecco-23.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.1]&lt;br /&gt;
:Same versions as in the predecessor, but the installer now allows to add Appium to the Autostart.&lt;br /&gt;
*expecco 22.2 and 22.1: [https://download.exept.de/transfer/h-expecco-22.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.2.0]&lt;br /&gt;
:Appium 1.22.3*&lt;br /&gt;
:Node 14.17.5&lt;br /&gt;
:adb 1.0.41 from platform-tools 33.0.2&lt;br /&gt;
:&#039;&#039;* We added the capability&#039;&#039; startChromedriverTimeout &#039;&#039;to Appium, to get a timeout earlier, if Chromedriver cannot be initialized. (see [[#startChromedriverTimeout|Problems and Solutions]])&#039;&#039;&lt;br /&gt;
*expecco 21.2: [https://download.exept.de/transfer/h-expecco-21.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.12.0.0]&lt;br /&gt;
:Contains Appium version 1.22.0, Node still is version 12.13.1.&lt;br /&gt;
*expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.1.0]&lt;br /&gt;
:Only minor changes compared to the previous version.&lt;br /&gt;
*expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.0.0]&lt;br /&gt;
:Compared to the previous version, Appium was updated to version 1.16.0-rc.1 and node 12 is used. &lt;br /&gt;
*expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.8.1.0]&lt;br /&gt;
:This installs Appium in the version 1.12.0 and now additionally contains build-tools in the version 28.0.3 in the android-sdk. Apart from this, it is the same as the previous version.&lt;br /&gt;
*expecco 18.2: [http://download.exept.de/transfer/h-expecco-18.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.7.3.0]&lt;br /&gt;
:This installs Appium in the version 1.8.1. In addition, an installation of &#039;&#039;Android Debug Bridge&#039;&#039; and &#039;&#039;Google USB Driver&#039;&#039; ([https://gsmusbdrivers.com/download/adb-fastboot-drivers/ adb-setup-1.4.3]) is offered. This covers drivers for a broad range of Android devices, and you won&#039;t have to install an individual driver for each device. A &#039;&#039;&#039;JDK is not contained anymore (due to a change in Oracle&#039;s license terms)&#039;&#039;&#039;, you have to download it on your own, e.g. from [https://www.oracle.com/technetwork/java/javase/downloads/index.html Oracle].&lt;br /&gt;
*expecco 18.1: same procedure as for expecco 2.11&lt;br /&gt;
*expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/MobileTestingSupplement_1.6.0.2_Setup.exe Mobile Testing Supplement 1.6.0.2]&lt;br /&gt;
:This installs a Java JDK Version 8, android-sdk and Appium Version 1.6.4. The supplement also offers a universal adb driver ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]). This driver supports a wide range of Android Devise, and avoids the need to search for individual device-specific drivers.&lt;br /&gt;
*expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_1.5.0.0_Setup.exe Mobile Testing Supplement 1.5.0.0]&lt;br /&gt;
:It installs a Java JDK version 8, android-sdk and Appium version 1.4.16. During the installation the graphical user interface of Appium is started, you can close this window immediately. The supplement also offers a universal adb driver (ClockworkMod). This combines drivers for a wide range of Android devices so that you do not have to search for and install a separate driver for each device.&lt;br /&gt;
&lt;br /&gt;
If expecco has to use mobile devices that are connected to another computer, you have to start an Appium server there. You can do this by using the file &amp;lt;code&amp;gt;appium_standalone.cmd&amp;lt;/code&amp;gt;. The server is then started on default port 4723. If you want to use a different port number, start the server with&lt;br /&gt;
&lt;br /&gt;
 appium_standalone.cmd -p &amp;lt;portnummer&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The server is ready, as soon as the line&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Appium REST http interface listener started on 0.0.0.0:4723&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
is displayed, where you can read the used port number at the end.&lt;br /&gt;
&lt;br /&gt;
If your Android device is connected to a remote machine,&lt;br /&gt;
you may want to see the live screen locally using a tool like&lt;br /&gt;
[https://github.com/Genymobile/scrcpy scrcpy].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When Appium is started for the first time – either standalone or by expecco – it may happen that the Windows firewall blocks access to the node server. Allow the access or Appium cannot be started.&lt;br /&gt;
&lt;br /&gt;
== Mac OS ==&lt;br /&gt;
Note: the following can be ignored if you do not plan to test iOS (iPhone) devices. The Mac setup is not needed for Android devices.&lt;br /&gt;
&lt;br /&gt;
=== Xcode ===&lt;br /&gt;
Automation with iOS devices needs [https://developer.apple.com/xcode/ Xcode]. You can install it from the App Store. Please make sure that the version matches the tested iOS versions.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;iOS&#039;&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp;  &lt;br /&gt;
|&#039;&#039;&#039;Xcode&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;macOS&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|10.x&lt;br /&gt;
|8.x&lt;br /&gt;
|10.12 (Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|11.x&lt;br /&gt;
|9.x&lt;br /&gt;
|10.13 (High Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|12.x&lt;br /&gt;
|10.x&lt;br /&gt;
|10.14 (Mojave)&lt;br /&gt;
|-&lt;br /&gt;
|13.x&lt;br /&gt;
|11.x&lt;br /&gt;
|10.15 (Catalina)&lt;br /&gt;
|-&lt;br /&gt;
|14.x&lt;br /&gt;
|12.x&lt;br /&gt;
|11.0 (Big Sur)&lt;br /&gt;
|-&lt;br /&gt;
|15.x&lt;br /&gt;
|13.x&lt;br /&gt;
|12.0 (Monterey)&lt;br /&gt;
|-&lt;br /&gt;
|16.x&lt;br /&gt;
|14.x&lt;br /&gt;
|12.5 (Monterey)&lt;br /&gt;
|}&lt;br /&gt;
This table is only a simplified overview, better see [https://xcodereleases.com/ Xcode releases] or [https://en.wikipedia.org/wiki/Xcode#Version_comparison_table Xcode versions] for the exact versions. For new iOS minor versions, there is usually also a new release of Xcode, e.g. for iOS 10.2 you need at least Xcode 8.2, for iOS 10.3 at least Xcode 8.3, etc. So if you are upgrading to a newer iOS version, you will usually need a newer Xcode version as well. Newer versions of Xcode may not run on older operating systems, which in turn may require an operating system upgrade. If you also want to test older iOS versions, it can be useful to install the corresponding Xcode versions in parallel.&lt;br /&gt;
&lt;br /&gt;
=== Appium ===&lt;br /&gt;
You can install Appium either as command-line tool or use it with [https://github.com/appium/appium-desktop Appium Desktop], which provides a GUI to start the server. Meanwhile there is also Appium 2.0, which is not tested with expecco yet and therefore not recommended to use.&lt;br /&gt;
&lt;br /&gt;
==== Appium Desktop ====&lt;br /&gt;
Download the newest version of [https://github.com/appium/appium-desktop/releases/ Appium Desktop]. For the Mac, it is best to take the dmg file and install it to the applications. When starting &#039;&#039;Appium Server GUI&#039;&#039; you will probably get the error message, that it is not possible for security reasons. In this case, open the context menu of the app file (right click or Ctrl + click) and choose &#039;&#039;Open&#039;&#039; there. Then confirm that you really want to open the application. From now on you can open the application normally.&lt;br /&gt;
&lt;br /&gt;
[[Datei:OpenAppiumServerGUI1.png|text-top]] [[Datei:OpenAppiumServerGUI2.png|text-top]]&lt;br /&gt;
&lt;br /&gt;
Since Xcode 14 there are problems with signing the WebDriverAgent, which Appium loads on the device for the automation. This means that no connection is possible with version 1.22.3-4 of Appium Desktop. In newer versions of WebDriverAgent, this problem is solved, but currently there is no version of Appium Desktop using such a new version (as of November 2022). However, you can manually download a new version (e.g. 4.10.2) and replace the files in Appium. To do this, download one of the two archive files (zip or tar.gz) containing the source code from the [https://github.com/appium/WebDriverAgent/releases/ WebDriverAgent download page]. Then open and extract this file. Copy the contents of the folder &#039;&#039;WebDriverAgent-4.10.2&#039; to&lt;br /&gt;
&lt;br /&gt;
 /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
If you navigate there by Finder, make a context click (right click or Ctrl + click) on the application and choose &#039;&#039;Show Package Contents&#039;&#039; from the menu. Replace all files that are already present with the same name.&lt;br /&gt;
&lt;br /&gt;
==== Install Appium using npm ====&lt;br /&gt;
You can install Appium using npm (Node Package Manager) as well. To do this, you have to install node/npm first. This can be done using [https://github.com/nvm-sh/nvm nvm] (Node Version Manager), which you can get on Github. If the following installation instructions should not work for you, you will find detailed information in the [https://github.com/nvm-sh/nvm#readme Readme] there.&lt;br /&gt;
&lt;br /&gt;
Open a Terminal window. Then clone the Github repository of nvm&lt;br /&gt;
 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash&lt;br /&gt;
and load it&lt;br /&gt;
 export NVM_DIR=&amp;quot;$([ -z &amp;quot;${XDG_CONFIG_HOME-}&amp;quot; ] &amp;amp;&amp;amp; printf %s &amp;quot;${HOME}/.nvm&amp;quot; || printf %s &amp;quot;${XDG_CONFIG_HOME}/nvm&amp;quot;)&amp;quot; [ -s &amp;quot;$NVM_DIR/nvm.sh&amp;quot; ] &amp;amp;&amp;amp; \. &amp;quot;$NVM_DIR/nvm.sh&amp;quot; # This loads nvm&lt;br /&gt;
&lt;br /&gt;
Then execute&lt;br /&gt;
 command -v nvm&lt;br /&gt;
to see if it works. It should print &#039;&#039;nvm&#039;&#039;. If there is no response, execute&lt;br /&gt;
 touch ~/.zshrc&lt;br /&gt;
and try again.&lt;br /&gt;
&lt;br /&gt;
Now you can install node with the following command.&lt;br /&gt;
 nvm install 16.15.1&lt;br /&gt;
As there are problems installing Appium using the newest version of node, we recommend this version.&lt;br /&gt;
&lt;br /&gt;
After node is installed, you can use it to install Appium:&lt;br /&gt;
 npm install -g appium&lt;br /&gt;
&lt;br /&gt;
The Appium server now simply can be started with the command&lt;br /&gt;
 appium&lt;br /&gt;
The output will then be written directly to the terminal.&lt;br /&gt;
&lt;br /&gt;
This version also has problems with signing the WebDriverAgent, like explained in [[#Appium_Desktop | Appium Desktop]]. Therefore download a newer version of WebDriverAgent in this case as well and replace the old files. You will find them at&lt;br /&gt;
 /Users/&amp;lt;user&amp;gt;/.nvm/versions/16.15.1/lib/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
==== Mobile Testing Supplement ====&lt;br /&gt;
We provide older versions of Appium via the Mobile Testing Supplement for Mac OS, with which you can easily install it:&lt;br /&gt;
* &#039;&#039;&#039;expecco 20.2&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-20.2.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement for Mac OS (1.2.2)]&lt;br /&gt;
:Contains Appium version 1.18.3 and uses node 14.&lt;br /&gt;
&lt;br /&gt;
* expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement for Mac OS (1.2.0)]&lt;br /&gt;
:Only a few changes compared to the previous version.&lt;br /&gt;
&lt;br /&gt;
* expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement_for_MacOS.tar.bz2 Mobile Testing Supplement for Mac OS (1.1.98)]&lt;br /&gt;
:Appium is updated to version 1.16.0-rc.1 and node 12 is used.&lt;br /&gt;
&lt;br /&gt;
* expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.96.tar.bz2 Mobile Testing Supplement for Mac OS (1.1.96)]&lt;br /&gt;
:This version contains Appium 1.12.0.&lt;br /&gt;
&lt;br /&gt;
* expecco 18.1: [http://download.exept.de/transfer/h-expecco-18.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.94.tar.bz2 Mobile Testing Supplement for Mac OS (1.1.94)]&lt;br /&gt;
:This version contains Appium 1.8.0.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.11:[http://download.exept.de/transfer/h-expecco-2.11.1/Mobile_Testing_Supplement_for_Mac_OS_1.0.94.tar.bz2 Mobile Testing Supplement for Mac OS (1.0.94)]&lt;br /&gt;
:This version contains Appium 1.6.4.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_for_Mac_OS_1.0.tar.bz2 Mobile Testing Supplement for Mac OS]&lt;br /&gt;
:Diese Version entält Appium 1.4.16.&lt;br /&gt;
&lt;br /&gt;
After you have downloaded the supplement, you can move it to a directory of your choice (e.g. your home directory) and unpack it there. A suitable command in a shell could look like this, adjust the version number accordingly:&lt;br /&gt;
&lt;br /&gt;
 tar -xvpf Mobile_Testing_Supplement_for_Mac_OS_1.1.98.tar.bz2&lt;br /&gt;
&lt;br /&gt;
If your default Xcode installation is the one you want to use, you can start Appium directly from the file in the &#039;&#039;bin&#039;&#039; directory with the appropriate version number:&lt;br /&gt;
&lt;br /&gt;
 Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
If you want to use another Xcode than the one configured as default, you have to tell Appium the corresponding path by using the environment variable &#039;&#039;DEVELOPER_DIR&#039;&#039;. For example, if you have installed Xcode in &#039;&#039;/Applications/Xcode-11.3.app&#039;&#039;, you can start Appium this way:&lt;br /&gt;
&lt;br /&gt;
 DEVELOPER_DIR=&amp;quot;/Applications/Xcode-11.3.app/Contents/Developer&amp;quot; Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
To find out what is set as the default Xcode installation on your system, use this command:&lt;br /&gt;
&lt;br /&gt;
 xcode-select -p&lt;br /&gt;
&lt;br /&gt;
If Appium cannot find your Xcode installation, a message like this appears:&lt;br /&gt;
&#039;&#039;&amp;lt;blockquote&amp;gt;org.openqa.selenium.SessionNotCreatedException - A new session could not be created. (Original error: Could not find path to Xcode, environment variable DEVELOPER_DIR set to: /Applications/Xcode.app but no Xcode found)&amp;lt;/blockquote&amp;gt;&#039;&#039;&lt;br /&gt;
In such a case, restart Appium by specifying a valid &#039;&#039;DEVELOPER_DIR&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Signing WebDriverAgent ====&lt;br /&gt;
For automation, Appium installs an App called WebDriverAgent on the device and therefore has to be able to sign it. You need an Apple account and a respective certificate for this. For evaluation you can use a free account. This has the disadvantage that created profiles are only valid for one week and must be recreated afterwards. Also be careful when sharing the account, as certificates may be revoked or invalidated by automatic generation. As a result, apps that have already been signed can no longer be used.&lt;br /&gt;
&lt;br /&gt;
If you already have a respective certificate and its associated private key in your keychain on the Mac, you can have the WebDriverAgent automatically signed. If not, it is recommended to set and manage the signing using Xcode.&lt;br /&gt;
&lt;br /&gt;
First, connect the device you want to use to your Mac via USB. Make sure both the Mac and the device are in the same network or there will be problems when connection with Appium. Start Xcode and open &#039;&#039;Preferences&#039;&#039;. Go to the Accounts page and create an entry with your account. You can then click on &#039;&#039;Manage Certificates...&#039;&#039; to see the certificates that belong to that account. To run tests, you need an iOS Development Certificate and the associated private key. If you do not already have one, create one. If you already have one, but it is not in your keychain (indicated by &amp;quot;Not in Keychain&amp;quot;), you can import it. You can do that by the [https://support.apple.com/en-us/guide/keychain-access/welcome/mac keychain access] on your Mac, if you have exported it previously from the keychain, where it is stored. The certificate with the associated key should be in the keychain &#039;&#039;Login&#039;&#039;. It can be exported from there as PKCS#12 file (typical ending .p12). To import a certificate into your keychain, select the option &#039;&#039;Import objects&#039;&#039; from the &#039;&#039;File&#039;&#039; menu. If you don&#039;t know where the certificate is stored, you can also revoke it in Xcode and recreate it in your keychain. However, only do this if you know that the old certificate is no longer in use because it can no longer be used afterwards. Now the keychain should contain an iOS development certificate.&lt;br /&gt;
&amp;lt;!--(Den folgenden Teil braucht man wohl nicht mehr, wenn es in Xcode eingestellt ist)From the right-click menu, select Information. Under the details of the certificate you will find the Team ID, which is referred to here as the Organizational Unit. Enter it in the Team ID field of the plug-in&#039;s settings, see [[#Plugin_Configuration|Plugin Configuration]].--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now open the WebDriverAgent project in Xcode. If you have installed the Mobile Testing Supplement, you will find it in this directory at&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
If you have installed Appium Desktop, you will find it at&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;/Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You can use the Finder to navigate to the Xcode project file and open it by double clicking. Note, that you have to perform a context click (right click or Ctrl + click) on the Appium Server GUI app and select &#039;&#039;Show Package Contents&#039;&#039; in the menu, to get to its subdirectory.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingWebDriverAgentXcode.png]]&lt;br /&gt;
&lt;br /&gt;
Select &#039;&#039;WebDriverAgentLib&#039;&#039; and the page &#039;&#039;Signing &amp;amp; Capabilities&#039;&#039;. In the section &#039;&#039;Signing&#039;&#039; set the option &#039;&#039;Automatically manage signing&#039;&#039; and then select a team. Now switch to &#039;&#039;WebDriverAgentRunner&#039;&#039; and do the same there.&lt;br /&gt;
&amp;lt;!-- (The following seems to not be relevant anymore.) Here you should see errors indicating that no Provisioning Profiles have been created or found. Therefore, go to the &#039;&#039;Build Settings&#039;&#039; page and look for the entry &#039;&#039;Product Bundle Identifier&#039;&#039; in the &#039;&#039;Packaging&#039;&#039; section. Change this from com.facebook.WebDriverAgentRunner to something Xcode accepts by changing the prefix. Xcode can now generate a matching Provisioning Profile and the errors on the General page should disappear. After that you can quit Xcode. --&amp;gt;&lt;br /&gt;
By setting the team, the errors showing up for WebDriverAgentRunner should disappear. If Xcode should not be able to create a Provisioning Profile matching the Bundle ID &#039;&#039;com.facebook.WebDriverAgentRunner&#039;&#039;, you can edit the latter so that it fits your certificate. After that you can quit Xcode or you can, like explained further below, directly start the build in Xcode, so the project will be already built when Appium wants to use it.&lt;br /&gt;
&lt;br /&gt;
If you now connect to your device from expecco, the WebDriverAgent will be installed and started on it and then switch to the app to be tested. You may still have to trust the execution of the WebDriverAgent on the device. It maybe a sign that you have to do this, if the app WebDriverAgent first appears on the device and tries to start, but then is uninstalled again. To trust the execution, open the settings during the connection setup on the device and then the entry &#039;&#039;Device management&#039;&#039; under &#039;&#039;General&#039;&#039;. This entry is only visible if a developer app is installed on the device. You may therefore have to wait until the WebDriverAgent is installed before the entry appears. Select the entry of your Apple account and trust it. Since the WebDriverAgent will be uninstalled again if the start did not work, you have to do this during the connection setup. If this is too hectic for you, you can also execute the following code:&lt;br /&gt;
&lt;br /&gt;
 xcodebuild -project Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
 xcodebuild -project /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&lt;br /&gt;
&lt;br /&gt;
This installs the WebDriverAgent on the device without deleting it again.&lt;br /&gt;
&lt;br /&gt;
If there are problems while installing the WebDriverAgent, you can also try and start the build in Xcode. Make sure the right target &#039;&#039;WebDriverAgent&#039;&#039; is selected. Error messages in Xcode might indicate easier what the problem is about. Sometimes it even helps to try for a second time, if it took too long for the first time and got aborted. It may occur, that you are asked several times during the build to enter the password for the keychain.&lt;br /&gt;
&lt;br /&gt;
[[Datei:WebDriverAgentCodesign.png]]&lt;br /&gt;
&lt;br /&gt;
Read also the documentation of Appium on [https://github.com/appium/appium-xcuitest-driver/blob/master/docs/real-device-config.md Setting up tests with iOS devices]. Refer to the [https://support.apple.com/en-us/HT204460 Apple documentation] for details on installing and trusting of apps.&lt;br /&gt;
&lt;br /&gt;
Once the WebDriverAgent is installed on the device, it will be reused for later connections und connecting should work faster. The signed version is then already on your Mac as well and doesn&#039;t have to be built again. This should speed up the connect with other devices as well. If you know, that the connect has to build and sign the WebDriverAgent first, it is advisable to set the capability &#039;&#039;wdaLaunchTimeout&#039;&#039;. This timeout specifies how long Appium waits for the WebDriverAgents to start up on the device and is per default set to 60000&amp;amp;nbsp;ms. Building often takes a little longer than one minute, so the connect attempt will be canceled. A value of 120000 will be more reliable here.&lt;br /&gt;
&lt;br /&gt;
== Plugin Configuration ==&lt;br /&gt;
Before you start, please check the settings of the Mobile Testing Plugin and adjust them if necessary. Select the menu item &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Extensions&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot; (see fig.). By default, these paths are found automatically (1). To adjust a path manually, deactivate the corresponding check mark at the right. You&#039;ll see a drop-down list with some paths to choose from. If an entered path is wrong or cannot be found, the field is marked red and a message appears. Make sure that all paths are specified correctly.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingEinstellungen.png | thumb | 400px | Plugin Configuration]]&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;appium&#039;&#039;&#039;: Enter the path to the executable file with which Appium can be started in the command line. Under Windows this file will usually be called &amp;quot;&amp;lt;code&amp;gt;appium.cmd&amp;lt;/code&amp;gt;&amp;quot;. This path is used when expecco starts an Appium server.&lt;br /&gt;
*&#039;&#039;&#039;node&#039;&#039;&#039;: Enter the path to the executable that starts Node (also called (also called &amp;quot;Node.js&amp;quot;). This path is passed to Appium when a server is started so that Appium can find it independently of the PATH variable. Under Windows this file is usually called &amp;quot;&amp;lt;code&amp;gt;node.exe&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;JAVA_HOME&#039;&#039;&#039;: Enter the path to a JDK (Java Development Kit)here. This path is passed to each Appium server. Leave the field blank to use the value from the environment variable. To specify which Java should be used by expecco, set this path in the Java Bridge settings.&lt;br /&gt;
*&#039;&#039;&#039;ANDROID_HOME&#039;&#039;&#039;: Enter the path to an Android SDK here. This path is passed to each Appium server. Leave the field blank to use the value from the environment variable.&lt;br /&gt;
*&#039;&#039;&#039;adb&#039;&#039;&#039;: The path to the adb command. Under Windows the file is called &amp;quot;&amp;lt;code&amp;gt;adb.exe&amp;lt;/code&amp;gt;&amp;quot;. This file is used by expecco, for example, to get the list of connected devices. This path should be selected automatically, if the command is found in the ANDROID_HOME directory. This is also used by Appium. If expecco and Appium use different versions of adb, conflicts may occur.&lt;br /&gt;
*&#039;&#039;&#039;android.bat&#039;&#039;&#039;: This file is only needed to start the AVD and the SDK Manager, which deal with phone emulators. The file in the ANDROID_HOME directory will be selected automatically, if present there.&lt;br /&gt;
*&#039;&#039;&#039;aapt&#039;&#039;&#039;: The path to the &amp;quot;aapt&amp;quot; command here. Under Windows this file is called &amp;quot;&amp;lt;code&amp;gt;aapt.exe&amp;lt;/code&amp;gt;&amp;quot;. expecco uses &amp;quot;aapt&amp;quot; only in the connection editor to read the package and activities of an &amp;quot;apk&amp;quot; file. The file in the ANDROID_HOME directory will be selected automatically, if present there.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingJavaBridgeEinstellungen.png | thumb | 400px | JDK Configuration]]&lt;br /&gt;
&lt;br /&gt;
Starting with expecco 2.11, there is an additional field called &#039;&#039;Team ID&#039;&#039;. If you run iOS tests, enter the Team ID of your certificate here. This is used for every iOS connection, unless you change the value in the connection settings in individual cases. For information on how to obtain the team ID, please refer to the section on [[#Signing| signing]] for installations on Mac OS. With expecco 2.10 and older, you can only enter the Team ID as capability for each connection setting separately. However, you must use the [[#Extended_View|extended view]] to do this. Enter the capability &#039;&#039;xcodeOrgId&#039;&#039; here and set the Team ID of the certificate as value.&lt;br /&gt;
&lt;br /&gt;
The server address setting at the bottom of the page refers to the behavior of the connection editor. It checks at the end whether the server address ends in &#039;&#039;/wd/hub&#039;&#039; as this is the usual form. If not, a dialog asks how to react. The defined behavior can be viewed and changed here.&lt;br /&gt;
&lt;br /&gt;
Also switch to the entry &#039;&#039;Java Bridge&#039;&#039; (see figure). Here you have to specify the path to your Java installation, which is used by expecco. Enter a JDK here. If you want to use the one from the Mobile Testing Supplement under Windows, the path is&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;C:\Program Files (x86)\exept\Mobile Testing Supplement\jdk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can also use the system settings.&lt;br /&gt;
&lt;br /&gt;
== Prepare Android Device ==&lt;br /&gt;
If you connect an Android device under Windows, you may still need an adb driver for the device. You can usually find a suitable driver on the manufacturer&#039;s website. If you have installed the universal driver from the Mobile Testing Supplement, everything should already work for most devices. In some cases, Windows will automatically try to install a driver when you connect the device for the first time. &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Attention&#039;&#039;&#039;: Before you can control a mobile device with the Appium plugin, you have to allow this debugging!&lt;br /&gt;
&lt;br /&gt;
For Android devices, you can find this option in the settings under &#039;&#039;[https://developer.android.com/studio/debug/dev-options Developer Options]&#039;&#039; called &#039;&#039;USB-Debugging&#039;&#039;. If the developer options are not displayed, you can unlock them by tapping Build Number seven times in About the Phone.&lt;br /&gt;
&lt;br /&gt;
Also enable the &#039;&#039;Stay awake&#039;&#039; feature to prevent the device from turning off the screen during test creation or execution.&lt;br /&gt;
&lt;br /&gt;
For security reasons, USB debugging must be allowed for each computer individually. When connecting the device to the PC via USB, you must agree to the connection on the device. If you haven&#039;t done this for your computer yet, but no corresponding dialog appears on the device, it may help to unplug and reconnect the device. This can happen especially if you have installed the ADB driver while the device was already connected via USB. If this doesn&#039;t help either, open the notifications by dragging them from the top of the screen. There you will find the USB connection and you can open the options. Select another type of connection; usually MTP or PTP should work.&lt;br /&gt;
&lt;br /&gt;
You can also test on an emulator. It does not need to be prepared separately, as it is already designed for USB debugging. It is even possible to start an emulator at the beginning of the test.&lt;br /&gt;
&lt;br /&gt;
To check if a device you have connected to your computer can be used, open the [[#Connection_Editor|connection editor]]. The device should be displayed there.&lt;br /&gt;
&lt;br /&gt;
=== Connection via WLAN ===&lt;br /&gt;
It is possible to connect to Android devices via Wireless LAN. For devices using Android 11 or newer, this can be done wirelessly, else you have to connect initially via USB. Since expecco 22.1, WiFi connections can be established using the [[Mobile_Testing_Plugin/en#Connection_Editor|Connection Editor]]. It is also possible to do this using a command window.&lt;br /&gt;
==== Wireless Connect (Android 11) ====&lt;br /&gt;
In the developer options of your device, enable wireless debugging and open its options. You initially have to pair your machine with the device. To do this, choose &amp;quot;&#039;&#039;Pair device with pairing code&#039;&#039;&amp;quot; to get a pairing code and an IP address with port. Then open a command window (terminal window) on your machine and enter:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb pair &amp;lt;Device IP Address&amp;gt;:&amp;lt;Pairing Port&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
where &amp;lt;tt&amp;gt;&amp;lt;Device IP Address&amp;gt;:&amp;lt;Pairing Port&amp;gt;&amp;lt;/tt&amp;gt; is the IP address and port as shown on the device. After that, you will be asked for the pairing code. If everything went right, the popup on the device should have closed and your machine is added to the list of paired devices. Then enter at the command window:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;Device IP Address&amp;gt;:&amp;lt;Debugging Port&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The IP address is the same as for pairing, but the port is different. Both are shown as IP address &amp;amp; Port on the device. The device should now be connected via WLAN and can be used in the same way as with a USB connection. You can check this by entering &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; or open the connection dialog in expecco. In the list, the device appears with its IP address and port. Remember that the WLAN connection no longer exists when the ADB server or the device is restarted. Restarting the device often disables wireless debugging and the used port is changed. The pairing, however, is permanent and has not to be done again the next time you connect.&lt;br /&gt;
==== Start via USB ====&lt;br /&gt;
First, connect your device via USB. Then open a command window (terminal window) and enter:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The device listens for a TCP/IP connection on port 5555. If you have several devices connected or emulators running, you have to specify which device you mean. Enter in this case:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb devices -l&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
to get a list of all devices, where the first column gives the device&#039;s ID.&lt;br /&gt;
Then, enter:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb -s &amp;lt;deviceID&amp;gt; tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
with the device identification of the desired device. You can now disconnect the USB connection.&amp;lt;br&amp;gt;Now you have to find out the IP address of your device. You can usually find it somewhere in the device&#039;s settings, for example in the Status or WLAN settings of the phone. Then type in:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP address of device&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The device should now be connected via WLAN and can be used in the same way as with a USB connection. You can check this by entering &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; again or open the connection dialog in expecco. In the list, the device appears with its IP address and port. Remember that the WLAN connection no longer exists when the ADB server or the device is restarted.&lt;br /&gt;
&lt;br /&gt;
== Preparing an iOS-Device and App ==&lt;br /&gt;
Control of iOS devices is only possible via a Mac. Please also read the section [[#Mac_OS|Installation under Mac OS]].&lt;br /&gt;
&lt;br /&gt;
Before you can control a mobile device with the Mobile Testing Plugin, you must allow debugging for iOS devices with iOS 8 or higher. Activate the option &amp;quot;&#039;&#039;Enable UI Automation&#039;&#039;&amp;quot; under the &amp;quot;&#039;&#039;Developer&#039;&#039;&amp;quot; menu in the device settings.&amp;lt;br&amp;gt;If you cannot find the &amp;quot;&#039;&#039;Developer&#039;&#039;&amp;quot; entry in the settings, proceed as follows: Connect the device to the Mac via USB. If necessary, you must still agree to the connection on the device. Start Xcode and then select &amp;quot;&#039;&#039;Devices&#039;&#039;&amp;quot; from the menu bar at the top of the screen in the &amp;quot;&#039;&#039;Window&#039;&#039;&amp;quot; menu. A window opens in which a list of the connected devices is displayed. Select your device there. Then the entry &amp;quot;&#039;&#039;Developer&#039;&#039;&amp;quot; should appear in the settings on the device. You may have to exit the settings and restart.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Alert.png | thumb | 270px | Alert unter iOS]]&lt;br /&gt;
It is not possible to establish a connection to the device as long as it shows certain alerts. Such an alert may appear if FaceTime is activated (by displaying a message about SMS charges as shown in the screenshot). Be sure to configure the device so that it does not show such alerts when idle.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.11 and later ===&lt;br /&gt;
You can test any app which is executable or already installed on the device used. If the app is available as a development build, the UDID of the device must be stored in the app. In any case, the WebDriverAgent must be signed for the device. Please read the section about [[#Signing|signing]] under Mac OS.&lt;br /&gt;
&lt;br /&gt;
If you want to use the Home button in a test, you must activate &amp;quot;AssistiveTouch&amp;quot; on the device. You will find this option in the settings under &amp;quot;&#039;&#039;General&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;Operating Help&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;AssistiveTouch&#039;&#039;&amp;quot;. Then place the menu in the middle of the upper edge of the screen. You can then record pressing the Home button with the corresponding menu entry in the recorder or use the &amp;quot;&#039;&#039;Press Home Button&#039;&#039;&amp;quot; block directly.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.10 ===&lt;br /&gt;
The app you want to use must be available as a development build. The UDID of the device must also be stored in the app.&lt;br /&gt;
&lt;br /&gt;
=== Sign the development build ===&lt;br /&gt;
A development build of an app is only allowed for a limited number of devices and cannot be started on other devices. However, it is possible to exchange the certificate and the usable devices in a development build.&lt;br /&gt;
&lt;br /&gt;
* Evaluation with demo app of eXept:&lt;br /&gt;
:We will be happy to provide you with a demo app which is available as a development build and which we can sign for your device. Please send the UDID of your device to your eXept contact person. How to determine the UDID of your device is described in the following section.&lt;br /&gt;
&lt;br /&gt;
* Using your own app for your test device:&lt;br /&gt;
:If you receive a development build (IPA file) from the app developers that is approved for your test device, you can use it directly. To do this, you must tell the developers the UDID of your device so they can enter it. &#039;&#039;&#039;You can use Xcode to read the UDID of a device&#039;&#039;&#039;. Start Xcode and select &#039;&#039;Devices&#039;&#039; from the menu bar at the top of the screen in the &#039;&#039;Window&#039;&#039; menu. A window opens in which a list of the connected devices is displayed. Select your device and search for the &#039;&#039;Identifier&#039;&#039; entry in Properties. The UDID is a 40-digit hexadecimal number.&lt;br /&gt;
&lt;br /&gt;
* Externally developed app for your test device:&lt;br /&gt;
:You can also re-sign apps to make them run on other devices. However, this process is complicated and requires access to an Apple Developer account. A documentation on the procedure is currently in preparation.&lt;br /&gt;
&lt;br /&gt;
:For the evaluation we will gladly support you with the re-signing of your app..&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Log in to the [https://developer.apple.com/ Apple-Webinterface]. Navigate to &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039;. If necessary, create a Developer Certificate and a Provisioning Profile for your device here and download both. If you don&#039;t have a Developer Account yet, create one here: https://developer.apple.com/enroll/. For this you have to register with an Apple-ID.&lt;br /&gt;
&lt;br /&gt;
# Find out Team ID (&#039;&#039;Membership&#039;&#039; -&amp;gt; &#039;&#039;Team ID&#039;&#039;)&lt;br /&gt;
# Under &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039; select development certificate (under &#039;&#039;+&#039;&#039; create, if not available) and download&lt;br /&gt;
# Under &#039;&#039;App ID&#039;&#039; create Wildcard App ID, if not present. Note App ID (AppID = Prefix.ID)&lt;br /&gt;
# Add device, find out UDID (or &#039;&#039;Identifier&#039;&#039;) of the device (&#039;&#039;Xcode&#039;&#039; -&amp;gt; &#039;&#039;Window&#039;&#039; (above in menu bar) -&amp;gt; &#039;&#039;Devices&#039;&#039;)&lt;br /&gt;
# Create commission profiles: &#039;&#039;iOS App Development&#039;&#039; -&amp;gt; Select &#039;&#039;AppID&#039;&#039; -&amp;gt; Select certificate -&amp;gt; Select device -&amp;gt; Create profile name -&amp;gt; Download provisioning profiles.&lt;br /&gt;
# Import the downloaded certificate (&#039;&#039;Downloads&#039;&#039; -&amp;gt; Certificate (.cer)&lt;br /&gt;
# Copy SHA1 fingerprint. Right click on Certificate -&amp;gt; &#039;&#039;Information&#039;&#039;, then scroll to the bottom of the page).&lt;br /&gt;
# Create Entitlements.plist (&#039;&#039;Open Terminal&#039; -&amp;gt; Downloads/Mobile_Testing_Supplement/bin/gen-entitlements_plist &#039;Team-ID&#039; &#039;App ID&#039; Downloads/Mobile_Testing_Supplement/bin/re-sign-ipa &amp;lt;path to ipa (z.B. Downloads/expeccoMobileDemo.ipa)&amp;gt; \&lt;br /&gt;
&amp;quot;&amp;lt;Zertifikat (SHA1-Fingerabdruck, z.B. 76 E8 4B E8 78 D5 D7 F9 2E 09 8B D7 E8 FB CE 30 0C F5 D0 EF)&amp;gt;&amp;quot; \&lt;br /&gt;
&amp;lt;Path to Commission Profile (e.g. /Users/exept_test/Downloads/dut.mobileprovision)&amp;gt; \&lt;br /&gt;
&amp;lt;Path for the result ipa (z.B. Downloads/expeccoMobileDemo_re-signed.ipa)&amp;gt; \&lt;br /&gt;
[Pfad zur entitlements.plist] (z.B. /Users/exept_test/entitlements.plist)&lt;br /&gt;
&lt;br /&gt;
To re-sign, you can use the corresponding script from the Mobile Testing Supplement for Mac OS or any other tool (e.g. isign).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more information about using iOS devices, see also the &lt;br /&gt;
[http://appium.io/slate/en/master/?java#appium-on-real-ios-devices Appium documentation].&lt;br /&gt;
&lt;br /&gt;
=== Native iOS-Apps ===&lt;br /&gt;
You can also use apps that are already natively present on the device. To do this, you must know their bundle ID and then enter it in the connection settings. Here is a small selection of common apps:&lt;br /&gt;
{| style=&amp;quot;text-align:left&amp;quot;&lt;br /&gt;
! App&lt;br /&gt;
!&lt;br /&gt;
! Bundle-ID&lt;br /&gt;
|-&lt;br /&gt;
| App Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.AppStore&lt;br /&gt;
|-&lt;br /&gt;
| Calculator&lt;br /&gt;
| &lt;br /&gt;
| com.apple.calculator&lt;br /&gt;
|-&lt;br /&gt;
| Calendar&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilecal&lt;br /&gt;
|-&lt;br /&gt;
| Camera&lt;br /&gt;
| &lt;br /&gt;
| com.apple.camera&lt;br /&gt;
|-&lt;br /&gt;
| Contacts&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileAddressBook&lt;br /&gt;
|-&lt;br /&gt;
| iTunes Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileStore&lt;br /&gt;
|-&lt;br /&gt;
| Mail&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilemail&lt;br /&gt;
|-&lt;br /&gt;
| Maps&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Maps&lt;br /&gt;
|-&lt;br /&gt;
| Messages&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileSMS&lt;br /&gt;
|-&lt;br /&gt;
| Phone&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilephone&lt;br /&gt;
|-&lt;br /&gt;
| Photos&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobileslideshow&lt;br /&gt;
|-&lt;br /&gt;
| Settings&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Preferences&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
You can find further Bundle-IDs [https://github.com/joeblau/apple-bundle-identifiers here].&lt;br /&gt;
&lt;br /&gt;
= Examples =&lt;br /&gt;
In the demo test suites for expecco you will also find examples for tests with the Mobile Testing Plugin. To do this, select the option &amp;quot;&#039;&#039;Example from File&#039;&#039;&amp;quot; on the start screen and open the folder named &amp;quot;&#039;&#039;mobile&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;TestsuiteMobileTestingDemo&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m01_MobileTestingDemo.ets --&amp;gt;&amp;lt;/span&amp;gt; &#039;&#039;m01_MobileTestingDemo.ets&#039;&#039; ==&lt;br /&gt;
The test suite contains two simple test plans: &amp;quot;&#039;&#039;Simple CalculatorTest&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Complex Calculator and Messaging Test&#039;&#039;&amp;quot;. Both tests use an Android emulator, which you must start before starting. The apps used in the test are part of the basic equipment of the emulator and therefore no longer need to be installed. Since the apps may differ under every Android version, it is important that your emulator runs under Android 6.0. In addition, the language must be set to English.&lt;br /&gt;
&lt;br /&gt;
; Simple CalculatorTest&lt;br /&gt;
: This test connects to the calculator and enters the formula &#039;&#039;2+3&#039;&#039;. The result of the calculator is compared with the expected value &#039;&#039;5&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; Complex Calculator and Messaging Test&lt;br /&gt;
: This test connects to the calculator and then opens the message service. There it waits for an incoming message from the number &#039;&#039;15555215556&#039;&#039;, in which a formula to be calculated is sent. The message is generated before via a socket at the emulator. When the message arrives, it is opened by the test and its contents are read. Then the calculator is opened again, the received formula is entered and the result is read. The test then switches back to the message service and sends the result as an answer.&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;m02_expeccoMobileDemo.ets&#039;&#039; und &#039;&#039;m03_expeccoMobileDemoIOS.ets&#039;&#039; ==&lt;br /&gt;
These are part of the tutorial for the Mobile Testing Plugin. The included test case is incomplete and will be added during the tutorial. Please read the section [[#Tutorial|Tutorial]].&lt;br /&gt;
&lt;br /&gt;
= Tutorial =&lt;br /&gt;
There is a tutorial describing the basic procedure for creating tests with the Mobile Testing Plugin. It is based on a supplied example consisting of a simple app and an expecco test suite.&lt;br /&gt;
&lt;br /&gt;
You find it on the page [[Mobile_Testing_Tutorial/en|Mobile Testing Tutorial]] in two versions for Android and iOS devices.&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsAndroid&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m02_expeccoMobileDemo.ets --&amp;gt;&amp;lt;/span&amp;gt; [[Mobile_Testing_Tutorial/en#First_steps_with_Android|First steps with Android]]&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsIOS&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m03_expeccoMobileDemoIOS.ets --&amp;gt;&amp;lt;/span&amp;gt; [[Mobile_Testing_Tutorial/en#First_steps_with_iOS|First steps with iOS]]&lt;br /&gt;
&lt;br /&gt;
= Dialogs of the Mobile Testing Plugin =&lt;br /&gt;
== Connection Editor ==&lt;br /&gt;
You can use the Connection Editor to quickly define, change, or establish connections. Depending on the task, the dialog has small differences and is opened differently:&lt;br /&gt;
*If you want to establish a connection, access the dialog in the GUI browser by clicking on &#039;&#039;Connect&#039;&#039; and then selecting &#039;&#039;Mobile Testing&#039;&#039;.&lt;br /&gt;
*To change or copy an existing connection in the GUI browser, select it, right-click and select &#039;&#039;Edit Connection&#039;&#039; or &#039;&#039;Copy Connection&#039;&#039; from the context menu.&lt;br /&gt;
*If you do not want to create connection settings for the GUI browser but for use in a test, choose &#039;&#039;Create Connection Settings&#039;&#039; from the Mobile Testing Plugin menu.... This only allows you to create the settings for a connection without creating a connection in the GUI browser.&lt;br /&gt;
&lt;br /&gt;
The Connection Editor menu has several buttons, some of which are only visible when creating connection settings:&lt;br /&gt;
[[Datei:MobileTestingVerbindungseditorMenu.png]]&lt;br /&gt;
#&#039;&#039;Delete Settings&#039;&#039;: Resets all entries. (Only visible when creating settings.)&lt;br /&gt;
#&#039;&#039;Load settings from file&#039;&#039;: Allows to open a saved settings file (*.csf). Its settings are transferred to the dialog. Entries already made without conflict are retained.&lt;br /&gt;
#&#039;&#039;Load settings from attachment&#039;&#039;: Allows you to open an attachment with connection settings from an open project. These settings are applied to the dialog. Entries already made without conflict are retained.&lt;br /&gt;
#&#039;&#039;Save settings to file&#039;&#039; and&lt;br /&gt;
#&#039;&#039;Save settings to attachment&#039;&#039;: Here you can save the entered settings to a file (*.csf) or create them as an attachment in an open project. Both options have a delayed menu in which you can choose to save only a certain part of the settings. (Only visible when creating settings.)&lt;br /&gt;
#&#039;&#039;Advanced View&#039;&#039;: Allows you to switch to the advanced view to make additional settings. Read more about this at the end of this chapter. (Only visible when creating settings.)&lt;br /&gt;
#&#039;&#039;Help&#039;&#039;: A help text for the respective step is shown or hidden on the right side.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The dialog is divided into three steps. In the first step you select the device you want to use, in the second step you select which App should be used and in the last step the settings for the Appium server are made.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep1&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Step 1: Select Device ===&lt;br /&gt;
In the upper part you will see a list of all connected Appium devices that are detected. With the checkbox below you can hide devices that are detected but not ready. If you want to enter a device that is not connected, you can create it with the corresponding button &#039;&#039;Enter Android device&#039;&#039; or &#039;&#039;Enter iOS device&#039;&#039;. However, you need to know the required properties of your device. The device is then created in a second device list and can be selected there. If no list with connected elements can be displayed, various messages are displayed instead:&lt;br /&gt;
*No devices found&lt;br /&gt;
*:expecco could not find any Android devices.&lt;br /&gt;
*:To automatically configure a connection to a device, make sure&lt;br /&gt;
*:*it is connected&lt;br /&gt;
*:*it is turned on&lt;br /&gt;
*:*that it has an appropriate adb driver installed&lt;br /&gt;
*:*it is enabled for debugging (see below).&lt;br /&gt;
*No available devices found&lt;br /&gt;
*:expecco could not find any available Android devices. But not available ones were found, e.g. with the status &amp;quot;unauthorized&amp;quot;.&lt;br /&gt;
*:To configure a connection to a device automatically, make sure that &lt;br /&gt;
*:*it is connected&lt;br /&gt;
*:*it is turned on&lt;br /&gt;
*:*that it has an appropriate adb driver installed&lt;br /&gt;
*:*it is enabled for debugging (see below).&lt;br /&gt;
*:To view unavailable devices, enable this option below.&lt;br /&gt;
*Connection lost&lt;br /&gt;
*:expecco has lost the connection to the adb server. Try to re-establish the connection by clicking on the button.&lt;br /&gt;
*Connection failed&lt;br /&gt;
*:expecco could not connect to the adb server. Possibly it is not running or the specified path is not correct.&lt;br /&gt;
*:Check the adb configuration in the settings and try to start the adb server and establish a connection by clicking on the button.&lt;br /&gt;
*Connect ...&lt;br /&gt;
*:expecco connects to the adb server. This may take a few seconds.&lt;br /&gt;
*Start adb-Server ...&lt;br /&gt;
*:expecco starts the adb-Server. This may take a few seconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--With &#039;&#039;Automation by&#039;&#039; you can specify, which automation engine is to be used. If you leave the setting at &#039;&#039;(Default)&#039;&#039; the corresponding capability is not set at all. Otherwise Appium, Selendroid and from expecco 2.11 XCUITest are available. Selendroid is usually only used for Android devices prior to version 4.1.--&amp;gt;With &#039;&#039;Next&#039;&#039; you get to the next step. If you enter settings for the GUI browser, this is only possible once a device has been selected.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;UnlockingDeveloperOptions&amp;quot;&amp;gt;Note on unlocking&amp;lt;/span&amp;gt;: In newer Android versions the developer options are no longer offered in the settings at first. If your Android device does not show an entry for &amp;quot;&#039;&#039;Developer options&#039;&#039;&amp;quot; in the settings, first select the entry &amp;quot;&#039;&#039;Phone info&#039;&#039;&amp;quot;, then &amp;quot;&#039;&#039;SoftwareVersionsInfo&#039;&#039;&amp;quot; and click on the entry &amp;quot;&#039;&#039;BuildVersion&#039;&#039;&amp;quot; several times.&lt;br /&gt;
&lt;br /&gt;
==== Manage Chromedrivers ====&lt;br /&gt;
If the App you want to automate uses WebViews with Chrome, Appium needs to have access to an appropriate Chromedriver. If you have selected a device in the list, you can use &amp;quot;&#039;&#039;Manage Chromedrivers&#039;&#039;&amp;quot; to see, which Chrome versions are installed on the device and which Chromedriver versions are provided by expecco. With this dialog you can also download required Chromedriver versions. Beware that there may be several Chrome versions on the device. An App doesn&#039;t have to use the version of the installed Chrome browser for its WebViews. The Chromedriver you use should fit your app for everything to work properly. You can also change the path to the Chromedriver in the capabilities generated at the end of the connection editor.&lt;br /&gt;
&lt;br /&gt;
==== Connect WiFi Android Device ====&lt;br /&gt;
&lt;br /&gt;
You can connect to Android devices using WiFi as well. In this case, the device has to be connected to ADB first, see [[Mobile_Testing_Plugin/en#Connection_via_WLAN|Connection via WLAN]]. Since expecco 22.1, the connection editor provides a dialog helping to set this up, which can be used instead of the command window. For devices using Android 11 or newer, you can pair the device with your machine here by specifying the appropriate parameters and then establish the connection by specifying the IP address and port. You can also use this to establish a wireless connection for devices that are connected via USB. When you select the corresponding device in the list, the required information is read out automatically.&lt;br /&gt;
&lt;br /&gt;
Note that establishing a wireless connection is not part of the connection settings. If you want to establish a new connection with the generated settings, you must make sure that the device is connected to ADB with the specified IP address and port so that it can be found. The ADB connection will be lost if the ADB server or the device are restarted. The permission for wireless debugging is also often reset when the device is restarted and the debug port can then change. Therefore, a wireless connection must always be established manually.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep2&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Step 2: Select App===&lt;br /&gt;
Here you can enter information about the app to be tested. You can decide if you want to use an app that is already installed on the device or if you want to install an app for the test. Select the appropriate tab above. Depending on whether you selected an Android or an iOS device in the previous step, the required input will change.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Android&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App on Device&#039;&#039;&lt;br /&gt;
**:If you have selected a connected device in the first step, the packages of all installed apps are automatically retrieved and you can select from the drop-down lists. The installed apps are divided into third-party packages and system packages; select the appropriate package list. This selection does not belong to the settings, but only provides the corresponding package list. You can use the filter to further narrow down the list and then select the desired package. The activities of the selected package are also automatically retrieved and made available as a drop-down list. Select the activity you want to start. As a rule, an activity is automatically entered from the list. If you are not using a connected device, you must enter the package and the activity manually.&lt;br /&gt;
**&#039;&#039;Install App&#039;&#039;&lt;br /&gt;
**:Under &#039;&#039;App&#039;&#039;, enter the path to an app. The path must be valid for the Appium server being used. You can also specify a URL. If you are using a local Appium server, you can use the right button to navigate to the App installation file and enter this path. If possible, the corresponding package and the activity are also entered in the fields below. However, this entry is not necessary.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;iOS&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App on Device&#039;&#039;&lt;br /&gt;
**:Specify the bundle ID of an installed app. You can find out the IDs of the installed apps using Xcode, for example. Start Xcode and select &#039;&#039;Devices&#039;&#039; from the menu bar at the top of the screen in the &#039;&#039;Window&#039;&#039; menu. A window will open displaying a list of connected devices. If you select your device, you will see a list of the apps you have installed in the overview.&lt;br /&gt;
**&#039;&#039;Install App&#039;&#039;&lt;br /&gt;
**:Under &#039;&#039;App&#039;&#039;, enter the path to an app. The path must be valid for the Appium server being used. You can also specify a URL. For the requirements of apps for real devices, please read the section  [[#iOS-Ger.C3.A4t_and_App_Preparing|Preparing an iOS-Device and App]].&lt;br /&gt;
&lt;br /&gt;
In the lower part you can specify whether the app should be reset or uninstalled when the connection is terminated, and whether it should be reset initially. Again, the corresponding capability is not set if you select &#039;&#039;(Default)&#039;&#039;. With &#039;&#039;Next&#039;&#039; you get to the next step.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep3&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Step 3: Server Settings===&lt;br /&gt;
In the last step, a list of all the capabilities that result from your entries in the previous steps is first displayed in the upper part. If you are familiar with Appium and want to set additional capabilities that are not covered by the connection editor, you can click on &#039;&#039;Edit&#039;&#039; to open the extended view. See the section below for more information.&lt;br /&gt;
&lt;br /&gt;
If you enter settings for the GUI browser, you can enter the &#039;&#039;Connection name&#039;&#039; with which the connection is displayed. This is also the name under which devices can use this connection when it is established. If you leave the field blank, a name will be generated. If the box &amp;quot;&#039;&#039;Managed by expecco&#039;&#039;&amp;quot; is checked, expecco will start a local Appium server on a free port, or use a free server that has already been started. To use your own server, turn this feature off and enter the appropriate address. You will get the local default address and already used addresses to choose from.&lt;br /&gt;
&lt;br /&gt;
In older expecco versions the box is labeled &amp;quot;&#039;&#039;Start on demand&#039;&#039;&amp;quot;. In this case, you must also enter an address if you want expecco to start the server. expecco then tries to start an Appium server at the given address when connecting, if none is running there yet. This server will then also be shut down when the connection is terminated. This only works for local addresses. Make sure that you only use port numbers that are free. It is best to only use odd port numbers from the standard port 4723. The following port number is also used when establishing a connection, which could otherwise lead to conflicts.&lt;br /&gt;
&lt;br /&gt;
Depending on how you opened the dialog, there are now different buttons to close it. In any case you have the option to save. This opens a dialog where you can either select an open project to save the settings there as an attachment, or choose to save it to a file that you can then specify. Saving does not close the dialog, allowing you to select another option.&lt;br /&gt;
&lt;br /&gt;
If you have opened the editor for establishing a connection, you can finally click on &#039;&#039;Connect&#039;&#039; or &#039;&#039;Start and connect server&#039;&#039;, depending on whether the check mark for server start is set. For changing or copying a connection in the GUI Browser, this option is called &#039;&#039;Apply&#039;&#039;, since in this case only the connection entry is changed or created, but the connection setup is not started. If necessary, you can do this afterwards via the context menu. If you have changed capabilities of an existing connection, a dialog then prompts you to decide whether these changes should be applied directly by closing the connection and establishing the new connection or not. In this case, the changes only take effect after you reestablish the connection.&lt;br /&gt;
&lt;br /&gt;
To use the connection editor, also read the corresponding section in the respective tutorial in step 1. (Android: [[Mobile_Testing_Tutorial/en#Step_1:_Run_Demo|Run Demo]], iOS: [[Mobile_Testing_Tutorial/en#Step_1:_Run_Demo_2|Run Demo]]).&lt;br /&gt;
&lt;br /&gt;
===Extended View===&lt;br /&gt;
The extended view of the connection editor can be obtained either by clicking on &#039;&#039;Edit&#039;&#039; in the third step or at any time via the corresponding menu item if you have started the editor via the plugin menu. This view displays a list of all configured Appium Capabilities. You can add, change or remove further entries to this list. To add a capability, select it from the drop-down list of the input field. In this list all known capabilities are sorted into the categories &#039;&#039;Common&#039;&#039;, &#039;&#039;Android&#039;&#039; and &#039;&#039;iOS&#039;&#039;. If you have selected a capability, a short information text is displayed. You can also enter a capability manually in the field. Then click on &#039;&#039;Add&#039;&#039; to add the capability to the list. There you can set the value in the right column. To delete an entry, select it and click on &#039;&#039;Remove&#039;&#039;. With &#039;&#039;Back&#039;&#039; you leave the extended view.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingErweiterteAnsicht.png]]&lt;br /&gt;
&lt;br /&gt;
== Running Appium Servers ==&lt;br /&gt;
In the menu of the Mobile Testing Plugin you will find the entry &#039;&#039;Appium-Server...&#039;&#039;. This opens a window with an overview of all Appium servers started by expecco and on which port they are running. By clicking on the icon in the column &#039;&#039;Show Log&#039;&#039; you can view the logfile of the corresponding server. This is deleted when the server is shut down. With the icons in the column &#039;&#039;Exit&#039;&#039; the corresponding server can be terminated. However, this is prevented if expecco still has an open connection via this server. The rightmost column shows for which connection the server is in use. If it reads &#039;&#039;&amp;lt;idle&amp;gt;&#039;&#039;, the server is currently not used by expecco.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAppiumServer.png]]&lt;br /&gt;
&lt;br /&gt;
When opening the editor to start an Appium connection, an Appium server is started immediately to speed up the connection process. For this purpose, expecco always keeps one idle running Appium server. Additional running servers however, which are not in use anymore, will be terminated automatically after a while.&lt;br /&gt;
&lt;br /&gt;
In the menu of the Mobile Testing Plugin you will also find the entry &#039;&#039;Close all Connections and Servers&#039;&#039;. This is intended for cases where connections or servers cannot be terminated in any other way. If possible, always terminate connections in the GUI browser or by executing a corresponding block. Servers that you have started in the server overview should be terminated there; servers that were started with a connection are automatically terminated with this connection.&lt;br /&gt;
&lt;br /&gt;
Note that only servers started and managed by expecco are listed in the overview. Possible other Appium servers that were started in a different way are not recognized.&lt;br /&gt;
&lt;br /&gt;
== Recorder ==&lt;br /&gt;
If the GUI browser is connected to a device, the integrated recorder can be used to record a test section with that device. To start the recorder, select the appropriate connection in the GUI browser and click the Record button. A new window opens for the recorder. The recorded actions are created in the GUI browser work area. It is therefore possible to edit the recorded data in parallel.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingRecorder.png|caption|]]&lt;br /&gt;
&lt;br /&gt;
====Components of the Recorder Window====&lt;br /&gt;
#&#039;&#039;&#039;Continue/Pause Recording&#039;&#039;&#039;: You can pause the recording by clicking the right icon. You will then see a large pause sign in the view. All actions that you perform now in the recorder are executed, but no blocks are recorded. You can switch back to normal recording mode by clicking the left icon.&lt;br /&gt;
#&#039;&#039;&#039;Stop Recording&#039;&#039;&#039;: Stops the recording and closes the recorder window.&lt;br /&gt;
#&#039;&#039;&#039;Update&#039;&#039;&#039;: Gets the current image and element tree from the device. This is necessary if the device takes longer to execute an action or if something changes without being triggered by the recorder. Since expecco 21.2, there is an additional submenu here that can be used to enable automatic update by checking for changes in the background (see also &#039;&#039;Automatic Update&#039;&#039; further below).&lt;br /&gt;
#&#039;&#039;&#039;Follow Mouse&#039;&#039;&#039;: Select the element under the mouse pointer in the GUI browser.&lt;br /&gt;
#&#039;&#039;&#039;Element Highlighting&#039;&#039;&#039;: The element under the mouse is outlined in red.&lt;br /&gt;
#&#039;&#039;&#039;Show Elements&#039;&#039;&#039;: Show the borders of all elements in the view.&lt;br /&gt;
#&#039;&#039;&#039;Tools&#039;&#039;&#039;: Selection, which  tool is used for recording. The selected action is triggered with each click on the view. The following actions are available:&lt;br /&gt;
#*Element Actions:&lt;br /&gt;
#**Click: Short click on the element under cursor. To determine more precisely which element is used, use the Follow Mouse or Element Highlighting function.&lt;br /&gt;
#**Tap with Duration (Element): Similar to click, except that the duration of the click will be recorded as well. This allows the recording of long clicks.&lt;br /&gt;
#**Tap with Position (Element): Similar to click, but additionally records the position inside the element. The position can be recorded relative to the element size or, when pressing Ctrl while clicking, as absolute position from the upper left corner of the element.&lt;br /&gt;
#**Set Text: Allows to set the text of an input field.&lt;br /&gt;
#**Clear Text: Clears the text of an input field.&lt;br /&gt;
#*Device Actions:&lt;br /&gt;
#**Tap (Screen): Triggers a click at the screen position.&lt;br /&gt;
#**Tap with Duration (Screen): Triggers a click at the screen position, which also considers the duration.&lt;br /&gt;
#**Swipe: Swipe in a straight line from the point where you press the mouse button until you release it. The duration is also recorded.&lt;br /&gt;
#:Please note for this actions that the result may differ on different devices, e.g. with different screen resolutions.&lt;br /&gt;
#*Test Flow Blocks&lt;br /&gt;
#**Check Attribute: Compares the value of a specified attribute of the element with a predefined value. The result triggers the corresponding output.&lt;br /&gt;
#**Assert Attribut: Compares the value of a specified attribute of the element with a predefined value. If the values are not equal, the test fails.&lt;br /&gt;
#**Get Attribute: Gets the current value of a specified attribute of the element.&lt;br /&gt;
#*Auto&lt;br /&gt;
#:If the Auto tool is selected, you can use all actions by specific input methods: &#039;&#039;Click&#039;&#039;, &#039;&#039;Tap Element&#039;&#039; and &#039;&#039;Swipe&#039;&#039; still work by clicking, but are distinguished by the duration and movement of the cursor. To trigger a &#039;&#039;Tap&#039;&#039;, hold down Ctrl while clicking. The remaining actions are available in a context menu by right-clicking on the element.&lt;br /&gt;
#&#039;&#039;&#039;Context Actions&#039;&#039;&#039;: Here you can record actions concerning contexts:&lt;br /&gt;
#*Switch to Context: Shows a list of all currently available contexts and you can select to which one you want to switch.&lt;br /&gt;
#*Get Current Context: Gets the handle of the current context.&lt;br /&gt;
#*Get Context Handles: Gets a list of all currently available contexts.&lt;br /&gt;
#&#039;&#039;&#039;Softkeys&#039;&#039;&#039;: Only for Android. Simulates pressing the buttons Back, Home, Menu and Power.&lt;br /&gt;
#&#039;&#039;&#039;Home Button&#039;&#039;&#039;: Only for iOS since expecco 2.11. Allows pressing the Home button.Prior to expecco 19.2, it only works if AssistiveTouch is activated and the menu is located in the middle of the upper screen border. From expecco 19.2 on, the function no longer uses AssistiveTouch.&lt;br /&gt;
#&#039;&#039;&#039;Help&#039;&#039;&#039;: Opens this online documentation on the general page about [[GuiBrowser_Recorder/en|GUI Browser recorders]].&lt;br /&gt;
#&#039;&#039;&#039;View&#039;&#039;&#039;: Shows a screenshot of the device. Actions are triggerd by mouse depending on the selected tool. If a new action can be recorded, the window has a green frame, else it is red.&lt;br /&gt;
#&#039;&#039;&#039;Resize Window to Image&#039;&#039;&#039;: Resizes the recorder window so that the screenshot can be displayed completely.&lt;br /&gt;
#&#039;&#039;&#039;Resize Image to Window&#039;&#039;&#039;: Scales the screenshot to a size that makes use of the full size of the window.&lt;br /&gt;
#&#039;&#039;&#039;Adjust Display&#039;&#039;&#039;: Opens a dialog to adjust the displayed image, if expecco does not show it right. You can correct the scaling or rotate the image by 90°.&lt;br /&gt;
#&#039;&#039;&#039;Correct Orientation&#039;&#039;&#039;: Corrects the image if it is upside down. Using the arrow to the right, the image can also be rotated by 90°, if this should ever be necessary. Since expecco 19.1 you find this functionality under &#039;&#039;Adjust Display&#039;&#039;. The orientation of the image is irrelevant for the functionality of the recorder, it only works on the elements it receives.&lt;br /&gt;
#&#039;&#039;&#039;Scaling&#039;&#039;&#039;: Changes the scaling of the screenshots.&lt;br /&gt;
#&#039;&#039;&#039;Messages&#039;&#039;&#039;: Shows the path of the current selected element or other messages. It has a context menu to show a list of previous messages.&lt;br /&gt;
&lt;br /&gt;
====Usage====&lt;br /&gt;
Each click in the window triggers an action and is recorded in the workspace of the GUI browser. There you can run, edit, or create a new block from what you have recorded. You find the actions to trigger softkeys directly in the menu bar (see above). To record actions on elements, either change the selection of the tool in the menu bar (see above) and then click on the element or select the corresponding action from the context menu by right-clicking on the corresponding element. For text input it is also possible to place the cursor over the element and enter the text. This opens the input dialog for this action. On how to use the recorder, see also step 2 in the tutorial ([[Mobile_Testing_Tutorial/en#Step_2:_Creating_a_Block_with_the_Recorder|Android]] resp. [[Mobile_Testing_Tutorial/en#Step_2:_Creating_a_block_with_the_Recorder_2|iOS]]).&lt;br /&gt;
&lt;br /&gt;
====Hide elements====&lt;br /&gt;
Since expecco 21.2 it is also possible to hide the selected element in the recorder from the context menu. This means that this element cannot be selected from now on. This function is useful for ignoring elements that are in the foreground to be able to access elements below them. To undo this state, you have to find the corresponding element in the tree of the GUI browser, which also has such an entry in the context menu.&lt;br /&gt;
&lt;br /&gt;
====Automatic Update====&lt;br /&gt;
The recorder doesn&#039;t show a live image of the device, but only a snapshot. Therefore an update is needed after changes to match what is displayed on the device. The recorder updates automatically after executing an action. Since expecco 20.2 there are further automatic updates possible. You can enable the, in the menu &amp;quot;View&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
One option is, to check after an action has been executed, if there are further changes after the first update. If so, a second update is triggered. This shall fix the problem, that the recorder is not up to date after an action, because the update has been done too early.&lt;br /&gt;
&lt;br /&gt;
The second option is to enable a periodical update. After a set interval the recorder is automatically updated if there are changes. Thereby the recorder view is mostly up to date, but this causes an overhead regarding the communication to the device.&lt;br /&gt;
&lt;br /&gt;
== AVD Manager und SDK Manager ==&lt;br /&gt;
AVD Manager und SDK Manager sind beides Anwendungen von Android. Im Menü des Mobile Testing Plugins bietet expecco die Möglichkeit, diese zu starten. Ansonsten finden Sie diese Programme bei Ihrer Android-Installation. Mit dem AVD Manager können Sie AVDs, also Konfigurationen für Emulatoren, erstellen, bearbeiten und starten. Mit dem SDK Manager erhalten Sie einen Überblick über Ihre Android-Installation und können diese bei Bedarf erweitern.&lt;br /&gt;
&lt;br /&gt;
= Hybrid Apps and WebViews =&lt;br /&gt;
&#039;&#039;&#039;!!! IMPORTANT NOTICE - If you have problems switching to the webview, please set the &amp;quot;Default Application - Browser App&amp;quot; in Android Settings to &amp;quot;Chrome&amp;quot; !!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hybrid apps contain platform native elements as well as other elements that are integrated in a WebView. These elements can also be used, but you first have to switch to the corresponding context. With the block &#039;&#039;Get Current Context&#039;&#039; you get the current context. Initially this is &#039;&#039;NATIVE_APP&#039;&#039;, i.e. the context of the native elements. With the block &#039;&#039;Get Context Handles&#039;&#039; you get a collection of all existing contexts. If there is a WebView context, it is called &#039;&#039;WEBVIEW_1&#039;&#039; or &#039;&#039;WEBVIEW_&amp;lt;package&amp;gt;&#039;&#039; with the package of the WebView. Several WebView contexts are also possible. For each WebView context, there is a corresponding WebView element in the native context. You can use the &#039;&#039;Switch to Context&#039;&#039; block to switch to such a context and from now on only have access to the elements in this context.&lt;br /&gt;
&lt;br /&gt;
In the GUI browser, the existing contexts are displayed at the top of the tree as well as the tree of a context is inserted below the corresponding WebView element.&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span id=&amp;quot;Customizing XPath using the GUI Browsers&amp;quot;&amp;gt;&amp;lt;!-- name before 01.10.2020--&amp;gt;&amp;lt;/span&amp;gt;Customizing XPath using the GUI Browser=&lt;br /&gt;
Bausteine, die auf einem Gerät fehlerfrei funktionieren, tun dies auf anderen Geräten möglicherweise nicht. Auch können kleine Änderungen der App dazu führen, dass ein Baustein nicht mehr den gewünschten Effekt hat. Man sollte einen Baustein daher so robust formulieren, dass er für eine Vielzahl von Geräten verwendet werden kann und kleine Anpassungen an der App verkraftet. Dazu muss man das grundlegende Funktionsprinzip der Adressierung verstehen. Dies wird im Folgenden am Beispiel der App aus dem Tutorial erläutert.&lt;br /&gt;
&lt;br /&gt;
Die Ansicht der App setzt sich aus einzelnen Elementen zusammen. Dazu gehören die Schaltflächen &#039;&#039;GTIN-13 (EAN-13)&#039;&#039; und &#039;&#039;Verify&#039;&#039;, das Eingabefeld der Zahl &#039;&#039;4006381333986&#039;&#039; und das Ergebnisfeld, in dem OK erscheint, wie auch alle anderen auf der Anzeige sichtbaren Dinge. Diese sichtbaren Elemente sind in unsichtbare Strukturelemente eingebettet. Alle Elemente zusammen sind in einer zusammenhängenden Hierarchie, dem Elementbaum, organisiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingGUIBrowser.png | frame | left | Abb. 1: Funktionen des GUI-Browsers]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
Sie können sich diesen Baum im GUI-Browser ansehen. Wechseln Sie dazu in den GUI-Browser (Abb. 1) und starten Sie eine beliebige Verbindung. Sobald die Verbindung aufgebaut ist, können Sie den gesamten Baum aufklappen (1) (Klick bei gedrückter Strg-Taste). Er enthält alle Elemente der aktuellen Seite der App.&lt;br /&gt;
&lt;br /&gt;
Ein Baustein, der nun ein bestimmtes Element verwendet, muss dieses eindeutig angeben, indem er dessen Position im Elementbaum mit einem Pfad im XPath-Format beschreibt. Dieses Format ist ein verbreiteter Web-Standard für XML-Dokumente und -Datenbanken, eignet sich aber genauso für Pfade im Elementbaum.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie ein Element im Baum auswählen, wird unten der von expecco automatisch generierte XPath (2) für das Element angezeigt, der auch beim Aufzeichnen verwendet wird. Oberhalb davon in der Mitte des Fensters befindet sich eine Liste der Eigenschaften (3) des ausgewählten Elements. Man nennt diese Eigenschaften auch Attribute. Sie beschreiben das Element näher wie beispielsweise seinen Typ, seinen Text oder andere Informationen zu seinem Zustand. Links unten können Sie zur besseren Orientierung im Baum die &#039;&#039;Vorschau&#039;&#039; (4) aktivieren, um sich den Bildausschnitt des Elements anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Der Elementbaum für gleiche Ansicht einer App kann sich je nach Gerät unterscheiden. Es sind diese Unterschiede, die verhindern, eine Aufnahme von einem Gerät unverändert auch auf allen anderen Geräten abzuspielen: Ein XPath, der im einen Elementbaum ein bestimmtes Element identifiziert, beschreibt nicht unbedingt das gleiche Element im Elementbaum auf einem anderen Gerät. Es kann stattdessen passieren, dass der XPath auf kein Element, auf ein falsches Element oder auf mehrere Elemente passt. Dann schlägt der Test fehl oder er verhält sich unerwartet.&lt;br /&gt;
&lt;br /&gt;
Man könnte natürlich für jedes Gerät einen eigenen Testfall schreiben. Das brächte aber unverhältnismäßigen Aufwand bei Testerstellung und -wartung mit sich. Das Problem lässt sich auch anders lösen, da ein jeweiliges Element nicht nur durch genau einen XPath beschrieben wird. Vielmehr erlaubt der Standard mithilfe verschiedener Merkmale unterschiedliche Beschreibungen für ein und dasselbe Element zu formulieren. Das Ziel ist daher, einen Pfad zu finden, der auf allen für den Test verwendeten Geräten funktioniert und überall eindeutig zum richtigen Element führt.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel besteht die Verbindung zur Android-App aus dem Tutorial und der Eintrag des GTIN-13-Buttons ist ausgewählt (5). Dessen automatisch generierter XPath (2) kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[@resource id=&#039;android:id/content&#039;]/android.widget.RelativeLayout/android.widget.Button[@resource-id=&#039;de.exept.expeccomobiledemo:id/gtin_13&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Er ist offensichtlich lang und unübersichtlich. Der sehr viel kürzere Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@text=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
führt zum selben Element.&lt;br /&gt;
&lt;br /&gt;
Für die iOS-App lautet der automatisch generierte XPath für diesen Button beispielsweise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/XCUIElementTypeApplication/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/UIAApplication/UIAWindow[1]/UIAButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und kann kürzer als&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@name=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Sie können den Pfad entsprechend im GUI-Browser ändern und durch &#039;&#039;Pfad überprüfen&#039;&#039; (6) feststellen, ob er weiterhin auf das ausgewählte Element zeigt, was expecco mit &#039;&#039;Verify Path: OK&#039;&#039; (7) bestätigen sollte. Der erste, sehr viel längere Pfad, beschreibt den gesamten Weg vom obersten Element des Baumes bis hin zum gesuchten Button. Der zweite Pfad hingegen wählt mit * zunächst sämtliche Elemente des Baumes und schränkt die Auswahl dann auf genau die Elemente ein, die ein &#039;&#039;text&#039;&#039;- bzw. &#039;&#039;name&#039;&#039;-Attribut mit dem Wert &#039;&#039;GTIN-13 (EAN-13)&#039;&#039; besitzen, in unserem Fall also genau der eine Button, den wir suchen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden Android-ähnliche Pfade zur Veranschaulichung verwendet. Die Elemente in iOS-Apps heißen zwar anders, wodurch andere Pfade entstehen; das Prinzip ist jedoch das gleiche.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum1.png | frame | Abb. 2: Elementbaum einer fiktiven App]]&lt;br /&gt;
&lt;br /&gt;
Sie können solche Pfade mit Hilfe weniger Regeln selbst formulieren. Sehen Sie sich den einfachen Baum einer fiktiven Android-App in Abb. 2 an: Die Einrückungen innerhalb des Baumes geben die Hierarchie der Elemente wieder. Ein Element ist ein &#039;&#039;Kind&#039;&#039; eines anderen Elementes, wenn jenes andere Element das nächsthöhere Element mit einem um eins geringeren Einzug ist. Jenes Element ist das &#039;&#039;Elternelement&#039;&#039; des Kindes. Sind mehrere untereinander stehende Elemente gleich eingerückt, so sind sie also alle Kinder desselben Elternelements.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad durch alle Ebenen der Hierarchie zum TextView-Element ist nun:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Elemente sind mit Schrägstrichen voneinander getrennt. Es fällt auf, dass der Name des ersten Elements nicht mit dem im Baum übereinstimmt. Das oberste Element in der Hierarchie heißt immer &#039;&#039;hierarchy&#039;&#039; (für iOS wäre es &#039;&#039;AppiumAUT&#039;&#039;), expecco zeigt im Baum stattdessen den Namen der Verbindung an, damit man mehrere Verbindungen voneinander unterscheiden kann. Die weiteren Elemente tragen jeweils das Präfix &#039;&#039;android.widget.&#039;&#039;, das im Baum zur besseren Übersicht nicht angezeigt wird. Bei IOS gibt es kein Präfix, das durch einen Punkt abgetrennt wäre, expecco 2.11 blendet aber entsprechend &#039;&#039;XCUIElementType&#039;&#039; am Anfang aus. Mit jedem Schrägstrich führt der Pfad über eine Eltern-Kind-Beziehung in eine tiefere Hierarchie-Ebene, d. h. &#039;&#039;FrameLayout&#039;&#039; ist ein Kindelement von &#039;&#039;hierarchy&#039;&#039;, &#039;&#039;LinearLayout&#039;&#039; ist ein Kind von &#039;&#039;FrameLayout&#039;&#039; usw. Die in eckigen Klammern geschriebenen Wörter dienen nur als Orientierungshilfe im Baum. Sie gehören nicht zum Typ.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad muss nicht beim Element &#039;&#039;hierarchy&#039;&#039; beginnen. Man kann den Pfad beginnend mit einem beliebigen Element des Baumes bilden. Man kann also verkürzt auch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
schreiben. Der Pfad führt zum selben &#039;&#039;TextView&#039;&#039;-Element, da es nur ein Element dieses Typs gibt. Anders verhält es sich bei dem Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da es zwei Elemente vom Typ &#039;&#039;Button&#039;&#039; gibt, passt dieser Pfad auf zwei Elemente, nämlich den Button, der mit &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; markiert ist, und den &#039;&#039;Button&#039;&#039;, der mit &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; markiert ist. Es würde an dieser Stelle aber auch nicht helfen den langen Pfad von &#039;&#039;hierarchy&#039;&#039; aus beginnend anzugeben. Um einen mehrdeutigen Pfad weiter zu differenzieren, kann man explizit ein Element aus einer Menge wählen, indem man den numerischen Index in eckigen Klammern dahinter schreibt. Der Pfad aus dem obigen Beispiel lässt sich damit so anpassen, dass er eindeutig auf den &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; weist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[1].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ihnen fällt sicher auf, dass der Index eine 1 ist obwohl das zweite Element gemeint ist. Das kommt daher, dass die Zählung bei 0 beginnt. Der Button mit der Markierung &amp;quot;An&amp;quot; hat also die Nummer 0 und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Nummer 1.&lt;br /&gt;
&lt;br /&gt;
Dieser Ansatz, einen expliziten Index zu verwenden, hat zwei Nachteile: Zum einen lässt sich an dem Pfad nur schwer ablesen welches Element gemeint ist, zum andern ist der Pfad sehr empfindlich schon gegenüber kleinsten Änderungen, wie zum Beispiel dem Vertauschen der beiden &#039;&#039;Button&#039;&#039;-Elemente oder dem Einfügen eines weiteren &#039;&#039;Button&#039;&#039;-Elements in der App.&lt;br /&gt;
&lt;br /&gt;
Es wäre daher wünschenswert, das gemeinte Element über eine ihm charakteristische Eigenschaft wie einen Attributwert, zu adressieren. Für Android-Apps eignet sich hierfür häufig das Attribut &#039;&#039;resource-id&#039;&#039;. Im Idealfall muss bei der Entwicklung der App darauf geachtet werden, dass jedes Element eine eindeutige Id erhält. Die &#039;&#039;resource-id&#039;&#039; hat den großen Vorteil, dass sie unabhängig vom Text des Elements oder der Spracheinstellung des Geräts ist. Für iOS-Apps kann entsprechend das Attribut &#039;&#039;name&#039;&#039; verwendet werden, wenn es von der App sinnvoll gesetzt wird. Der XPath-Standard erlaubt solche Auswahlbedingungen zu einem Element anzugeben. Angenommen, der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Eigenschaft &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;off&#039;&#039; und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; hat als &#039;&#039;resource-id&#039;&#039; den Wert &#039;&#039;on&#039;&#039;, dann kann man als eindeutigen Pfad für den &amp;quot;Aus&amp;quot;-&#039;&#039;Button&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[@resource-id=&#039;off&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
formulieren. Wie an dem Beispiel zu sehen werden solche Bedingungen wie ein Index in eckigen Klammern an den Elementtyp angehängt. Der Name eines Attributes wird mit einem @ eingeleitet und der Wert mit einem = in Anführungszeichen angehängt. Ist der Attributwert global eindeutig, kann man den vorausgehenden Pfad sogar durch den globalen Platzhalter * ersetzen, der auf jedes Element passt. Das obige Beispiel mit dem GTIN-13-&#039;&#039;Button&#039;&#039; war ein solcher Fall.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum2.png | frame | Abb. 3: Elementbaum einer fiktiven App mit Erweiterungen]]&lt;br /&gt;
&lt;br /&gt;
Abb. 3 zeigt eine Erweiterung des Beispiels aus Abb. 2. Die App hat nun ein weiteres, nahezu identisches &#039;&#039;LinearLayout&#039;&#039; bekommen. Die &#039;&#039;Buttons&#039;&#039; sind in ihren Attributen jeweils ununterscheidbar. Deshalb funktioniert der vorige Ansatz nicht, einen eindeutigen Pfad nur mithilfe eines Attributwerts zu formulieren. Offensichtlich unterscheiden sich aber ihre benachbarten &#039;&#039;TextViews&#039;&#039;. Es ist möglich die jeweilige &#039;&#039;TextView&#039;&#039; in den Pfad mit aufzunehmen, um einen &#039;&#039;Button&#039;&#039; dennoch eindeutig zu adressieren. Ein Pfad zum &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; unterhalb der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; kann dabei wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView[@resource-id=&#039;push&#039;]/../android.widget.Button[@resource-id=&#039;on&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Teil beschreibt den Pfad zu der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; und der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;push&#039;&#039;. Danach folgt ein Schrägstrich gefolgt von zwei Punkten. Die zwei Punkte sind eine spezielle Elementbezeichnung, die nicht ein Kindelement benennt, sondern zum Elternelement wechselt, in diesem Fall also das &#039;&#039;LinearLayout&#039;&#039;, in dem die &#039;&#039;TextView&#039;&#039; eingebettet ist. Im Kontext dieses &#039;&#039;LinearLayout&#039;&#039; ist der restliche Pfad, nämlich der &#039;&#039;Button&#039;&#039; mit der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;on&#039;&#039;, eindeutig.&lt;br /&gt;
&lt;br /&gt;
Der XPath-Standard bietet noch sehr viel mehr Ausdrucksmittel. Mit der hier knapp vorgestellten Auswahl ist es aber bereits möglich für die meisten praktischen Testfälle gute Pfade zu formulieren. Eine vollständige Einführung in XPath ginge über den Umfang dieser Einführung weit hinaus. Sie finden zahlreiche weiterführende Dokumentationen im Web und in Büchern.&lt;br /&gt;
&lt;br /&gt;
Eine universelle Strategie zum Erstellen guter XPaths gibt es nicht, da sie von den Testanforderungen abhängt. In der Regel ist es sinnvoll, den XPath kurz und dennoch eindeutig zu halten. Häufig lassen sich Elemente über Eigenschaften identifizieren wie beispielsweise ihren Text. Will man aber gerade den Text eines Elements auslesen, kann dieser natürlich nicht im Pfad verwendet werden, da er vorher nicht bekannt ist. Ebenso wird der Text variieren, wenn die App mit verschiedenen Sprachen gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Jeder Baustein, der auf einem Element arbeitet, hat einen Eingangspin für den XPath. Im GUI-Browser finden Sie in der Mitte oben eine Liste von Bausteinen mit Aktionen, die Sie auf das ausgewählte Element anwenden können. Suchen Sie den Baustein &#039;&#039;Click&#039;&#039; (8) im Ordner Elements und wählen Sie ihn aus (Abb. 1). Er wird im rechten Teil unter &#039;&#039;Test&#039;&#039; eingefügt, der Pin für den XPath ist mit dem automatisch generierten Pfad des Elements vorbelegt (9). Sie können den Baustein hier auch ausführen. Die Ansicht wechselt dann auf &#039;&#039;Lauf&#039;&#039;. Ändert sich durch die Aktion der Zustand Ihrer App, müssen Sie den Baum anschließend aktualisieren (10).&lt;br /&gt;
&lt;br /&gt;
Wenn Sie in der unteren Liste eine Eigenschaft auswählen, wechselt die Anzeige der Bausteine zu &#039;&#039;Eigenschaften&#039;&#039;, wo Sie die eigenschaftsbezogenen Bausteine finden. Wie bei den Aktionen können Sie auch hier einen Baustein auswählen, der dann rechts in Test mit dem Pfad des Elements und der ausgewählten Eigenschaft eingetragen wird, sodass Sie ihn direkt ausführen können.&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span id=&amp;quot;troubleshooting&amp;quot;&amp;gt;&amp;lt;!-- Referenced by error dialog on connection error --&amp;gt;&amp;lt;/span&amp;gt;Problems and Solutions=&lt;br /&gt;
== Locators depend on the version or are variable ==&lt;br /&gt;
In this case consider to either store the locators (xPath) in a variable or to define a locator mapping inside a screenplay attachment. It is also possible to store just parts of an locator (e.g. locator path of a parent or attribute value) in a variable and add them in the freeze value of the locator pin by &amp;quot;&#039;&#039;$(varName)&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Invisible UI Elements ==&lt;br /&gt;
Note that the [[#Recorder|Recorder]] also considers items that you cannot see on the screen. Therefore, turn on element highlighting or use the follow mouse function and the element tree in the GUI browser to determine if the correct element is used. It can happen, that invisible elements are in front of other elements and cover them, so that the desired element cannot be selected in the recorder. See section [[#Hide_elements|Hide elements]] for a solution to this.&lt;br /&gt;
&lt;br /&gt;
== iOS: Cable not certified ==&lt;br /&gt;
In some cases, when connecting an iOS device via USB, a message appears indicating that the cable used is not certified. In this case, replacing the respective cable is the only solution.&lt;br /&gt;
&lt;br /&gt;
== iOS: Alerts when connecting ==&lt;br /&gt;
Make sure that no alerts are open when connecting to an iOS device. Otherwise the connection will fail because the app cannot be brought to the foreground. See also [[#Preparing_an_iOS-Device_and_App|Preparing an iOS-Device and App]].&lt;br /&gt;
&lt;br /&gt;
== iOS: .ipa cannot be installed ==&lt;br /&gt;
Note that on iOS simulators no &#039;&#039;.ipa&#039;&#039; files can be installed but only &#039;&#039;.app&#039;&#039; files.&lt;br /&gt;
&lt;br /&gt;
==iOS: First Connect is not working==&lt;br /&gt;
If there is not already a signed build of the WebDriverAgent on your Mac, it has to be created during the first connect. Usually, this can take a little longer than one minute. Per default Appium uses a timeout of 60000&amp;amp;nbsp;ms to wait for the WebDriverAgent to start on the device, so the connect will be canceled in that case. You can set this timeout with the capability &#039;&#039;wdaLaunchTimeout&#039;&#039;, e.g. to &#039;&#039;120000&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Moreover, the signing settings have to be correct. In our experience, the most reliable solution is to set automatic signing in the WebDriverAgent Xcode project an selecting the team there. See the explanation in section [[#Signing_WebDriverAgent|Signing WebDriverAgent]] for that. In this case you should &#039;&#039;&#039;not&#039;&#039;&#039; use the capabilities &#039;&#039;xcodeConfigFile&#039;&#039; resp. &#039;&#039;xcodeOrgId&#039;&#039; and &#039;&#039;xcodeSigningId&#039;&#039;, as they could cause a conflict. Caution: If you have set a Team ID in the Mobile Testing settings, expecco will automatically set this as &#039;&#039;xcodeOrgId&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
Pay attention to your device during the first connect. You might have to agree to the installation by entering your password. On the Mac you might need to enter the password to allow access to the key chain for signing, often several times.&lt;br /&gt;
&lt;br /&gt;
== Android: Device not visible in the connect editor ==&lt;br /&gt;
If an Android device connected via USB does not appear in the connection editor, try changing the USB connection type. Usually MTP or PTP should work. Check again, if &amp;quot;USB Debugging&amp;quot; is enabled in the developer options on the device (these options are disabled on some devices and have to be enabled first using a trick.) See also [[#Prepare_Android_Device|Prepare Android Device]].&lt;br /&gt;
&lt;br /&gt;
== Android: Truncated Elements at Bottom ==&lt;br /&gt;
For Android devices that automatically show and hide the navigation bar/softkeys, the recorder may cut off elements in the lower area that would be hidden by the softkeys, even if they are not displayed at this time. In this case it is advisable to set the softkeys so that they are permanently displayed.&lt;br /&gt;
&lt;br /&gt;
For newer Android versions there usually is no such option. Even if the controls are visible all the time, they don&#039;t have their own space, but are on top of the content of the app. Therefore, there is an area on the lower part of the screen, which cannot be automated, because it is not counted to the active area of the app. Appium will then truncate the elements there. This area can even be larger then the needed by the controls. This is a known issue for Samsung devices with Android 11. Since the information about the size of the app area is already provided on Android level, we cannot offer a solution for this, but can only hope that the problem will be fixed by the manufacturer. You may try to get better results by setting the control to gestures, but this bears the same issue.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;waitForIdleTimeout&amp;quot;&amp;gt;&amp;lt;!-- Referenced by expecco--&amp;gt;&amp;lt;/span&amp;gt; Android: Test Hangs While Finding an Element==&lt;br /&gt;
The block &#039;&#039;Find Element by XPath&#039;&#039; and all element blocks wait until an element is present for the given path. The timeout for this can be set either directly at the block or in the environment variables. However, if the element should already be present, but the test doesn&#039;t continue anyway, the reason could be in the UIAutomator/UIAutomator2. It waits for the app to go to the idle state before it even starts to search for the element. This may take longer, if the app e.g. runs an animation in the background or executes other kinds of actions. Fetching the page source, e.g. when updating in the GUI browser or in the recorder, can also take longer for this reason. There is a default timeout of 10 seconds after which it no longer waits for the idle state. This timeout can be set in Appium (waitForIdleTimeout). If you want to change the value of this timeout, you can do this since expecco 21.2 by executing the Smalltalk code &amp;lt;code&amp;gt;AppiumTestRunner::TestRunConnection waitForIdleTimeout:2000&amp;lt;/code&amp;gt; before the test. The timeout is given in milliseconds, so the example sets it to 2 seconds.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;startChromedriverTimeout/&amp;gt;Android: Updating the Tree or Switching to Webview Context takes too long==&lt;br /&gt;
Especially with older devices it can happen that newer Chromedriver cannot be initialized. This makes it impossible to switch to the webview context. However, this is only detected over a timeout by Appium, which is 4 minutes by default. Since expecco also tries to switch to the webview context when building the tree in the GUI browser, this can lead to very long loading times. Since there is no way to decrease this timeout in Appium, we have added a corresponding capability to the version we provide in the MobileTestingSupplement. Starting with version 1.13.1.0 of the [[#Windows|MobileTestingSupplement]], &#039;&#039;chromedriverStartTimeout&#039;&#039; can be used to set the timeout in milliseconds. The switch still doesn&#039;t work then, but expecco doesn&#039;t take as long to update the tree and the context switch module fails faster. The connection dialog adds this capability automatically starting with expecco 22.1. &lt;br /&gt;
&lt;br /&gt;
== No Action on Click ==&lt;br /&gt;
The block to click on an element is successful, but no action was performed on the device.&lt;br /&gt;
:This can happen if the element is hidden by another element and therefore clicking on the element is not possible. In this case, Appium does not throw an error, but simply nothing happens. If you would like to make a click at the position of the element anyways, even if it is hidden, use the block &#039;&#039;Tap&#039;&#039; instead and pass the location of the element to it (&#039;&#039;Get Location&#039;&#039;). If instead you want to check before a click whether the element is hidden at this moment, try whether the properties &#039;&#039;Is Displayed&#039;&#039; or &#039;&#039;Is Enabled&#039;&#039; might help you.&lt;br /&gt;
&lt;br /&gt;
== No Update After Action ==&lt;br /&gt;
An action was triggered on the recorder and a block has been recorded, but the recorder still shows the old image.&lt;br /&gt;
:The recorder doesn&#039;t show a live image of the device, but only a snapshot. After an action has been executed, the recorder will update automatically. However, it can happen, that the image has already been updated before the effects of the action are fully completed on the device. In this case you should update the recorder by hand using the icon with the blue arrows. Since expecco 20.2 you can also enable automatic updates for this case. See also the description for the [[#Recorder|recorder]].&lt;br /&gt;
&lt;br /&gt;
== Attribute &amp;quot;clickable&amp;quot; is wrong ==&lt;br /&gt;
An element has for the attribute/property &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; the value &amp;quot;&#039;&#039;false&#039;&#039;&amp;quot;, but is actually clickable.&lt;br /&gt;
:The attribute &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; has to be set explicitly by the app developer and does not affect the behavior of the app. You should generally disregard this attribute in your tests. Unfortunately, many apps exist where the programmer was &amp;quot;lazy&amp;quot; about this.&lt;br /&gt;
&lt;br /&gt;
==Connecting Fails==&lt;br /&gt;
If the connection to the Appium server fails, you will receive an error message in expecco similar to the one shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:MobileTestingVerbindungsfehler.png]]&lt;br /&gt;
&lt;br /&gt;
Here you can see the type of error that has occurred. Click on &amp;quot;&#039;&#039;Details&#039;&#039;&amp;quot; to get more information. Possible errors are:&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.remote.UnreachableBrowserException&#039;&#039;&lt;br /&gt;
:The specified server is not running or is not reachable. Check the server address.&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.WebDriverException&#039;&#039;&lt;br /&gt;
:Read the message after &#039;&#039;Original Error&#039;&#039; in the first line of the details:&lt;br /&gt;
:*&#039;&#039;Unknown device or simulator UDID&#039;&#039;&lt;br /&gt;
::Either the device is not connected properly or the udid is not correct.&lt;br /&gt;
:*&#039;&#039;Unable to launch WebDriverAgent because of xcodebuild failure: xcodebuild failed with code 65&#039;&#039;&lt;br /&gt;
::This error can have various causes. Either the WebDriverAgent could actually not be built because the signing settings are wrong or the appropriate provisioning profile is missing. Please read the section about [[#Signing|Signing]].  It is also possible that the WebDriverAgent cannot be started on the device, for example because an alert is in the foreground or you did not trust the developer.&lt;br /&gt;
:*&#039;&#039;Could not install app: &#039;Command &#039;ios-deploy [...] exited with code 253&#039;&#039;&#039;&lt;br /&gt;
::The specified app cannot be installed on the iOS device because it is not entered in the app&#039;s Provisioning Profile.&lt;br /&gt;
:*&#039;&#039;Bad app: [...] App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name.&#039;&#039;&lt;br /&gt;
::The path to the app is wrong. Make sure that the file is located in the specified path on your Mac.&lt;br /&gt;
:*&#039;&#039;packageAndLaunchActivityFromManifest failed.&#039;&#039;&lt;br /&gt;
::The specified &#039;&#039;apk&#039;&#039; file is probably broken.&lt;br /&gt;
:*&#039;&#039;Could not find app apk at [...]&#039;&#039;&lt;br /&gt;
::The path to the app is wrong. Make sure that the &#039;&#039;apk&#039;&#039; file is located in the specified path.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the error is not due to one of the causes listed above, the automation applications on the device may no longer function properly. In this case it helps to uninstall them from the mobile device. They are then automatically reinstalled the next time a connection is established.&lt;br /&gt;
&lt;br /&gt;
*For iOS devices, this is the WebDriverAgent, which you can simply uninstall from the home screen. This usually solves problems caused by changing the used Mac or the Xcode version.&lt;br /&gt;
&lt;br /&gt;
*For Android devices, it is the UIAutomator2; here, a problem occurs sporadically on some devices, the cause is currently unknown to us. To uninstall, on the device, navigate to &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;Applications&#039;&#039;&amp;quot;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; and search the list for the following entries:&lt;br /&gt;
    Appium Settings&lt;br /&gt;
    io.appium.uiautomator2.server&lt;br /&gt;
    io.appium.uiautomator2.server.test&lt;br /&gt;
:Click on the respective application and then on &amp;quot;&#039;&#039;Uninstall&#039;&#039;&amp;quot;.&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&#039;&#039;The corresponding entry may have a slightly different name on some devices.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If this doesn&#039;t help, check the output of the Appium server. For a server started by expecco, you can find the log in the list of [[#Running_Appium_Servers|Running Appium Servers]].&lt;br /&gt;
&lt;br /&gt;
==I do not have a Mac==&lt;br /&gt;
Maybe this site will help you: [https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10 https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin&amp;diff=29633</id>
		<title>Mobile Testing Plugin</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin&amp;diff=29633"/>
		<updated>2024-07-11T09:36:15Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Windows */ new supplement&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Deutsche Version&#039;&#039;&#039; | [[Mobile_Testing_Plugin/en|English Version]]&lt;br /&gt;
&lt;br /&gt;
= Einleitung =&lt;br /&gt;
Mit dem &#039;&#039;Mobile Testing Plugin&#039;&#039; können Anwendungen auf Android- und iOS-Geräten getestet werden. Dabei ist es egal, ob reale mobile Endgeräte oder emulierte Geräte verwendet werden. Das Plugin kann (und wird üblicherweise) zusammen mit dem [[Expecco_GUI_Tests_Extension_Reference|GUI-Browser]] verwendet werden, der das Erstellen von Tests unterstützt. Zudem ist damit das Aufzeichnen von Testabläufen möglich.&lt;br /&gt;
&lt;br /&gt;
Zur Verbindung mit den Geräten wird [http://appium.io/ Appium] verwendet. Appium ist ein freies Open-Source-Framework zum Testen und Automatisieren von mobilen Anwendungen.&lt;br /&gt;
&lt;br /&gt;
Zur Einarbeitung in das Mobile Plugin empfehlen wir das [[Mobile_Testing_Tutorial|Tutorial]] zu bearbeiten. Dieses führt anhand eines Beispiels Schritt für Schritt durch die Erstellung eines Testfalls und erklärt die nötigen Grundlagen.&lt;br /&gt;
&lt;br /&gt;
= Installation und Aufbau =&lt;br /&gt;
Zur Verwendung des Mobile Testing Plugins müssen Sie expecco inkl. des Plugins Mobile Testing installiert haben und Sie benötigen die entsprechenden Lizenzen. expecco kommuniziert mit den Mobilgeräten über einen Appium-Server, der entweder auf demselben Rechner wie expecco läuft, oder auf einem zweiten Rechner. Dieser muss für expecco erreichbar sein.&lt;br /&gt;
&lt;br /&gt;
==Installationsübersicht==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rechner, auf dem expecco läuft:&#039;&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rechner, an dem Android-Geräte angeschlossen sind:&#039;&#039;&#039;&lt;br /&gt;
* Appium-Server&#039;&#039;, diesen können Sie über das Mobile Testing Supplement installieren (s.u.), von dem wir regelmäßig einen neue Version zur Verfügung stellen&#039;&#039;&lt;br /&gt;
* Android SDK&#039;&#039;, dieses erhalten Sie ebenfalls mit dem Mobile Testing Supplement&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rechner, an dem iOS-Geräte angeschlossen sind&amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
* Appium-Server&#039;&#039;, diesen können Sie über das Mobile Testing Supplement für Mac OS installieren (s.u.), von dem wir regelmäßig einen neue Version zur Verfügung stellen&#039;&#039;&lt;br /&gt;
* Xcode &#039;&#039;in einer Version, die die verwendete iOS-Version unterstützt, erhältlich über den Apple App Store&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
* Apple-Entwickler-Zertifikat mit zugehörigem privaten Schlüssel &#039;&#039;(zum Signieren des WebDriverAgents)&#039;&#039;&lt;br /&gt;
* Provisioning Profile mit den verwendeten Mobilgeräten&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Je nach Aufbau können die oben genannten Rechner auch das selbe Gerät sein. expecco kann sich sowohl über das Netzwerk mit einem entfernten Appium-Server und dort angeschlossenen Mobilgeräten verbinden, als auch lokal selbst einen Appium-Server starten und diesen mit lokalen Mobilgeräten verwenden. Einige Funktionen von expecco, die die Erstellung von Testfällen erleichtern, sind jedoch nur verfügbar, wenn die Mobilgeräte am selben Rechner angeschlossen sind, auf dem auch expecco läuft. Ein möglicher Aufbau kann daher wie in folgender Abbildung aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAufbau.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird die Installation von Appium und anderer nötiger Programme für Windows und Mac OS erklärt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;: Zum Zeitpunkt der Erstellung dieses Dokuments wurden Versionen bis 11 auf Funktion verifiziert. Neuere Versionen sollten - sofern nicht grundlegende Änderungen von Oracle vorgenommen wurden, ebenfalls funktionieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;: Beachten Sie, dass aufgrund der Voraussetzungen (keine Anbindung an nicht-Apple Geräte verfügbar) iOS-Geräte nur von einem Mac aus angesteuert werden können. Sie benötigen also einen Mac als &amp;quot;Vermittler&amp;quot; (siehe auch unten: [[#Ich habe keinen Mac | &amp;quot;Ich habe keinen Mac&amp;quot;]])&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
Am einfachsten installieren Sie alles mit unserem Mobile Testing Supplement&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;. In neueren Versionen ist allerdings aufgrund geänderter Lizenzbedingungen seitens Oracle kein JDK mehr enthalten, sodass sie dieses zusätzlich installieren müssen. Sie können natürlich Appium auch direkt installieren, um die Version zu verwenden, die Sie möchten. Um dann einen Appium-Server mit expecco starten zu können, muss allerdings eine entsprechende Batchdatei vorhanden sein und in den [[Mobile_Testing_Plugin#Konfiguration_des_Plugins|Einstellungen]] angegeben werden. Verbindungen können aber auch zu anderen laufenden Appium-Servern aufgebaut werden.&lt;br /&gt;
*&#039;&#039;&#039;expecco 24.1&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-24.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.3]&lt;br /&gt;
:Im Vergleich zum Vorgänger aktualisierte Chromedriver Versionen.&lt;br /&gt;
*expecco 23.2: [https://download.exept.de/transfer/h-expecco-23.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.2]&lt;br /&gt;
:Im Vergleich zum Vorgänger aktualisierte Chromedriver Versionen.&lt;br /&gt;
*expecco 23.1: [https://download.exept.de/transfer/h-expecco-23.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.1]&lt;br /&gt;
:Gleiche Versionen wie der Vorgänger, aber der Installer erlaubt nun, Appium zum Autostart hinzuzufügen.&lt;br /&gt;
*expecco 22.2 und 22.1: [https://download.exept.de/transfer/h-expecco-22.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.2.0]&lt;br /&gt;
:Appium 1.22.3*&lt;br /&gt;
:Node 14.17.5&lt;br /&gt;
:adb 1.0.41 aus platform-tools 33.0.2&lt;br /&gt;
:&#039;&#039;* Wir haben Appium um die Capability&#039;&#039; startChromedriverTimeout &#039;&#039;erweitert, um schneller einen Timeout zu bekommen, wenn der Chromedriver nicht gestartet werden kann. (siehe [[#startChromedriverTimeout|Probleme und Lösungen]])&#039;&#039;&lt;br /&gt;
*expecco 21.2: [https://download.exept.de/transfer/h-expecco-21.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.12.0.0]&lt;br /&gt;
:Enthält die Appium-Version 1.22.0, Node ist weiterhin in der Version 12.13.1.&lt;br /&gt;
*expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.1.0]&lt;br /&gt;
:Nur kleine Änderungen im Vergleich zur vorigen Version.&lt;br /&gt;
*expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.0.0]&lt;br /&gt;
:Im Vergleich zur vorigen Version wurde Appium auf die Version 1.16.0-rc.1 aktualisiert und node 12 verwendet. &lt;br /&gt;
*expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.8.1.0]&lt;br /&gt;
:Dieses installiert Appium in der Version 1.12.0 und enthält nun zusätzlich build-tools der Version 28.0.3 im android-sdk. Ansonsten ist es gleich wie die vorige Version.&lt;br /&gt;
*expecco 18.2: [http://download.exept.de/transfer/h-expecco-18.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.7.3.0]&lt;br /&gt;
:Dieses installiert Appium in der Version 1.8.1. Außerdem bietet das Supplement auch an, &#039;&#039;Android Debug Bridge&#039;&#039; und &#039;&#039;Google USB Driver&#039;&#039; ([https://gsmusbdrivers.com/download/adb-fastboot-drivers/ adb-setup-1.4.3]) zu installieren. Damit sind Treiber für ein breites Spektrum an Android-Geräten abgedeckt, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen. Ein &#039;&#039;&#039;JDK ist (aufgrund geänderter Lizenzbedingungen seitens Oracle) nicht mehr enthalten&#039;&#039;&#039;, dieses müssen Sie selbst herunterladen, z.B. von [https://www.oracle.com/technetwork/java/javase/downloads/index.html Oracle].&lt;br /&gt;
*expecco 18.1: wie expecco 2.11&lt;br /&gt;
*expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/MobileTestingSupplement_1.6.0.2_Setup.exe Mobile Testing Supplement 1.6.0.2]&lt;br /&gt;
:Dieses installiert ein Java JDK der Version 8, android-sdk und Appium in der Version 1.6.4. Außerdem bietet das Supplement auch einen universellen adb-Treiber ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]) an. Dieser vereint Treiber für ein breites Spektrum an Android-Geräten, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen.&lt;br /&gt;
*expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_1.5.0.0_Setup.exe Mobile Testing Supplement 1.5.0.0]&lt;br /&gt;
:Dieses installiert ein Java JDK der Version 8, android-sdk und Appium in der Version 1.4.16. Während der Installation wird die grafische Oberfläche von Appium gestartet, dieses Fenster können Sie sofort wieder schließen. Außerdem bietet das Supplement auch einen universellen adb-Treiber ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]) an. Dieser vereint Treiber für ein breites Spektrum an Android-Geräten, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen.&lt;br /&gt;
&lt;br /&gt;
Wenn expecco Mobilgeräte verwenden soll, die an einem anderen Rechner angeschlossen sind, müssen Sie dort einen Appium-Server starten. Dies können Sie mit der Datei &amp;lt;code&amp;gt;appium_standalone.cmd&amp;lt;/code&amp;gt; tun. Der Server wird dann mit dem Standard-Port 4723 gestartet. Falls Sie eine andere Portnummer verwenden wollen, starten Sie den Server mit&lt;br /&gt;
&lt;br /&gt;
 appium_standalone.cmd -p &amp;lt;portnummer&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Server ist bereit, sobald die Zeile&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Appium REST http interface listener started on 0.0.0.0:4723&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
angezeigt wird, wobei Sie am Ende die verwendete Portnummer ablesen können.&lt;br /&gt;
&lt;br /&gt;
Beim ersten Starten von Appium – sowohl im Standalone als auch gestartet von expecco – kann es vorkommen, dass die Windows-Firewall den Node-Server blockiert. Lassen Sie den Zugriff zu, sonst kann Appium nicht gestartet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;) Sie können natürlich auch die Command Line Tools (adb, sdkmanager, avdmanager etc.) einer vorhandenen Android Studio Version verwenden, sowie Appium separat installieren.&lt;br /&gt;
Da sich diese Tools regelmäßig ändern, und es in der Vergangenheit zu Inkompatibilitäten und Fehlern nach Releasewechseln kam, empfehlen wir zu Beginn, das mitgelieferte Paket zu verwenden. Dies ist möglicherweise nicht das aktuellste, wurde aber auf Lauffähigkeit getestet.&lt;br /&gt;
&lt;br /&gt;
Falls das Android Mobilgerät an einem entfernen Rechner angeschlossen ist,&lt;br /&gt;
können Sie den aktuellen Bildschirminhalt z.B. mit dem [https://github.com/Genymobile/scrcpy scrcpy] tool live mitverfolgen.&lt;br /&gt;
&lt;br /&gt;
== Mac OS (nicht erforderlich für Android-Tests)==&lt;br /&gt;
Hinweis: Wenn Sie nicht vorhaben, iOS-Geräte (iPhone, iPad, etc.) zu testen, können Sie das Folgende ignorieren. &#039;&#039;&#039;Der Apple-Rechner sowie das Mac-Setup werden für Android-Geräte nicht benötigt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Xcode ===&lt;br /&gt;
Zur Automatisierung mit iOS-Geräten wird [https://developer.apple.com/xcode/ Xcode] benötigt. Sie erhalten dieses über den App Store. Dabei ist darauf zu achten, dass die Version zu den getesteten iOS-Versionen passt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;iOS&#039;&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp;  &lt;br /&gt;
|&#039;&#039;&#039;Xcode&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;macOS&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|10.x&lt;br /&gt;
|8.x&lt;br /&gt;
|10.12 (Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|11.x&lt;br /&gt;
|9.x&lt;br /&gt;
|10.13 (High Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|12.x&lt;br /&gt;
|10.x&lt;br /&gt;
|10.14 (Mojave)&lt;br /&gt;
|-&lt;br /&gt;
|13.x&lt;br /&gt;
|11.x&lt;br /&gt;
|10.15 (Catalina)&lt;br /&gt;
|-&lt;br /&gt;
|14.x&lt;br /&gt;
|12.x&lt;br /&gt;
|11.0 (Big Sur)&lt;br /&gt;
|-&lt;br /&gt;
|15.x&lt;br /&gt;
|13.x&lt;br /&gt;
|12.0 (Monterey)&lt;br /&gt;
|-&lt;br /&gt;
|16.x&lt;br /&gt;
|14.x&lt;br /&gt;
|12.5 (Monterey)&lt;br /&gt;
|}&lt;br /&gt;
Diese Tabelle gibt nur eine vereinfachte Übersicht, lesen Sie besser unter [https://xcodereleases.com/ Xcode Releases] oder [https://en.wikipedia.org/wiki/Xcode#Version_comparison_table Xcode-Versionen] welche Version Sie brauchen. Für neue iOS Minor-Versionen gibt es in der Regel auch ein Update für Xcode, z.B. brauchen Sie für iOS 10.2 mindestens Xcode 8.2, für iOS 10.3 mindestens Xcode 8.3 usw. &lt;br /&gt;
Wenn Sie also auf eine neuere iOS-Version wechseln, benötigen Sie in der Regel auch eine neuere Xcode-Version. Neuere Versionen von Xcode laufen möglicherweise nicht auf älteren Betriebssystemen, was wiederum eine Aktualisierung des Betriebssystems erforderlich machen kann. Falls Sie auch ältere iOS-Versionen testen wollen kann es sinnvoll sein, die entsprechenden Xcode-Versionen parallel zu installieren.&lt;br /&gt;
&lt;br /&gt;
=== Appium ===&lt;br /&gt;
Der Appium-Server kann entweder als Kommandozeilen-Anwendung installiert werden oder über [https://github.com/appium/appium-desktop Appium Desktop] verwendet werden, welcher den Server über ein GUI zur Verfügung stellt. Mittlerweile gibt es auch Appium 2.0, was wir aber bisher noch nicht mit expecco getestet haben und daher nicht empfehlen.&lt;br /&gt;
&lt;br /&gt;
==== Appium Desktop ====&lt;br /&gt;
Laden Sie die neueste Version von [https://github.com/appium/appium-desktop/releases/ Appium Desktop] herunter. Für den Mac nehmen Sie am besten die dmg-Datei und installieren sie in den Anwendungen. Beim Starten der Anwendung &#039;&#039;Appium Server GUI&#039;&#039; erhalten Sie wahrscheinlich eine Fehlermeldung, dass es aus Sicherheitsgründen nicht möglich ist. Öffnen Sie dann das Kontextmenü auf der Anwendungsdatei (Rechtsklick bzw. Strg + Klick) und wählen Sie dort &#039;&#039;Öffnen&#039;&#039; aus. Bestätigen Sie dann, dass Sie die Anwendung wirklich öffnen wollen. Fortan können Sie die Anwendung normal öffnen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:OpenAppiumServerGUI1.png|text-top]] [[Datei:OpenAppiumServerGUI2.png|text-top]]&lt;br /&gt;
&lt;br /&gt;
Ab Xcode 14 gibt es Probleme beim Signieren des WebDriverAgents, den Appium zur Automatisierung auf das Gerät spielt. Dadurch ist mit der Version 1.22.3-4 von Appium Desktop kein Verbindungsaufbau möglich. Das Problem ist in neueren Versionen des WebDriverAgents behoben, es gibt aber aktuell noch keine Version von Appium Desktop, die eine solche Version enthält (Stand November 2022). Sie können aber manuell eine neue Version herunterladen (z.B. 4.10.2)  und die Dateien in Appium ersetzen. Laden Sie dazu von der [https://github.com/appium/WebDriverAgent/releases/ WebDriverAgent Download-Seite] eine der beiden Archivdateien (zip oder tar.gz) mit dem Source Code herunter. Öffnen und entpacken Sie dann diese Datei. Den Inhalt des Ordners WebDriverAgent-4.10.2 müssen Sie nun nach&lt;br /&gt;
&lt;br /&gt;
 /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
kopieren. Wenn Sie über den Finder dorthin navigieren, machen Sie auf die Anwendung &#039;&#039;Appium Server GUI&#039;&#039; einen Kontextklick (Rechtsklick bzw. Strg + Klick) und wählen Sie im Menü &#039;&#039;Paketinhalt anzeigen&#039;&#039;. Ersetzen Sie alle Dateien, die bereits mit gleichem Namen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
==== Appium über npm installieren ====&lt;br /&gt;
Sie können Appium auch über npm (Node Package Manager) installieren. Dazu müsen Sie erst node/npm installieren. Das geht mit [https://github.com/nvm-sh/nvm nvm] (Node Version Manager) was Sie von Github bekommen. Falls die folgende Installationsanleitung bei Ihnen nicht funktionieren sollte, finden Sie dort ausführlichere Informationen im [https://github.com/nvm-sh/nvm#readme Readme].&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie ein Terminal-Fenster. Klonen Sie dann das Github-Repository von nvm&lt;br /&gt;
 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash&lt;br /&gt;
und laden Sie es&lt;br /&gt;
 export NVM_DIR=&amp;quot;$([ -z &amp;quot;${XDG_CONFIG_HOME-}&amp;quot; ] &amp;amp;&amp;amp; printf %s &amp;quot;${HOME}/.nvm&amp;quot; || printf %s &amp;quot;${XDG_CONFIG_HOME}/nvm&amp;quot;)&amp;quot; [ -s &amp;quot;$NVM_DIR/nvm.sh&amp;quot; ] &amp;amp;&amp;amp; \. &amp;quot;$NVM_DIR/nvm.sh&amp;quot; # This loads nvm&lt;br /&gt;
&lt;br /&gt;
Führen Sie danach&lt;br /&gt;
 command -v nvm&lt;br /&gt;
aus, um zu testen, ob es funktioniert hat. Es sollte &#039;&#039;nvm&#039;&#039; ausgegeben werden. Kommt keine Antwort, führen Sie&lt;br /&gt;
 touch ~/.zshrc&lt;br /&gt;
aus, und versuchen Sie es erneut.&lt;br /&gt;
&lt;br /&gt;
Nun können Sie node mit dem folgenden Befehl installieren.&lt;br /&gt;
 nvm install 16.15.1&lt;br /&gt;
Da es mit der aktuellen Version von node Probleme beim Installieren von Appium gibt, empfehlen wir diese Version.&lt;br /&gt;
&lt;br /&gt;
Nachdem node installiert ist, können Sie Appium darüber installieren:&lt;br /&gt;
 npm install -g appium&lt;br /&gt;
&lt;br /&gt;
Den Appium-Server können Sie nun einfach über den Befehl&lt;br /&gt;
 appium&lt;br /&gt;
starten. Die Ausgabe erfolgt dann direkt im Terminal.&lt;br /&gt;
&lt;br /&gt;
Auch bei dieser Version gibt es das Problem bei der Signierung des WebDriverAgents, wie bei [[#Appium_Desktop | Appium Desktop]] beschrieben. Laden Sie also auch in diesem Fall eine neuere Version des WebDriverAgents herunter und ersetzen Sie die alten Dateien. Diese finden Sie unter&lt;br /&gt;
 /Users/&amp;lt;user&amp;gt;/.nvm/versions/16.15.1/lib/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
==== Mobile Testing Supplement ====&lt;br /&gt;
Ältere Appium-Versionen stellen wir Ihnen über das Mobile Testing Supplement für Mac OS zur Verfügung, mit dem Sie es einfach installieren können:&lt;br /&gt;
* &#039;&#039;&#039;expecco 20.2&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-20.2.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement für Mac OS (1.2.2)]&lt;br /&gt;
:Enthält Appium Version 1.18.3 und verwendet node 14.&lt;br /&gt;
&lt;br /&gt;
* expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement für Mac OS (1.2.0)]&lt;br /&gt;
:Nur wenige Änderungen im Vergleich zur vorigen Version.&lt;br /&gt;
&lt;br /&gt;
* expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement_for_MacOS.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.98)]&lt;br /&gt;
:Im Vergleich zur vorigen Version wurde Appium auf die Version 1.16.0-rc.1 aktualisiert und es wird node 12 verwendet. &lt;br /&gt;
&lt;br /&gt;
* expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.96.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.96)]&lt;br /&gt;
:Diese Version enthält Appium 1.12.0. &lt;br /&gt;
&lt;br /&gt;
* expecco 18.1: [http://download.exept.de/transfer/h-expecco-18.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.94.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.94)]&lt;br /&gt;
:Diese Version enthält Appium 1.8.0.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/Mobile_Testing_Supplement_for_Mac_OS_1.0.94.tar.bz2 Mobile Testing Supplement für Mac OS (1.0.94)]&lt;br /&gt;
:Diese Version enthält Appium 1.6.4.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_for_Mac_OS_1.0.tar.bz2 Mobile Testing Supplement für Mac OS]&lt;br /&gt;
:Diese Version entält Appium 1.4.16.&lt;br /&gt;
&lt;br /&gt;
Nachdem Herunterladen des Supplements, können Sie es in ein Verzeichnis Ihrer Wahl (z. B. Ihr Home-Verzeichnis) verschieben und dort entpacken. Ein geeigneter Befehl in einer Shell könnte wie folgt aussehen, passen Sie dabei die Versionsnummer entsprechend an:&lt;br /&gt;
&lt;br /&gt;
 tar -xvpf Mobile_Testing_Supplement_for_Mac_OS_1.1.98.tar.bz2&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Ihre Standard-Xcode-Installation verwenden wollen, können Sie Appium direkt über die Datei im &#039;&#039;bin&#039;&#039;-Verzeichnis mit der entsprechenden Versionsnummer starten:&lt;br /&gt;
&lt;br /&gt;
 Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
Falls Sie ein anderes Xcode als das als Standard konfigurierte verwenden wollen, müssen Sie Appium den entsprechenden Pfad über die Umgebungsvariable &#039;&#039;DEVELOPER_DIR&#039;&#039; angeben. &lt;br /&gt;
Wenn Sie Xcode z. B. in &#039;&#039;/Applications/Xcode-11.3.app&#039;&#039; installiert haben, müssten Sie Appium so starten:&lt;br /&gt;
&lt;br /&gt;
 DEVELOPER_DIR=&amp;quot;/Applications/Xcode-11.3.app/Contents/Developer&amp;quot; Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
Was als Standard-Xcode-Installation gesetzt ist, zeigt der Befehl:&lt;br /&gt;
&lt;br /&gt;
 xcode-select -p&lt;br /&gt;
&lt;br /&gt;
Wenn Appium Ihre Xcode-Installation nicht findet, erscheint beim Verbinden eine Fehlermeldung in der Art:&lt;br /&gt;
&#039;&#039;&amp;lt;blockquote&amp;gt;org.openqa.selenium.SessionNotCreatedException - A new session could not be created. (Original error: Could not find path to Xcode, environment variable DEVELOPER_DIR set to: /Applications/Xcode.app but no Xcode found)&amp;lt;/blockquote&amp;gt;&#039;&#039;&lt;br /&gt;
Starten Sie in diesem Fall Appium erneut, unter Angabe eines gültigen &#039;&#039;DEVELOPER_DIR&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== WebDriverAgent-Signierung ====&lt;br /&gt;
Zur Automatisierung lädt Appium eine App namens WebDriverAgent auf das Gerät und muss sie dafür signieren können. Dazu brauchen Sie einen Apple-Account und ein entsprechendes Zertifikat. Zur Evaluierung können Sie einen kostenlosen Account verwenden. Dieser hat den Nachteil, dass erstellte Profile nur eine Woche gültig sind und danach neu erstellt werden müssen. Seien Sie auch vorsichtig, wenn Sie sich den Account teilen, da es vorkommen kann, dass Zertifikate widerrufen werden oder durch automatische Generierung ungültig werden. Als Folge können bereits signierte Apps nicht mehr verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie bereits ein entsprechendes Zertifikat mit dem zugehörigen privaten Schlüssel in Ihrer [https://support.apple.com/de-de/guide/keychain-access/welcome/mac Schlüsselbundverwaltung] auf dem Mac haben, können Sie den WebDriverAgent automatisch signieren lassen. Ansonsten empfiehlt es sich, die Signierung über Xcode einzustellen und zu verwalten.&lt;br /&gt;
&lt;br /&gt;
Schließen Sie zuerst das Gerät, das Sie verwenden möchten, über USB an den Mac an. Stellen Sie sicher, dass sich der Mac und das Gerät im selben Netzwerk befinden, ansonsten kann es beim Verbindungsaufbau mit Appium zu Problemen kommen. Starten Sie Xcode und öffnen Sie &#039;&#039;Preferences&#039;&#039;. Wechseln Sie zur Seite der Accounts und legen Sie einen Eintrag mit Ihrem Account an. Anschließend können Sie auf &#039;&#039;Manage Certificates...&#039;&#039; klicken, um die Zertifikate zu sehen, die zu diesem Account gehören. Zum Ausführen von Tests benötigen Sie ein iOS-Development-Zertifikat und den dazugehörigen privaten Schlüssel. Wenn Sie noch keines besitzen, erstellen Sie eines. Wenn Sie bereits eines haben, aber es nicht in Ihrem Schlüsselbund vorhanden ist (erkennbar an dem Hinweis &amp;quot;Not in Keychain&amp;quot;), können Sie es importieren. Das können Sie über die [https://support.apple.com/de-de/guide/keychain-access/welcome/mac Schlüsselbundverwaltung] auf dem Mac machen, wenn Sie es zuvor aus dem Schlüsselbund exportiert haben, in dem es sich befindet. Das Zertifikat mit dem zugehörigen Schlüssel sollte sich im Schlüsselbund &#039;&#039;Anmeldung&#039;&#039; befinden. Dort kann es als PKCS#12-Datei (Endung typischerweise .p12) exportiert werden. Um ein Zertifikat in Ihren Schlüsselbund zu importieren, wählen Sie im Menü &#039;&#039;Ablage&#039;&#039; die Option &#039;&#039;Objekte importieren&#039;&#039;. Falls Sie nicht wissen, wo das Zertifikat gespeichert ist, können Sie es in Xcode auch widerrufen und in Ihrem Schlüsselbund neu anlegen. Machen Sie das jedoch nur, wenn Sie wissen, dass das alte Zertifikat nicht mehr in Verwendung ist, da es danach nicht mehr benutzt werden kann. Nun sollte Ihr Schlüsselbund ein iOS-Development-Zertifikat enthalten.&lt;br /&gt;
&amp;lt;!---(Ich habe den folgenden Teil mal rausgenommen. Man braucht das nicht, wenn es in Xcode eingestellt ist.) Wählen Sie im Rechtsklick-Menü den Punkt &#039;&#039;Informationen&#039;&#039; aus. Unter den Details des Zertifikats finden Sie die Team-ID, die hier als Organisationseinheit bezeichnet wird. Tragen Sie diese in den Einstellungen des Plugins im Feld &#039;&#039;Team-ID&#039;&#039; ein, siehe [[#Konfiguration_des_Plugins|Konfiguration des Plugins]].--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie nun das WebDriverAgent-Projekt in Xcode. Wenn Sie das Mobile Testing Supplement installiert haben, finden Sie es in dessen Verzeichnis unter&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
Wenn Sie Appium Desktop installier haben, finden Sie es unter&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;/Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
Sie können einfach im Finder zu der Xcode-Project-Datei navigieren und Sie über einen Doppelklick öffnen. Beachten Sie dabei, dass Sie dabei auf die Anwendung Appium Server GUI einen Kontextklick (Rechtsklick bzw. Strg + Klick) machen und im Menü &#039;&#039;Paketinhalt anzeigen&#039;&#039; auswählen müssen, um in deren Unterverzeichnis zu gelangen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingWebDriverAgentXcode.png]]&lt;br /&gt;
&lt;br /&gt;
Wählen Sie &#039;&#039;WebDriverAgentLib&#039;&#039; und die Seite &#039;&#039;Signing &amp;amp; Capabilities&#039;&#039; aus. Setzen Sie dort im Abschnitt &#039;&#039;Signing&#039;&#039; die Option &#039;&#039;Automatically manage signing&#039;&#039; und wählen Sie dann ein Team aus. Wechseln Sie nun zu &#039;&#039;WebDriverAgentRunner&#039;&#039; und tun Sie dort dasselbe.&lt;br /&gt;
&amp;lt;!--(Das Folgende scheint nicht mehr aktuell zu sein.) Es sollten an dieser Stelle Fehler angezeigt werden, dass kein Provisioning Profile angelegt oder gefunden wurde. Wechseln Sie deshalb zur Seite &#039;&#039;Build Settings&#039;&#039; und suchen Sie hier im Abschnitt &#039;&#039;Packaging&#039;&#039; den Eintrag &#039;&#039;Product Bundle Identifier&#039;&#039;. Ändern Sie diesen von com.facebook.WebDriverAgentRunner zu etwas, das von Xcode akzeptiert wird, indem Sie den Präfix ändern. Xcode kann nun ein passendes Provisioning Profile generieren und die Fehler auf der General-Seite sollten verschwinden. Danach können Sie Xcode beenden. --&amp;gt;&lt;br /&gt;
Durch das Setzen des Teams sollten die Fehler für den WebDriverAgentRunner verschwinden. Sollte Xcode kein passendes Provisioning Profile für die Bundle ID &#039;&#039;com.facebook.WebDriverAgentRunner&#039;&#039; erstellen können, können Sie diese anpassen, dass sie zu Ihrem Zertifikat passt. Danach können Sie Xcode beenden oder auch, wie weiter unten beschrieben, direkt den Build über Xcode starten, damit das Projekt bereits gebaut ist, wenn Appium es verwenden möchte.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie sich nun von expecco eine Verbindung zu Ihrem Gerät aufbauen, wird der WebDriverAgent darauf installiert und gestartet, um anschließend zur zu testenden App zu wechseln. Eventuell muss auf dem Gerät muss der Ausführung des WebDriverAgents vertraut noch werden. Ein Anzeichnen dafür kann sein, dass die App WebDriverAgent zwar auf dem Gerät erscheint und zu starten versucht, danach aber wieder deinstalliert wird. Öffnen Sie dazu während des Verbindungsaufbaus auf dem Gerät in die Einstellungen und dort unter &#039;&#039;Allgemein&#039;&#039; den Eintrag &#039;&#039;Geräteverwaltung&#039;&#039;. Dieser Eintrag ist nur sichtbar, wenn eine Entwickler-App auf dem Gerät installiert ist. Sie müssen daher möglicherweise warten, bis der WebDriverAgent installiert ist, bevor der Eintrag erscheint. Wählen Sie dort den Eintrag Ihres Apple-Accounts und vertrauen Sie ihm. Da der WebDriverAgent wieder deinstalliert wird, wenn der Start nicht funktioniert hat, müssen Sie dies während des Verbindungsaufbaus tun. Falls Ihnen das zu hektisch ist, können Sie auch folgenden Code ausführen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;xcodebuild -project Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
  xcodebuild -project /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&lt;br /&gt;
&lt;br /&gt;
Damit wird der WebDriverAgent auf dem Gerät installiert ohne dass er wieder gelöscht wird.&lt;br /&gt;
&lt;br /&gt;
Wenn es Probleme beim Installieren des WebDriverAgents gibt, können Sie auch versuchen, den Build über Xcode zu starten. Stellen Sie sicher, dass das richtige Target &#039;&#039;WebDriverAgent&#039;&#039; ausgewählt ist. Fehlermeldungen in Xcode zeigen vielleicht einfacher, wo das Problem liegt. Manchmal hilft es auch, es ein zweites Mal zu versuchen, weil es möglicherweise beim ersten Mal zu lange gedauert hat und abgebrochen wurde. Es kann sein, dass Sie während des Builds mehrmals aufgefordert werden, das Passwort für Ihren Schlüsselbund anzugeben.&lt;br /&gt;
&lt;br /&gt;
[[Datei:WebDriverAgentCodesign.png]]&lt;br /&gt;
&lt;br /&gt;
Lesen Sie auch die Dokumentation von Appium zum [https://github.com/appium/appium-xcuitest-driver/blob/master/docs/real-device-config.md Aufsetzen von Tests mit iOS-Geräten]. In der [https://support.apple.com/en-us/HT204460 Dokumentation von Apple] finden Sie nähere Informationen zum Installieren und Vertrauen von Apps.&lt;br /&gt;
&lt;br /&gt;
Ist der WebDriverAgent einmal auf dem Gerät installiert, wird er für spätere Verbindungen wieder verwendet und der Verbindungsaufbau sollte schneller funktionieren. Ebenso liegt dann die signierte Version bereits auf Ihrem Mac und muss nicht erneut gebaut werden, was die Verbindung zu weiteren Geräten ebenfalls beschleunigt. Wenn Sie wissen, dass bei Ihrem Verbindungsaufbau der WebDriverAgent erst noch signiert und gebaut werden muss, ist es ratsam, die Capability &#039;&#039;wdaLaunchTimeout&#039;&#039; zu setzen. Dieser Timeout, wie lange auf den Start der WebDriverAgents auf dem Gerät gewartet werden soll, liegt standardmäßig bei 60000$nbsp;ms. Der Build dauert aber häufig über eine Minute, sodass der Versuch zum Verbindungsaufbau dann abgebrochen wird. Ein Wert von 120000 hat sich hier als besser erwiesen.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration des Plugins ==&lt;br /&gt;
Bevor Sie loslegen, sollten Sie die Einstellungen des Mobile Testing Plugins überprüfen und ggf. anpassen.&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie im Menü den Punkt &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; und dort unter &amp;quot;&#039;&#039;Erweiterungen&#039;&#039;&amp;quot; den Eintrag &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot; (s. Abb.). Standardmäßig werden diese Pfade automatisch gefunden (1). Um einen Pfad manuell anzupassen, deaktivieren Sie den entsprechenden Haken rechts davon. Sie erhalten in einer Drop-down-Liste einige Pfade zur Auswahl. Ist ein eingetragener Pfad falsch oder kann er nicht gefunden werden, wird das Feld rot markiert und es erscheint ein diesbezüglicher Hinweis. Stellen Sie sicher, dass alle Pfade richtig angegeben sind.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingEinstellungen.png | thumb | 400px | Konfiguration des Plugins]]&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;appium&#039;&#039;&#039;: Geben Sie hier den Pfad zur ausführbaren Datei an mit der Appium in der Kommandozeile gestartet werden kann. Unter Windows wird diese Datei in der Regel &amp;quot;&amp;lt;code&amp;gt;appium.cmd&amp;lt;/code&amp;gt;&amp;quot; heißen. Dieser Pfad wird benutzt, wenn expecco einen Appium-Server startet.&lt;br /&gt;
*&#039;&#039;&#039;node&#039;&#039;&#039;: Geben Sie hier den Pfad zur ausführbaren Datei an, die Node (auch &amp;quot;Node.js&amp;quot;) startet. Dieser Pfad wird beim Starten eines Servers an Appium weitergegeben, damit Appium ihn unabhängig von der PATH-Variablen findet. Unter Windows heißt diese Datei in der Regel &amp;quot;&amp;lt;code&amp;gt;node.exe&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;JAVA_HOME&#039;&#039;&#039;: Geben Sie hier den Pfad zu einem JDK an. Dieser Pfad wird an jeden Appium-Server weitergegeben. Lassen Sie das Feld frei, um den Wert aus der Umgebungsvariablen zu verwenden. Um einzustellen, welches Java von expecco verwendet werden soll, setzen Sie diesen Pfad in den Einstellungen für die Java Bridge.&lt;br /&gt;
*&#039;&#039;&#039;ANDROID_HOME&#039;&#039;&#039;: Geben Sie hier den Pfad zu einem SDK von Android an. Dieser Pfad wird an jeden Appium-Server weitergegeben. Lassen Sie das Feld frei, um den Wert aus der Umgebungsvariablen zu verwenden.&lt;br /&gt;
*&#039;&#039;&#039;adb&#039;&#039;&#039;: Hier steht der Pfad zum adb-Befehl. Unter Windows heißt die Datei adb.exe. Diese wird von expecco beispielsweise verwendet, um die Liste der angeschlossenen Geräte zu erhalten. Diesen Pfad sollten Sie automatisch wählen lassen, da dann der Befehl im ANDROID_HOME-Verzeichnis verwendet wird. Dieser wird auch von Appium verwendet. Falls expecco und Appium jedoch verschiedene Versionen von adb verwenden kann es zu Konflikten kommen.&lt;br /&gt;
*&#039;&#039;&#039;android.bat&#039;&#039;&#039;: Diese Datei wird nur benötigt, um damit den AVD und den SDK Manager zu starten. Automatisch wird hier die Datei im ANDROID_HOME-Verzeichnis gesucht.&lt;br /&gt;
*&#039;&#039;&#039;aapt&#039;&#039;&#039;: Geben Sie hier den Pfad zum aapt-Befehl an. Unter Windows heißt diese Datei &#039;&#039;aapt.exe&#039;&#039;. expecco verwendet aapt nur im Verbindungseditor, um das Paket und die Activities einer apk-Datei zu lesen. Automatisch wird hier die Datei im ANDROID_HOME-Verzeichnis gesucht.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingJavaBridgeEinstellungen.png | thumb | 400px | Konfiguration des JDKs]]&lt;br /&gt;
&lt;br /&gt;
Ab expecco 2.11 gibt es das Feld &#039;&#039;Team-ID&#039;&#039;. Wenn Sie iOS-Tests ausführen, tragen Sie hier die Team-ID Ihres Zertifikats ein. Diese wird für jede iOS-Verbindung verwendet, außer Sie setzen den Wert im Einzelfall in den Verbindungseinstellungen um. Wie Sie die Team-ID erhalten, lesen Sie im Abschnitt zur [[#Signierung|Signierung]] ber der Installation auf Mac OS. Mit expecco 2.10 können Sie die Team-ID nur für jede Verbindungseinstellung extra als Capability eintragen. Dazu müssen Sie jedoch die [[#Erweiterte_Ansicht|erweiterte Ansicht]] verwenden. Geben Sie hier die Capability &#039;&#039;xcodeOrgId&#039;&#039; an und setzen Sie als Wert die Team-ID des Zertifikats.&lt;br /&gt;
&lt;br /&gt;
Die Einstellung zur Serveradresse unten auf der Seite bezieht sich auf das Verhalten des Verbindungseditors. Dieser prüft am Ende, ob die Serveradresse auf &#039;&#039;/wd/hub&#039;&#039; endet, da dies die übliche Form ist. Falls nicht, wird in einem Dialog gefragt, wie darauf reagiert werden soll. Das festgelegte Verhalten kann hier eingesehen und verändert werden.&lt;br /&gt;
&lt;br /&gt;
Wechseln Sie ebenfalls zum Eintrag &#039;&#039;Java Bridge&#039;&#039; (s. Abb.). Hier muss der Pfad zu Ihrer Java-Installation angegeben werden, die von expecco benutzt wird. Tragen Sie hier ein JDK ein. Falls Sie unter Windows das aus dem Mobile Testing Supplement verwenden möchten, lautet der Pfad&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;C:\Program Files (x86)\exept\Mobile Testing Supplement\jdk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Sie können auch die Systemeinstellungen verwenden.&lt;br /&gt;
&lt;br /&gt;
== Android-Gerät vorbereiten ==&lt;br /&gt;
Wenn Sie ein Android-Gerät unter Windows anschließen benötigen Sie möglicherweise noch einen adb-Treiber für das Gerät. Einen passenden Treiber finden Sie üblicherweise auf der jeweiligen Webseite des Herstellers. Haben Sie den Universal-Treiber aus dem Mobile Testing Supplement installiert, sollte für die meisten Geräte bereits alles funktionieren. In einigen Fällen versucht auch Windows automatisch einen Treiber zu installieren, wenn Sie das Gerät zum ersten mal anschließen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===USB-Debugging Einschalten===&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Bevor Sie ein Mobilgerät mit dem Appium-Plugin ansteuern können, müssen Sie für dieses Debugging erlauben!&lt;br /&gt;
&lt;br /&gt;
Für Android-Geräte finden Sie diese Option in den Einstellungen unter &#039;&#039;[https://www.droidwiki.org/wiki/Entwickleroptionen Entwickleroptionen]&#039;&#039; mit dem Namen &#039;&#039;[https://www.droidwiki.org/USB-Debugging USB-Debugging]&#039;&#039;. Falls die Entwickleroptionen nicht angezeigt werden, können Sie diese freischalten, indem Sie unter &amp;quot;&#039;&#039;Über das Telefon&#039;&#039;&amp;quot; siebenmal auf &amp;quot;&#039;&#039;Build-Nummer&#039;&#039;&amp;quot; tippen.&lt;br /&gt;
&lt;br /&gt;
===Wach bleiben Aktivieren===&lt;br /&gt;
Aktivieren Sie auch die Funktion &#039;&#039;Wach bleiben&#039;&#039;, damit das Gerät nicht während der Testerstellung oder -ausführung den Bildschirm abschaltet.&lt;br /&gt;
&lt;br /&gt;
Aus Sicherheitsgründen muss USB-Debugging für jeden Computer einzeln zugelassen werden. Beim Verbinden des Geräts mit dem PC über USB müssen Sie dabei am Gerät der Verbindung zustimmen. Falls Sie dies für Ihren Computer noch nicht getan haben, aber auf dem Gerät kein entsprechender Dialog erscheint, kann es helfen, das Gerät aus- und wieder einzustecken. Das kann insbesondere dann passieren, wenn Sie den ADB-Treiber installiert haben während das Gerät bereits über USB angeschlossen war. Falls auch das nicht hilft, öffnen Sie die Benachrichtigungen, indem Sie sie vom oberen Bildschirmrand herunter ziehen. Dort finden Sie die USB-Verbindung und Sie können die Optionen dazu öffnen. Wählen Sie einen anderen Verbindungstypen aus; in der Regel sollten MTP oder PTP funktionieren.&lt;br /&gt;
&lt;br /&gt;
Sie können auch auf einem Emulator testen. Dieser muss nicht gesondert vorbereitet werden, da er bereits für USB-Debugging ausgelegt ist. Es ist sogar möglich, einen Emulator bei Testbeginn zu starten.&lt;br /&gt;
&lt;br /&gt;
Um zu überprüfen, ob ein Gerät, das Sie an Ihren Rechner angeschlossen haben, verwendet werden kann, öffnen Sie den [[#Verbindungseditor|Verbindungseditor]]. Das Gerät sollte dort angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Verbindung über WLAN ===&lt;br /&gt;
Es ist auch möglich, Android-Geräte über WLAN zu verbinden. Für Geräte mit Android 11 oder neuer ist dies direkt über WLAN möglich, im anderen Fall müssen Sie das Gerät zuerst über USB verbinden. Ab expecco 22.1 können Sie eine WLAN-Verbindung über den [[Mobile Testing Plugin#Verbindungseditor|Verbindungseditor]] aufbauen. Ansonsten ist es auch über die Eingabeaufforderung möglich.&lt;br /&gt;
==== Drahtlos verbinden über die Eingabeaufforderung mit expecco Versionen vor 22.1 (ab Android 11) ====&lt;br /&gt;
Mit expecco ab Version 22.1 funktioniert das einfacher über den Verbindungseditor.&lt;br /&gt;
&lt;br /&gt;
Erlauben Sie in den Entwickleroptionen des Geräts Debugging über WLAN und öffnen Sie dessen Optionen. Sie müssen zuerst das Gerät mit dem  Rechner koppeln. Wählen Sie dazu &amp;quot;&#039;&#039;Gerät mit einem Kopplungscode koppeln&#039;&#039;&amp;quot;, um einen Kopplungscode und eine IP-Adresse mit Port zu erhalten. Öffnen Sie dann auf dem Rechner die Eingabeaufforderung und geben Sie dort ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb pair &amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Kopplungsport&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
wobei Sie &amp;lt;tt&amp;gt;&amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Kopplungsport&amp;gt;&amp;lt;/tt&amp;gt; durch die auf dem Gerät angezeigte IP-Adresse &amp;amp; Port ersetzen. Danach werden Sie aufgefordert, den Kopplungscode einzugeben. Wenn alles geklappt hat, sollte sich das Popup auf dem Gerät schließen und der Rechner als gekoppeltes Gerät angezeigt werden. Geben Sie dann in der Eingabeaufforderung ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Debug-Port&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die IP-Adresse ist hier noch die gleiche wie beim Koppeln, aber der Port ist ein anderer. Beides wird als IP-Adresse &amp;amp; Port auf dem Gerät angezeigt. Damit sollte das Gerät nun über WLAN verbunden sein und kann genauso verwendet werden, wie mit USB-Verbindung. Sie können dies überprüfen, indem Sie entweder &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; eingeben oder in expecco den Verbindungsdialog öffnen. In der Liste taucht das Gerät mit seiner IP-Adresse und dem Port auf. Bedenken Sie, dass die WLAN-Verbindung nicht mehr besteht, wenn der ADB-Server oder das Gerät neu gestartet werden. Häufig wird beim Neustart des Geräts auch die Erlaubnis für das Debugging über WLAN wieder zurückgesetzt und der verwendete Port ändert sich. Die Kopplung bleibt aber bestehen und muss beim nächsten Verbinden nicht noch einmal durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==== WLAN Verbindung über USB starten (Android 10 und früher) ====&lt;br /&gt;
Verbinden Sie zunächst das Gerät über USB mit dem Rechner. Öffnen Sie dann die Eingabeaufforderung und geben Sie dort ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit lauscht das Gerät auf eine TCP/IP-Verbindung an Port 5555. Sollten Sie mehrere Geräte angeschlossen oder Emulatoren laufen haben, müssen Sie genauer angeben, welches Gerät Sie meinen. Geben Sie in diesem Fall ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb devices -l&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Sie erhalten eine Liste aller Geräte, wobei die erste Spalte deren Kennung ist. Schreiben Sie dann stattdessen&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb -s &amp;lt;Gerätekennung&amp;gt; tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
mit der Gerätekennung des gewünschten Geräts. Sie können die USB-Verbindung nun trennen. Jetzt müssen Sie die IP-Adresse Ihres Gerätes in Erfahrung bringen. Sie finden diese üblicherweise irgendwo in den Einstellungen des Geräts, beispielsweise beim Status oder in den WLAN-Einstellungen. Geben Sie dann ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP-Adresse des Geräts&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit sollte das Gerät nun über WLAN verbunden sein und kann genauso verwendet werden, wie mit USB-Verbindung. Sie können dies überprüfen, indem Sie wieder &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; eingeben oder in expecco den Verbindungsdialog öffnen. In der Liste taucht das Gerät mit seiner IP-Adresse und dem Port auf. Bedenken Sie, dass die WLAN-Verbindung nicht mehr besteht, wenn der ADB-Server oder das Gerät neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
=== Verbindung zu einem Emulator ===&lt;br /&gt;
Sie benötigen dazu den Emulator selbst, sowie mindestens ein AVD (Android Virtual Device). Hinweise zu Installation finden Sie in der [https://developer.android.com/studio/run/emulator Android Studio Dokumentation].&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Android Studio bereits mit den Defaulteinstellungen installiert haben &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;, sollte der Emulator bereits mitinstalliert sein. Falls nicht, wählen Sie in Android Studio &amp;quot;&#039;&#039;Configure&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;SDK Manager&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Android SDK&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;SDK Tools&#039;&#039;&amp;quot; - &#039;&#039;Android Emulator&#039;&#039;&amp;quot;, sowie dort die &amp;quot;&#039;&#039;Platform Tools&#039;&#039;&amp;quot;.&lt;br /&gt;
Alternativ geht das auch über die Kommandzeile mit dem &amp;quot;sdkmanager&amp;quot; Kommando.&lt;br /&gt;
&lt;br /&gt;
Als nächstes benötigen Sie mindestens ein AVD; auch dies geht am einfachsten über den Dialog in Android Studio:&lt;br /&gt;
wählen sie &amp;quot;&#039;&#039;Configure&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;AVD Manager&#039;&#039;&amp;quot; und folgen den Anweisungen (Deviceauswahl, Platform und Android Version).  &lt;br /&gt;
&lt;br /&gt;
Auch wenn Sie den Emulator automatisieren benötigen sie Appium; installieren Sie dieses entweder mit dem Mobile Testing Supplement, oder direkt von der Appium homepage (https://github.com/appium/appium-desktop/releases).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;Android Studio selbst wird nicht von expecco benötigt; es bietet aber kompfortable Dialoge zum Installieren von Paketen und AVDs.&lt;br /&gt;
&lt;br /&gt;
== iOS-Gerät und App vorbereiten ==&lt;br /&gt;
Das Ansteuern von iOS-Geräten ist nur über einen Mac möglich. Lesen Sie daher auch den Abschnitt zur [[#Mac_OS|Installation unter Mac OS]].&lt;br /&gt;
&lt;br /&gt;
Bevor Sie ein Mobilgerät mit dem Mobile Testing Plugin ansteuern können, müssen Sie für iOS-Geräte ab iOS 8 Debugging erlauben. Aktivieren Sie dazu die Option &#039;&#039;Enable UI Automation&#039;&#039; unter dem Menüpunkt &#039;&#039;Entwickler&#039;&#039; in den Einstellungen des Geräts. Falls Sie den Eintrag &#039;&#039;Entwickler&#039;&#039; in den Einstellungen nicht finden, gehen Sie wie folgt vor: Schließen Sie das Gerät über USB an den Mac an. Dabei müssen Sie ggf. am Gerät noch der Verbindung zustimmen. Starten Sie Xcode und wählen Sie dann in der Menüleiste am oberen Bildschirmrand im Menü &#039;&#039;Window&#039;&#039; den Eintrag &#039;&#039;Devices&#039;&#039;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wählen Sie dort Ihr Gerät aus. Danach sollte der Eintrag &#039;&#039;Entwickler&#039;&#039; in den Einstellungen auf dem Gerät auftauchen. Dazu müssen Sie möglicherweise die Einstellungen beenden und neu starten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Alert.png | thumb | 270px | Beispiel für einen Alert unter iOS]]&lt;br /&gt;
Ein Verbindungsaufbau zu dem Gerät ist nicht möglich solange es bestimmte Alerts zeigt. Ein solcher Alert kann z.&amp;amp;#x202f;B. erscheinen wenn FaceTime aktiviert ist, indem ein Hinweis auf anfallende SMS-Gebühren angezeigt wird (siehe Screenshot). Achten Sie darauf, das Gerät so zu konfigurieren, dass es im Leerlauf keine solchen Alerts zeigt.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.11 und später ===&lt;br /&gt;
Sie können beliebige Apps testen, die auf dem verwendeten Gerät lauffähig oder bereits installiert sind. Wenn die App als Development-Build vorliegt, muss die UDID des Geräts in der App hinterlegt sein. In jedem Fall muss der WebDriverAgent für das Gerät signiert werden. Lesen Sie dazu den Abschnitt zur [[#Signierung|Signierung]] unter Mac OS.&lt;br /&gt;
&lt;br /&gt;
Falls Sie in einem Test den Home-Button verwenden wollen, müssen Sie auf dem Gerät AssistiveTouch aktivieren. Sie finden diese Option in den Einstellungen unter &#039;&#039;Allgemein&#039;&#039; &amp;gt; &#039;&#039;Bedienungshilfen&#039;&#039; &amp;gt; &#039;&#039;AssistiveTouch&#039;&#039;. Platzieren Sie dann das Menü in der Mitte des oberen Bildschirmrands. Sie können das Drücken des Home-Buttons dann mit dem entsprechenden Menüeintrag im Recorder aufzeichnen oder direkt den Baustein &#039;&#039;Press Home Button&#039;&#039; benutzen.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.10 ===&lt;br /&gt;
Die App, die Sie verwenden wollen, muss als Development-Build vorliegen. Außerdem muss die UDID des Geräts in der App hinterlegt sein.&lt;br /&gt;
&lt;br /&gt;
=== Development-Build signieren ===&lt;br /&gt;
Ein Development-Build einer App ist nur für eine begrenzte Zahl von Geräten zugelassen und kann auf anderen Geräten nicht gestartet werden. Es ist aber möglich, das Zertifikat und die verwendbaren Geräte in einem Development-Build auszutauschen.&lt;br /&gt;
&lt;br /&gt;
* Evaluierung mit Demo-App von eXept:&lt;br /&gt;
:Gerne stellen wir Ihnen eine Demo-App zur Verfügung, die als Development-Build vorliegt und die wir für Ihr Gerät signieren können. Senden Sie dazu bitte Ihrem eXept-Ansprechpartner die UDID Ihres Gerätes zu. Wie Sie die UDID Ihres Gerätes ermitteln können, ist im folgenden Abschnitt beschrieben.&lt;br /&gt;
&lt;br /&gt;
* Eigene App für Ihr Testgerät verwenden:&lt;br /&gt;
:Wenn Sie von den App-Entwicklern einen Development-Build (IPA-Datei) erhalten, der für Ihr Testgerät zugelassen ist, können Sie diesen direkt verwenden. Dazu müssen Sie den Entwicklern die UDID Ihres Geräts mitteilen, damit sie diese eintragen können. &#039;&#039;&#039;Sie können die UDID eines Gerätes mithilfe von Xcode auslesen&#039;&#039;&#039;. Starten Sie dazu Xcode und wählen Sie in der Menüleiste am oberen Bildschirmrand im Menü &#039;&#039;Window&#039;&#039; den Eintrag &#039;&#039;Devices&#039;&#039;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wählen Sie Ihr Gerät aus und suchen Sie in Eigenschaften den Eintrag &#039;&#039;Identifier&#039;&#039;. Die UDID ist eine 40-stellige Hexadezimalzahl.&lt;br /&gt;
&lt;br /&gt;
* Extern entwickelte App für Ihr Testgerät umsignieren:&lt;br /&gt;
:Es können auch Apps umsigniert werden, damit Sie auf anderen Geräten lauffähig sind. Dieser Vorgang ist jedoch kompliziert und setzt insbesondere einen Zugang zu einem Apple-Developer-Account voraus. Eine Dokumentation zur Vorgehensweise ist derzeit in Vorbereitung.&lt;br /&gt;
&lt;br /&gt;
:Für die Evaluierung unterstützen wir Sie gerne beim Umsignieren Ihrer App.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Melden Sie sich beim [https://developer.apple.com/ Apple-Webinterface] an. Navigieren Sie zu &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039;. Erzeugen Sie hier ggf. ein Developer-Zertifikat und ein Provisioning Profile für Ihr Gerät und laden Sie beide herunter. Sollten Sie noch keinen Developer Account haben, erstellen Sie hier einen: https://developer.apple.com/enroll/. Hierzu müssen Sie sich mit einer Apple-ID anmelden.&lt;br /&gt;
&lt;br /&gt;
# Team-ID herausfinden (&#039;&#039;Membership&#039;&#039; -&amp;gt; &#039;&#039;Team ID&#039;&#039;)&lt;br /&gt;
# Unter &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039; Development-Zertifikat auswählen (unter &#039;&#039;+&#039;&#039; anlegen, falls nicht vorhanden) und herunterladen.&lt;br /&gt;
# Unter &#039;&#039;App ID&#039;&#039; Wildcard-App-ID erzeugen, falls nicht vorhanden. App-ID notieren (AppID = Prefix.ID)&lt;br /&gt;
# Gerät hinzufügen, dazu UDID (bzw. &#039;&#039;Identifier&#039;&#039;) des Geräts herausfinden (&#039;&#039;Xcode&#039;&#039; -&amp;gt; &#039;&#039;Window&#039;&#039; (oben in Menüleiste) -&amp;gt; &#039;&#039;Devices&#039;&#039;)&lt;br /&gt;
# Provisionen Profile erstellen: &#039;&#039;iOS App Development&#039;&#039; -&amp;gt; &#039;&#039;AppID&#039;&#039; auswählen -&amp;gt; Zertifikat wählen -&amp;gt; Gerät auswählen -&amp;gt; Profilname anlegen -&amp;gt; Provisioning Profile herunterladen.&lt;br /&gt;
# Das heruntergeladene Zertifikat importieren (&#039;&#039;Downloads&#039;&#039; -&amp;gt; Zertifikat (.cer)&lt;br /&gt;
# SHA1-Fingerabdruck kopieren. Dazu Rechtsklick auf Zertifikat -&amp;gt; &#039;&#039;Information&#039;&#039;, anschließend bis zum Ende der Seite scrollen).&lt;br /&gt;
# Entitlements.plist erstellen (&#039;&#039;Terminal&#039; öffnen -&amp;gt; Downloads/Mobile_Testing_Supplement/bin/gen-entitlements_plist &#039;Team-ID&#039; &#039;App ID&#039; Downloads/Mobile_Testing_Supplement/bin/re-sign-ipa &amp;lt;Pfad zum ipa (z.B. Downloads/expeccoMobileDemo.ipa)&amp;gt; \&lt;br /&gt;
&amp;quot;&amp;lt;Zertifikat (SHA1-Fingerabdruck, z.B. 76 E8 4B E8 78 D5 D7 F9 2E 09 8B D7 E8 FB CE 30 0C F5 D0 EF)&amp;gt;&amp;quot; \&lt;br /&gt;
&amp;lt;Pfad zum Provisionen Profile (z.B. /Users/exept_test/Downloads/dut.mobileprovision)&amp;gt; \&lt;br /&gt;
&amp;lt;Pfad für das Ergebnis-ipa (z.B. Downloads/expeccoMobileDemo_re-signed.ipa)&amp;gt; \&lt;br /&gt;
[Pfad zur entitlements.plist] (z.B. /Users/exept_test/entitlements.plist)&lt;br /&gt;
&lt;br /&gt;
Zum Umsignieren können Sie das entsprechende Skript aus dem Mobile Testing Supplement für Mac OS oder jedes beliebige andere Tool (z.B. isign) verwenden.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zur Verwendung von iOS-Geräten finden Sie auch in der [http://appium.io/slate/en/master/?java#appium-on-real-ios-devices Dokumentation von Appium].&lt;br /&gt;
&lt;br /&gt;
=== Native iOS-Apps ===&lt;br /&gt;
Sie können auch Apps verwenden, die bereits nativ auf dem Gerät vorhanden sind. Dazu müssen Sie deren Bundle-ID kennen und diese dann in die Verbindungseinstellungen eintragen. Hier eine kleine Auswahl gängiger Apps:&lt;br /&gt;
{| style=&amp;quot;text-align:left&amp;quot;&lt;br /&gt;
! App&lt;br /&gt;
!&lt;br /&gt;
! Bundle-ID&lt;br /&gt;
|-&lt;br /&gt;
| App Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.AppStore&lt;br /&gt;
|-&lt;br /&gt;
| Calculator&lt;br /&gt;
| &lt;br /&gt;
| com.apple.calculator&lt;br /&gt;
|-&lt;br /&gt;
| Calendar&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilecal&lt;br /&gt;
|-&lt;br /&gt;
| Camera&lt;br /&gt;
| &lt;br /&gt;
| com.apple.camera&lt;br /&gt;
|-&lt;br /&gt;
| Contacts&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileAddressBook&lt;br /&gt;
|-&lt;br /&gt;
| iTunes Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileStore&lt;br /&gt;
|-&lt;br /&gt;
| Mail&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilemail&lt;br /&gt;
|-&lt;br /&gt;
| Maps&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Maps&lt;br /&gt;
|-&lt;br /&gt;
| Messages&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileSMS&lt;br /&gt;
|-&lt;br /&gt;
| Phone&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilephone&lt;br /&gt;
|-&lt;br /&gt;
| Photos&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobileslideshow&lt;br /&gt;
|-&lt;br /&gt;
| Settings&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Preferences&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Weitere Bundle-IDs finden Sie [https://github.com/joeblau/apple-bundle-identifiers hier].&lt;br /&gt;
&lt;br /&gt;
= Beispiele =&lt;br /&gt;
Bei den Demo-Testsuiten für expecco finden Sie auch Beispiele für Tests mit dem Mobile Testing Plugin. Wählen Sie dazu auf dem Startbildschirm die Option &amp;quot;&#039;&#039;Beispiel aus Datei&#039;&#039;&amp;quot; und öffnen Sie den Ordner &amp;quot;&#039;&#039;mobile&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;TestsuiteMobileTestingDemo&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m01_MobileTestingDemo.ets --&amp;gt;&amp;lt;/span&amp;gt; &#039;&#039;m01_MobileTestingDemo.ets&#039;&#039; ==&lt;br /&gt;
Die Testsuite enthält zwei einfache Testpläne: &amp;quot;&#039;&#039;Simple CalculatorTest&#039;&#039;&amp;quot; und &amp;quot;&#039;&#039;Complex Calculator and Messaging Test&#039;&#039;&amp;quot;. Beide Tests verwenden einen Android-Emulator, den Sie vor Beginn starten müssen. Die Apps, die im Test verwendet werden, gehören zur Grundausstattung des Emulators und müssen daher nicht mehr installiert werden. Da sich die Apps unter jeder Android-Version unterscheiden können, ist es wichtig, dass Ihr Emulator unter Android 6.0 läuft. Außerdem muss die Sprache auf Englisch gestellt sein.&lt;br /&gt;
&lt;br /&gt;
; Simple CalculatorTest&lt;br /&gt;
: Dieser Test verbindet sich mit dem Taschenrechner und gibt die Formel &#039;&#039;2+3&#039;&#039; ein. Das Ergebnis des Rechners wird mit dem erwarteten Wert &#039;&#039;5&#039;&#039; verglichen.&lt;br /&gt;
&lt;br /&gt;
; Complex Calculator and Messaging Test&lt;br /&gt;
: Dieser Test verbindet sich mit dem Taschenrechner und öffnet anschließend den Nachrichtendienst. Dort wartet er auf eine einkommende Nachricht von der Nummer &#039;&#039;15555215556&#039;&#039;, in der eine zu berechnende Formel gesendet wird. Die Nachricht wird zuvor über einen Socket beim Emulator erzeugt. Nach dem Eintreffen der Nachricht wird diese vom Test geöffnet und deren Inhalt gelesen. Danach wird wieder der Taschenrechner geöffnet, die erhaltene Formel eingegeben und das Ergebnis gelesen. Anschließend wechselt der Test wieder zum Nachrichtendienst und sendet das Ergebnis als Antwort.&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;m02_expeccoMobileDemo.ets&#039;&#039; und &#039;&#039;m03_expeccoMobileDemoIOS.ets&#039;&#039; ==&lt;br /&gt;
Diese sind Bestandteil des Tutorials zum Mobile Testing Plugin. Der jeweils enthaltene Testfall ist unvollständig und wird im Zuge des Tutorials ergänzt. Lesen Sie dazu den Abschnitt [[#Tutorial|Tutorial]].&lt;br /&gt;
&lt;br /&gt;
= Tutorial =&lt;br /&gt;
Es gibt ein Tutorial, das das grundsätzliche Vorgehen zur Erstellung von Tests mit dem Mobile Testing Plugin beschreibt. Grundlage dafür ist ein mitgeliefertes Beispiel, bestehend aus einer einfachen App und einer expecco-Testsuite.&lt;br /&gt;
&lt;br /&gt;
Sie finden es auf der Seite [[Mobile_Testing_Tutorial|Mobile Testing Tutorial]] in zwei Versionen für Android und für iOS.&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsAndroid&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m02_expeccoMobileDemo.ets --&amp;gt;&amp;lt;/span&amp;gt;[[Mobile_Testing_Tutorial#Erste_Schritte_mit_Android|Erste Schritte mit Android]]&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsIOS&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m03_expeccoMobileDemoIOS.ets --&amp;gt;&amp;lt;/span&amp;gt;[[Mobile_Testing_Tutorial#Erste_Schritte_mit_iOS|Erste Schritte mit iOS]]&lt;br /&gt;
&lt;br /&gt;
= Dialoge des Mobile Testing Plugins =&lt;br /&gt;
== Verbindungseditor ==&lt;br /&gt;
Mithilfe des Verbindungseditors können Sie schnell Verbindungen definieren, ändern oder aufbauen. Je nach Aufgabe weist der Dialog kleine Unterschiede auf und wird unterschiedlich geöffnet:&lt;br /&gt;
*Um eine Verbindung aufzubauen, klicken Sie im GUI-Browser auf &amp;quot;&#039;&#039;Verbinden&#039;&amp;quot;&#039; klicken und wählen dann &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot;.&lt;br /&gt;
*Um eine bestehende Verbindung im GUI-Browser zu ändern oder zu kopieren, wählen Sie diese aus, machen einen Rechtsklick und wählen im Kontextmenü &amp;quot;&#039;&#039;Verbindung bearbeiten&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;Verbindung kopieren&#039;&#039;&amp;quot; aus.&lt;br /&gt;
*Wollen Sie Verbindungseinstellungen nicht für den GUI-Browser sondern zur Verwendung in einem Test erstellen, wählen Sie im Menü des Mobile Testing Plugins den Punkt &amp;quot;&#039;&#039;Verbindungseinstellungen erstellen...&#039;&#039;&amp;quot;. Darüber können nur die Einstellungen für eine Verbindung erstellt werden, ohne dass eine Verbindung tatsächlich angelegt wird.&lt;br /&gt;
&lt;br /&gt;
Einige der Schaltflächen sind nur beim Erstellen von Verbindungseinstellungen sichtbar:&lt;br /&gt;
[[Datei:MobileTestingVerbindungseditorMenu.png]]&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen löschen&#039;&#039;&amp;quot;: Setzt alle Einträge zurück. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen aus Datei laden&#039;&#039;&amp;quot;: Erlaubt das Öffnen einer gespeicherten Einstellungsdatei (*.csf). Deren Einstellungen werden in den Dialog übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen aus Anhang laden&#039;&#039;&amp;quot;: Erlaubt das Öffnen eines Anhangs mit Verbindungseinstellungen aus einem geöffneten Projekt. Diese Einstellungen werden in den Dialog übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen in Datei speichern&#039;&#039;&amp;quot; sowie&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen in Anhang speichern&#039;&#039;&amp;quot;: Hier können Sie die eingetragenen Einstellungen in eine Datei (*.csf) speichern oder als Anhang in einem geöffneten Projekt anlegen. Beide Optionen besitzen ein verzögertes Menü, in dem Sie auswählen können, nur einen bestimmten Teil der Einstellungen zu speichern. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Erweiterte Ansicht&#039;&#039;&amp;quot;: Damit können Sie in die erweiterte Ansicht wechseln, um zusätzliche Einstellungen vorzunehmen. Lesen Sie dazu mehr am Ende des Kapitels. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Hilfe&#039;&#039;&amp;quot;: An der rechten Seite wird ein Hilfetext zum jeweiligen Schritt ein- oder ausgeblendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Dialog ist in drei Schritte unterteilt. Im ersten Schritt wählen Sie das Gerät, das Sie verwenden möchten, im zweiten Schritt wählen Sie aus, welche App verwendet werden soll und im letzten Schritt erfolgen die Einstellungen zum Appium-Server.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep1&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 1: Gerät auswählen===&lt;br /&gt;
Im oberen Teil erhalten Sie eine Liste aller angeschlossenen Appium-Geräte, die erkannt werden. Mit der Checkbox darunter können Sie die Geräte ausblenden, die zwar erkannt werden, aber nicht bereit sind. Falls Sie ein Gerät eintragen wollen, das nicht angeschlossen ist, können Sie dies mit dem entsprechenden Knopf &amp;quot;&#039;&#039;Android-Gerät eingeben&#039;&#039;&amp;quot; bzw. &amp;quot;&#039;&#039;iOS-Gerät eingeben&#039;&#039;&amp;quot; anlegen. Dazu müssen Sie jedoch die benötigten Eigenschaften Ihres Geräts kennen. Das Gerät wird dann in einer zweiten Geräteliste angelegt und kann dort ausgewählt werden. Wenn keine Liste mit angeschlossenen Elementen angezeigt werden kann, werden stattdessen verschiedene Meldungen angezeigt:&lt;br /&gt;
*Keine Geräte gefunden&lt;br /&gt;
*:expecco konnte kein Android-Geräte finden.&lt;br /&gt;
*:Um eine Verbindung zu einem Gerät automatisch zu konfigurieren, stellen Sie sicher, dass es&lt;br /&gt;
*:*angeschlossen ist&lt;br /&gt;
*:*eingeschaltet ist&lt;br /&gt;
*:*einen passenden adb-Treiber installiert hat&lt;br /&gt;
*:*für Debugging freigeschaltet ist (siehe unten).&lt;br /&gt;
*Keine verfügbaren Geräte gefunden&lt;br /&gt;
*:expecco konnte keine verfügbaren Android-Geräte finden. Es wurden aber nicht verfügbare gefunden, z.B. mit dem Status &amp;quot;unauthorized&amp;quot;.&lt;br /&gt;
*:Um eine Verbindung zu einem Gerät automatisch zu konfigurieren, stellen Sie sicher, dass es&lt;br /&gt;
*:*angeschlossen ist&lt;br /&gt;
*:*eingeschaltet ist&lt;br /&gt;
*:*einen passenden adb-Treiber installiert hat&lt;br /&gt;
*:*für Debugging freigeschaltet ist (siehe unten).&lt;br /&gt;
*:Um nicht verfügbare Geräte anzuzeigen, aktivieren Sie unten diese Option.&lt;br /&gt;
*Verbindung verloren&lt;br /&gt;
*:expecco hat die Verbindung zum adb-Server verloren. Versuchen Sie die Verbindung wieder herzustellen, indem Sie auf den Button klicken.&lt;br /&gt;
*Verbindung fehlgeschlagen&lt;br /&gt;
*:expecco konnte sich nicht mit dem adb-Server verbinden. Möglicherweise läuft er nicht oder der angegebene Pfad stimmt nicht.&lt;br /&gt;
*:Überprüfen Sie die adb-Konfiguration in den Einstellungen und versuchen Sie den adb-Server zu starten und eine Verbindung herzustellen indem Sie auf den Knopf klicken.&lt;br /&gt;
*Verbinden ...&lt;br /&gt;
*:expecco verbindet sich mit dem adb-Server. Dies kann einige Sekunden dauern.&lt;br /&gt;
*adb-Server starten ...&lt;br /&gt;
*:expecco startet den adb-Server. Dies kann einige Sekunden dauern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Bei &amp;quot;&#039;&#039;Automatisierung durch&#039;&#039;&amp;quot; können Sie angeben, welche Automation-Engine verwendet werden soll. Lassen Sie die Einstellung auf &amp;quot;&#039;&#039;(Default)&#039;&#039;&amp;quot; wird die entsprechende Capability gar nicht gesetzt. Ansonsten stehen Appium, Selendroid und ab expecco 2.11 XCUITest zur Verfügung. In der Regel wird Selendroid nur für Android-Geräte vor Version 4.1 gebraucht.--&amp;gt;Mit &amp;quot;&#039;&#039;Weiter&#039;&#039;&amp;quot; gelangen Sie zum nächsten Schritt. Wenn Sie Einstellungen für den GUI-Browser eingeben, ist das erst möglich, wenn ein Gerät ausgewählt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;UnlockingDeveloperOptions&amp;quot;&amp;gt;Anmerkung zum Freischalten&amp;lt;/span&amp;gt;: In jüngeren Android Versionen werden die Entwickleroptionen zunächst nicht mehr in den Einstellungen angeboten. Falls ihr Android Gerät in den Einstellungen keinen Eintrag zu &amp;quot;&#039;&#039;Entwickleroptionen&#039;&#039;&amp;quot; zeigt, wählen Sie zunächst den Eintrag &amp;quot;&#039;&#039;Telefoninfo&#039;&#039;&amp;quot;, dann &amp;quot;&#039;&#039;SoftwareVersionsInfo&#039;&#039;&amp;quot; und klicken darin mehrfach auf den Eintrag &amp;quot;&#039;&#039;BuildVersion&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Chromedriver verwalten ====&lt;br /&gt;
Wenn die App, die Sie bedienen wollen, WebViews mit Chrome benutzt, benötigt Appium Zugriff auf einen passenden Chromedriver. Wenn Sie ein Gerät in der Liste auswählen, können Sie über &amp;quot;&#039;&#039;Chromedriver verwalten&#039;&#039;&amp;quot; sehen, welche Chrome-Versionen auf dem Gerät vorhanden sind und welche Chromedriver-Versionen durch expecco zur Verfügung stehen. Über diesen Dialog können Sie auch benötigte Chromedriver-Versionen herunterladen. Beachten Sie, dass auf dem Gerät verschiedene Chrome-Versionen vorhanden sein können, da die Apps in ihren WebViews nicht die gleiche Chrome-Version verwenden müssen, wie die als Browser installierte. Damit alles funktioniert, sollte der verwendete Chromedriver zur entsprechenden App passen. Sie können den Pfad zum Chromedriver auch am Ende des Verbindungsdialogs in den erstellten Capabilities ändern.&lt;br /&gt;
&lt;br /&gt;
==== WLAN-Android-Geräte verbinden ====&lt;br /&gt;
Sie können sich auch über WLAN zu Android-Geräten verbinden. Dazu muss das Gerät zunächst mit adb verbunden werden, siehe [[Mobile_Testing_Plugin#Verbindung_.C3.BCber_WLAN|Verbindung über WLAN]]. Ab expecco 22.1 bietet der Verbindungseditor hierfür einen Dialog, der Ihnen dabei hilft und den Sie anstatt der Eingabeaufforderung verwenden können. Für Geräte mit Android 11 oder höher können Sie hier das Gerät mit dem Rechner zu koppeln, indem Sie die entsprechenden Parameter angeben und anschließend die Verbindung unter Angabe von IP-Adresse und Port aufbauen. Sie können damit auch für Geräte, die über USB verbunden sind, eine WLAN-Verbindung aufbauen. Wenn Sie das entsprechende Gerät in der Liste auswählen, werden die benötigten Angaben automatisch ausgelesen.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass der Aufbau einer WLAN-Verbindung nicht Teil der Verbindungseinstellungen ist. Wenn Sie mit den erzeugten Einstellungen eine neue Verbindung aufbauen wollen, müssen Sie sicherstellen, dass das Gerät über mit der angegebenen IP-Adresse und dem Port mit adb verbunden ist, damit es gefunden wird. Die ADB-Verbindung geht verloren, wenn der ADB-Server oder das Gerät neu gestartet werden. Die Erlaubnis für das WLAN-Debugging wird beim Neustart des Geräts auch häufig zurückgesetzt und der Debug-Port kann dann wechseln. Daher muss eine WLAN-Verbindung immer manuell hergestellt werden.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep2&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 2: App auswählen===&lt;br /&gt;
Hier können Sie Angaben zur App machen, die getestet werden soll. Dabei können Sie entscheiden, ob Sie eine App verwenden wollen, die bereits auf dem Gerät installiert ist, oder ob für den Test eine App installiert werden soll. Wählen Sie oben den entsprechenden Reiter aus. Je nachdem, ob Sie im vorigen Schritt ein Android- oder ein iOS-Gerät ausgewählt haben, ändert sich die erforderte Eingabe.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Android&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App auf dem Gerät&#039;&#039;&lt;br /&gt;
**:Wenn Sie im ersten Schritt ein angeschlossenes Gerät ausgewählt haben, werden die Pakete aller installierten Apps automatisch abgerufen und Sie können die Auswahl aus den Drop-down-Listen treffen. Die installierten Apps sind in Fremdpakete und Systempakete unterteilt; wählen Sie die entsprechende Paketliste aus. Diese Auswahl gehört nicht zu den Einstellungen, sondern stellt nur die entsprechende Paketliste zur Verfügung. Sie können den Filter benutzen, um die Liste weiter einzuschränken und dann das gewünschte Paket auswählen. Die Activities des ausgwählten Pakets werden ebenfalls automatisch abgerufen und als Drop-down-Liste zur Verfügung gestellt. Wählen Sie die Activity aus, die gestartet werden soll. In der Regel wird automatisch eine Activity aus der Liste eingetragen. Falls Sie kein verbundenes Gerät verwenden, müssen Sie die Eingabe des Pakets und der Activity von Hand vornehmen.&lt;br /&gt;
**&#039;&#039;App installieren&#039;&#039;&lt;br /&gt;
**:Geben Sie bei &amp;quot;&#039;&#039;App&#039;&#039;&amp;quot; den Pfad zu einer App an. Der Pfad muss für den Appium-Server gültig sein, der verwendet wird. Sie können auch eine URL angeben. Benutzen Sie einen lokalen Appium-Server, können Sie den rechten Butten benutzen, um zu der Installationsdatei der App zu navigieren und diesen Pfad einzutragen. Wenn möglich werden dabei auch das entsprechende Paket und die Activity in den Feldern darunter eingetragen. Diese Angabe ist aber nicht notwendig.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;iOS&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App auf dem Gerät&#039;&#039;&lt;br /&gt;
**:Geben Sie die Bundle-ID einer installierten App an. Sie können die IDs der installierten Apps bspw. mithilfe von Xcode erfahren. Starten Sie dazu Xcode und wählen Sie in der Menüleiste am oberen Bildschirmrand im Menü &amp;quot;&#039;&#039;Window&#039;&#039;&amp;quot; den Eintrag &amp;quot;&#039;&#039;Devices&#039;&#039;&amp;quot;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wenn Sie Ihr Gerät auswählen, sehen Sie in der Übersicht eine Auflistung der von Ihnen installierten Apps.&lt;br /&gt;
**&#039;&#039;App installieren&#039;&#039;&lt;br /&gt;
**:Geben Sie bei &amp;quot;&#039;&#039;App&#039;&#039;&amp;quot; den Pfad zu einer App an. Der Pfad muss für den Appium-Server gültig sein, der verwendet wird. Sie können auch eine URL angeben. Zu den Vorraussetzungen an Apps für reale Geräte lesen Sie bitte den Abschnitt [[#iOS-Ger.C3.A4t_und_App_vorbereiten|iOS-Geräte und App vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
Im unteren Teil können Sie festlegen, ob die App beim Verbindungsabbau zurückgesetzt bzw. deinstalliert werden soll, und ob sie initial zurückgesetzt werden soll. Auch hier wird die entsprechende Capability gar nicht gesetzt, wenn Sie &amp;quot;&#039;&#039;(Default)&#039;&#039;&amp;quot; auswählen. Mit &amp;quot;&#039;&#039;Weiter&#039;&#039;&amp;quot; gelangen Sie zum nächsten Schritt.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep3&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 3: Servereinstellungen===&lt;br /&gt;
Im letzten Schritt befindet sich zunächst im oberen Teil eine Liste aller Capabilities, die sich aus Ihren Angaben der vorigen Schritte ergeben. Wenn Sie sich mit Appium auskennen und noch zusätzliche Capabilities setzen möchten, die der Verbindungseditor nicht abdeckt, können Sie durch Klicken auf &amp;quot;&#039;&#039;Bearbeiten&#039;&#039;&amp;quot; in die erweiterte Ansicht gelangen. Lesen Sie dazu den Abschnitt weiter unten.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Einstellungen für den GUI-Browser eingeben, können Sie den &#039;&#039;Verbindungsnamen&#039;&#039; eintragen, mit dem die Verbindung angezeigt wird. Dies ist auch der Name unter dem Bausteine diese Verbindung verwenden können, wenn sie aufgebaut ist. Wenn Sie das Feld frei lassen, wird ein Name generiert. Wenn der Haken für &amp;quot;&#039;&#039;Von expecco gesteuert&#039;&#039;&amp;quot; gesetzt ist, wird expecco einen lokalen Appium-Server an einem freien Port starten, oder einen bereits gestarteten freien Server verwenden. Um einen eigenen Server zu verwenden, schalten Sie diese Funktion ab und geben Sie die entsprechende Adresse ein. Sie erhalten die lokale Standard-Adresse und bereits verwendete Adressen zur Auswahl.&lt;br /&gt;
&lt;br /&gt;
In älteren expecco-Versionen ist der Haken mit &amp;quot;&#039;&#039;Bei Bedarf starten&#039;&#039;&amp;quot; beschriftet. In diesem Fall müssen Sie auch eine Adresse angeben, wenn expecco den Server starten soll. expecco versucht dann beim Verbinden einen Appium-Server an der angegebenen Adresse zu starten, wenn dort noch keiner läuft. Dieser Server wird dann beim Beenden der Verbindung ebenfalls heruntergefahren. Dies funktioniert nur für lokale Adressen. Achten Sie darauf, nur Portnummern zu verwenden, die auch frei sind. Verwenden Sie am besten nur ungerade Portnummern ab dem Standardport 4723. Beim Verbindungsaufbau wird ebenfalls die folgende Portnummer verwendet, wodurch es sonst zu Konflikten kommen könnte. &lt;br /&gt;
&lt;br /&gt;
Je nachdem, wie Sie den Dialog geöffnet haben, gibt es nun verschiedene Schaltflächen um ihn abzuschließen. In jedem Fall haben Sie die Option zu speichern. Dabei öffnet sich ein Dialog, indem Sie entweder ein geöffnet Projekt auswählen können, um die Einstellungen dort als Anhang zu speichern, oder auswählen es in einer Datei zu speichern, die Sie anschließend angeben können. Durch das Speichern wird der Dialog nicht beendet, wodurch Sie anschließend noch eine andere Option auswählen könnten.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie den Editor zum Verbindungsaufbau geöffnet haben, können Sie abschließend auf &amp;quot;&#039;&#039;Verbinden&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;Server starten und verbinden&#039;&#039;&amp;quot; klicken, je nachdem, ob der Haken für den Serverstart gesetzt ist. Für das Ändern oder Kopieren einer Verbindung im GUI-Brower heißt diese Option &amp;quot;&#039;&#039;Übernehmen&#039;&#039;&amp;quot;, da in diesem Fall nur der Verbindungseintrag geändert bzw. neu angelegt wird, der Verbindungsaufbau aber nicht gestartet wird. Das können Sie bei Bedarf anschließend über das Kontextmenü tun. Falls Sie Capabilities einer bestehenden Verbindung geändert haben, fordert Sie anschließend ein Dialog auf zu entscheiden, ob diese Änderungen direkt übernommen werden sollen, indem die Verbindung abgebaut und mit den neuen Verbindungen aufgebaut wird, oder nicht. In diesem Fall werden die Änderungen erst wirksam, nachdem Sie die Verbindung neu aufbauen.&lt;br /&gt;
&lt;br /&gt;
Zur Verwendung des Verbindungseditors lesen Sie auch den entsprechenden Abschnitt im jeweiligen Tutorial in Schritt 1 (Android: [[Mobile_Testing_Tutorial#Schritt_1:_Demo_ausf.C3.BChren|Demo ausführen]], iOS: [[Mobile_Testing_Tutorial#Schritt_1:_Demo_ausf.C3.BChren_.28iOS.29|Demo ausführen (iOS)]]).&lt;br /&gt;
&lt;br /&gt;
===Erweiterte Ansicht===&lt;br /&gt;
Die erweiterte Ansicht des Verbindungseditors erhalten Sie entweder durch Klicken auf &amp;quot;&#039;&#039;Bearbeiten&#039;&#039;&amp;quot; im dritten Schritt oder jederzeit über den entsprechenden Menüeintrag, wenn Sie den Editor über das Plugin-Menü gestartet haben. In dieser Ansicht erhalten Sie eine Liste aller eingestellten Appium-Capabilities. Zu dieser können Sie weitere hinzufügen, Einträge ändern oder entfernen. Um eine Capability hinzuzufügen, wählen Sie diese aus der Drop-down-Liste des Eingabefelds aus. In dieser befinden sich alle bekannten Capabilities sortiert in die Kategorien &#039;&#039;Common&#039;&#039;, &#039;&#039;Android&#039;&#039; und &#039;&#039;iOS&#039;&#039;. Haben Sie eine Capability ausgewählt, wird ein kurzer Informationstext dazu angezeigt. Sie können in das Feld auch von Hand eine Capability eingeben. Klicken Sie dann auf &amp;quot;&#039;&#039;Hinzufügen&#039;&#039;&amp;quot;, um die Capabilitiy in die Liste einzutragen. Dort können Sie in der rechten Spalte den Wert setzen. Um einen Entrag zu löschen, wählen Sie diesen aus und klicken Sie auf &amp;quot;&#039;&#039;Entfernen&#039;&#039;&amp;quot;. Mit &amp;quot;&#039;&#039;Zurück&#039;&#039;&amp;quot; verlassen Sie die erweiterte Ansicht.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingErweiterteAnsicht.png]]&lt;br /&gt;
&lt;br /&gt;
== Laufende Appium-Server ==&lt;br /&gt;
Im Menü des Mobile Testing Plugins finden Sie den Eintrag &amp;quot;&#039;&#039;Appium-Server...&#039;&#039;&amp;quot;. Mit diesem öffnen Sie ein Fenster mit einer Übersicht aller Appium-Server, die von expecco gestartet wurden und auf welchem Port diese laufen. Durch Klicken auf das Icon in der Spalte &amp;quot;&#039;&#039;Log anzeigen&#039;&#039;&amp;quot; können Sie das Logfile des entsprechenden Servers anschauen. Dieses wird beim Beenden des Servers wieder gelöscht. Mit den Icons in der Spalte &amp;quot;&#039;&#039;Beenden&#039;&#039;&amp;quot; kann der entsprechenden Server beendet werden. Allerdings wird dies verhindert, wenn expecco über diesen Server noch eine offene Verbindung hat. Für welche Verbindung ein Server verwendet wird, sehen Sie in der rechten Spalte. Steht dort &#039;&#039;&amp;lt;idle&amp;gt;&#039;&#039; wird er zur Zeit nicht von expecco verwendet.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAppiumServer.png]]&lt;br /&gt;
&lt;br /&gt;
Beim Öffnen des Editors um eine Appium-Verbindung aufzubauen, wird direkt ein Appium-Server gestartet, um den folgenden Verbindungsaufbau zu beschleunigen. Zu diesem Zweck hält sich expecco auch immer einen freien Appium-Server offen. Weitere laufende Server, die nicht mehr verwendet werden, werden jedoch nach einiger Zeit automatisch beendet.&lt;br /&gt;
&lt;br /&gt;
Im Menü des Mobile Testing Plugins finden Sie auch den Eintrag &amp;quot;&#039;&#039;Alle Verbindungen und Server beenden&#039;&#039;&amp;quot;. Dies ist für den Fall gedacht, dass Verbindungen oder Server auf andere Weise nicht beendet werden können. Beenden Sie Verbindungen wenn möglich immer im GUI-Browser oder durch Ausführen eines entsprechenden Bausteins. Server, die Sie in der Server-Übersicht gestartet haben, beenden Sie dort; Server, die mit einer Verbindung gestartet wurden, werden automatisch mit dieser beendet.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass in der Übersicht nur Server aufgelistet sind, die von expecco gestartet und verwaltet werden. Mögliche andere Appium-Server, die auf andere Art gestartet wurden, werden nicht erkannt.&lt;br /&gt;
&lt;br /&gt;
== Recorder ==&lt;br /&gt;
Besteht im GUI-Browser eine Verbindung zu einem Gerät, kann der integrierte Recorder verwendet werden, um mit diesem Gerät einen Testabschnitt aufzunehmen. Sie starten den Recorder, indem Sie im GUI-Browser die entsprechende Verbindung auswählen und dann auf den Aufnahme-Knopf klicken. Für den Recorder öffnet sich ein neues Fenster. Die aufgezeichneten Aktionen werden im Arbeitsbereich des GUI-Browsers angelegt. Daher ist es möglich, das Aufgenommene parallel zu editieren.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingRecorder.png|caption|]]&lt;br /&gt;
&lt;br /&gt;
====Komponenten des Recorderfensters====&lt;br /&gt;
#&#039;&#039;&#039;Aufnahme fortsetzen/pausieren&#039;&#039;&#039;: Über das rechte Symbol können Sie die Aufnahme pausieren. Sie sehen dann ein großes Pause-Symbol in der Anzeige. Alle Aktionen, die Sie währenddessen im Recorder machen werden zwar ausgeführt, es werden aber keine Bausteine aufgezeichnet. Über das linke Symbol können Sie dann wieder in den normalen Aufnahmemodus wechseln.&lt;br /&gt;
#&#039;&#039;&#039;Aufnahme stoppen&#039;&#039;&#039;: Stoppt die Aufnahme und schließt das Recorderfenster.&lt;br /&gt;
#&#039;&#039;&#039;Aktualisieren&#039;&#039;&#039;: Holt das aktuelle Bild und den aktuellen Elementbaum vom Gerät. Dies wird nötig, wenn das Gerät zur Ausführung einer Aktion länger braucht oder sich etwas ohne das Anstoßen durch den Recorder ändert. Seit expecco 21.2 gibt es hier zusätzlich ein Untermenü, mit dem automatisches Aktualisieren angeschaltet werden kann, indem im Hintergrund auf Änderungen geprüft wird (siehe auch &#039;&#039;Automatisches Aktualisieren&#039;&#039; weiter unten).&lt;br /&gt;
#&#039;&#039;&#039;Follow-Mouse&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird im GUI-Browser ausgewählt.&lt;br /&gt;
#&#039;&#039;&#039;Element-Highlighting&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird rot umrandet.&lt;br /&gt;
#&#039;&#039;&#039;Elemente einzeichnen&#039;&#039;&#039;: Die Rahmen aller Elemente der Ansicht werden angezeigt.&lt;br /&gt;
#&#039;&#039;&#039;Werkzeuge&#039;&#039;&#039;: Auswahl, mit welchem Werkzeug aufgenommen werden soll. Die gewählte Aktion wird bei einem Klick auf die Anzeige ausgelöst. Dabei stehen folgende Aktionen zur Verfügung:&lt;br /&gt;
#*Aktionen auf Elemente:&lt;br /&gt;
#**Klicken: Kurzer Klick auf das Element, über dem der Cursor steht. Zur genaueren Bestimmung, welches Element verwendet wird, benutzen Sie die Funktion Follow-Mouse oder Element-Highlighting.&lt;br /&gt;
#**Antippen mit Dauer (Element): Ähnlich zum Klicken, nur dass zusätzlich die Dauer des Klicks aufgezeichnet wird. Dadurch sind auch längere Klicks möglich.&lt;br /&gt;
#**Antippen mit Position (Element): Ähnlich zum Klicken, aber zusätzlich wird die Position innerhalb des Elements aufgenommen. Die Position kann relativ zur Größe des Elements aufgenommen werden oder, wenn Sie dabei Strg gedrückt halten, absolut zur linken oberen Ecke des Elements.&lt;br /&gt;
#**Text setzen: Ermöglicht das Setzen eines Textes in Eingabefelder.&lt;br /&gt;
#**Text löschen: Löscht den Text eines Eingabefelds.&lt;br /&gt;
#*Aktionen auf das Gerät:&lt;br /&gt;
#**Antippen (Bildschirm): Löst einen Klick auf die Bildschirmposition aus.&lt;br /&gt;
#**Antippen mit Dauer (Bildschirm): Löst einen Klick auf die Bildschirmposition aus, bei dem auch die Dauer berücksichtigt wird.&lt;br /&gt;
#**Wischen: Wischen in einer geraden Linie vom Punkt des Drückens des Mausknopfes bis zum Loslassen. Die Dauer wird ebenfalls aufgezeichnet.&lt;br /&gt;
#:Beachten Sie bei diesen Aktionen, dass das Ergebnis sich auf verschiedenen Geräten unterscheiden kann, bspw. bei verschiedenen Bildschirmauflösungen.&lt;br /&gt;
#*Erstellen von Testablauf-Bausteinen&lt;br /&gt;
#**Attribut prüfen: Vergleicht den Wert eines festgelegten Attributs des Elements mit einem vorgegebenen Wert. Das Ergebnis triggert den entsprechenden Ausgang.&lt;br /&gt;
#**Attribut zusichern: Vergleicht den Wert eines festgelegten Attributs des Elements mit einem vorgegebenen Wert. Bei Ungleichheit schlägt der Test fehl.&lt;br /&gt;
#**Attribut holen: Liest den aktuellen Wert eines Attributs aus.&lt;br /&gt;
#*Automatisch&lt;br /&gt;
#:Ist das Auto-Werkzeug ausgewählt, können alle Aktionen durch spezifische Eingabeweise benutzt werden: &#039;&#039;Klicken&#039;&#039;, &#039;&#039;Element antippen&#039;&#039; und &#039;&#039;Wischen&#039;&#039; funktionieren weiterhin durch Klicken, wobei sie anhand der Dauer und der Bewegung des Cursors unterschieden werden. Um ein &#039;&#039;Antippen&#039;&#039; auszulösen, halten Sie beim Klicken Strg gedrückt. Die übrigen Aktionen erhalten Sie durch einen Rechtsklick auf das Element in einem Kontextmenü.&lt;br /&gt;
#&#039;&#039;&#039;Kontext-Aktionen&#039;&#039;&#039;: Hier können Sie Aktionen aufzeichnen, die Kontexte betreffen:&lt;br /&gt;
#*Zu Kontext wechseln: Bietet eine Liste der aktuell verfügbaren Kontexte und Sie können auswählen, zu welchem gewechselt werden soll.&lt;br /&gt;
#*Aktuellen Kontext holen: Holt den Handle des aktuellen Kontexts.&lt;br /&gt;
#*Kontext-Handles holen: Holt eine Liste aller aktuell verfügbaren Kontext-Handles.&lt;br /&gt;
#&#039;&#039;&#039;Softkeys&#039;&#039;&#039;: Nur unter Android. Simuliert das Drücken der Knöpfe Zurück, Home, Fensterliste und Power.&lt;br /&gt;
#&#039;&#039;&#039;Home-Button&#039;&#039;&#039;: Nur unter iOS ab expecco 2.11. Ermöglicht das Drücken des Home-Buttons. Vor expecco 19.2 funktioniert es nur, wenn AssistiveTouch aktiviert ist und sich das Menü in der Mitte des oberen Bildschirmrands befindet. Ab expecco 19.2 verwendet die Funktion kein AssistiveTouch mehr.&lt;br /&gt;
#&#039;&#039;&#039;Hilfe&#039;&#039;&#039;: Öffnet diese Online-Dokumentation auf der allgemeinen Seite zu [[GuiBrowser_Recorder|GUI-Browser Recordern]].&lt;br /&gt;
#&#039;&#039;&#039;Anzeige&#039;&#039;&#039;: Zeigt einen Screenshot des Geräts. Aktionen werden mit der Maus je nach Werkzeug ausgelöst. Wenn eine neue Aktion eingegeben werden kann, hat das Fenster einen grünen Rahmen, sonst ist er rot.&lt;br /&gt;
#&#039;&#039;&#039;Fenster an Bild anpassen&#039;&#039;&#039;: Ändert die Größe des Fensters so, dass der Screenshot vollständig angezeigt werden kann.&lt;br /&gt;
#&#039;&#039;&#039;Bild an Fenster anpassen&#039;&#039;&#039;: Skaliert den Screenshot auf eine Größe, mit der er die volle Größe des Fensters ausnutzt.&lt;br /&gt;
#&#039;&#039;&#039;Ansicht anpassen&#039;&#039;&#039;: Öffnet einen Dialog um die Ansicht anzupassen, falls expecco das Bild nicht richtig darstellt. Sie können die Skalierung anpassen oder das Bild um 90° drehen.&lt;br /&gt;
#&#039;&#039;&#039;Ausrichtung anpassen&#039;&#039;&#039;: Korrigiert das Bild, falls dieses auf dem Kopf stehen sollte. Über den Pfeil rechts daneben kann das Bild auch um 90° gedreht werden, falls dies einmal nötig sein sollte. Ab expecco 19.1 finden Sie diese Funktion in &#039;&#039;Ansicht anpassen&#039;&#039;. Die Ausrichtung des Bildes ist für die Funktion des Recorders unerheblich, dieser arbeitet ausschließlich auf den erhaltenen Elementen.&lt;br /&gt;
#&#039;&#039;&#039;Skalierung&#039;&#039;&#039;: Ändert die Skalierung des Screenshots.&lt;br /&gt;
#&#039;&#039;&#039;Meldungen&#039;&#039;&#039;: Zeigt den Pfad des ausgewählten Elements oder andere Meldungen an. Es gibt ein Kontextmenü, um eine Liste der vorigen Meldungen zu sehen.&lt;br /&gt;
&lt;br /&gt;
====Verwendung====&lt;br /&gt;
Mit jedem Klick im Fenster wird eine Aktion ausgelöst und im Arbeitsbereich des GUI-Browsers aufgezeichnet. Dort können Sie das Aufgenommene abspielen, editieren oder daraus einen neuen Baustein erstellen.&lt;br /&gt;
Aktionen zum Auslösen von Sofkeys finden Sie direkt in der Menüleiste (s.o.). Um Aktionen auf Elemente aufzuzeichen, ändern Sie entweder die Auswahl des Werkzeugs in der Menüleiste (s.o.) und klicken dann auf das Element oder wählen Sie die entsprechende Aktion aus dem Kontextmenü durch einen Rechtsklick auf das entsprechende Element aus. Für Texteingabe ist es zudem möglich, den Cursor über dem Element zu platzieren und den Text einzugeben. Dabei öffnet sich der Eingabedialog für diese Aktion.&lt;br /&gt;
Zur Verwendung des Recorders lesen Sie auch Schritt 2 im Tutorial ([[Mobile_Testing_Tutorial#Schritt_2:_Einen_Baustein_mit_dem_Recorder_erstellen|Android]] bzw. [[Mobile_Testing_Tutorial#Schritt_2:_Einen_Baustein_mit_dem_Recorder_erstellen_.28iOS.29|iOS]]).&lt;br /&gt;
&lt;br /&gt;
====Elemente verbergen====&lt;br /&gt;
Ab expecco 21.2 gibt es im Kontextmenü außerdem die Möglichkeit, das ausgewählte Element im Recorder zu verbergen. Das bedeutet, dass dieses Element fortan nicht mehr ausgewählt werden kann. Diese Funktion eignet sich dazu, Elemente zu ignorieren, die im Vordergrund liegen, um auf Elemente darunter zugreifen zu können. Um diesen Zustand wieder rückgängig zu machen, müssen Sie das entsprechende Element im Baum des GUI-Browsers finden, dort gibt es im Kontextmenü ebenfalls einen solchen Eintrag.&lt;br /&gt;
&lt;br /&gt;
====Automatisches Aktualisieren====&lt;br /&gt;
Der Recorder zeigt kein Livebild des Geräts sondern nur eine Momentaufnahme. Um mit der Anzeige auf dem Gerät übereinzustimmen muss daher nach Änderungen aktualisiert werden. Der Recorder aktualisiert sich automatisch, nachdem er eine Aktion ausgeführt hat. Ab expecco 20.2 sind zudem weitere automatische Updates möglich. Sie können Sie im Menü &#039;&#039;Fenster&#039;&#039; aktivieren.&lt;br /&gt;
&lt;br /&gt;
Zum einen kann kurze Zeit nach dem Ausführen einer Aktion überprüft werden, ob es noch Änderungen nach der ersten Aktualisierung gegeben hat, damit in diesem Fall eine zweite Aktualisierung stattfinden kann. Dies soll das Problem beheben, dass der Recorder nach einer Aktion nicht aktuell ist, weil die Aktualisierung zu früh stattgefunden hat.&lt;br /&gt;
&lt;br /&gt;
Zum anderen kann eine periodische Aktualisierung eingeschaltet werden. Nach einem einstellbaren Interval wird der Recorder automatisch aktualisiert, sollte es Änderungen geben. Dadurch ist die Anzeige im Recorder immer weitgehend aktuell, allerdings entsteht dadurch auch ein Mehraufwand was die Kommunikation mit dem Gerät betrifft.&lt;br /&gt;
&lt;br /&gt;
== AVD Manager und SDK Manager ==&lt;br /&gt;
AVD Manager und SDK Manager sind beides Anwendungen von Android. Im Menü des Mobile Testing Plugins bietet expecco die Möglichkeit, diese zu starten. Ansonsten finden Sie diese Programme bei Ihrer Android-Installation. Mit dem AVD Manager können Sie AVDs, also Konfigurationen für Emulatoren, erstellen, bearbeiten und starten. Mit dem SDK Manager erhalten Sie einen Überblick über Ihre Android-Installation und können diese bei Bedarf erweitern.&lt;br /&gt;
&lt;br /&gt;
= Hybrid-Apps und WebViews =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;!!! WICHTIGER HINWEIS - Wenn Sie Probleme haben, auf den Webview zu wechseln, geben Sie bitte unter den Android Einstellungen - Apps -Standard Apps &amp;quot;Chrome&amp;quot; als &amp;quot;Browser-App&amp;quot; an !!!&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hybrid-Apps enthalten neben den Plattform-nativen Elementen weitere Elemente, die in einen WebView eingebunden sind. Diese Elemente können ebenfalls bedient werden, allerdings muss zuvor in den entsprechenden Kontext gewechselt werden. Mit dem Baustein &amp;quot;&#039;&#039;Get Current Context&#039;&#039;&amp;quot; erhalten Sie den aktuellen Kontext. Zu Beginn ist dies &amp;quot;&#039;&#039;NATIVE_APP&#039;&#039;&amp;quot;, also der Kontext der nativen Elemente. Mit dem Baustein &amp;quot;&#039;&#039;Get Context Handles&#039;&#039;&amp;quot; bekommen Sie eine Collection aller vorhandenen Kontexte. Gibt es einen WebView-Kontext, so heißt dieser &amp;quot;&#039;&#039;WEBVIEW_1&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;WEBVIEW_&amp;lt;package&amp;gt;&#039;&#039;&amp;quot; mit dem Paket des WebViews. Es kann auch mehrere WebView-Kontexte geben. Zu jedem WebView-Kontext gibt es im nativen Kontext ein entsprechendes WebView-Element. Mit dem Baustein &amp;quot;&#039;&#039;Switch to Context&#039;&#039;&amp;quot; können Sie in einen solchen Kontext wechseln und haben fortan nur Zugriff auf die Elemente in diesem Kontext.&lt;br /&gt;
&lt;br /&gt;
Im GUI-Browser werden zum einen oben im Baum die vorhandenen Kontexte angezeigt, zum anderen wird der Baum eines Kontexts unterhalb des entsprechenden WebView-Elements eingefügt.&lt;br /&gt;
&lt;br /&gt;
= XPath anpassen mithilfe des GUI-Browsers =&lt;br /&gt;
Bausteine, die auf einem Gerät fehlerfrei funktionieren, tun dies auf anderen Geräten möglicherweise nicht. Auch können kleine Änderungen der App dazu führen, dass ein Baustein nicht mehr den gewünschten Effekt hat. Man sollte einen Baustein daher so robust formulieren, dass er für eine Vielzahl von Geräten verwendet werden kann und kleine Anpassungen an der App verkraftet. Dazu muss man das grundlegende Funktionsprinzip der Adressierung verstehen. Dies wird im Folgenden am Beispiel der App aus dem Tutorial erläutert.&lt;br /&gt;
&lt;br /&gt;
Die Ansicht der App setzt sich aus einzelnen Elementen zusammen. Dazu gehören die Schaltflächen &amp;quot;&#039;&#039;GTIN-13 (EAN-13)&#039;&#039;&amp;quot; und &amp;quot;&#039;&#039;Verify&#039;&#039;&amp;quot;, das Eingabefeld der Zahl &amp;quot;&#039;&#039;4006381333986&#039;&#039;&amp;quot; und das Ergebnisfeld, in dem OK erscheint, wie auch alle anderen auf der Anzeige sichtbaren Dinge. Diese sichtbaren Elemente sind in unsichtbare Strukturelemente eingebettet. Alle Elemente zusammen sind in einer zusammenhängenden Hierarchie, dem Elementbaum, organisiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingGUIBrowser.png | frame | left | Abb. 1: Funktionen des GUI-Browsers]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
Sie können sich diesen Baum im GUI-Browser ansehen. Wechseln Sie dazu in den GUI-Browser (Abb. 1) und starten Sie eine beliebige Verbindung. Sobald die Verbindung aufgebaut ist, können Sie den gesamten Baum aufklappen (1) (Klick bei gedrückter Strg-Taste). Er enthält alle Elemente der aktuellen Seite der App.&lt;br /&gt;
&lt;br /&gt;
Ein Baustein, der nun ein bestimmtes Element verwendet, muss dieses eindeutig angeben, indem er dessen Position im Elementbaum mit einem Pfad im XPath-Format beschreibt. Dieses Format ist ein verbreiteter Web-Standard für XML-Dokumente und -Datenbanken, eignet sich aber genauso für Pfade im Elementbaum.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie ein Element im Baum auswählen, wird unten der von expecco automatisch generierte XPath (2) für das Element angezeigt, der auch beim Aufzeichnen verwendet wird. Oberhalb davon in der Mitte des Fensters befindet sich eine Liste der Eigenschaften (3) des ausgewählten Elements. Man nennt diese Eigenschaften auch Attribute. Sie beschreiben das Element näher wie beispielsweise seinen Typ, seinen Text oder andere Informationen zu seinem Zustand. Links unten können Sie zur besseren Orientierung im Baum die &#039;&#039;Vorschau&#039;&#039; (4) aktivieren, um sich den Bildausschnitt des Elements anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Der Elementbaum für gleiche Ansicht einer App kann sich je nach Gerät unterscheiden. Es sind diese Unterschiede, die verhindern, eine Aufnahme von einem Gerät unverändert auch auf allen anderen Geräten abzuspielen: Ein XPath, der im einen Elementbaum ein bestimmtes Element identifiziert, beschreibt nicht unbedingt das gleiche Element im Elementbaum auf einem anderen Gerät. Es kann stattdessen passieren, dass der XPath auf kein Element, auf ein falsches Element oder auf mehrere Elemente passt. Dann schlägt der Test fehl oder er verhält sich unerwartet.&lt;br /&gt;
&lt;br /&gt;
Man könnte natürlich für jedes Gerät einen eigenen Testfall schreiben. Das brächte aber unverhältnismäßigen Aufwand bei Testerstellung und -wartung mit sich. Das Problem lässt sich auch anders lösen, da ein jeweiliges Element nicht nur durch genau einen XPath beschrieben wird. Vielmehr erlaubt der Standard mithilfe verschiedener Merkmale unterschiedliche Beschreibungen für ein und dasselbe Element zu formulieren. Das Ziel ist daher, einen Pfad zu finden, der auf allen für den Test verwendeten Geräten funktioniert und überall eindeutig zum richtigen Element führt.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel besteht die Verbindung zur Android-App aus dem Tutorial und der Eintrag des &amp;quot;&#039;&#039;GTIN-13&#039;&#039;&amp;quot;-Buttons ist ausgewählt (5). Dessen automatisch generierter XPath (2) kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[@resource id=&#039;android:id/content&#039;]/android.widget.RelativeLayout/android.widget.Button[@resource-id=&#039;de.exept.expeccomobiledemo:id/gtin_13&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Er ist offensichtlich lang und unübersichtlich. Der sehr viel kürzere Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@text=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
führt zum selben Element.&lt;br /&gt;
&lt;br /&gt;
Für die iOS-App lautet der automatisch generierte XPath für diesen Button beispielsweise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/XCUIElementTypeApplication/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/UIAApplication/UIAWindow[1]/UIAButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und kann kürzer als&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@name=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Sie können den Pfad entsprechend im GUI-Browser ändern und durch &amp;quot;&#039;&#039;Pfad überprüfen&#039;&#039;&amp;quot; (6) feststellen, ob er weiterhin auf das ausgewählte Element zeigt, was expecco mit &amp;quot;&#039;&#039;Verify Path: OK&#039;&#039;&amp;quot; (7) bestätigen sollte. Der erste, sehr viel längere Pfad, beschreibt den gesamten Weg vom obersten Element des Baumes bis hin zum gesuchten Button. Der zweite Pfad hingegen wählt mit &amp;quot;*&amp;quot; zunächst sämtliche Elemente des Baumes und schränkt die Auswahl dann auf genau die Elemente ein, die ein &#039;&#039;text&#039;&#039;- bzw. &#039;&#039;name&#039;&#039;-Attribut mit dem Wert &amp;quot;&#039;&#039;GTIN-13 (EAN-13)&#039;&#039;&amp;quot; besitzen, in unserem Fall also genau der eine Button, den wir suchen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden Android-ähnliche Pfade zur Veranschaulichung verwendet. Die Elemente in iOS-Apps heißen zwar anders, wodurch andere Pfade entstehen; das Prinzip ist jedoch das gleiche.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum1.png | frame | Abb. 2: Elementbaum einer fiktiven App]]&lt;br /&gt;
&lt;br /&gt;
Sie können solche Pfade mit Hilfe weniger Regeln selbst formulieren. Sehen Sie sich den einfachen Baum einer fiktiven Android-App in Abb. 2 an: Die Einrückungen innerhalb des Baumes geben die Hierarchie der Elemente wieder. Ein Element ist ein &#039;&#039;Kind&#039;&#039; eines anderen Elementes, wenn jenes andere Element das nächsthöhere Element mit einem um eins geringeren Einzug ist. Jenes Element ist das &#039;&#039;Elternelement&#039;&#039; des Kindes. Sind mehrere untereinander stehende Elemente gleich eingerückt, so sind sie also alle Kinder desselben Elternelements.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad durch alle Ebenen der Hierarchie zum TextView-Element ist nun:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Elemente sind mit Schrägstrichen voneinander getrennt. Es fällt auf, dass der Name des ersten Elements nicht mit dem im Baum übereinstimmt. Das oberste Element in der Hierarchie heißt immer &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot; (für iOS wäre es &amp;quot;&#039;&#039;AppiumAUT&#039;&#039;&amp;quot;), expecco zeigt im Baum stattdessen den Namen der Verbindung an, damit man mehrere Verbindungen voneinander unterscheiden kann. Die weiteren Elemente tragen jeweils das Präfix &amp;quot;&#039;&#039;android.widget.&#039;&#039;&amp;quot;, das im Baum zur besseren Übersicht nicht angezeigt wird. Bei IOS gibt es kein Präfix, das durch einen Punkt abgetrennt wäre, expecco 2.11 blendet aber entsprechend &amp;quot;&#039;&#039;XCUIElementType&#039;&#039;&amp;quot; am Anfang aus. Mit jedem Schrägstrich führt der Pfad über eine Eltern-Kind-Beziehung in eine tiefere Hierarchie-Ebene, d. h. &amp;quot;&#039;&#039;FrameLayout&#039;&#039;&amp;quot; ist ein Kindelement von &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot;, &amp;quot;&#039;&#039;LinearLayout&#039;&#039;&amp;quot; ist ein Kind von &amp;quot;&#039;&#039;FrameLayout&#039;&#039;&amp;quot; usw. Die in eckigen Klammern geschriebenen Wörter dienen nur als Orientierungshilfe im Baum. Sie gehören nicht zum Typ.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad muss nicht beim Element &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot; beginnen. Man kann den Pfad beginnend mit einem beliebigen Element des Baumes bilden. Man kann also verkürzt auch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
schreiben. Der Pfad führt zum selben &amp;quot;&#039;&#039;TextView&#039;&#039;&amp;quot;-Element, da es nur ein Element dieses Typs gibt. Anders verhält es sich bei dem Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da es zwei Elemente vom Typ &amp;quot;&#039;&#039;Button&#039;&#039;&amp;quot; gibt, passt dieser Pfad auf zwei Elemente, nämlich den Button, der mit &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; markiert ist, und den &#039;&#039;Button&#039;&#039;, der mit &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; markiert ist. Es würde an dieser Stelle aber auch nicht helfen den langen Pfad von &#039;&#039;hierarchy&#039;&#039; aus beginnend anzugeben. Um einen mehrdeutigen Pfad weiter zu differenzieren, kann man explizit ein Element aus einer Menge wählen, indem man den numerischen Index in eckigen Klammern dahinter schreibt. Der Pfad aus dem obigen Beispiel lässt sich damit so anpassen, dass er eindeutig auf den &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; weist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[1].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ihnen fällt sicher auf, dass der Index eine 1 ist obwohl das zweite Element gemeint ist. Das kommt daher, dass die Zählung bei 0 beginnt. Der Button mit der Markierung &amp;quot;An&amp;quot; hat also die Nummer 0 und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Nummer 1.&lt;br /&gt;
&lt;br /&gt;
Dieser Ansatz, einen expliziten Index zu verwenden, hat zwei Nachteile: Zum einen lässt sich an dem Pfad nur schwer ablesen welches Element gemeint ist, zum andern ist der Pfad sehr empfindlich schon gegenüber kleinsten Änderungen, wie zum Beispiel dem Vertauschen der beiden &#039;&#039;Button&#039;&#039;-Elemente oder dem Einfügen eines weiteren &#039;&#039;Button&#039;&#039;-Elements in der App.&lt;br /&gt;
&lt;br /&gt;
Es wäre daher wünschenswert, das gemeinte Element über eine ihm charakteristische Eigenschaft wie einen Attributwert, zu adressieren. Für Android-Apps eignet sich hierfür häufig das Attribut &amp;quot;&#039;&#039;resource-id&#039;&#039;&amp;quot;. Im Idealfall muss bei der Entwicklung der App darauf geachtet werden, dass jedes Element eine eindeutige Id erhält. Die &#039;&#039;resource-id&#039;&#039; hat den großen Vorteil, dass sie unabhängig vom Text des Elements oder der Spracheinstellung des Geräts ist. Für iOS-Apps kann entsprechend das Attribut &amp;quot;&#039;&#039;name&#039;&#039;&amp;quot; verwendet werden, wenn es von der App sinnvoll gesetzt wird. Der XPath-Standard erlaubt solche Auswahlbedingungen zu einem Element anzugeben. Angenommen, der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Eigenschaft &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;off&#039;&#039; und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; hat als &#039;&#039;resource-id&#039;&#039; den Wert &#039;&#039;on&#039;&#039;, dann kann man als eindeutigen Pfad für den &amp;quot;Aus&amp;quot;-&#039;&#039;Button&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[@resource-id=&#039;off&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
formulieren. Wie an dem Beispiel zu sehen werden solche Bedingungen wie ein Index in eckigen Klammern an den Elementtyp angehängt. Der Name eines Attributes wird mit einem &amp;quot;@&amp;quot; eingeleitet und der Wert mit einem &amp;quot;=&amp;quot; in Anführungszeichen angehängt. Ist der Attributwert global eindeutig, kann man den vorausgehenden Pfad sogar durch den globalen Platzhalter * ersetzen, der auf jedes Element passt. Das obige Beispiel mit dem GTIN-13-&#039;&#039;Button&#039;&#039; war ein solcher Fall.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum2.png | frame | Abb. 3: Elementbaum einer fiktiven App mit Erweiterungen]]&lt;br /&gt;
&lt;br /&gt;
Abb. 3 zeigt eine Erweiterung des Beispiels aus Abb. 2. Die App hat nun ein weiteres, nahezu identisches &#039;&#039;LinearLayout&#039;&#039; bekommen. Die &#039;&#039;Buttons&#039;&#039; sind in ihren Attributen jeweils ununterscheidbar. Deshalb funktioniert der vorige Ansatz nicht, einen eindeutigen Pfad nur mithilfe eines Attributwerts zu formulieren. Offensichtlich unterscheiden sich aber ihre benachbarten &#039;&#039;TextViews&#039;&#039;. Es ist möglich die jeweilige &#039;&#039;TextView&#039;&#039; in den Pfad mit aufzunehmen, um einen &#039;&#039;Button&#039;&#039; dennoch eindeutig zu adressieren. Ein Pfad zum &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; unterhalb der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; kann dabei wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView[@resource-id=&#039;push&#039;]/../android.widget.Button[@resource-id=&#039;on&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Teil beschreibt den Pfad zu der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; und der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;push&#039;&#039;. Danach folgt ein Schrägstrich gefolgt von zwei Punkten. Die zwei Punkte sind eine spezielle Elementbezeichnung, die nicht ein Kindelement benennt, sondern zum Elternelement wechselt, in diesem Fall also das &#039;&#039;LinearLayout&#039;&#039;, in dem die &#039;&#039;TextView&#039;&#039; eingebettet ist. Im Kontext dieses &#039;&#039;LinearLayout&#039;&#039; ist der restliche Pfad, nämlich der &#039;&#039;Button&#039;&#039; mit der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;on&#039;&#039;, eindeutig.&lt;br /&gt;
&lt;br /&gt;
Der XPath-Standard bietet noch sehr viel mehr Ausdrucksmittel. Mit der hier knapp vorgestellten Auswahl ist es aber bereits möglich für die meisten praktischen Testfälle gute Pfade zu formulieren. Eine vollständige Einführung in XPath ginge über den Umfang dieser Einführung weit hinaus. Sie finden zahlreiche weiterführende Dokumentationen im Web und in Büchern.&lt;br /&gt;
&lt;br /&gt;
Eine universelle Strategie zum Erstellen guter XPaths gibt es nicht, da sie von den Testanforderungen abhängt. In der Regel ist es sinnvoll, den XPath kurz und dennoch eindeutig zu halten. Häufig lassen sich Elemente über Eigenschaften identifizieren wie beispielsweise ihren Text. Will man aber gerade den Text eines Elements auslesen, kann dieser natürlich nicht im Pfad verwendet werden, da er vorher nicht bekannt ist. Ebenso wird der Text variieren, wenn die App mit verschiedenen Sprachen gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Jeder Baustein, der auf einem Element arbeitet, hat einen Eingangspin für den XPath. Im GUI-Browser finden Sie in der Mitte oben eine Liste von Bausteinen mit Aktionen, die Sie auf das ausgewählte Element anwenden können. Suchen Sie den Baustein &#039;&#039;Click&#039;&#039; (8) im Ordner Elements und wählen Sie ihn aus (Abb. 1). Er wird im rechten Teil unter &amp;quot;&#039;&#039;Test&#039;&#039;&amp;quot; eingefügt, der Pin für den XPath ist mit dem automatisch generierten Pfad des Elements vorbelegt (9). Sie können den Baustein hier auch ausführen. Die Ansicht wechselt dann auf &amp;quot;&#039;&#039;Lauf&#039;&#039;&amp;quot;. Ändert sich durch die Aktion der Zustand Ihrer App, müssen Sie den Baum anschließend aktualisieren (10).&lt;br /&gt;
&lt;br /&gt;
Wenn Sie in der unteren Liste eine Eigenschaft auswählen, wechselt die Anzeige der Bausteine zu &amp;quot;&#039;&#039;Eigenschaften&#039;&#039;&amp;quot;, wo Sie die eigenschaftsbezogenen Bausteine finden. Wie bei den Aktionen können Sie auch hier einen Baustein auswählen, der dann rechts in Test mit dem Pfad des Elements und der ausgewählten Eigenschaft eingetragen wird, sodass Sie ihn direkt ausführen können.&lt;br /&gt;
&lt;br /&gt;
== Weitere Locator-Strategien ==&lt;br /&gt;
Appium bietet neben XPath noch weitere Strategien zur Adressierung von Elementen an. Einige davon stehen Ihnen &#039;&#039;&#039;ab Version 20.1&#039;&#039;&#039; ebenfalls mit expecco zur Verfügung. Diese sind nicht ganz so mächtig wie XPath, dafür aber häufig schneller bei der Auflösung auf dem Gerät. Insbesondere bei der Verwendung mit iPhones, wo die Hierarchie bei jeder XPath-Auflösung erst aufgebaut werden muss, bieten alternative Strategien einen Vorteil für die Laufzeit.&lt;br /&gt;
&lt;br /&gt;
XPath ist weiterhin der Standard, das heißt alle Locator ohne besondere Angabe werden als XPath interpretiert. Um eine der anderen Strategien zu verwenden, schreiben Sie diese mit einem Gleichzeichen vor den gewünschten Locator. Diese Technik können Sie sowohl an den Blöcken verwenden, als auch im GUI-Browser testen.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | AccessibilityId || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Wert des Elements, der dazu dient, die App barrierefrei zu machen. Für iOS ist das das Attribut &#039;&#039;&#039;Accessibility-id&#039;&#039;&#039;, für Android das Attribut &#039;&#039;&#039;content-descr&#039;&#039;&#039;. &#039;&#039;Beispiel: accessibilityId=Löschen&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | className || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Namen der Klasse des Elements. &#039;&#039;Beispiel: className=android.widget.FrameLayout&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | id || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet die Kennung des Elements. Für iOS ist das das Attribut &#039;&#039;&#039;name&#039;&#039;&#039;, für Android das Attribut &#039;&#039;&#039;resource-id&#039;&#039;&#039;. &#039;&#039;Beispiel: id=android:id/text1&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | iOSClassChain&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet die Hierarchie der Elemente ähnlich wie bei XPath. Eine Erklärung zum Aufbau finden Sie [https://github.com/facebookarchive/WebDriverAgent/wiki/Class-Chain-Queries-Construction-Rules hier]. &#039;&#039;Beispiel: iOSClassChain=XCUIElementTypeWindow/XCUIElementTypeButton[`label == &amp;quot;Ok&amp;quot;`]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; padding-right:1em&amp;quot; | iOSNsPredicateString&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet einfache Kriterien, wie Attribute, die auch kombiniert werden können. &#039;&#039;Beispiel: iOSNsPredicateString=type == &#039;XCUIElementTypeButton&#039; AND name == &#039;Weiter&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | name&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Namen des Elements. &#039;&#039;Beispiel: name=Bestätigen&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &#039;&#039;nur für iOS&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Um eine direkte Beschleunigung mit iOS zu erzielen, ohne dass Sie Ihre bisherigen Pfade anpassen müssen, wandelt expecco zudem Pfade, die nur aus einem Element mit Klasse und name-Attribut bestehen, zur Laufzeit automatisch in einen entsprechenden Locator der Strategie iOSNsPredicateString um. Wenn Sie einen Pfad explizit als XPath markieren, wird diese Anpassung nicht vorgenommen.&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span id=&amp;quot;troubleshooting&amp;quot;&amp;gt;&amp;lt;!-- Referenced by error dialog on connection error --&amp;gt;&amp;lt;/span&amp;gt;Probleme und Lösungen=&lt;br /&gt;
== Locator sind versionsabhängig oder variabel ==&lt;br /&gt;
Dann sollten Sie die Locator (xPath) entweder in einer Variablen halten oder ein Locator-Mapping in einem Screenplay Anhang definieren. Es ist auch möglich, lediglich Teile des Locators (z.B. Locator-Pfad eines Elternelements oder Attributwert) in einer Variable zu halten und im Freezevalue des Locator-Pins mit &amp;quot;&#039;&#039;$(varName)&#039;&#039;&amp;quot; einzufügen.&lt;br /&gt;
&lt;br /&gt;
==Unsichtbare UI-Elemente==&lt;br /&gt;
Beachten Sie, dass im [[#Recorder|Recorder]] auch Elemente berücksichtigt werden, die Sie auf dem Bildschirm nicht sehen. Schalten Sie daher das Element-Highlighting an oder nutzen Sie die Follow-Mouse-Funktion und den Elementbaum im GUI-Browser, um festzustellen, ob das richtige Element verwendet wird. Es kann vorkommen, dass unsichtbare Elemente vor anderen Elementen liegen und diese verdecken, so dass die gewünschten Elemente im Recorder nicht ausgewählt werden können. Lesen Sie dazu den Abschnitt [[#Elemente_verbergen|Elemente verbergen]].&lt;br /&gt;
&lt;br /&gt;
==iOS: Kabel nicht zertifiziert==&lt;br /&gt;
In manchen Fällen erscheint beim Verbinden eines iOS-Geräts über USB der Hinweis, das verwendete Kabel sei nicht zertifiziert. In diesem Fall hilft es nur, das entsprechende Kabel auszutauschen.&lt;br /&gt;
==iOS: Alerts beim Verbindungsaufbau==&lt;br /&gt;
Stellen Sie sicher, dass beim Verbindungsaufbau mit einem iOS-Gerät keine Alerts geöffnet sind. Der Aufbau schlägt sonst fehl, da die App nicht in den Vordergrund kommen kann. Siehe auch [[#iOS-Ger.C3.A4t_und_App_vorbereiten|iOS-Gerät und App vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
==iOS: .ipa installieren nicht möglich==&lt;br /&gt;
Beachten Sie, dass auf iOS-Simulatoren keine &#039;&#039;.ipa&#039;&#039;-Dateien sondern nur &#039;&#039;.app&#039;&#039;-Dateien installiert werden können.&lt;br /&gt;
&lt;br /&gt;
==iOS: Erster Verbindungsaufbau funktioniert nicht==&lt;br /&gt;
Wenn auf Ihrem Mac noch kein signierter Build des WebDriverAgents liegt, muss dieser beim ersten Verbindungsaufbau erst erzeugt werden. Das kann in der Regel etwas länger als eine Minute dauern. Standardmäßig verwendet Appium aber einen Timeout von 60000&amp;amp;nbsp;ms um zu warten bis der WebDriverAgent auf dem Gerät startet, so dass der Aufbau in diesen Fällen abgebrochen wird. Sie können den Timeout mit der Capability &#039;&#039;wdaLaunchTimeout&#039;&#039; setzen, z.B. auf &#039;&#039;120000&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Außerdem müssen die Einstellungen für die Signierung passen. Am zuverlässigsten funktioniert das nach unserer Erfahrung, wenn man im Xcode-Projekt des WebDriverAgents auf automatische Signierung stellt und das Team setzt. Siehe dazu die Erklärung im Abschnitt [[#WebDriverAgent-Signierung|WebDriverAgent-Signierung]]. In diesem Fall sollten Sie die Capabilities &#039;&#039;xcodeConfigFile&#039;&#039; bzw. &#039;&#039;xcodeOrgId&#039;&#039; und &#039;&#039;xcodeSigningId&#039;&#039; &#039;&#039;&#039;nicht&#039;&#039;&#039; verwenden, da es sonst zu Konflikten kommen kann. Achtung: Wenn Sie eine Team-ID in den Mobile-Testing-Einstellungen gesetzt haben, setzt expecco diese automatisch als &#039;&#039;xcodeOrgId&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
Achten Sie beim ersten Verbindungsaufbau außerdem auf Ihr Gerät, da Sie dort möglicherweise der Installation per Passwort zustimmen müssen. Auf dem Mac kann die Eingabe des Passworts zur Freigabe des Schlüsselbunds für die Signierung nötig werden, häufig auch mehrmals.&lt;br /&gt;
&lt;br /&gt;
==Android: Gerät nicht im Verbindungsdialog==&lt;br /&gt;
Wenn ein über USB angeschlossenes Android-Gerät nicht im Verbindungsdialog auftaucht, versuchen Sie, den USB-Verbindungstyp zu ändern. In der Regel sollten MTP oder PTP funktionieren. Prüfen Sie nochmal, ob &amp;quot;USB Debugging&amp;quot; in den Entwicklereinstellungen des Geräts aktiviert ist (diese Einstellungen sind bei manchen Geräten zunächst unsichtbar, und müssen durch einen Trick zugänglich gemacht werden). Siehe auch [[#Android-Ger.C3.A4t_vorbereiten|Android-Gerät vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
==Android: Abgeschnittene Elemente unten==&lt;br /&gt;
Bei Android-Geräten, die die Steuerungsleiste bzw. Softkeys automatisch ein- und ausblenden, kann es vorkommen, dass der Recorder im unteren Bereich Elemente abschneidet, die durch die Softkeys verdeckt würden, auch wenn sie zu diesem Zeitpunkt gar nicht angezeigt werden. In diesem Fall hift es, die Softkeys so einzustellen, dass sie in einer permanenten Leiste angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
Bei neueren Android-Versionen gibt es eine solche Einstellung in der Regel nicht. Auch wenn die Steuerelemente permanent eingeblendet sind, liegen sie auf keiner extra Leiste, sondern vor dem Inhalt der App. Es gibt dann im unteren Teil einen Bereich, der nicht bedient werden kann, weil er nicht zum aktiven Bereich der App gezählt wird, weshalb die Elemente von Appium abgeschnitten werden. Dieser Bereich kann auch größer sein als von den Steuerungselementen beansprucht. Bekannt ist dies für Samsung-Geräte mit Android 11. Da die Information über die Größe des App-Bereichs bereits auf Android-Ebene so geliefert wird, können wir hierfür keine Lösung anbieten, sondern können nur hoffen, dass das Problem vom Hersteller behoben wird. Sie können versuchen, ob Sie mit der Einstellung von Gestensteuerung bessere Ergebnisse bekommen, allerdings gibt es hier das gleiche Problem.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;waitForIdleTimeout&amp;quot;&amp;gt;&amp;lt;!-- Referenced by expecco--&amp;gt;&amp;lt;/span&amp;gt; Android: Test hängt beim Suchen eines Elements==&lt;br /&gt;
Der Baustein &#039;&#039;Find Element by XPath&#039;&#039; und alle Element-Bausteine warten bis ein Element zum angegebenen Pfad auftaucht. Den Timeout dafür kann man entweder am Baustein direkt oder in den Umgebungsvariablen ändern. Wenn das Element aber bereits da sein sollte und es dennoch sehr lange dauert, bis der Test weitergeht, kann das am UIAutomator/UIAutomator2 liegen. Dieser wartet, bis die App in den Idle-Zustand geht, bevor er überhaupt nach Elementen sucht. Dies kann länger dauern, wenn die App z.B. im Hintergrund noch Animationen abspielt oder andere Aktionen ausführt. Auch das Holen des Page-Sources z.B. beim Aktualisieren im GUI-Browser oder im Recorder kann dadurch länger dauern. Standardmäßig gibt es hierfür einen Timeout von 10 Sekunden, nach dem nicht weiter auf den Idle-Zustand gewartet wird. Dieser Timeout lässt sich durch eine Einstellung in Appium anpassen (waitForIdleTimeout). Falls Sie einen anderen Wert für diesen Timeout setzen möchten, ist dies ab expecco 21.2 möglich, indem Sie vor dem Test den Smalltalk-Code &amp;lt;code&amp;gt;AppiumTestRunner::TestRunConnection waitForIdleTimeout:2000&amp;lt;/code&amp;gt; ausführen. Der Timeout wird in Millisekunden angegeben, das Beispiel setzt ihn also auf 2 Sekunden.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;startChromedriverTimeout/&amp;gt;Android: Aktualisieren des Trees oder Wechseln zum Webview-Kontext braucht zu lange==&lt;br /&gt;
Speziell mit älteren Geräten kann es vorkommen, dass neuere Chromedriver nicht initialisiert werden können. Das führt dann dazu, dass nicht in den Webview-Kontext gewechselt werden kann. Dies wird von Appium allerdings nur über einen Timeout festgestellt, der standardmäßig bei 4 Minuten liegt. Da expecco auch beim Aufbauen des Trees im GUI-Browser versucht in den Webview-Kontext zu wechseln, kann das zu sehr langen Ladezeiten führen. Da es in Appium keine Möglichkeit gibt, diesen Timeout herunter zu setzen, haben wir die Version, die wir im MobileTestingSupplement bereitstellen, um eine entsprechende Capability erweitert. Ab der Version 1.13.1.0 des [[#Windows|MobileTestingSupplements]] kann mit &#039;&#039;chromedriverStartTimeout&#039;&#039; der Timeout in Millisekunden gesetzt werden. Der Wechsel funktioniert dadurch zwar trotzdem nicht, aber expecco braucht dann nicht mehr so lange beim Aktualisieren des Trees und der Baustein zum Wechseln des Kontextes schlägt schneller fehl. Der Verbindungsdialog fügt diese Capability ab expecco 22.1 automatisch hinzu.&lt;br /&gt;
&lt;br /&gt;
==Keine Aktion bei Klick==&lt;br /&gt;
Der Baustein zum Klicken auf ein Element ist erfolgreich, aber auf dem Gerät wurde keine Aktion ausgeführt.&lt;br /&gt;
:Dies kann vorkommen, wenn das Element von einem anderen Element verdeckt ist und ein Klick auf das Element deshalb nicht möglich ist. In diesem Fall wird von Appium kein Fehler geworfen, sondern es passiert einfach nichts. Wenn Sie dennoch einen Klick an der Position des Elements machen möchten, auch wenn es verdeckt ist, benutzen Sie stattdessen den Baustein &#039;&#039;Tap&#039;&#039; und übergeben Sie diesem die Position des Elements (&#039;&#039;Get Location&#039;&#039;). Wenn Sie stattdessen vor einem Klick prüfen möchten, ob das Element zu diesem Zeitpunkt verdeckt ist, versuchen Sie, ob Ihnen die Eigenschaften &#039;&#039;Is Displayed&#039;&#039; oder &#039;&#039;Is Enabled&#039;&#039; weiterhelfen.&lt;br /&gt;
&lt;br /&gt;
==Kein Update nach Aktion==&lt;br /&gt;
Über den Recorder wurde eine Aktion ausgeführt, für die auch ein Baustein aufgezeichnet wurde, der Recorder zeigt aber immer noch das alte Bild.&lt;br /&gt;
:Der Recorder zeigt kein Livebild des Geräts, sondern immer nur eine Momentaufnahme. Nachdem eine Aktion ausgeführt wurde, aktualisiert sich der Recorder automatisch. Es kann aber vorkommen, dass das Bild schon aktualisiert wurde, bevor die Auswirkungen der Aktion auf dem Gerät vollständig abgeschlossen sind. In diesem Fall sollten Sie den Recorder von Hand aktualisieren über das Symbol mit den blauen Pfeilen. Ab expecco 20.2 können Sie für diesen Fall auch automatisches Aktualisieren einstellen. Siehe auch Beschreibung zum [[#Recorder|Recorder]].&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;clickable&amp;quot; Attribut falsch==&lt;br /&gt;
Ein Element hat im &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; Attribut/Property den Wert &amp;quot;&#039;&#039;false&#039;&#039;&amp;quot;, ist aber dennoch anklickbar.&lt;br /&gt;
:Das &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; Attribute muss explizit vom App-Programmierer gesetzt werden, und hat tatsächlich keine Relevanz für das tatsächliche Verhalten der App. Sie sollten dieses Attribut i.A. in Ihren Tests nicht beachten.&amp;lt;br&amp;gt;Leider existieren viele Apps, bei denen der Programmierer hier &amp;quot;lazy&amp;quot; war.&lt;br /&gt;
&lt;br /&gt;
==Verbindungsaufbau schlägt fehl==&lt;br /&gt;
Schlägt der Verbindungsaufbau mit dem Appium-Server fehl, erhalten Sie in expecco eine Fehlermeldung ähnlicher der unten abgebildeten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingVerbindungsfehler.png]]&lt;br /&gt;
&lt;br /&gt;
Hier sehen Sie die Art des aufgetretenen Fehlers. Klicken Sie auf &amp;quot;&#039;&#039;Details&#039;&#039;&amp;quot; um nähere Informationen zu erhalten. Mögliche Fehler sind:&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.remote.UnreachableBrowserException&#039;&#039;&lt;br /&gt;
:Der angegebene Server läuft nicht oder ist nicht erreichbar. Überprüfen Sie die Serveradresse.&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.WebDriverException&#039;&#039;&lt;br /&gt;
:Lesen Sie in den Details in der ersten Zeile die Meldung hinter &#039;&#039;Original Error&#039;&#039;:&lt;br /&gt;
:*&#039;&#039;Unknown device or simulator UDID&#039;&#039;&lt;br /&gt;
::Entweder ist das Gerät nicht richtig angeschlossen oder die udid stimmt nicht.&lt;br /&gt;
:*&#039;&#039;Unable to launch WebDriverAgent because of xcodebuild failure: xcodebuild failed with code 65&#039;&#039;&lt;br /&gt;
::Dieser Fehler kann verschiedene Ursachen haben. Entweder konnte tatsächlich der WebDriverAgent nicht gebaut werden, weil die Signierungseinstellungen falsch sind oder das passende Provisioning Profile fehlt. Lesen Sie dazu den Abschnitt zur [[#Signierung|Signierung]]. Es kann auch sein, dass der WebDriverAgent auf dem Gerät nicht gestartet werden kann, weil sich beispielsweise ein Alert im Vordergrund befindet oder Sie dem Entwickler nicht vertraut haben.&lt;br /&gt;
:*&#039;&#039;Could not install app: &#039;Command &#039;ios-deploy [...] exited with code 253&#039;&#039;&#039;&lt;br /&gt;
::Die angegebene App kann nicht auf dem iOS-Gerät installiert werden, weil es nicht im Provisioning Profile der App eingetragen ist.&lt;br /&gt;
:*&#039;&#039;Bad app: [...] App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name.&#039;&#039;&#039;&lt;br /&gt;
::Der Pfad zur App ist falsch. Stellen Sie sicher, dass sich die Datei unter dem angegebenen Pfad auf dem Mac befindet.&lt;br /&gt;
:*&#039;&#039;packageAndLaunchActivityFromManifest failed.&#039;&#039;&lt;br /&gt;
::Die angegebene &#039;&#039;apk&#039;&#039;-Datei ist vermutlich kaputt.&lt;br /&gt;
:*&#039;&#039;Could not find app apk at [...]&#039;&#039;&lt;br /&gt;
::Der Pfad zur App ist falsch. Stellen Sie sicher, dass sich die &#039;&#039;apk&#039;&#039;-Datei am angegebenen Pfad befindet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Falls der Fehler nicht durch eine der oben gelisteten Ursachen bedingt ist, kann es sein, dass die auf dem Gerät befindlichen Automation-Anwendungen nicht mehr richtig funktionieren. Hier hilft es, diese vom Mobilgerät zu deinstallieren. Beim nächsten Verbindungsaufbau werden sie dann automatisch neu installiert.&lt;br /&gt;
&lt;br /&gt;
*Für iOS-Geräte ist das der WebDriverAgent, den Sie einfach vom Home-Screen deinstallieren können. Dies behebt in der Regel Probleme durch den Wechsel des verwendeten Macs oder der Xcode-Version.&lt;br /&gt;
&lt;br /&gt;
*Für Android-Geräte ist es der UIAutomator2; hier tritt auf einigen Geräten sporadisch ein Problem auf, die Ursache dafür ist uns z.Z. noch nicht bekannt. Zur Deinstallation navigieren Sie auf dem Gerät zu &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;Anwendungen&#039;&#039;&amp;quot;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; und suchen in der Liste nach folgenden Einträgen:&lt;br /&gt;
    Appium Settings&lt;br /&gt;
    io.appium.uiautomator2.server&lt;br /&gt;
    io.appium.uiautomator2.server.test&lt;br /&gt;
:Klicken Sie auf die jeweilige Anwendung und dann auf &amp;quot;&#039;&#039;Deinstallieren&#039;&#039;&amp;quot;.&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&#039;&#039;Der entsprechende Eintrag heißt auf manchen Geräten möglicherweise etwas anders.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Falls dies nicht hilft, kann eventuell die Ausgabe des Appium-Servers weiterhelfen. Für einen von expecco gestarteten Server finden Sie das Log in der Liste der [[#Laufende_Appium-Server|laufenden Appium-Server]].&lt;br /&gt;
&lt;br /&gt;
==Ich habe keinen Mac==&lt;br /&gt;
Vielleicht hilft Ihnen diese Webseite weiter: [https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10 https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Release_Notes_24.x&amp;diff=29406</id>
		<title>Release Notes 24.x</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Release_Notes_24.x&amp;diff=29406"/>
		<updated>2024-05-29T07:42:43Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Release 24.1 (2Q 2024) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See also: [[Release Notes 23.x]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Release 24.1 (2Q 2024) ==&lt;br /&gt;
*Feature: [[Expecco_API/en#Global_and_Static_Variables|Static Variables for Python]]&lt;br /&gt;
*Feature: Qt-Testing: Logging with log levels &amp;lt;code&amp;gt;DEBUG&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;INFO&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;WARN&amp;lt;/code&amp;gt; ([[Qt_Inject_Windows/en#Logging|Qt-Logging]])&lt;br /&gt;
*Feature: Qt-Testing: Qt-Connections now use the ConnectionManager like the other Gui test technologies&lt;br /&gt;
*Feature: WindowsAutomation: Native Touch, Tap, Drag &amp;amp; Drop support now in the base WindowsAutomation Library&lt;br /&gt;
*Feature: Show Log and [[Timeline/en|Timeline view]] for testplans&lt;br /&gt;
*Feature: Search and Goto Line menu functions in the activity log view&lt;br /&gt;
*Feature: [[Embedded Systems C Bridge API|C-Bridge]] now supports SSL connections (encryption and authentication using certificates)&lt;br /&gt;
*Feature: [[Testsuite_Editor-ExecutionSettings_Editor/en|Settings for execution]] (thread pool and log activities/pins/info) can now be saved in the test suite settings&lt;br /&gt;
*Feature: CSV test report, values for start time, end time and duration added&lt;br /&gt;
*Feature: Improved refactoring for compound blocks: &amp;quot;Extract (&amp;amp; Replace) New Compound Action&amp;quot;&lt;br /&gt;
*Feature: Enhanced expecco reflection library&lt;br /&gt;
*Feature: Logprocessors can be executed for embedded testplans&lt;br /&gt;
*Feature: Logging of background actions can be individually enabled and disabled for testplans and nested testplans&lt;br /&gt;
*Fix: Current temporary testplan settings (like selected testcases, do-not-execute of pre/post action, etc.) don&#039;t get lost anymore when reimporting a library&lt;br /&gt;
*Fix: WindowsAutomation: Fix blocking of applications after &amp;lt;Mouse Button Down&amp;gt;&lt;br /&gt;
*Fix: asynchronous write to an output pin with no wait() in bridged actions are now detected and reported as error (see Example3 in the [[Expecco_API/en#Asynchronous_and_Callback_Functions|NodeJS API Documentation]])&lt;br /&gt;
*Fix: Bridges: Detect (and ignore) invalid requests from forked background bridge threads&lt;br /&gt;
*Fix: Acitivity logs of asynchronous events in background actions are now displayed correctly in the background activity log.&lt;br /&gt;
*Fix: Qt: Drag and drop improved by revising the &amp;quot;Move mouse event&amp;quot; (Windows)&lt;br /&gt;
*Fix: Disabling logs of sub-activities (if successful, if not successful, etc.)&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Release_Notes_24.x&amp;diff=29405</id>
		<title>Release Notes 24.x</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Release_Notes_24.x&amp;diff=29405"/>
		<updated>2024-05-28T07:12:16Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Release 24.1 (2Q 2024) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See also: [[Release Notes 23.x]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Release 24.1 (2Q 2024) ==&lt;br /&gt;
*Feature: [[Expecco_API/en#Global_and_Static_Variables|Static Variables for Python]]&lt;br /&gt;
*Feature: Qt-Testing: Logging with log levels &amp;lt;code&amp;gt;DEBUG&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;INFO&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;WARN&amp;lt;/code&amp;gt; ([[Qt_Inject_Windows/en#Logging|Qt-Logging]])&lt;br /&gt;
*Feature: Qt-Testing: Qt-Connections now use the ConnectionManager like the other Gui test technologies&lt;br /&gt;
*Feature: WindowsAutomation: Native Touch, Tap, Drag &amp;amp; Drop support now in the base WindowsAutomation Library&lt;br /&gt;
*Feature: Show Log and [[Timeline/en|Timeline view]] for testplans&lt;br /&gt;
*Feature: Search and Goto Line menu functions in the activity log view&lt;br /&gt;
*Feature: [[Embedded Systems C Bridge API|C-Bridge]] now supports SSL connections (encryption and authentication using certificates)&lt;br /&gt;
*Feature: [[Testsuite_Editor-ExecutionSettings_Editor/en|Settings for execution]] (thread pool and log activities/pins/info) can now be saved in the test suite settings&lt;br /&gt;
*Feature: CSV test report, values for start time, end time and duration added&lt;br /&gt;
*Feature: Improved refactoring for compound blocks: &amp;quot;Extract (&amp;amp; Replace) New Compound Action&amp;quot;&lt;br /&gt;
*Feature: Enhanced expecco reflection library&lt;br /&gt;
*Fix: Current temporary testplan settings (like selected testcases, do-not-execute of pre/post action, etc.) don&#039;t get lost anymore when reimporting a library&lt;br /&gt;
*Fix: WindowsAutomation: Fix blocking of applications after &amp;lt;Mouse Button Down&amp;gt;&lt;br /&gt;
*Fix: asynchronous write to an output pin with no wait() in bridged actions are now detected and reported as error (see Example3 in the [[Expecco_API/en#Asynchronous_and_Callback_Functions|NodeJS API Documentation]])&lt;br /&gt;
*Fix: Bridges: Detect (and ignore) invalid requests from forked background bridge threads&lt;br /&gt;
*Fix: Acitivity logs of asynchronous events in background actions are now displayed correctly in the background activity log.&lt;br /&gt;
*Fix: Qt: Drag and drop improved by revising the &amp;quot;Move mouse event&amp;quot; (Windows)&lt;br /&gt;
*Fix: Disabling logs of sub-activities (if successful, if not successful, etc.)&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Test_Editor/en&amp;diff=29345</id>
		<title>Test Editor/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Test_Editor/en&amp;diff=29345"/>
		<updated>2024-05-07T15:18:56Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Timeline View */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:Test Editor.png|thumb|300px|Test Editor after a run]]&lt;br /&gt;
Notice: starting with release 1.8, this editor has been split into separate editor and execution tabs:&lt;br /&gt;
;Test/Demo&lt;br /&gt;
:Definition of the network under test. This is used to define a test or demo for the edited action. As such, it combines features of the [[CompoundBlock Editor-CompoundWorksheet Editor/en|network editor]].&lt;br /&gt;
;Run&lt;br /&gt;
:Shows information of the current or last execution of the network under test.&lt;br /&gt;
&lt;br /&gt;
The separation was made to make better use of the screen (which was too filled for small displays) and also to reuse the execution output view in the [[GUI Browser/en|GUI-Browser]]. This document describes the previous combined editor.&lt;br /&gt;
&lt;br /&gt;
=== As Part of an Action Block Definition ===&lt;br /&gt;
Every action can have an associated &amp;quot;&#039;&#039;Test Network&#039;&#039;&amp;quot; which is shown in the &amp;quot;&#039;&#039;Test/Demo&#039;&#039;&amp;quot; tab. The test network typically shows how the action is to be used and/or contains a unit test of the action.&lt;br /&gt;
We highly recommend that all of your actions provide an executable example of its use, both as a &amp;quot;unit test&amp;quot; and as additional documentation. It may also be used as a place to provide ready-to-use setups, which can be copied/pasted into other networks.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;&#039;&#039;Test/Demo&#039;&#039;&amp;quot; network should not be used for &amp;quot;official&amp;quot; test-runs. Instead, always put real tests into a testplan and only use the test/demo network for the &amp;quot;private&amp;quot; execution of a single block &lt;br /&gt;
(i.e. unit tests for the action itself) or as a place for demonstration or &amp;quot;executable documentation&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To the right, you see a test editor after the successful execution of a test-block.&lt;br /&gt;
&lt;br /&gt;
=== As Part of the GUI Browser ===&lt;br /&gt;
&lt;br /&gt;
In this context, the test run tab presents the outcome of the last&lt;br /&gt;
execution within the GUI browser. This can be either the single action or the complete sequence as recorded so far.&lt;br /&gt;
&lt;br /&gt;
=== As Part of the Testplan Editor ===&lt;br /&gt;
&lt;br /&gt;
Here the outcome of the selected test case is presented.&lt;br /&gt;
&lt;br /&gt;
= Buttons =&lt;br /&gt;
&lt;br /&gt;
*[[Bild:Icon Run.png]] &amp;quot;Run&amp;quot; &amp;lt;br&amp;gt; Starts or continues execution. All auto started steps will be triggered.&amp;lt;br&amp;gt;Unless enabled in the execution settings, no debugger is opened when an error occurs or a breakpoint is hit. Instead, on error or fail, the execution is terminated and the failed/error status remembered in the log (shown in red).&amp;lt;br&amp;gt;Halts or breakpoints are ignored.&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[[Bild:Icon Run Debug.png]] &amp;quot;Debug Run&amp;quot; &amp;lt;br&amp;gt;Start or continue the test execution in debug mode causing the debugger to open on exceptions (regardless of what is specified in the execution settings) and also when a breakpoint is hit.&amp;lt;br&amp;gt;In addition, skipInTrace and doNotLog attributes are ignored. Thus, all activities will be logged.&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[[Bild:Icon Run Single Step.png]] &amp;quot;Step&amp;quot;&amp;lt;br&amp;gt;Start the test execution in single step mode or continue single stepping (when at a breakpoint).&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[[Bild:Icon Run SingleStepInto.png]] &amp;quot;Step Into&amp;quot;&amp;lt;br&amp;gt;Like the above, but steps into other compound actions.&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[[Bild:Icon Pause.png]] &amp;quot;Pause&amp;quot; &amp;lt;br&amp;gt;Pause the current test run. To proceed or single step, click on the according button.&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[[Bild:Icon Stop.png]] &amp;quot;Stop&amp;quot; &amp;lt;br&amp;gt;Stop the execution of the current test run. Exception handling &amp;amp; cleanup (post actions) will be performed.&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[[Bild:Icon InterruptRun.png]] &amp;quot;Interrupt&amp;quot; (new in 18.1 aka &amp;quot;2.12&amp;quot;) &amp;lt;br&amp;gt;Interrupt the execution of the current test run and open a debugger. Useful to debug endless loops or to inspect the execution state in a long running elementary action. In the debugger, the execution can be proceeded, single stepped or aborted.&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[[Bild:Icon PauseOnError.png]] &amp;quot;Pause on Error&amp;quot; &amp;lt;br&amp;gt;This toggle controls how the executor behaves when an error is encountered. The default is to stop the test execution and to mark the test case as &amp;quot;FAILED&amp;quot; or &amp;quot;ERROR&amp;quot;. However, especially during the test development process itself, it is often useful to be able to proceed after an error. For example, when the test consists of a web-browser&#039;s input field values being checked and validated, you may want to continue after a validation error. With this toggle set, the executor goes into the pause-state whenever an error is encountered, and execution can be continued by pressing the &amp;quot;Run&amp;quot; or &amp;quot;Single Step&amp;quot; button again (i.e. it behaves as if &amp;quot;Pause&amp;quot; was pressed).&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[[Bild:Icon Hard Stop.png]] &amp;quot;Hard Stop&amp;quot; &amp;lt;br&amp;gt;Hard-Terminate the execution of the current test run, without doing any exception/cleanup handling. This is useful e.g. for recursion hang-ups, or if a block&#039;s cleanup action leads to another blocking situation.&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;!-- no longer; only in testplan runner &lt;br /&gt;
*[[Bild:Icon Logging Menu.png]] Open the logging dropdown menu&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
*[[Bild:Icon Print Report.png]] &amp;quot;Report&amp;quot;&amp;lt;br&amp;gt;Generate a report from the log data&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[[Bild:Icon Follow Execution.gif]] &amp;quot;Follow execution&amp;quot;&amp;lt;br&amp;gt;To enabled/disable auto-select of the currently active block in the log (animation while running).&amp;lt;br&amp;gt;This button also provides a drop-down box (right click or press-and-hold), to select the number of levels and a tag filter, to further control which actions should be followed. The button&#039;s icon image shows a &amp;quot;minus&amp;quot; when automatic follow is disabled.&amp;lt;br&amp;gt;If the tag filter is set, it gives a list of match-patterns (GLOB patterns) separated by semicolon. Automatic follow will then only show action which are both within any level-limit and which have a tag which matches any in the given tag filter pattern&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[[Bild:Icon FindNextError.png]] &amp;quot;Find Error&amp;quot; &amp;lt;br&amp;gt;In the log, select the next activity which has finished with an error.&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[[Bild:Icon Next Inconclusive.png]] &amp;quot;Find Inconclusive&amp;quot;&amp;lt;br&amp;gt;In the log, select the next activity which has finished with an inconclusive state.&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[[Bild:Icon FindNextActive2.png]] &amp;quot;Find Active&amp;quot;&amp;lt;br&amp;gt;In the log, select the next activity which is currently executing.&lt;br /&gt;
&lt;br /&gt;
*[[Bild:Icon BackToPreviouslyVisited.png]] &amp;quot;Previously Visited&amp;quot;&amp;lt;br&amp;gt;In the log, select the previously visited activity (i.e. back in visited-history).&lt;br /&gt;
&lt;br /&gt;
The remaining edit- and breakpoint-related buttons are described in the [[CompoundBlock Editor-CompoundWorksheet Editor/en#Buttons|network editor]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- only present in the testplan-run-editor !&lt;br /&gt;
&lt;br /&gt;
= Logging Menu =&lt;br /&gt;
[[Bild:Logging Menu.png|thumb|153px|Logging]]&lt;br /&gt;
&lt;br /&gt;
;Save Log...&lt;br /&gt;
:This option allows saving the current logging information into an expecco log file or a XML formatted file. Selecting it brings up a file chooser to determine the target path of the log file.&lt;br /&gt;
&lt;br /&gt;
;Load Log...&lt;br /&gt;
:This option allows loading previously saved logging information from an expecco log file or a XML formatted file. Selecting it brings up a file chooser to determine the source path of the log file.&lt;br /&gt;
&lt;br /&gt;
;Remove all Results in System&lt;br /&gt;
:This option is used to clear all generated log data in the system. No reports can be generated from any more.&lt;br /&gt;
&lt;br /&gt;
;Remove Result&lt;br /&gt;
:This option is used to clear the last generated log data. No reports can be generated from any more.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Views =&lt;br /&gt;
After a run, the recorded &#039;&#039;Activity Log&#039;&#039; is presented as a hierarchical tree of executed actions. Select individual actions the tree to see the action&#039;s details (inputs, outputs and generated logging messages).&lt;br /&gt;
&lt;br /&gt;
== Activity Tree ==&lt;br /&gt;
The activity tree displays a hierarchical view of the activities that are invoked during the test run, each with a single entry in the tree. If an activity spawns sub activities, these sub activities are enlisted in the branch of the spawning activity, and you can expand or collapse the branch with the node browsing item. Only the first level is expanded automatically when the test run is started. Activities that perform elementary actions never have sub activities, while those that perform compound actions always have at least one sub activity (else they fail due to lack of executable steps inside). Activities on the same level are sorted chronologically by invocation time.&lt;br /&gt;
&lt;br /&gt;
The symbol in front of the activity indicates the state of the activity. This can be either in progress or one of the [[Glossary/en#Verdict | test results (verdicts)]]: &amp;quot;PASSED&amp;quot;, &amp;quot;FAIL&amp;quot;, &amp;quot;INCONCLUSIVE&amp;quot; or &amp;quot;ERROR&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Context Menu Activity Tree.png|thumb|231px|Context Menu]]&lt;br /&gt;
A context menu is available in the activity tree view, relating to the Activity that is currently selected:&lt;br /&gt;
&lt;br /&gt;
;Find Next Unhandled Error&lt;br /&gt;
:This option switches the selection in the tree from the currently selected activity to the next, failed activity for which no error handling was performed (and which was not ignored). The search is in the order of the tree hierarchy (i.e. deep-first search, starting at the current selection). &lt;br /&gt;
&lt;br /&gt;
;Find Next Error&lt;br /&gt;
:Similar to the above, but this menu function will find both handled and unhandled errors and failures.&lt;br /&gt;
&lt;br /&gt;
;Find Previous Unhandled Error&lt;br /&gt;
:Similar to the above, but searches backward for the previous unhandled failure or error.&lt;br /&gt;
&lt;br /&gt;
;Find Previous Error&lt;br /&gt;
:Similar to the above, but searches for any error (both handled and unhandled)&lt;br /&gt;
&lt;br /&gt;
;Generate Report from here...&lt;br /&gt;
:This option generates a report of the selected activity and all nested activities.&lt;br /&gt;
&lt;br /&gt;
;Open page on selected Item&lt;br /&gt;
:This opens a new page on the block corresponding to the selected activity.&lt;br /&gt;
&lt;br /&gt;
== Network View ==&lt;br /&gt;
This view is shown for compound activities. It displays the activity diagram and highlights steps as they are executed. A step&#039;s color reflects its execution state, as described below in &amp;quot;State Colors&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Note that in this view, editing is not possible. You can, however, press &amp;lt;kbd&amp;gt;Enter&amp;lt;/kbd&amp;gt; after selecting a step, causing a new browser page to open up, showing the selected step&#039;s diagram.&lt;br /&gt;
&lt;br /&gt;
== Log View ==&lt;br /&gt;
This view shows the log created by the activity. The log consists of the messages (and possibly attached data or screenshots) as generated by the activity (and subactivities) via the &amp;quot;logInfo&amp;quot; / &amp;quot;logWarning&amp;quot; / &amp;quot;logError&amp;quot; and &amp;quot;logFailure&amp;quot; calls (either from elementary code or via the corresponding action steps in a compound action).&lt;br /&gt;
&lt;br /&gt;
The toolbar buttons show or hide different message types. The checkbox named &amp;quot;&#039;&#039;Sublogs&#039;&#039;&amp;quot; shows or hides the logs of subactivities.&lt;br /&gt;
&lt;br /&gt;
== [[Timeline/en|Timeline View]] ==&lt;br /&gt;
This pane is new with version 23.2. It shows a graphical presentation of the execution times.&lt;br /&gt;
&lt;br /&gt;
== Pin Data View ==&lt;br /&gt;
This view is available for all types of activities. It shows two lists, the input pin value list to the left, and the output pin value list to the right. In each of the lists, three columns arrange the information. The first field of each row displays the pin name, the second one displays the value, and the third one displays the sender, or the receiver, respectively.&lt;br /&gt;
&lt;br /&gt;
Note that input information is not changing after an activity was spawned, while output values can still be produced or changed during the execution of the activity. In each list, only one row can be selected at a time. According to the selected row, the above icon buttons can be used:&lt;br /&gt;
&lt;br /&gt;
;[[Bild:Icon Sender.png]]&lt;br /&gt;
: Jump to the sender (the source) of the value. Only available for input pins when a sender object is available. This causes the selection in the activity tree to change to the activity that sent the selected value to this activity.&lt;br /&gt;
;[[Bild:Icon Receiver.png]]&lt;br /&gt;
: Jump to the receiver (the sink) of the value. Only available for output pins when a receiver object is available. This causes the selection in the activity tree to change to the activity that received the selected value from this activity.&lt;br /&gt;
;[[Bild:Icon Inspect Value.png]]&lt;br /&gt;
: Inspect the value object. As a shortcut, double click on the pin value&#039;s row.&lt;br /&gt;
&lt;br /&gt;
The popup menu (right click) depends on the selection. If no row is selected, functions operating on all values are provided. Otherwise, functions on the selected item are offered. The selection can be toggled by pressing CTRL with the mouse click.&lt;br /&gt;
&lt;br /&gt;
= State Colors =&lt;br /&gt;
When a compound action&#039;s diagram is executed, a read-only version of the diagram editor is showing the state of the execution.&lt;br /&gt;
There, steps are colored according to their [[Glossary/en#Verdict|execution state (verdict)]]. The color setting is part of the user settings and&lt;br /&gt;
can be changed according to your personal taste (or, if you suffer from red-green color blindness, for example).&lt;br /&gt;
&amp;lt;br&amp;gt;The defaults are:&lt;br /&gt;
* grey/original color&amp;lt;br&amp;gt;the step was not yet executed&lt;br /&gt;
&lt;br /&gt;
* blue&amp;lt;br&amp;gt;the step is about to be executed. This means that it has all of its input values (and possibly any required resources) available and it is ready to run. However, its code or network is not yet being executed - either because other steps are still running and the maximum execution parallelity has been reached, or because the diagram is being single stepped and waiting for you to press the &amp;quot;&#039;&#039;Step Next&#039;&#039;&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
* bright green (lime)&amp;lt;br&amp;gt;the step is being executed&lt;br /&gt;
&lt;br /&gt;
* normal green (darker green)&amp;lt;br&amp;gt;the step has finished execution with success&lt;br /&gt;
&lt;br /&gt;
* yellow&amp;lt;br&amp;gt;the step has finished execution with success, but a warning was generated during its execution or an exception was caught or ignored. Select the step and the &amp;quot;Log&amp;quot; tab for details.&lt;br /&gt;
&lt;br /&gt;
* normal red&amp;lt;br&amp;gt;the step finished execution with an unhanded error&lt;br /&gt;
&lt;br /&gt;
* dark red&amp;lt;br&amp;gt;the step finished execution with a failure&lt;br /&gt;
&lt;br /&gt;
* dark grey&amp;lt;br&amp;gt;the step was skipped or its execution was aborted. Either due to the user initiating an explicit abort (&amp;quot;&#039;&#039;Stop&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Hard Stop&#039;&#039;&amp;quot; button), or because another step forced the containing diagram&#039;s execution to stop.&lt;br /&gt;
&lt;br /&gt;
= Tasks =&lt;br /&gt;
==Running a Trial Test of the Block==&lt;br /&gt;
To invoke the test wrapper, click on the start button in the editor&#039;s tool bar. The network is executed as usual, by starting with steps marked as autostart. If logging is enabled, the lower monitoring panel monitors the execution status. If logging is not enabled, the monitoring panel will be cleared and remains empty. Logging is initially enabled.&lt;br /&gt;
&lt;br /&gt;
The monitoring panel is split vertically, showing the activity tree on the left, and the observation panel to the right, which displays the current state of the selected activity. Select any activity to see the details in the right area. The depth of the activity tree can be limited by setting a log depth limit. See [[Settings/en#Logging Settings|settings]].&lt;br /&gt;
&lt;br /&gt;
If the &amp;quot;follow execution&amp;quot; toggle([[Bild:Icon Follow Execution.gif]]) has been checked, the selection in the tree automatically follows the currently executing activity.&lt;br /&gt;
&lt;br /&gt;
==Debugging==&lt;br /&gt;
The &amp;quot;normal&amp;quot; reaction to errors during a testplan-run is to finish the test plan with a FAIL or ERROR status. This behavior is OK for test execution; however, during test development, it is helpful to get a symbolic debugger which gives more detail about what happened, the current state (i.e. variables) and how the program got there (called &amp;quot;&#039;&#039;backtrace&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;walkback&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;call chain&#039;&#039;&amp;quot; in the literature).&lt;br /&gt;
&lt;br /&gt;
The debugger can be enabled via the global settings dialog. These settings are also used if you press the &amp;quot;&#039;&#039;Run&#039;&#039;&amp;quot;-button in this test-block runner. However, the additional &amp;quot;&#039;&#039;Run with Debug&#039;&#039;&amp;quot; button starts executing with the debugger enabled, ignoring the global settings.&lt;br /&gt;
&lt;br /&gt;
==Modifying the Program while Executing==&lt;br /&gt;
It is possible to change the running program. This may sound a weird thing to do at first, but is very useful when test cases are created in an explorative manner, or changes have to be made to a long running test, and you do not want (or cannot) restart the test from the beginning.&lt;br /&gt;
&lt;br /&gt;
You can change the program at any time (simply edit the action in another tab or window and accept). However, any action being already executed continues execution until finished in the old action definition. Only then (when invoked for the next time) will any changed definition become effective. &lt;br /&gt;
&lt;br /&gt;
This means:&lt;br /&gt;
* if an elementary block is currently being executed, the changed program text will be effective when the elementary block is called the next time&lt;br /&gt;
* if a compound action is changed, it will use the new activity diagram, when invoked the next time.&lt;br /&gt;
&lt;br /&gt;
To make code and diagram changes an atomic action, all changes are first done to a temporary edit-copy, which is finally installed as an atomic action when the &amp;quot;&#039;&#039;Accept&#039;&#039;&amp;quot; button is pressed. If multiple actions are to be edited, any ongoing execution should be paused first, and proceeded once all changes have been done.&lt;br /&gt;
&lt;br /&gt;
==Single Stepping and Breakpoints==&lt;br /&gt;
===Steps in an Activity Diagram===&lt;br /&gt;
Either place a breakpoint on a step and proceed by pressing the &amp;quot;&#039;&#039;Single Step&#039;&#039;&amp;quot; button, or start the execution right from the start via the &amp;quot;&#039;&#039;Single Step&#039;&#039;&amp;quot; button. There is also a &amp;quot;breakpoint&amp;quot;-action, which can be placed into the network. By conditionally enabling these steps, conditional breakpoints can be added.&amp;lt;br&amp;gt;When a breakpoint is reached, you can:&lt;br /&gt;
* continue single stepping (by pressing the &amp;quot;Step&amp;quot; button),&lt;br /&gt;
* cancel execution (press the &amp;quot;Stop&amp;quot; or &amp;quot;Hard Stop&amp;quot; button), or&lt;br /&gt;
* continue with normal execution (press the &amp;quot;Run&amp;quot; button).&lt;br /&gt;
&lt;br /&gt;
Notice that there are now two different single step buttons; one is showing steps as executed in the currently visible network, the other (&amp;quot;&#039;&#039;Step In&#039;&#039;&amp;quot;) also halts before any step in any subnetwork is about to be executed.&lt;br /&gt;
&lt;br /&gt;
===Code Lines in an Elementary Action===&lt;br /&gt;
In a JavaScript action, place a line such as:&lt;br /&gt;
 this.halt();&lt;br /&gt;
or&lt;br /&gt;
 halt();&lt;br /&gt;
(in Smalltalk code, write &amp;quot;&amp;lt;CODE&amp;gt;self halt&amp;lt;/CODE&amp;gt;&amp;quot;)&lt;br /&gt;
somewhere in your elementary block&#039;s code. When executed, a debugger will be opened, highlighting the line containing the code-breakpoint.&lt;br /&gt;
&lt;br /&gt;
As an alternative, place a line breakpoint by double-clicking beside the code line in the left side-bar area (a red breakpoint sign will be shown then). Notice that line breakpoints can only be placed at expressions starting in that very line, whereas the above described &amp;lt;CODE&amp;gt;halt&amp;lt;/CODE&amp;gt; can be placed anywhere, where an expression is allowed.&lt;br /&gt;
&lt;br /&gt;
In the debugger, press one of&lt;br /&gt;
* &amp;quot;&#039;&#039;Next Line&#039;&#039;&amp;quot; to single step to the next code line &lt;br /&gt;
* &amp;quot;&#039;&#039;Step&#039;&#039;&amp;quot; to single step over the next expression&lt;br /&gt;
* &amp;quot;&#039;&#039;Send&#039;&#039;&amp;quot; to step into the next expression&lt;br /&gt;
* &amp;quot;&#039;&#039;Continue&#039;&#039;&amp;quot; to proceed.&lt;br /&gt;
* &amp;quot;&#039;&#039;Abort&#039;&#039;&amp;quot; to stop the execution&lt;br /&gt;
&lt;br /&gt;
The debugger also shows the calling chain (how did I get there) in the top pane, and the activity&#039;s local variables and temporary variables in the lower pane.&lt;br /&gt;
&lt;br /&gt;
The debugger is described in detail in http://live.exept.de/doc/online/english/tools/debugger/TOP.html.&lt;br /&gt;
&lt;br /&gt;
==Premature Stop of a Test==&lt;br /&gt;
Occasionally, it might be required to stop a test even though it has not completed. For example, if you detect an error or malfunction which is not detected by the test, or the test is caught in an endless loop due to an unexpected situation.&lt;br /&gt;
In this case, press the &amp;quot;&#039;&#039;Stop&#039;&#039;&amp;quot; button. &lt;br /&gt;
&lt;br /&gt;
The &amp;quot;&#039;&#039;Stop&#039;&#039;&amp;quot; button asks the test-executor for a controlled termination of the run. &amp;quot;&#039;&#039;Controlled&#039;&#039;&amp;quot; means, that any cleanup actions (post-execution actions) are to be executed.&lt;br /&gt;
&lt;br /&gt;
This is the preferred way to stop test execution, because those cleanup actions are meant to free any acquired resources, remove temporary files or to turn off hardware equipment which was acquired and configured by the test. I.e. to bring the state of your equipment back to a well known (initial) state.&lt;br /&gt;
&lt;br /&gt;
However, sometimes, a cleanup action might itself encounter trouble. For example, if your test requires a login procedure to a remote machine, and the cleanup tries to perform a logout, this may block if the connection was lost during the test. In this case, the cleanup action will not be able to perform its logout and may even block forever.&lt;br /&gt;
&lt;br /&gt;
To handle this situation gracefully, expecco will wait for some pre-configured time for all the cleanup actions to complete (this is a configurable settings value found in the &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution Settings&#039;&#039;&amp;quot;-dialog). After that, a dialog window will appear, asking if the cleanup should be aborted or if you want to continue waiting for the cleanup.&lt;br /&gt;
&lt;br /&gt;
If you are certain that no cleanup action is required, or if you know in advance, that it will fail or block, use the &amp;quot;&#039;&#039;Hard Stop&#039;&#039;&amp;quot; button, which terminates the execution without even attempting to perform any cleanup actions.&lt;br /&gt;
Use this with care, as it may leave allocated resources and devices in a non-determined state. It may also lead to file streams or sockets being left open. You can repair this (i.e. manually close any streams) via the &amp;quot;&#039;&#039;Extra&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Debugging&#039;&#039;&amp;quot; menu, where you fild menu items to find and/or close those streams.&lt;br /&gt;
&amp;lt;BR&amp;gt;Notice that unreferenced resources are usually automatically freed after some time via the automatic memory manager&#039;s finalization mechanism. However, this would not work if eg. an open file stream is still referenced by being held in an activity log or an expecco environment variable.&lt;br /&gt;
&lt;br /&gt;
= Typical Error Messages when Execution Fails =&lt;br /&gt;
&lt;br /&gt;
=== Empty action &amp;quot;...&amp;quot; (no steps) ===&lt;br /&gt;
&lt;br /&gt;
Obviously, there is no action step at all in your diagram. This makes no sense in a production test suite, and is therefore reported as an error.&lt;br /&gt;
However, when developing tests, it may be useful to create dummy actions as placeholders for &amp;quot;to-be-implemented&amp;quot; actions. Then, got to &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Debugging&#039;&#039;&amp;quot; and check the &amp;quot;&#039;&#039;Allow empty Actions&#039;&#039;&amp;quot; toggle.&lt;br /&gt;
&lt;br /&gt;
Solutions:&lt;br /&gt;
* add some dummy action to you network. A step which writes a log message such as &amp;quot;to be implemented&amp;quot; is a good idea. This can be written to either the activity log (and will therefore appear in any printed test report) or to the Transcript (console).&lt;br /&gt;
&lt;br /&gt;
* check &amp;quot;&#039;&#039;Allow empty Actions&#039;&#039;&amp;quot; in the settings.&lt;br /&gt;
&lt;br /&gt;
=== No executable step in action &amp;quot;Test/Demo&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
No inner action step could be executed inside the diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;This happens if:&lt;br /&gt;
* an explicit &amp;quot;Start&amp;quot; step is missing,&lt;br /&gt;
* and/or no step has the &amp;quot;autostart&amp;quot; attribute set (which is equivalent to a start step)&lt;br /&gt;
* and no inner step got a value at one of its required triggering pins (from the compound action).&lt;br /&gt;
Solution:&lt;br /&gt;
:typically, you forgot to provide an input value to the tested compound action in the &amp;quot;Test/Demo&amp;quot; diagram.&lt;br /&gt;
&lt;br /&gt;
=== No value for input pin &amp;quot;...&amp;quot; of step &amp;quot;...&amp;quot; ===&lt;br /&gt;
An inner step was started, but got no input value at one of its required pins.&lt;br /&gt;
The inner step was started (probably due to autostart or an explicit trigger, bt not due to an input value arriving).&lt;br /&gt;
&lt;br /&gt;
Solution:&lt;br /&gt;
:make sure the inner pin is connected, and also that it will receive a value at the input pin(s). If it has an autostart or explicit trigger, check if that is really what you intended. In most cases, steps should be triggered by incoming data, and not only by control flow triggers (but to have both is perfectly ok).&lt;br /&gt;
:&lt;br /&gt;
:Be especially careful when steps are in a loop: often an input value is &amp;quot;consumed&amp;quot;in the first iteration, and then no value is present in further loop cycles. Then, make the input a &amp;quot;non-consuming&amp;quot; (parameter) pin, to preserve the value across loop cycles.&lt;br /&gt;
&lt;br /&gt;
= See Also =&lt;br /&gt;
API for the builtin and bridged languages: &amp;quot;[[Expecco API]]&amp;quot;,&lt;br /&gt;
&amp;quot;[[Expecco_API/en#Pin Functions | Pin-API ]]&amp;quot; and &amp;quot;[[ Expecco_API/en#Current Activity | Activity-API ]]&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;[[Expecco_API/en#JavaScript_and_Smalltalk_Elementary_Blocks|API for Smalltalk/JavaScript actions]]&lt;br /&gt;
&amp;lt;br&amp;gt;[[Expecco_API/en#Groovy_Elementary_Blocks|API for Java/Groovy actions]]&lt;br /&gt;
&amp;lt;br&amp;gt;[[Expecco_API/en#Bridged_Python_Elementary_Blocks|API for Python actions]]&lt;br /&gt;
&amp;lt;br&amp;gt;[[Expecco_API/en#Node.js_.28Bridged.29_Elementary_Blocks|API for NodeJS actions]]&lt;br /&gt;
&amp;lt;br&amp;gt;[[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|API for Ruby actions]]&lt;br /&gt;
&amp;lt;br&amp;gt;[[Expecco_API/en#Bridged C Elementary Blocks|API for C actions]]&lt;br /&gt;
&amp;lt;br&amp;gt;Scripted actions: &amp;quot;[[ElementaryBlock_Element/en#Script_Action_Blocks | Script Action Blocks]]&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;[[ElementaryBlock_Element/en#Bridge_Action_Blocks_vs._Script_Action_Blocks | Bridged Actions vs. Script Actions]]&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;[[Code_Editor/en|Code Editor]]&lt;br /&gt;
&amp;lt;br&amp;gt;[[GUI Browser/en|GUI-Browser]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Editors]]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Release_Notes_24.x&amp;diff=29338</id>
		<title>Release Notes 24.x</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Release_Notes_24.x&amp;diff=29338"/>
		<updated>2024-05-07T14:50:59Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Release 24.1 (2Q 2024) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See also: [[Release Notes 23.x]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Release 24.1 (2Q 2024) ==&lt;br /&gt;
*Feature: [[Expecco_API/en#Global_and_Static_Variables|Static Variables for Python]]&lt;br /&gt;
*Feature: Qt-Testing: Logging with log levels &amp;lt;code&amp;gt;DEBUG&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;INFO&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;WARN&amp;lt;/code&amp;gt;&lt;br /&gt;
*Feature: WindowsAutomation: Native Touch, Tap, Drag &amp;amp; Drop support now in the base WindowsAutomation Library&lt;br /&gt;
*Feature: Show Log and [[Timeline/en|Timeline view]] for testplans&lt;br /&gt;
*Feature: Search and Goto Line menu functions in the activity log view&lt;br /&gt;
*Feature: [[Embedded Systems C Bridge API|C-Bridge]] now supports SSL connections (encryption and authentication using certificates)&lt;br /&gt;
*Feature: Settings for execution (thread pool and log activities/pins/info) can now be saved in the test suite settings&lt;br /&gt;
*Feature: CSV test report, values for start time, end time and duration added&lt;br /&gt;
*Feature: Improved Refactoring &amp;quot;Extract (&amp;amp; Replace) New Compound Action&amp;quot;&lt;br /&gt;
*Feature: More information in CSV test reports&lt;br /&gt;
*Fix: Current temporary testplan settings (like selected testcases, do-not-execute of pre/post action, etc.) don&#039;t get lost anymore when reimporting a library&lt;br /&gt;
*Fix: WindowsAutomation: Fix blocking of applications after &amp;lt;Mouse Button Down&amp;gt;&lt;br /&gt;
*Fix: asynchronous write to an output pin with no wait() in bridged actions are now detected and reported as error (see Example3 in the [[Expecco_API/en#Asynchronous_and_Callback_Functions|NodeJS API Documentation]])&lt;br /&gt;
*Fix: Bridges: Detect (and ignore) invalid requests from forked background bridge threads&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Release_Notes_24.x&amp;diff=29310</id>
		<title>Release Notes 24.x</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Release_Notes_24.x&amp;diff=29310"/>
		<updated>2024-05-06T13:32:19Z</updated>

		<summary type="html">&lt;p&gt;Matilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See also: [[Release Notes 23.x]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Release 24.1 (2Q 2024) ==&lt;br /&gt;
*Feature: [[Expecco_API/en#Global_and_Static_Variables|Static Variables for Python]]&lt;br /&gt;
*Bug Fix: asynchronous write to an output pin with no wait() in bridged actions are now detected and reported as error (see Example3 in the [[Expecco_API/en#Asynchronous_and_Callback_Functions|NodeJS API Documentation]])&lt;br /&gt;
*Feature: Qt-Testing: Logging with log levels &amp;lt;code&amp;gt;DEBUG&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;INFO&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;WARN&amp;lt;/code&amp;gt;&lt;br /&gt;
*Feature: WindowsAutomation: Native Touch, Tap, Drag &amp;amp; Drop support now in the base WindowsAutomation Library&lt;br /&gt;
*Feature: Log and timeline view also for the root testplan&lt;br /&gt;
*Enhancement: Current temporary testplan settings (like selected testcases, do-not-execute of pre/post action, etc.) don&#039;t get lost anymore when reimporting a library&lt;br /&gt;
*Bug Fix: WindowsAutomation: Fix blocking after &amp;lt;Mouse Button Down&amp;gt;&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Release_Notes_24.x&amp;diff=29269</id>
		<title>Release Notes 24.x</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Release_Notes_24.x&amp;diff=29269"/>
		<updated>2024-04-22T09:31:37Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Release 24.1 (2Q 2024) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See also: [[Release Notes 23.x]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Release 24.1 (2Q 2024) ==&lt;br /&gt;
*Feature: [[Expecco_API/en#Global_and_Static_Variables|Static Variables for Python]]&lt;br /&gt;
*Bug Fix: asynchronous write to an output pin with no wait() in bridged actions are now detected and reported as error (see Example3 in the [[Expecco_API/en#Asynchronous_and_Callback_Functions|NodeJS API Documentation]])&lt;br /&gt;
*Feature: Qt-Testing: Logging with log levels &amp;lt;code&amp;gt;DEBUG&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;INFO&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;WARN&amp;lt;/code&amp;gt;&lt;br /&gt;
*Feature: WindowsAutomation: Native Touch, Tap, Drag &amp;amp; Drop support now in the base WindowsAutomation Library&lt;br /&gt;
*Enhancement: Current temporary testplan settings (like selected testcases, do-not-execute of pre/post action, etc.) don&#039;t get lost anymore when reimporting a library&lt;br /&gt;
*Bug Fix: WindowsAutomation: Fix blocking after &amp;lt;Mouse Button Down&amp;gt;&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Testplan_Editor/en&amp;diff=29268</id>
		<title>Testplan Editor/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Testplan_Editor/en&amp;diff=29268"/>
		<updated>2024-04-17T12:07:07Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Log Processor Action */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:Testplan Editor 1.png|thumb|300px|Testplan Editor showing the plan&#039;s attributes]]&lt;br /&gt;
[[Bild:Testplan Editor 2.png|thumb|300px|Testplan Editor showing a test-case item&#039;s attributes]]&lt;br /&gt;
&lt;br /&gt;
The test plan editor is used to create, modify and execute test plans. It is shown in the &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; tab when a [[Testplan Element/en|testplan element]] is selected in the navigation tree.&lt;br /&gt;
&lt;br /&gt;
Testplans are constructed as a sequence of test cases. Notice that in literature and other test frameworks, these are often called &amp;quot;&#039;&#039;test steps&#039;&#039;&amp;quot;. Expecco uses the term &amp;quot;&#039;&#039;test case&#039;&#039;&amp;quot; for items in a test plan and &amp;quot;&#039;&#039;test step&#039;&#039;&amp;quot; for individual action steps within a test case. The reason is that in expecco, a &amp;quot;&#039;&#039;test step&#039;&#039;&amp;quot; (which defines what is done) can be put into multiple test plans as test case (which defines when and under which conditions it is execute). &lt;br /&gt;
&lt;br /&gt;
To add test cases to a test plan, drag actions (from the left tree) into the test case list. &lt;br /&gt;
If you want to define your test plan in a top-down fashion (i.e. create the list of test cases first, before any actions are defined), you can also create the test plan&#039;s list items with the &amp;quot;&#039;&#039;Add Test Case&#039;&#039;&amp;quot; button or menu function, and later specify the concrete action by dragging actions into the &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; field at the bottom or by selecting the test action vie the &amp;quot;...&amp;quot; button at the right. Finally, you can copy (CTRL-C) tree items and paste them elow the selected testcase with CTRL-V.&lt;br /&gt;
&lt;br /&gt;
Later, when the test plan is executed, these test cases will be executed in sequence one after the other.&lt;br /&gt;
&lt;br /&gt;
The test plan editor consists of two major areas: the top list presents the list of test cases, the bottom presents attributes of the selected item in the list.&lt;br /&gt;
Attributes specify the behavior of the test plan and of individual test cases.&lt;br /&gt;
&lt;br /&gt;
To execute the test plan, click on the green &amp;quot;&#039;&#039;run&#039;&#039;&amp;quot; button in the toolbar.&lt;br /&gt;
&lt;br /&gt;
When a test plan has been executed, the state of its last execution outcome is shown in the top list. Not executed or inconclusive items are shown with a grey color, successful items in green, and failed items in red.&lt;br /&gt;
&lt;br /&gt;
To the right you can see two examples for an opened testplan editor. In the first, the test plan itself is selected; in the second, a test case is selected and shown. Both show a situation after a test run which was only partially successful.&lt;br /&gt;
&lt;br /&gt;
= Testplan Hierarchies and Slices =&lt;br /&gt;
&lt;br /&gt;
Items in a test plan (called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; in the previous paragraph) are typically implemented as &lt;br /&gt;
actions from the tree. I.e. usually, you will define a test action and bring it into a test plan&#039;s list. &lt;br /&gt;
&lt;br /&gt;
Any action can be used as test case and thus placed into a test plan&#039;s list. However, it is recommended that test actions be  tagged as &amp;quot;TEST-CASE&amp;quot; (tree menu &amp;amp;#8594; &amp;quot;&#039;&#039;More&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Mark as TEST_CASE&#039;&#039;&amp;quot;), so they will be presented with a different icon in the tree (that us just to make things easier to find; it has no semantic meaning).&lt;br /&gt;
&lt;br /&gt;
In addition to actions, it is also possible to place other test plans as items into a test plan.&lt;br /&gt;
This allows for tests to be grouped (for example: by component or variant of the [[Glossary/en#SUT_.28System_Under_Test.29 | SUT]]) and placed as group into another test plan. Thus, the group can be executed individually (for component tests) or under another test plan (for final acceptance tests).&lt;br /&gt;
&lt;br /&gt;
Because of this, it may be better to call these &amp;quot;&#039;&#039;Testplan Items&#039;&#039;&amp;quot; instead of &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; (but your milage may vary and users tend to use different naming for these entities).&lt;br /&gt;
&lt;br /&gt;
= Buttons =&lt;br /&gt;
&lt;br /&gt;
*[[Bild:Icon Run.png]] Start the test execution (stop execution on error).&lt;br /&gt;
*[[Bild:Icon Run Debug.png]] Start the test execution with debug (open a debugger on error).&lt;br /&gt;
*[[Bild:Icon Run Failed.png]] Runs all previously failed and inconclusive test cases again (i.e. all cases which ended with success will be skipped)&lt;br /&gt;
*[[Bild:Icon Run Inconclusive.png]] Runs all previously inconclusive test cases.&lt;br /&gt;
:This includes both cases which have not yet been executed and cases which have ended in the inconclusive state.&lt;br /&gt;
*[[Bild:Icon Run Single Step.png]] Start execution in single step mode or continue single stepping.&lt;br /&gt;
*[[Bild:Icon Run Single Step2.png]] Start execution in single step mode or continue single stepping. Steps into called actions.&lt;br /&gt;
*[[Bild:Icon Pause.png]] Pause the current test run. To proceed, click on the run button. To proceed single stepping, click on one of the single-step buttons.&lt;br /&gt;
*[[Bild:Icon StopAndSkip.png]] Stop the execution of the current test-case, marking it as aborted (inconclusive). Proceed by starting the next test-case.&lt;br /&gt;
*[[Bild:Icon Stop.png]] Stop the execution of the current test run. Exception handling and cleanup actions will be performed.&lt;br /&gt;
&lt;br /&gt;
*[[Bild:Icon Hard Stop.png]] Hard-Terminate the testrun, without exception handling or cleanup actions.&lt;br /&gt;
: This is useful e.g. for hang-ups or communication failures (i.e. if a cleanup action itself hangs). Be aware, that this may lead to leftover open web-browser windows (in case of web-testing) or leftover open communication channels (sockets, serial line connections). These may have to be closed manually via the &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Debugging&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Close Connections&#039;&#039;&amp;quot; menu, if required.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*[[Bild:Icon Logging Menu.png]] Logging drop down menu to load/save a result log&lt;br /&gt;
*[[Bild:Icon Print Report.png]] Generate a [[Report Generation/en|report]] from the log data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*[[Bild:Icon Add Testcase.png]] Adds an empty test-case to testplan. The item&#039;s action can then be specified in the lower details area. However, a more convenient way to add test-cases is to simply drag&amp;amp;drop an action into the list.&lt;br /&gt;
*[[Bild:Icon Remove Testcase.png]] Remove the selected test-case(s) from test plan&lt;br /&gt;
*[[Bild:Icon Up.png]]/[[Bild:Icon Down.png]] Change the execution order of the test-cases, by moving the selected test-case(s) up or down in the list&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*[[Bild:Icon Follow Execution.png]] Follow execution: autoselect the currently active block in the log (while running).&amp;lt;br&amp;gt;In recent expecco versions, this button got replaced by a drop-down box, to selecte the number of levels, which should be followed. The button&#039;s icon image is slightly different.&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
*[[Bild:Icon Previous Error.png]] Find the previous failed or erroneous test case&lt;br /&gt;
*[[Bild:Icon Next Error.png]] Find the next failed or erroneous test case&lt;br /&gt;
*[[Bild:Icon Next Inconclusive.png]] Find the next inconclusive test case&lt;br /&gt;
*[[Bild:Icon Next Active.png]] Find the next active (currently running) test case&lt;br /&gt;
&lt;br /&gt;
= Tasks =&lt;br /&gt;
== Adding and Arranging Test Cases ==&lt;br /&gt;
There are multiple ways to create new test case entries in the test plan:&lt;br /&gt;
# Create empty items with the toolbar button shown above, then specify the action block in the lower editor&#039;s &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; field.&lt;br /&gt;
# Directly drag &amp;amp; drop an action block or another test plan from the navigation tree into the testplan area. For this, it is useful to open a secondary popup or split tree.&lt;br /&gt;
# Copy-Paste items from the left tree; using either menu- or keyboard shortcut functions.&lt;br /&gt;
# Use a programatic testplan generator from the reflection library&lt;br /&gt;
&lt;br /&gt;
Please note that not any block can serve as test case item in this list.&lt;br /&gt;
Allowed are:&lt;br /&gt;
* actions without input pins (or where all pins have default values)&lt;br /&gt;
* actions where input pins have only simple types (strings, numbers, filenames). See [[#Action Parameters | &amp;quot;&#039;&#039;Action Parameters&#039;&#039;&amp;quot; below]].&lt;br /&gt;
* other test plans (this creates a hierarchical test plan, with sub-test sequences).&lt;br /&gt;
&lt;br /&gt;
When creating an entry with the toolbar button or by pasting, new entries will be inserted below the currently selected entry. If nothing is selected or when an item is dropped onto the test plan itself, the new entry is added at the very bottom of the list.&lt;br /&gt;
&lt;br /&gt;
The items&#039; order (which is also the execution order) can be changed via the &amp;quot;&#039;&#039;Move Item Up&#039;&#039;&amp;quot; / &amp;quot;&#039;&#039;Move Item Down&#039;&#039;&amp;quot; items found on the the popup menu of a selected item. There are also [[Common_Keyboard_Shortcuts/en#Tree.2FList_Organisation|keyboard shortcuts]] (&amp;lt;kbd&amp;gt;Ctrl-&amp;amp;#x2191;&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Ctrl-&amp;amp;#x2193;&amp;lt;/kbd&amp;gt;) and toolbar buttons to move selected item(s).&lt;br /&gt;
&lt;br /&gt;
== Executing a Test ==&lt;br /&gt;
&lt;br /&gt;
Start the execution by clicking on the &amp;quot;&#039;&#039;Start&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Run&#039;&#039;&amp;quot;) button ([[Bild:Icon Run.png]]). By default, execution starts with the first item and proceeds downward in the list.&lt;br /&gt;
You&#039;ll find multiple such run buttons: regular run, to run with debugger opening on error, to rerun failed cases only (as described above) or to rerun only inconclusive test cases. There are also two single step options in the toolbar.&lt;br /&gt;
&lt;br /&gt;
Test cases can be individually skipped or activated by toggling the &amp;quot;&#039;&#039;Enable&#039;&#039;&amp;quot; checkbox in the list. There are also popup-menu entries to enable/disable multiple items in one operation (i.e. select multiple items, then use the menu function &amp;quot;&#039;&#039;Skip Selected Items&#039;&#039;&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
The list keeps the information of the previous run, even if you switch to another editor and come back later. However, only the last execution&#039;s result of a test plan is remembered (unless you save the result in a file). Before any run, all test-cases&#039; states are reset to the &amp;quot;Untested&amp;quot; state (which counts as &amp;quot;INCONLUSIVE&amp;quot;), no matter if they are activated for execution or not.&lt;br /&gt;
&lt;br /&gt;
All checked test-cases are executed sequentially. While running, the currently executing test-case is marked with a little clock symbol. The symbols of all other test cases indicate their result state, which is one of the [[Glossary/en#Verdict|verdicts]] or the already mentioned &amp;quot;Untested&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
After the test run, the list-elements can be expanded (the little [+]/[-] icons) to browse the test-cases&#039; activity logs. You can also follow the execution while running, to keep track on the current execution state. Either click on those activity items, or check the &amp;quot;&#039;&#039;Follow Activity&#039;&#039;&amp;quot; toggle, to have expecco automatically follow the currently active action.&lt;br /&gt;
&lt;br /&gt;
Create a report from this test-run by clicking on the &amp;quot;&#039;&#039;Report&#039;&#039;&amp;quot; button. Initially, a standard report template (with probably way too much detail) is printed. This can be customized in various ways to suit your needs. For more information see: [[Report Generation/en|Report Generation]].&lt;br /&gt;
&lt;br /&gt;
== Stopping / Pausing / Resuming ==&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;&#039;&#039;Pause&#039;&#039;&amp;quot; button ([[Bild:Icon Pause.png]]) will pause the execution.&amp;lt;br&amp;gt;Useful to look into the trace or message log. You may later continue with or without the debug option (without the debug option, errors will lead to non-success of the corresponding test case, without user intervention. With debug, a debugger will pop up allowing for inspection of data and the state of any pending elementary action).&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;&#039;&#039;Stop&#039;&#039;&amp;quot; button ([[Bild:Icon Stop.png]]) will end the execution.&amp;lt;br&amp;gt;All currently active actions will be marked as &amp;quot;aborted&amp;quot;, which is treated like &amp;quot;inconclusive&amp;quot; when interpreted as [[Glossary/en#Verdict | test verdict]].&lt;br /&gt;
&lt;br /&gt;
* If you press either the &amp;quot;&#039;&#039;Run&#039;&#039;&amp;quot; ([[Bild:Icon Run.png]]) or the &amp;quot;&#039;&#039;Run-with-debug&#039;&#039;&amp;quot; ([[Bild:Icon Run_Debug.png]])button,&amp;lt;br&amp;gt;execution will start from the very first test case (unless you change the check-toggles which control the individual test case executions). If the suite was paused, it will be resumed.&lt;br /&gt;
&lt;br /&gt;
* If you press the &amp;quot;&#039;&#039;Run Failed&#039;&#039;&amp;quot; button ([[Bild:Icon Run_Failed.png]]),&amp;lt;br&amp;gt;test cases which already finished with success will NOT be reexecuted. Thus their outcome and trace data is preserved. This is useful after a fix of the system under test and a rerun of affected cases.&lt;br /&gt;
&lt;br /&gt;
* If you press the &amp;quot;&#039;&#039;Run Inconclusive&#039;&#039;&amp;quot; button ([[Bild:Icon Run_Inconclusive.png]]),&amp;lt;br&amp;gt;only tests which where aborted previously or which have not yet been executed will be executed. Both successful and failed tests will NOT be reexecuted. This is useful to resume a test after a longer session interruption. Notice, that this &amp;quot;Run not Executed&amp;quot; function even works if you saved the previous test result and restarted expecco in the mean time. This works even if you proceed testing on another machine (testers will appreciate this, when their laptop battery is about to die...).&lt;br /&gt;
&lt;br /&gt;
== Selective Execution ==&lt;br /&gt;
You can execute individual test-cases or a subset of all the test plan.&lt;br /&gt;
&lt;br /&gt;
Of course, selective execution requires that test cases are independent from previous cases. That means that either each case leaves the SUT in a defined initial state, or every case makes sure to bring it into a defined state before doing its thing.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Individual Selection:&#039;&#039;&#039;&amp;lt;br&amp;gt;Individual testcases are excluded/included by toggling their execution toggle in the list. Notice that this is a session setting. When the suite is reloaded in a new session, all execution toggles will be reset to their default state (which can be specified for each individual item in the lower attribute area).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Rerun of Failed Tests:&#039;&#039;&#039;&amp;lt;br&amp;gt;The &amp;quot;&#039;&#039;Execute Failed&#039;&#039;&amp;quot; button executes those tests which failed in the previous run. This is useful if the whole suite would take a long time and individual tests are to be executed again after a fix of the system under test. Or after a change of a test-case&#039;s definition. Although this might save time, it is good practice (i.e. highly obligatory) to rerun the test plan completely eventually.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Selection by Risk:&#039;&#039;&#039;&amp;lt;br&amp;gt;You can define individual risk levels to each test-case of the plan. Now toggle the &amp;quot;&#039;&#039;Risk&#039;&#039;&amp;quot; check-box at the top of the test plan and set a risk limit. Then, when executing, only those test-cases will be executed which have a greater or equal risk level. &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Selection by Group:&#039;&#039;&#039;&amp;lt;br&amp;gt;By attaching individual group-tags to each test-case, you can also group related test cases into test groups. Then, toggle the &amp;quot;&#039;&#039;Testgroup&#039;&#039;&amp;quot; check-box at the top of the test plan and enter some identifier(s) to specify, which group(s) to execute. The next test-run will only execute test-cases with a matching group tag.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Dynamic Selection by Pre-Execution Checks&#039;&#039;&#039;&amp;lt;br&amp;gt;If present, the pre-execution action is run before the actual test case. If it generates a non-successful result, the corresponding test case is skipped (a corresponding post-execution action is also skipped, if present).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Dynamic Selection by Condition Variables&#039;&#039;&#039;&amp;lt;br&amp;gt;You can attach a &#039;&#039;condition variable&#039;&#039; or a set of condition variables to a testcase. If a name or list of names is specified in the &amp;quot;&#039;&#039;Check Condition Variable&#039;&#039;&amp;quot; field, all of them must contain a boolean &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; value, otherwise, the test case is skipped with an inconclusive outcome. The variables must be defined in the testplan&#039;s environment (or the project&#039;s top environment) as boolean variables.&amp;lt;p&amp;gt;In addition, it is possible to update a condition variable (or a set of condition variables) depending on the outcome of a test case. All variables listed in the &amp;quot;&#039;&#039;set condition variable&#039;&#039;&amp;quot; field will be set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, if the test case passed, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; otherwise.&amp;lt;br&amp;gt;These two allow for a simple conditional execution of individual test cases. Of course, these variables are also visible in the network as regular environment variables. Therefore, more complex checks can be performed using arbitrarily complex logic there.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Sub-Testplans&#039;&#039;&#039;&amp;lt;br&amp;gt;Finally, by dropping another test-plan into the test-case area, all of its test-cases are embedded and are treated as a single test-case in the outer test-plan. Thus, hierarchies of testplans can be created, which can of course still be executed individually.&lt;br /&gt;
&lt;br /&gt;
== Repeated Execution (Loop Modes) ==&lt;br /&gt;
&lt;br /&gt;
It is often useful to run the same test scenario multiple times. For example if an error only occurs sporadically, you may want to repeat the test run until an error occurs. Or if your goal is to detect memory leaks or performance degration of the system under test, you may want to run it multiple times to put stress on it.&lt;br /&gt;
For this, various loop modes can be configured (see &amp;quot;&#039;&#039;Execution Modes&#039;&#039;&amp;quot; below):&lt;br /&gt;
* repeat the test for a particular number of runs&lt;br /&gt;
* repeat the test for a given time duration&lt;br /&gt;
* repeat the test until an error occurs&lt;br /&gt;
* repeat the test until no error occurs&lt;br /&gt;
&lt;br /&gt;
Of course, all of the above can be easily implemented by creating a compound block and placing the test scenario&#039;s action block into it with either an iteration count or by adding appropriate looping blocks around. This is also the preferred mechanism, if different input values or configuration data has to be used for each run.&lt;br /&gt;
However, in most cases, only a simple repetition of the same test is desired, and this can be done without programming, by setting up a loop mode in the execution configuration.&lt;br /&gt;
&lt;br /&gt;
=== Individual versus Full Report ===&lt;br /&gt;
&lt;br /&gt;
When executing a test in loop mode, a big amount of trace and report data may accumulate, which may be cumbersome to examine and may also reach the available memory limits (in this case, expecco prunes the execution log, by removing older trace information).&lt;br /&gt;
&lt;br /&gt;
For this, it is possible to specify that individual reports are generated and written to a file after each run - either unconditionally or only when an individual run is successful or failed. You can specify a filename pattern for this, so that each file gets a distinguished name (with optional run-number and/or time stamp in the file name). The files will be created relative to the project&#039;s attachment folder, unless an absolute pathname is specified.&lt;br /&gt;
&lt;br /&gt;
=== Alternative Postprocessing Options ===&lt;br /&gt;
&lt;br /&gt;
To postprocess the accumulated trace/log information, define a log-processor action and add it to individual testcases as &amp;quot;&#039;&#039;Log Processor Action&#039;&#039;&amp;quot;. The log processor action gets the collected activity-log as input. This allows for arbitrary filtering and/or processing of the log information, but requires some knowledge about the structure of the log items and the operation of the log-processing action blocks in the [[ Standard Library ]] and/or the [[ Expecco Reflection Library | Reflection Library ]].&lt;br /&gt;
&amp;lt;br&amp;gt;(You can of course create an dummy log processor first, place a breakpoint on it and inspect the received object to see its structure).&lt;br /&gt;
&lt;br /&gt;
== Data Driver / Generator (Feeding Loop) ==&lt;br /&gt;
&lt;br /&gt;
You can execute the same suite with multiple data value tuples,&lt;br /&gt;
by defining a data generator action (drag&amp;amp;drop it into the &amp;quot;&#039;&#039;Data Generator&#039;&#039;&amp;quot; input field). &lt;br /&gt;
This action will be executed and each output value tuple will be&lt;br /&gt;
used to set variables in the testplan&#039;s environment, and execute the testplan&lt;br /&gt;
once for for each generated tuple.&lt;br /&gt;
The variables are named according to the generator action&#039;s output pin names.&lt;br /&gt;
(i.e. if you define environment variables &amp;quot;a&amp;quot; and &amp;quot;b&amp;quot;, the generator should (must) have two output pins named &amp;quot;a&amp;quot; and &amp;quot;b&amp;quot;, and generate the driving values there.)&lt;br /&gt;
&lt;br /&gt;
== Configuring the Testplan ==&lt;br /&gt;
=== Adding Pre and Post Execution Actions===&lt;br /&gt;
Testplans can have pre- and post-execution blocks. The pre-execution block is executed before the plan is executed; the post-execution block is executed after it has finished.&lt;br /&gt;
If the pre-execution block does not finish with success, the testplan is not executed. This can be useful e.g. to allocate and/or release resources. To add a pre- or post-execution action, drag &amp;amp; drop an action block from the navigation tree into the corresponding field. Please note that these blocks cannot receive values via an input pin. See also below for pre- and post actions of individual test cases.&lt;br /&gt;
&lt;br /&gt;
=== Adding a Background Execution Action ===&lt;br /&gt;
Testplans can have a background-execution block. The background-execution block is executed in parallel to the execution of the testplan and will be terminated after the execution of the testplan has finished. Typically, this will be a block which opens a socket, pipe or other communication channel or to start an external (shell-) process to feed or monitor the system under test. See also below for individual testcase background actions.&lt;br /&gt;
&lt;br /&gt;
=== Adding an Inventory ===&lt;br /&gt;
If a test case requires a resource (device, lock or operator), an inventory can be specified, which defines the set of available resources and from which the resource will be allocated. Without an inventory, the test will not be able to perform.&lt;br /&gt;
&amp;lt;br&amp;gt;An inventory can be defined locally in a test plan, or globally in the top-level testSuite&#039;s &#039;&#039;misc&#039;&#039; tab (the later is used, if the test plan does not specify its own inventory preferences).&lt;br /&gt;
&lt;br /&gt;
If tests are executed from AIDYMO via remote-execution, the inventory is provided by AIDYMO instead.&lt;br /&gt;
This ensures that measurement devices are correctly acquired and locked&lt;br /&gt;
for the duration of a test&#039;s execution - even among multiple tests running at the same time on different test machines.&lt;br /&gt;
To add an inventory, drag &amp;amp; drop an existing inventory definition element from the navigation tree.&lt;br /&gt;
&lt;br /&gt;
=== Execution Settings ===&lt;br /&gt;
*&#039;&#039;&#039;Run Time Limit&#039;&#039;&#039;&amp;lt;br&amp;gt;This field is used to set a time limit for the execution of the test plan. The execution will stop after the specified duration. The entered number can be followed by a time unit, e.g. &amp;quot;ms&amp;quot; / &amp;quot;s&amp;quot; / &amp;quot;m&amp;quot; / &amp;quot;h&amp;quot; / &amp;quot;d&amp;quot;. Without unit, &amp;quot;seconds&amp;quot; are assumed. To remove a previously set time limit simply leave the field blank.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Finish Suite even if Time Limit Reached&#039;&#039;&#039;&amp;lt;br&amp;gt;This check box determines if either the execution of a test plan is stopped immediately after reaching the time limit or let the execution finish, e.g. to execute the remaining items and any post actions.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Loop (Stop on Error or Failure / Success)&#039;&#039;&#039;&amp;lt;br&amp;gt;This check box toggles looping on or off. If on, the execution of the test plan will be repeated until an error or failure (success) is encountered or otherwise the time limit for the execution is reached. The stop on condition feature is useful to catch sporadic error-behavior of a system under test. For example, to run a test unattended over night, but stop when a certain condition arises.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Loop (Skip successful tests when looping)&#039;&#039;&#039;&amp;lt;br&amp;gt;This check box toggles, if only failed or inconclusive tests should be run when looping. This is useful, when you want to retry failed tests until all testcases in the testplan are successful.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Loop Count&#039;&#039;&#039;&amp;lt;br&amp;gt;This field is used to set a maximum loop count for the test plan execution. To loop endless just leave the field blank.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Period&#039;&#039;&#039;&amp;lt;br&amp;gt;Forces cycles to be executed with this periodic time. For example, if you specify 30m, the testplan will be repeated every 30 minutes. If an individual run takes longer than the period, the next loop iteration will be performed immediately - otherwise, the system waits (idle) for the time difference between period and previous execution time. Use this, if the system under test needs some cleanup or &amp;quot;healing&amp;quot; time after each test run - especially when doing stress tests on a system which needs database or memory management cleanup after each run (e.g. systems which need some pause to perform garbage collection to prevent ever growing memory usage). Another&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Save Result after each Run&#039;&#039;&#039;&amp;lt;br&amp;gt;If checked, a report file is written as specified in the filename pattern field after each run - either unconditionally, or for every successful or for every failed run. This is useful if a test only fails/succeeds sporadically, and you need a trace/log for those runs. If you do not specify this option, a single huge report may be generated, which is both hard to examine and which may become larger than the systems memory capacity (in this case, expecco would prune the report and throw away older items, which is usually not the user&#039;s intention).&amp;lt;br&amp;gt;The filename pattern specifies the names of those individual report files, and should contain meta patterns such as:&amp;lt;br&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;li&amp;gt;&amp;quot;%1&amp;quot; for the current run-number (1..)&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;li&amp;gt;&amp;quot;%2&amp;quot; for the individual run&#039;s start timestamp (as YYYYMMDDHHMMSS)&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;li&amp;gt;&amp;quot;%3&amp;quot; for the name of the test plan&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;li&amp;gt;&amp;quot;%4&amp;quot; for the name of the test suite.&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;li&amp;gt;&amp;quot;%5&amp;quot; for the individual run&#039;s start timestamp (as YYYYMMDD-HHMMSS)  (V23.2 only)&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;li&amp;gt;&amp;quot;%6&amp;quot; for the individual run&#039;s start timestamp (as YYYY-MM-DD-HHMMSS) (V23.2 only)&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;br&amp;gt;Thus, &amp;quot;&amp;lt;code&amp;gt;%4-%3-%1-%2.elf&amp;lt;/code&amp;gt;&amp;quot; will generate report files named &amp;quot;suite-plan-1-20141004140005.elf&amp;quot;, &amp;quot;suite-plan-2-20141004140007.elf&amp;quot;, etc.&amp;lt;br&amp;gt;You may specify multiple report file patterns in this field (separated by semicolon &amp;quot;;&amp;quot;), to generate reports in different formats. For example, enter &amp;quot;&amp;lt;code&amp;gt;run%1.elf , run%1.pdf&amp;lt;/code&amp;gt;&amp;quot; to generate both a full log (which can be reopened with expecco for detail information) and a summary report as pdf document. For all reports, the default report template of the suite (or the user settings) is used. &amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;lt;br&amp;gt;The individual report files are created either in the project&#039;s attachment folder or, if an absolute pathname is given as pattern, in that folder.&amp;lt;br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;The attachment folder is a temporary folder, which is automatically removed when expecco is closed, or another suite is opened. Thus, you should archive those after execution. If expecco ALM is used as a test execution management system, these files will be uploaded and archived automatically after a run.&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;lt;br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;If expecco is used without expecco ALM, you may want to add a post-execution action, which copies those files to an archive, a database or checks them into a versioning repository. This is also a possible solution, if expecco-tests are to be started via another system, like jenkins or a batch script.&lt;br /&gt;
&lt;br /&gt;
:New in V23.2:&lt;br /&gt;
::You may also provide shell- and environment variable replacements in the filename; $(xxx) will be expanded by either a shell/cmd or a project-variable named &amp;quot;xxx&amp;quot;.&lt;br /&gt;
::Thus, if you &amp;quot;&amp;lt;code&amp;gt;setenv ELF_DIR /tmp/myrun&amp;lt;/code&amp;gt;&amp;quot; and define the report file pattern as &amp;quot;&amp;lt;code&amp;gt;$(ELF_DIR)/run%1.elf&amp;lt;/code&amp;gt;&amp;quot;, your files will be stored as &amp;quot;/tmp/myrun/run1.elf&amp;quot;, &amp;quot;/tmp/myrun/run2.elf&amp;quot;, etc.&lt;br /&gt;
::Or if you set a project variable named &amp;quot;ELF_DIR&amp;quot; (possibly even dynamically during the run), the directory is defined by that variable&#039;s value.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span ID=&amp;quot;SeverityIgnoreLimit&amp;quot;&amp;gt;&#039;&#039;&#039;Severity Ignore Limit&#039;&#039;&#039;&amp;lt;/span&amp;gt; (new in 21.2)&amp;lt;br&amp;gt;By default, a test plan stops executing further test cases if a &amp;quot;Mandatory (also called &amp;quot;Required&amp;quot;) test case fails, and only continues after a fail with the next test case if the failed test case was marked as &amp;quot;Optional&amp;quot;.&lt;br /&gt;
:Test cases should be marked as &amp;quot;Mandatory&amp;quot;, if it really does not make any sense to continue with a test; for example, if the device under test has no power, if a login procedure failed or if a measurement device is offline.&lt;br /&gt;
:However, it is sometimes useful to have a more fine-grain control over the severity of a failure.&lt;br /&gt;
:For this, you can pass a severity level with a FAIL (either by calling &amp;lt;code&amp;gt;fail_severity()&amp;lt;/code&amp;gt; in elementary code, or via the &amp;quot;&amp;lt;code&amp;gt;FAIL-with-SEVERITY&amp;lt;/code&amp;gt;&amp;quot; action from the standard library).&lt;br /&gt;
:In the tesplan, you can now specify which severity level is considered severe enough to stop the test plan. In other words, of a FAIL-severity is less than the limit specified in that field, then test plan will continue executing mandatory test cases.&lt;br /&gt;
:Severities are numbers from 0 to 100. For backward compatibility, a regular FAIL (i.e. without an explicit severity) are handled like a max-severe failure with a pritority of 100.&lt;br /&gt;
:These cannot be ignored by the severity limit field.&lt;br /&gt;
:Thus old suites which where developed before the 21.2 version will keep their behavior of stopping when a mandatory test case fails, whereas new test actions can use the new &amp;quot;&amp;lt;code&amp;gt;FAIL-with-SEVERITY&amp;lt;/code&amp;gt; action to pass aseverity level, which is then compared against the limit set for the run.&lt;br /&gt;
:Notice that this is a per-run setting. The severity limit will not be stored with the suite and it will not be made persistent in the user&#039;s settings. This limit is meant to be used when tests are manually started by an operator or during test development, but not for productions systems. Therefore, in a production run, all FAILS within a mandatory test case will stop the run.&lt;br /&gt;
:For now, the elementary &amp;quot;&amp;lt;code&amp;gt;fail_severity()&amp;lt;/code&amp;gt;&amp;quot; API is only available in expecco elementary actions (i.e. script actions and bridged actions cannot as-yet call this. These may be provided in future releases, if there are sufficient requests from customers (for now, you can pass a fail severity from a bridged elementary action via an output pin back to expecco, and raise the FAIL there, using the action from the std-lib).&lt;br /&gt;
&lt;br /&gt;
=== Manual Execution Settings ===&lt;br /&gt;
*&#039;&#039;&#039;Stop between individual Tests&#039;&#039;&#039;&amp;lt;br&amp;gt;This check box allows you to stop the execution between each testcase. A confirmation dialog will pop up, asking for a confirmation-click to continue. Useful if any manual handling is needed after each test-case.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Stop between loop cycles&#039;&#039;&#039;&amp;lt;br&amp;gt;Similar to the above. If checked and one of the loop modes is selected, a confirmation dialog pops up after every loop cycle, asking for a confirmation-click to continue.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Stop on Error&#039;&#039;&#039;&amp;lt;br&amp;gt;This check-box determines whether the execution of the test plan is stopped when an error occurs. There are two such check boxes, to specify if it should apply only to test-cases marked as &amp;quot;required&amp;quot; or also to &amp;quot;optional&amp;quot; test cases.&lt;br /&gt;
&lt;br /&gt;
=== expecco ALM Settings ===&lt;br /&gt;
These settings are only relevant if expecco is used as a &amp;quot;slave test execution engine&amp;quot; for AIDYMO (formerly called &amp;quot;&#039;&#039;expecco ALM&#039;&#039;&amp;quot;). They are ignored if expecco is running as a stand alone application (e.g. by the test developer) or started manually by a test engineer (see [[Command_Line_Options|&amp;quot;Command Line Options&amp;quot;]]).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Visible in AIDYMO&#039;&#039;&#039;&amp;lt;br&amp;gt;This checkbox determines whether the test plan is visible in [[Expecco_ALM_Overview/en|expecco ALM/AIDYMO]]. Such externally visible test plans can later be executed automatically by AIDYMO. Invisible test plans are useful for the test developer, to leave partial tests, setup, shutdown or cleanup sequences in the test suite, which are not meant for public use (or use by the automatic test scheduler).&lt;br /&gt;
*&#039;&#039;&#039;Operator Needed&#039;&#039;&#039;&amp;lt;br&amp;gt;This checkbox determines whether an operator is required during execution of the test. AIDYMO will then ask a human operator to supervise/perform the test.&lt;br /&gt;
*&#039;&#039;&#039;Cases Visible in AIDYMO&#039;&#039;&#039;&amp;lt;br&amp;gt;This checkbox determines whether test cases are individually selectable for execution in AIDYMO. If unchecked, only the whole test plan can be configured for an automatic run. You should only turn this check on, if the test cases are independent from each other, and do not need state from a previous test case or leave the system under test in a state needed by another test case. Otherwise, it is better to define multiple test plans, each with its individual setup/shutdown actions to leave the system under test in a defined state, and let the test manager choose among those plans, instead of individual test cases.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--* &#039;&#039;&#039;MON&#039;&#039;&#039;&amp;lt;br&amp;gt;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuring Testcases ==&lt;br /&gt;
&lt;br /&gt;
=== Testcase Description Field ===&lt;br /&gt;
Specifies the test case&#039;s descriptive name which is shown in reports, traces and log files.&lt;br /&gt;
If this field is left blank, the name of the action block which implements the test case is shown.&lt;br /&gt;
This field does not affect the execution - it only controls the names used in reports and logs.&lt;br /&gt;
&lt;br /&gt;
=== Action ===&lt;br /&gt;
The action block, which implements the test case. This can be any compound or elementary action block from the left tree. The block must be one without input pins - if required, wrap it into a new compound block and provide input values from any source, such as constant freeze values, database values, CSV values from a file or environment variable values. You can either set the action by dragging a block from the left tree into this field, or by opening a selection dialog via the &amp;quot;...&amp;quot; button at the field&#039;s right.&lt;br /&gt;
&lt;br /&gt;
=== Condition Variables ===&lt;br /&gt;
Condition variables provide an easy to use control mechanism over which testcase items are executed during a run. By specifying a list of boolean condition variables in this field, the testcase item will only be executed if all of those variables contain a &amp;quot;&amp;lt;CODE&amp;gt;true&amp;lt;/CODE&amp;gt;&amp;quot; value (non-existing variables are treated like being &amp;quot;&amp;lt;CODE&amp;gt;true&amp;lt;/CODE&amp;gt;&amp;quot;). After the execution, the success-state is written to the variables named in the &amp;quot;&#039;&#039;Set Variables&#039;&#039;&amp;quot; field.&lt;br /&gt;
These variables are managed in the testplan&#039;s environment. Therefore, you can also access these variables via regular environment blocks or via the low level code API (environmentAt: / environmentAt:put: calls). Condition variables can be used to disable individual test cases or to guide execution through different paths depending on previous actions. A typical application is to read out the system under tests configuration by a pre-action or first test case step, then setting condition variables, and execute only specific subsets of the suite, depending on the outcome.&lt;br /&gt;
&lt;br /&gt;
More complex conditional execution is possible by wrapping individual test case actions into a compound block and placing condition test actions into that.&lt;br /&gt;
&lt;br /&gt;
=== Adding Pre and Post Execution ===&lt;br /&gt;
Individual testcase items can have pre- and post-execution actions too. The pre-execution action (if specified) is executed each time the item is executed; the post execution action is executed after the item&#039;s execution has finished. This can be useful e.g. to allocate and/or release resources, to check for more complex preconditions, system state or for the test system&#039;s configuration, and to leave that information in environment variables to be accessed by later test steps, or be used as condition variables. To add a pre- or post-execution action, simply drag and drop a block from the navigation tree into the according slot. Please note that these block may not have input pins.&lt;br /&gt;
&lt;br /&gt;
The pre-execution action is also a &#039;&#039;pre condition&#039;&#039;.&lt;br /&gt;
If it ends non-successful, the corresponding test case and any post execute action are skipped.&lt;br /&gt;
&lt;br /&gt;
=== Background Action ===&lt;br /&gt;
Sometimes, a background server process, monitor or data feeder activity is required to run in parallel to the actual test scenario.&lt;br /&gt;
This field allows for an action to be defined, which is started in parallel with (actually: right before) the test plan and terminated afterwards. Any compound or elementary block can be specified. Typically, this will be a block which opens a server socket, pipe or other communication channel to feed the system under test, or to start an external program for monitoring, capturing or generating data.&lt;br /&gt;
Please note that this block may not have input pins.&lt;br /&gt;
&amp;lt;br&amp;gt;If you need a background action to run during individual actions, place them as a step into the action&#039;s diagram.&lt;br /&gt;
&lt;br /&gt;
=== Log Processor Action ===&lt;br /&gt;
Test executions generate an execution log/trace, which is later used to generate a more or less detailed report. For most customers, the report settings allow for the most common type of reports to be generated (by specifying the amount of data and detail of the report there).&lt;br /&gt;
&lt;br /&gt;
However, for very special reports, or if specific data has to be extracted and postprocessed, it may be useful to process the generated raw activity data before it is used or instead of being used as input to the report generator.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;&#039;&#039;Log Processor&#039;&#039;&amp;quot; field allows for an action block to be specified, which gets the raw log as input and may produce a cooked-up version of it as output. If the log processor has no output, the original activity log will be passed on to the report generator.&lt;br /&gt;
&lt;br /&gt;
Arbitrary processing, filtering, renaming or archival of the raw data is possible in this action. Of course, some knowledge about the structure of that raw data is required, and you should consult the class browser and/or open a data inspector on a generated raw log for this. You will find an example in the &amp;quot;d11_LOG_Processing_Example.ets&amp;quot; suite (in &amp;quot;projects/examples&amp;quot;). Also, the reflection library now contains activityLog processing actions in the &amp;quot;Analysis&amp;quot; folder, and a sample testplan.&lt;br /&gt;
&lt;br /&gt;
The log processor can also be used to extract particular information and save it into a separate database or file in any format. In this case, the log processor should not modify the given activity log, and either not having an output pin, or send it unchanged to its output.&lt;br /&gt;
&lt;br /&gt;
Notice that there are both per-testcase log processors and a an overall (per testplan) log processor.&lt;br /&gt;
The latter gets a collection (i.e. Array) of individual activity logs as input, which it should process in an enumeration loop. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Adding an Inventory ===&lt;br /&gt;
If the test case, or a nested requires skills, an inventory has to be specified here, otherwise the test will not be able to perform. You can also specify inventories for certain test cases. To add an inventory simply drag and drop it from the navigation tree into the according slot.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testgroup and Risk Setting ===&lt;br /&gt;
For the selective execution of a test plan it can be useful to set a risk level for certain test cases or to collect related test cases in test groups. The risk level can go from &amp;quot;&amp;lt;CODE&amp;gt;very low&amp;lt;/CODE&amp;gt;&amp;quot; to &amp;quot;&amp;lt;CODE&amp;gt;very high&amp;lt;/CODE&amp;gt;&amp;quot; or can be set to &amp;quot;&amp;lt;CODE&amp;gt;unknown&amp;lt;/CODE&amp;gt;&amp;quot;. To add a block to an test group, just enter identifiers for the groups into the according field. Multiple identifiers must be separated by spaces. See [[Testplan_Editor-TestplanListView_Editor/en#Selective Execution|&amp;quot;Selective Execution&amp;quot;]] for more information.&lt;br /&gt;
&lt;br /&gt;
=== Execution Settings ===&lt;br /&gt;
The check box in front of each test case determines whether it is executed or not (in the upper list). Please note that this setting is temporary and will not be saved. To set the default execution toggle setting, use the &amp;quot;&#039;&#039;Default for Execute&#039;&#039;&amp;quot; check box in the lower attribute area.&lt;br /&gt;
&lt;br /&gt;
=== Action Parameters ===&lt;br /&gt;
Actions which have input pins need additional values when executed. If such an action is placed into a test plan, an additional tab is provided in the lower attribute area where values for those pins are to be entered.&lt;br /&gt;
&lt;br /&gt;
Notice that only a limited set of data types are allowed for these. If more complex values are needed, you must place the action as a step into another compound &#039;&#039;Test Case Action&#039;&#039;, feed the step&#039;s input pins as required and place this &#039;&#039;wrapper&#039;&#039; action into the test plan. There of course, any arbitrary complex data may be generated or acquired from a file, attachment or database.&lt;br /&gt;
&lt;br /&gt;
= Context Menu of the Testcase List =&lt;br /&gt;
Some of the context menu (right-click) functions of the test-case/activity-log list operate on the selected item or set of items.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Context Menu Testplan.png|thumb|373px|Context Menu]]&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Add Testcase&#039;&#039;&#039;&amp;lt;br&amp;gt;Adds a new (blank) test-case to the test-plan. You should drag and drop a test action into the &amp;quot;block&amp;quot; field in the lower pane.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Delete Testcase&#039;&#039;&#039;&amp;lt;br&amp;gt;Removes the selected test-case from the test-plan.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Enable selected Testcases&#039;&#039;&#039;&amp;lt;br&amp;gt;Enables (activates) the selected test-cases for execution.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Disable selected Testcases&#039;&#039;&#039;&amp;lt;br&amp;gt;Disables the selected test-cases for execution.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Make all Enable Flags the Default for Execution&#039;&#039;&#039;&amp;lt;br&amp;gt;Sets the state of the selection as the default for the test case. This will be the initial enable/disable-state of those test-cases, when the suite is loaded.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Make selected Testcase Required&#039;&#039;&#039;&amp;lt;br&amp;gt;Sets the priority of the selected test-cases to &amp;quot;Required&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Make selected Testcases Optional&#039;&#039;&#039;&amp;lt;br&amp;gt;Sets the priority of the selected test-cases to &amp;quot;Optional&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Open Page on selected Item&#039;&#039;&#039;&amp;lt;br&amp;gt;Opens a new browser page on the selected test-case&#039;s action. This function is only available if exactly one test-case is selected.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Update&#039;&#039;&#039;&amp;lt;br&amp;gt;Update all activity logs and sublogs under the selected item.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Find Next Error&#039;&#039;&#039;&amp;lt;br&amp;gt;Find and select the next failed or erroneous test-case in the activity log.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Find Previous Error&#039;&#039;&#039;&amp;lt;br&amp;gt;Find and select the previous failed or erroneous test-case in the activity log.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Remove Result for selected Items&#039;&#039;&#039;&amp;lt;br&amp;gt;Removes the test results of the selected test-case.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Compress Result for selected Items&#039;&#039;&#039;&amp;lt;br&amp;gt;Compresses the log result for the selected items. Compression means that only erroneous log entries are kept; all passed and OK infos are removed.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Generate Report from here...&#039;&#039;&#039;&amp;lt;br&amp;gt;Generates a [[Report Generation/en|report]] for the selected test-case (and, if this is a sub-testplan, for all nested test-cases).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Move Up/Down&#039;&#039;&#039;&amp;lt;br&amp;gt;To change the execution order of the test-cases.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The full online documentation can be found under: [[Online Documentation/en|Online Documentation]]&lt;br /&gt;
&lt;br /&gt;
= Plugin Extension Tabs =&lt;br /&gt;
&lt;br /&gt;
Plugins may add additional pages to this editor. Please refer to the individual plugin documentation.&lt;br /&gt;
For example, the Jira plugin adds a tab to specify the issue action to be taken in case of a failed test case execution.&lt;br /&gt;
&lt;br /&gt;
[[Category:Editors]]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Java_Browser/en&amp;diff=29202</id>
		<title>Java Browser/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Java_Browser/en&amp;diff=29202"/>
		<updated>2024-02-21T16:39:53Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Using Java Browser */ new location in the menu&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Java Browser&#039;&#039;&#039; provides a simple interface to browse Java code. This is useful for test developers who write tests which use [[ElementaryBlock_Element/en#Groovy_Blocks|Groovy blocks]] to connect to the system under test. &lt;br /&gt;
&lt;br /&gt;
== Using Java Browser ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Select_Workspace_01.png|200px|thumb|right|Workspace selection dialog]]&lt;br /&gt;
[[Datei:JBrowser 01.png|200px|thumb|right|Java browser window]]&lt;br /&gt;
To open the Java Browser, select &amp;quot;&#039;&#039;Plugins&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Productivity&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Java Browser&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Open...&#039;&#039;&amp;quot; and then select a [[#Workspace|workspace]]. To create a new workspace, enter a new, empty directory. &lt;br /&gt;
&lt;br /&gt;
After the workspace is chosen, a single Java Browser window appears. It shows Java packages, classes and methods as well &lt;br /&gt;
as source code if it&#039;s available. If the source code is not available then it still shows the class structure without actual methods&#039; source code.&lt;br /&gt;
&lt;br /&gt;
== Workspace ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Java Browser&#039;&#039;&#039; stores all Java code and sources in a folder called a &#039;&#039;workspace&#039;&#039;. You can freely move workspaces around or store them on a shared network drive. &lt;br /&gt;
&lt;br /&gt;
To create a workspace, select an empty directory. To add Java code to the workspace, open the workspace settings (in Java Browser window, select &#039;&#039;Workspace&#039;&#039; ► &#039;&#039;Settings&#039;&#039;). In the settings dialog you may add &amp;quot;.jar&amp;quot; files or directories containing &amp;quot;.class&amp;quot; files and attach sources to then. Of course, you may use the workspace settings dialog any time later to add or remove &amp;quot;.jar&amp;quot; or &amp;quot;.class&amp;quot; file directories.&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Java_GUI_Plugins/en&amp;diff=29119</id>
		<title>Java GUI Plugins/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Java_GUI_Plugins/en&amp;diff=29119"/>
		<updated>2024-01-29T13:33:51Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Connection to Remote Systems */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Java_GUI_Plugins|Deutsche Version]] | &#039;&#039;&#039;English Version&#039;&#039;&#039;&lt;br /&gt;
== Supported Java Technologies ==&lt;br /&gt;
expecco supports the automation of Java applications implemented with Java Swing, Java SWT or JavaFX. Also supported are applications that combine several of these technologies, e.g. a Swing application with embedded JavaFX content.&lt;br /&gt;
&lt;br /&gt;
=== Java Swing ===&lt;br /&gt;
&lt;br /&gt;
This plugin for expecco allows you to create automated tests for Java applications whose user interfaces were created with Swing. The block library contains blocks for controlling and checking Swing user interfaces. This plugin is also integrated into the expecco GUI Test Extension. This extension supports the development of test sequences. &lt;br /&gt;
&lt;br /&gt;
==== Main Features ====&lt;br /&gt;
&lt;br /&gt;
* Automated operation and verification of Swing user interfaces&lt;br /&gt;
* Simultaneous operation of several applications&lt;br /&gt;
* Control of Swing user interfaces on remote target systems&lt;br /&gt;
* Control of Java applications already running independently (no change to source code necessary, no recompilation of the application necessary)&lt;br /&gt;
* Addressing of control elements by XPath&lt;br /&gt;
* Access at object level possible via Java Bridge Interface Library&lt;br /&gt;
* Integration into the [[Expecco GUI Tests_Extension Reference/en|expecco GUI Tests Extension]]&lt;br /&gt;
* Block library with actions and checks for Swing components&lt;br /&gt;
&lt;br /&gt;
=== Java SWT ===&lt;br /&gt;
Similar for applications created with the SWT GUI framework.&lt;br /&gt;
&lt;br /&gt;
=== JavaFX ===&lt;br /&gt;
Since Java 11, JavaFX is no longer included in the JDK. Therefore you have to install an additional JavaFX SDK, e.g. from [https://openjfx.io/ OpenJFX]. Then copy the jar files from the lib directory of the JavaFX JDK to &amp;lt;code&amp;gt;packages\exept\expecco\plugin\javafx\lib&amp;lt;/code&amp;gt; in the expecco installation directory.&lt;br /&gt;
&lt;br /&gt;
== Functionality ==&lt;br /&gt;
&lt;br /&gt;
The interface establishes a connection to the Java VM and provides functions for reading widget attributes, recording user input, and remotely controlling the application. In addition, a library provides additional building blocks for automating tests.&lt;br /&gt;
Essentially, the Java Swing plugin consists of two parts, the plugin&lt;br /&gt;
for expecco and the application control (agent). To control the Swing application, an agent is loaded into the Java Virtual Machine of the running Java application. A Java Development Kit 1.8 (JDK) or higher is required to load the agent. However, the application to be tested can be run in a normal Java Runtime Edition 1.8 (JRE).&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
On the computer where the application to be tested is to run (local or remote):&lt;br /&gt;
&lt;br /&gt;
* [http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html Java Development Kit 1.8] or higher (to load the agent)&lt;br /&gt;
* [http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html Java Runtime Edition 1.8] or higher (to run the application to be tested)&lt;br /&gt;
&lt;br /&gt;
The expecco requirements apply on the expecco computer.&lt;br /&gt;
&lt;br /&gt;
Please note that both the agent and the application to be tested must be started with either 32 or 64 bit Java, otherwise no connection is possible.&lt;br /&gt;
&lt;br /&gt;
Caused by JDK changes between Java versions, potential version conflicts may occur.&lt;br /&gt;
&lt;br /&gt;
The compatibility of the versions is as follows. [[Java GUI Plugins#Fehlerbehandlung|Further information on this.]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:JavaSwing Bridge Compatibility.png|border|200px|]]&lt;br /&gt;
&lt;br /&gt;
===Access Permissions===&lt;br /&gt;
&lt;br /&gt;
To be able to guarantee a connection on the target system, additional parameters must be specified when starting the application to be tested (as well as the Java agent).&lt;br /&gt;
&lt;br /&gt;
There are two ways to do this&lt;br /&gt;
&lt;br /&gt;
* Set an environment variable that is automatically loaded at the start of each Java application&lt;br /&gt;
* Manual transfer of parameters at each start of a Java application&lt;br /&gt;
* (Alternatively you can change access rights in the module-info.java files directly, but this is anything but practical)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Up to Java 11&#039;&#039;&#039; it should be sufficient to set the following parameters:&lt;br /&gt;
: &amp;lt;code&amp;gt;-Djdk.attach.allowAttachSelf=true&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;--illegal-access=permit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setting an environment variable works as follows (&#039;&#039;Example JDK_JAVA_OPTIONS which is loaded at every JVM start&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;for Windows Systems&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;setx JDK_JAVA_OPTIONS &amp;quot;-Djdk.attach.allowAttachSelf=true; --illegal-access=permit&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* or via the GUI (Windows key + Pause).&lt;br /&gt;
&lt;br /&gt;
[[File:Windows Setenvironment.png|border|600px|]]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;for Unix systems&#039;&#039;&#039;&lt;br /&gt;
* Bash: &amp;lt;code&amp;gt;export _JAVA_OPTIONS=&#039;-Djdk.attach.allowAttachSelf=true; --illegal-access=permit&#039;&amp;lt;/code&amp;gt; &lt;br /&gt;
* C Shell: &amp;lt;code&amp;gt;setenv _JAVA_OPTIONS &#039;-Djdk.attach.allowAttachSelf=true; --illegal-access=permit&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Since Java 11&#039;&#039;&#039; there is a stricter separation for the encapsulation of modules:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--illegal-access=permit&amp;lt;/code&amp;gt; will no longer work if the target application has a fixed module encapsulation ([https://stackoverflow.com/questions/46741907/what-is-an-automatic-module Details]).&lt;br /&gt;
In this case, additional parameters must be specified at program start which allow expecco access to the inherent resources.&lt;br /&gt;
Depending on the technology used, the required parameters can vary, which is why you have to find them out for yourself.&lt;br /&gt;
&amp;lt;code&amp;gt;jdeps list-deps JARNAME.jar&amp;lt;/code&amp;gt; Jdeps is a freely available (part of the jdk) very useful tool for this purpose.&lt;br /&gt;
A short overview of the commands can be found [https://doc.expecco.de/w2.x/images/0/03/Java_module_cheat_sheet.pdf here] [https://zeroturnaround.com/rebellabs ©]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example JavaFX&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
The environment variable &amp;lt;code&amp;gt;PATH_TO_FX&amp;lt;/code&amp;gt; which points to the JavaFX directory must be set (functionality see above)&lt;br /&gt;
and the following parameters must be available when starting the Java application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
Parameter list (fold out)&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;--modul-path &amp;quot;%PATH_TO_FX%&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-modules=javafx.controls &amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-modules=javafx.swing &amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-modules=javafx.web &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-opens javafx.graphics/com.sun.javafx.sg.prism=ALL-UNNAMED &amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-opens javafx.graphics/javafx.stage=ALL-UNNAMED &amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-opens javafx.graphics/javafx.scene=ALL-UNNAMED &amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-opens javafx.graphicss/com.sun.javafx.stage=ALL-UNNAMED &amp;lt;/code&amp;gt; &lt;br /&gt;
* &amp;lt;code&amp;gt;--add-opens javafx.graphics/javafx.scene.layout=ALL-UNNAMED &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-opens javafx.controls/javafx.scene.control=ALL-UNNAMED &amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-opens javafx.controls/javafx.scene.control.skin=ALL-UNNAMED &amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-opens javafx.controls/javafx.scene.chart=ALL-UNNAMED &amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-exports javafx.controls/com.sun.javafx.charts=ALL-UNNAMED &amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-opens javafx.controls/com.sun.javafx.charts=ALL-UNNAMED &amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-exports javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED &amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-opens javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-opens javafx.graphics/javafx.scene.image=ALL-UNNAMED &amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-opens javafx.graphics/javafx.scene.shape=ALL-UNNAMED &amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-opens javafx.graphics/javafx.scene.text=ALL-UNNAMED &amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-opens javafx.graphics/javafx.application=ALL-UNNAMED &amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-opens javafx.graphicss/javafx.geometry=ALL-UNNAMED &amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-opens javafx.graphics/javafx.scene.robot=ALL-UNNAMED &amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-exports javafx.graphicss/com.sun.glass.ui=ALL-UNNAMED &amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-opens javafx.graphics/com.sun.glass.ui=ALL-UNNAMED &amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-opens javafx.graphics/com.sun.glass.ui.win=ALL-UNNAMED &amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-opens javafx.graphics/javafx.scene.input=ALL-UNNAMED &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-opens javafx.base/javafx.event=ALL-UNNAMED &amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-exports javafx.base/com.sun.javafx.runtime=ALL-UNNAMED &amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-opens javafx.base/com.sun.javafx.runtime=ALL-UNNAMED &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-exports javafx.graphicss/com.sun.javafx.scene=ALL-UNNAMED &amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-exports javafx.graphicss/com.sun.javafx.util=ALL-UNNAMED &amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-exports javafx.graphicss/com.sun.javafx.scene.input=ALL-UNNAMED &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-exports javafx.web/com.sun.webkit.dom=ALL-UNNAMED&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--add-opens java.base/java.util=ALL-UNNAMED&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you do not want to supply 10+ command line parameters, you can use instead [[File:Java_fx_command_options.txt]]. Then you start your application with the java command:&lt;br /&gt;
    java @java_fx_command_options.txt ....&lt;br /&gt;
&lt;br /&gt;
If you still get a &amp;lt;code&amp;gt;java.lang.IllegalAccessError&amp;lt;/code&amp;gt;, you have to extend this parameter in the following way:&lt;br /&gt;
* Error text of the type &amp;lt;code&amp;gt;Module &amp;lt;module&amp;gt; does not open &amp;quot;&amp;lt;package&amp;gt;&amp;quot; for unnamed modules&amp;lt;/code&amp;gt;:&lt;br /&gt;
: &amp;lt;code&amp;gt;--add-opens &amp;lt;modules&amp;gt;/&amp;lt;package&amp;gt;=ALL-UNNAMED &amp;lt;/code&amp;gt;&amp;gt;&lt;br /&gt;
: Example:&#039;&#039; &amp;lt;code&amp;gt;Module java.base does not open java.lang for unnamed module&amp;lt;/code&amp;gt; &#039;&#039;solve with:&#039;&#039; &amp;lt;code&amp;gt;--add-opens java.base/java.lang=ALL-UNNAMED&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Error text of the type &amp;lt;code&amp;gt;cannot access the class &amp;lt;package&amp;gt;.&amp;lt;class name&amp;gt; (in module &amp;lt;module&amp;gt;), because the module &amp;lt;module&amp;gt; &amp;lt;package&amp;gt; does not export to the unnamed module&amp;lt;/code&amp;gt;:&lt;br /&gt;
: &amp;lt;code&amp;gt;---add-exports &amp;lt;modules&amp;gt;/&amp;lt;package&amp;gt;=ALL-UNNAMED &amp;lt;/code&amp;gt;&amp;gt;&lt;br /&gt;
: Example:&#039;&#039; &amp;lt;code&amp;gt;cannot access the class com.sun.javafx.scene.input.ExtendedInputMethodRequests (in the module javafx.graphics) because the module javafx.graphics com.sun.javafx.scene.input not exported into an unnamed module &amp;lt;/code&amp;gt; &#039;&#039;solve with:&#039;&#039; &amp;lt;code&amp;gt;--add-exports javafx.graphicss/com.sun.javafx.scene.input=ALL-UNNAMED&amp;lt;/code&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tool Generate CmdLine File for arbitrarily modules (Java 11 et sqq.)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
See [[JavaBridgeOpenModule/en|Generate CmdLine File for Java 11 et sqq.]]&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Installation on the expecco Computer ===&lt;br /&gt;
&lt;br /&gt;
When installing expecco, make sure that the Java plugin is selected as the component to be installed.&lt;br /&gt;
&lt;br /&gt;
If the application to be tested for the development of test sequences is executed on the same computer, start expecco and under &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Plugins&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Java Bridge&#039;&#039;&amp;quot; &lt;br /&gt;
set the local path to a Java Development Kit 1.8 or higher.&lt;br /&gt;
&lt;br /&gt;
The mandatory setting here is &amp;lt;code&amp;gt;JDK Installation Path&amp;lt;/code&amp;gt; which is used for the main connection. &amp;lt;code&amp;gt;Java Installation Path&amp;lt;/code&amp;gt; is an alternative setting for Groovy which only requires a JRE. For local connections, the Java Agent is automatically started with these settings. &lt;br /&gt;
&lt;br /&gt;
[[Datei:JDKPfadEinstellungen.png|border|600px|]]&lt;br /&gt;
&lt;br /&gt;
=== Installation on Test Application Computer ===&lt;br /&gt;
&lt;br /&gt;
You have to copy the javaBin folder of the expecco bridge framework to the test computer. It is in the expecco installation directory at:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;...\exept\bridgeFramework\javaBridge\javaBin&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== expecco GUI Browser ==&lt;br /&gt;
&lt;br /&gt;
The expecco GUI-Browser is an additional tool which offers the possibility to analyze running applications and to develop test sequences. Then you can use the information, such as names and properties of individual elements, to perform actions with the function library or to interact with individual elements.&lt;br /&gt;
&lt;br /&gt;
=== Connecting ===&lt;br /&gt;
&lt;br /&gt;
The following is a short series of pictures that can be used as a &#039;&#039;&#039;guide&#039;&#039;&#039; when setting up a connection&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:JavaSwing GUI Browser.png|border|600px|]]]&lt;br /&gt;
&lt;br /&gt;
First open the &amp;lt;code&amp;gt;GUI Browser&amp;lt;/code&amp;gt; (black circle) and in the tab &amp;lt;code&amp;gt;Connect&amp;lt;/code&amp;gt; select the option &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; (red circle).&lt;br /&gt;
In the opening dialog you can now choose between 3 options.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Start Application on the Local Machine&#039;&#039;&#039;&lt;br /&gt;
: provides a convenient way to start a local Java application via command line command&lt;br /&gt;
* &#039;&#039;&#039;Connect to an already running Application on the Local machine&#039;&#039;&#039;&lt;br /&gt;
: Allows connection to locally running Java applications. The Java Agent is automatically started with the Java version you specified in the expecco settings.&lt;br /&gt;
* &#039;&#039;&#039;Connect to an already running Application on a Remote Machine&#039;&#039;&#039;&lt;br /&gt;
: Allows you to connect to an already started Java Agent on another machine. This will then connect to the Java application running there.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:JavaSwing Connection Window.png|border|600px|]]]&lt;br /&gt;
&lt;br /&gt;
A search for Java applications lists all running Java virtual machines on the target system (in the example: localhost). A selection of the individual entries lists further information about the respective application.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:JavaSwing Connection Connected.png|border|600px|]]]&lt;br /&gt;
&lt;br /&gt;
If a connection has been successfully established, it will automatically be entered in the Expecco configuration list. There you can also see the GUI structure of the application as a hierarchical tree. Information on how to proceed can be found here: [[Expecco_GUI_Tests_Extension_Reference| GUI Test Reference]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:JavaSwing Connection Reconnect.png|border|600px|]]]&lt;br /&gt;
&lt;br /&gt;
Closed connections stay in the GUI browser. If the application is still running, you can reestablish the connection. To do this, right-click on the entry and select &#039;&#039;Connect&#039;&#039; from the context menu.&lt;br /&gt;
If the connection settings have changed, you must reconfigure the connection. This can happen if you have restarted the application in the meantime. When using a remote system, this also applies to the agent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Connection to Remote Systems ===&lt;br /&gt;
[[File:JavaSwing Connection RemoteSetup.png|border|600px|]]]&lt;br /&gt;
&lt;br /&gt;
To establish a connection remotely, the Java Agent must first be started on the target computer. To do this, navigate to the directory &amp;lt;code&amp;gt;...\exept\bridgeFramework\javaBridge\javaBin&amp;lt;/code&amp;gt; on the computer.&lt;br /&gt;
There is a script which automatically detects the Java version in JAVA_HOME and starts the correct agent.&lt;br /&gt;
* Windows users start &amp;lt;code&amp;gt;startAgentLoader.bat&amp;lt;/code&amp;gt;&lt;br /&gt;
* UNIX users start &amp;lt;code&amp;gt;startAgentLoader.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
These scripts can be provided with parameters via the command line as shown in the picture.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ip &amp;lt;HostnameOderIP&amp;gt;&amp;lt;/code&amp;gt; gives the agent a special IP to wait for a connection. Useful for specific network masks.&lt;br /&gt;
: Default host is 0.0.0.0.&lt;br /&gt;
* &amp;lt;code&amp;gt;-port &amp;gt;PortNumber&amp;lt;/code&amp;gt; gives the agent a specific port to wait for connections from Expecco.&lt;br /&gt;
: Default port is 56784.&lt;br /&gt;
&lt;br /&gt;
=== Warnings ===&lt;br /&gt;
[[Datei:JavaSwing Connection Warnings.png|border|600px|]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
If any problems occur with the applications in this list, as can be seen in the picture above,&lt;br /&gt;
the connection dialog automatically returns a suggested solution.&amp;lt;br&amp;gt; If the error that occurs would make a connection impossible, the corresponding entry is automatically marked as invalid.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The following error messages may occur and can be easily corrected:&lt;br /&gt;
::{|&lt;br /&gt;
|JAVA VERSION MISMATCH&lt;br /&gt;
|As you can see in the picture, there may be Java version conflicts between the agent and the application.&amp;lt;br&amp;gt; In this case it is easiest to adjust the Expecco settings for Java Bridge.&amp;lt;br&amp;gt; A remote connection would have to start the program manually with the desired Java version instead.&amp;lt;br&amp;gt; The Java Agent, if called via the &amp;lt;code&amp;gt;startAgentLoader&amp;lt;/code&amp;gt; script, selects the version Based on &amp;lt;code&amp;gt;JAVA_HOME&amp;lt;/code&amp;gt; on the remote system&lt;br /&gt;
|-&lt;br /&gt;
|32 BIT - 64 BIT CONFLICT&lt;br /&gt;
|The 32 and 64 bit versions of Java are not compatible with each other. &amp;lt;br&amp;gt;Both the agent and the application must be started with the same &amp;quot;bit version&amp;quot; of Java.&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|UNABLE TO DETERMINE VERSION&lt;br /&gt;
|The agent cannot determine which Java version the application is using. &amp;lt;br&amp;gt;A connection may be possible, but there may be a potential version conflict.&lt;br /&gt;
|}&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
== Cross-Technology Connections ==&lt;br /&gt;
If an application uses multiple Java technologies, you only need to establish one connection and then use the blocks from the library according to the technology of the element to be addressed. Since expecco 21.1 you can alternatively use blocks from the CommonJavaGUILibrary. Read more about the different libraries in the next section.&lt;br /&gt;
&lt;br /&gt;
=== Embedded JavaFX in Java Swing ===&lt;br /&gt;
If JavaFX is embedded in a Swing application, it contains a JFXPanel element. In the GUI browser, the JavaFX elements are displayed below this panel. For the FX blocks to find these embedded FX elements, the block &#039;&#039;Set FX Context To Panel&#039;&#039; from the Swing Library with the path to the JFXPanel must be executed at the beginning.&lt;br /&gt;
&lt;br /&gt;
=== WebView in JavaFX ===&lt;br /&gt;
If a WebView is included in JavaFX, its elements are displayed in the GUI browser below the WebView element. For these elements there are separate blocks in the JavaFX library, which are combined in the folder &#039;&#039;Embedded WebView&#039;&#039;. In order for the elements to be found in the test, the block &#039;&#039;Set WebView Context&#039;&#039; must first be executed on the element WebView.&lt;br /&gt;
&lt;br /&gt;
=== Embedded Java Swing in JavaFX ===&lt;br /&gt;
If Java Swing is embedded in a JavaFX application, it contains a SwingNode element. In the GUI browser, its content is still displayed parallel to the FX content. The modules of the Swing library can be used directly with these elements.&lt;br /&gt;
&lt;br /&gt;
=== Compound Paths ===&lt;br /&gt;
Since expecco 21.1 the CommonJavaGUITestLibrary contains blocks, which generally work with each of the three supported Java technologies as well as Embedded WebView in FX. Just as some blocks only work with special types of elements, there are blocks, which so far do not support all technologies. But the whole functionality provided by the specific Java libraries is also available here.&lt;br /&gt;
&lt;br /&gt;
For cross-technology connections, these blocks use compound paths, i.e. an embedded element is addressed by a path which combines the path to its embedder with the subpath of the element. For example let&#039;s take a look at a Swing application embedding FX elements using a JFXPanel. The path to an FX button then may look like this&lt;br /&gt;
 /frame/rootpane/layeredpane/panel/JFXPanel/Scene/Node/Button&lt;br /&gt;
where &#039;&#039;/frames/rootpane/layeredpane/panel/JFXPanel&#039;&#039; is the path within the Swing context to the JFXPanel and &#039;&#039;/Scene/Node/Button&#039;&#039; is the path to the button within the FX context of the JFXPanel. Blocks to switch the context are not needed anymore. The paths can also be shortened, but the embedding node, in this case the JFXPanel, has to be an explicit part of the path. E.g.&lt;br /&gt;
 //JFXPanel//Button&lt;br /&gt;
would also work.&lt;br /&gt;
&lt;br /&gt;
Compound paths only work with the blocks in the CommonJavaGUITestLibrary. The blocks in the specific Java libraries still work with the old path and can be used side by side. To switch back to the usage of the old paths and blocks in the GUI Browser, open the menu &#039;&#039;GUI Browser &amp;gt; Recording&#039;&#039; and uncheck &#039;&#039;Record Compound Paths&#039;&#039; there.&lt;br /&gt;
&lt;br /&gt;
== Libraries ==&lt;br /&gt;
There are several libraries that can be used for Java connections. Originally a separate library was provided for each technology, but since expecco 21.1 there is a common library that works with all supported Java technologies. Each of the libraries contains connect blocks that all establish a connection of the same type. Therefore, blocks from all libraries can be used in the same test using the same connection.&lt;br /&gt;
&lt;br /&gt;
=== JavaSwingLibrary ===&lt;br /&gt;
Contains blocks for testing JavaSwing applications and embedded JavaSwing content. There are also blocks to set the context for embedded JavaFX content (see JavaFXLibrary). Paths for these blocks always refer to the JavaSwing content only, e. g. even if it is embedded in a JavaFX application.&lt;br /&gt;
&lt;br /&gt;
=== JavaSWTLibrary ===&lt;br /&gt;
Contains blocks for testing JavaSWT applications.&lt;br /&gt;
&lt;br /&gt;
=== JavaFXLibrary ===&lt;br /&gt;
Contains blocks for testing JavaFX applications and embedded JavaFX content. To access embedded JavaFX elements within a Swing application, the context must first be set to the corresponding JFXPanel. There is a block in the JavaSwingLibrary for this purpose. The paths are then resolved within this context. Otherwise the paths are resolved within the existing stages. There are also blocks for embedded WebView. To use these the context must be set to the corresponding WebView.&lt;br /&gt;
&lt;br /&gt;
=== CommonJavaGUILibrary ===&lt;br /&gt;
Starting with expecco 21.1 the CommonJavaGUILibrary contains blocks which can be used with all Java elements. If an application uses different Java technologies, [[Java_GUI_Plugins/en#Compound_Paths|compound paths]] are used to specify an element. This eliminates the need to switch to different contexts.&lt;br /&gt;
&lt;br /&gt;
However, this library and the extension of the functionality of the block to each element type is still under construction, so some blocks do not yet work with all elements. Furthermore, the library also requires a corresponding new expecco version.&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Set an anchor for the Skip Mode entry --&amp;gt;&lt;br /&gt;
==== The tree in the GUI browser does not show all elements of my application====&lt;br /&gt;
An application consists of many different elements. Some of them are not interactive, i.e. they are not directly visible to the user and are only used for formatting, such as panels. &lt;br /&gt;
&lt;br /&gt;
If many such elements are present, the tree can become very large and very deep. &lt;br /&gt;
As these elements are usually uninteresting for automation, they can be hidden in expecco by default.&lt;br /&gt;
If you need to access one of those elements, or need it to create a unique path, that behavior should be turned off. &lt;br /&gt;
&lt;br /&gt;
The JavaSwingLibrary contains the &#039;&#039;Set Skip Mode&#039;&#039; block for this purpose. On of the following modes can be selected:&lt;br /&gt;
::{|&lt;br /&gt;
|INTERACTIVE &lt;br /&gt;
|Collect only interactive elements&lt;br /&gt;
|-&lt;br /&gt;
|ALL&lt;br /&gt;
|Collect all elements&lt;br /&gt;
|-&lt;br /&gt;
|INTERACTIVE_HYBRID&lt;br /&gt;
|like INTERACTIVE, but with the fallback to ALL if a path cannot be resolved&lt;br /&gt;
|-&lt;br /&gt;
|ALL_HYBRID&lt;br /&gt;
|like ALL, but with the fallback to INTERACTIVE if a path cannot be resolved&lt;br /&gt;
|}&lt;br /&gt;
:Execution of the block changes the behavior for the current connection. It refers to what is displayed in the tree as well as how the paths on the blocks are handled. Since expecco 19.1 the default is ALL_HYBRID and in earlier versions it is INTERACTIVE.&lt;br /&gt;
&lt;br /&gt;
====I cannot connect, but all settings are correct====&lt;br /&gt;
Even though this should not happen in general, here are a few more aspects which affect the connection:&lt;br /&gt;
*Firewall&amp;lt;br&amp;gt;The firewall can interfere with the Java Agent&#039;s communication with the application.&amp;lt;br&amp;gt;Either set up an exception rule for the agent or deactivate the firewall for the duration of the test.&lt;br /&gt;
* Socket in use&amp;lt;br&amp;gt;It can happen, especially when debugging, that a previous instance of a Java agent was not closed correctly. This can lead to it occupying the socket and rejecting other connections.&amp;lt;br&amp;gt;Try &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Debugging&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Close all bridge connections / Close all socket connections&#039;&#039;&amp;quot;. &amp;lt;br&amp;gt;Be warned that this will also close all other existing (local) Expecco connections. In the case of remote connection, a restart of the agent and possibly of the application may help.&lt;br /&gt;
== See Also ==&lt;br /&gt;
[[Expecco GUI Tests Extension Reference/en]]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Release_Notes_23.x&amp;diff=29106</id>
		<title>Release Notes 23.x</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Release_Notes_23.x&amp;diff=29106"/>
		<updated>2024-01-11T08:51:47Z</updated>

		<summary type="html">&lt;p&gt;Matilk: link to 24.x release notes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See also: [[Release Notes 24.x]]&amp;lt;br&amp;gt;&lt;br /&gt;
See also: [[Release Notes 22.x]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Release 23.2 (December 2023) ==&lt;br /&gt;
*Feature: [[Environment_Editor/en#Fields|Static (Step-) Variables]]&lt;br /&gt;
*Feature: DOM inspector (try an XML attachment) generates better xpath suggestions (alternatives in [[Attachment_Editor/en#XML_Inspector | attachment editor]])&lt;br /&gt;
*Feature: [[Testplan_Editor/en#Log_Processor_Action|log processors]] are now configurable both for individual test cases and for the overall result of a testplan&lt;br /&gt;
*Feature: [[Testplan_Editor/en#Log_Processor_Action|log processor]] activities are shown in a testplan&#039;s activity log (but not in a report)&lt;br /&gt;
*Feature: Qt-Library: New Action &#039;&#039;QButton::Click&#039;&#039;: direct click, not being delegated to a thread&lt;br /&gt;
*Feature: Qt-Testing: ExpeccoTestService library and Inject-Tool for QT5.15.0 and VS2022:  [[QT_Testing/en#ExpeccoTestService_Library%3A_Delivery_in_Expecco_Versions|Delivered versions for QT and build environment]]&lt;br /&gt;
*Feature: [[Timeline/en|Timeline view]] for the activity log (Still experimental, might reach its limits with too large logs or while running)&lt;br /&gt;
*Feature: more [[Testplan_Editor/en#Execution_Settings | pathname options]] for testplan when generating ELF-per-run result files (in loops)&lt;br /&gt;
*Feature: a new [[Testplan_Editor/en#Execution_Settings | option]] in testplan to skip successful tests when looping&lt;br /&gt;
*Feature: enhanced manual test wizard with the option to execute the manual tests with a mobile device (Android, Apple IOS or Web-Browser) &lt;br /&gt;
*Feature: [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks |bridged Ruby elementary actions]]&lt;br /&gt;
*Feature: Improvements in the XML inspector (tree popup menu &amp;amp; string search)&lt;br /&gt;
*Feature: [[Expecco_API/en#Bridged_Python_Elementary_Blocks |bridged Python elementary actions]] can now be cancelled and terminated&lt;br /&gt;
*Feature: Python settings: Reorganize Python paths, export Python bridge code for debugging in external IDE ([[Installing additional Frameworks/en#Python_Installation|Python_Installation]])&lt;br /&gt;
*Feature: improved [[Tools_TestSuiteDifferenceBrowser|difference viewer]] (project and version compare UI)&lt;br /&gt;
*Feature: environment: current value (possibly changed from initial value) is saved in .elf log file&lt;br /&gt;
*Feature: StandardLibrary: additional optional pins for encoding (e.g. #utf8) in &amp;quot;FileStream [ Open For xxxx ]&amp;quot; blocks&lt;br /&gt;
*Feature: Values that cannot be saved in a .elf log file (e.g. web elements) are now saved and restored as UnrestoreableDate instead of nil&lt;br /&gt;
*New Python Version: Delivered installation package for Python 3.11.6&lt;br /&gt;
*Change in the format of .elf log files to store handled error states. Older expecco versions cannot handle this and might have problems to open such a file.&lt;br /&gt;
*Bug Fix: log processor actions were themself added to the log, possibly leading to problems when executed again&lt;br /&gt;
*Bug Fix: time-limited actions with the &#039;&#039;timeLimitOK&#039;&#039; flag set did not trigger the enable output pin.&lt;br /&gt;
*Bug Fix: zip archive view generated wrong name-list if language setting was EN-US (AM/PM from timestamp was interpreted as part of filename)&lt;br /&gt;
*Bug Fix: unicode strings in environment variables could not be stored to CSV files&lt;br /&gt;
*Bug Fix: a cancelled compound action did write to an output pin in certain situations&lt;br /&gt;
&lt;br /&gt;
== Release 23.1 ==&lt;br /&gt;
*Feature: Continue an interrupted test plan (i.e. even in a new expecco session and/or on another machine) &lt;br /&gt;
*Feature: Webtest (Selenium WebDriver): Support of [[Selenium_WebDriver_Plugin/en#Compound_Paths|compound paths]] for embedded elements.&lt;br /&gt;
*Feature: Webtest (Selenium WebDriver): [[Selenium_WebDriver_Plugin/en#Recorder|Recorder]] shows available windows and the current frame context.&lt;br /&gt;
*Feature: Webtest (Selenium WebDriver): Support of [[Selenium_WebDriver_Plugin/en#Shadow_Elements|shadow elements]] in the GUI browser and recorder, accessible by compound paths.&lt;br /&gt;
*Feature: Qt-Plugin supports Qt6 ([[QT_Testing/en#ExpeccoTestService_Library%3A_Delivery_in_Expecco_Versions|Qt-Versions]])&lt;br /&gt;
*Feature: Expecco Remote Control &amp;amp; Monitoring Service with Web Front-End (App for Android or Apple IOS is available on request) ([[Expecco_Remote_Control_App/en|expecco Mobile Remote App]])&lt;br /&gt;
*Feature: Diagram Editor: default style for new connections (e.g. hidden)&lt;br /&gt;
*Feature: Diagram Editor: shortcut keys for environment-freeze and others&lt;br /&gt;
*Feature: Diagram Editor: connections can be named&lt;br /&gt;
*Feature: User defined menu operations: Activity-Log in case of an error&lt;br /&gt;
*Feature: Zip-Archive viewer/extractor/inspector in [[Attachment_Editor/en#Zip_Archive_Inspector | attachment editor]]&lt;br /&gt;
*Feature: ManualTest actions are now part of the base system; the extra plugin licence is only needed to import Excel test descriptions&lt;br /&gt;
*Feature: Logging with microsecond resolution timestamps now works in Windows (if enabled in the settings) &lt;br /&gt;
*Feature: Support XML report file fetching via the REST interface&lt;br /&gt;
*Feature: PCAN (USB Can-Bus Adapter) is now supported in 64-bit expecco&lt;br /&gt;
*Feature: Folders can pass Tags to new sub-elements (inherit)&lt;br /&gt;
*Feature: Menu entry to set Test Groups for Tree Elements&lt;br /&gt;
*Standard Library: Warning Dialog with Opt-out option (show only once)&lt;br /&gt;
*FMU/CBridge: [[Functional Mockup Interface | support FMI2 API; partial support for FMI3]]&lt;br /&gt;
*FMU/CBridge: download resources to CBridge (eg. unifmu generated python FMUs work)&lt;br /&gt;
*Fix: nth-root: lost precision when applied to higher than 64bit floats.&lt;br /&gt;
*Fix: LargeFloats rounding was broken&lt;br /&gt;
*Fix: WSDL import with namespace redefinitions&lt;br /&gt;
*New [[Mobile_Testing_Plugin/en#Windows|Mobile Testing Supplement]] for Windows with an option in the installer to add Appium to the Autostart.&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin/en&amp;diff=29088</id>
		<title>Mobile Testing Plugin/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin/en&amp;diff=29088"/>
		<updated>2023-12-22T09:42:59Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Windows */ new supplement version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile_Testing_Plugin|Deutsche Version]] | &#039;&#039;&#039;English Version&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
With the &#039;&#039;Mobile Testing Plugin&#039;&#039; applications can be tested on Android and iOS devices. This includes both real and emulated devices. It does not matter whether real mobile devices or emulated devices are used. The plugin can (and usually is) used in conjunction with the [[Expecco_GUI_Tests_Extension_Reference|GUI-Browser]], which supports the creation of tests. It can also be used to record test procedures.&lt;br /&gt;
&lt;br /&gt;
[http://appium.io/ Appium] is used to connect to the devices. Appium is a free open source framework for testing and automating mobile applications.&lt;br /&gt;
&lt;br /&gt;
We recommend to go through the [[Mobile_Testing_Tutorial/en|Tutorial]] to familiarize yourself with the Mobile Plugin. This tutorial leads step by step through the creation of a test case using an example and explains the necessary basics.&lt;br /&gt;
&lt;br /&gt;
= Installation and Setup =&lt;br /&gt;
To use the &#039;&#039;Mobile Testing Plugin&#039;&#039;, you must have installed expecco together with the corresponding plugin, and you need the appropriate licenses. expecco communicates with the mobile devices via an Appium server, which either runs on the same computer as expecco, or on a second computer. This must be accessible for expecco.&lt;br /&gt;
&lt;br /&gt;
== Installation Overview ==&lt;br /&gt;
&#039;&#039;&#039;Computer running expecco:&#039;&#039;&#039;&lt;br /&gt;
* Java JDK version 8, 9, 10 or 11&lt;br /&gt;
&#039;&#039;&#039;Computer connected to Android devices :&#039;&#039;&#039;&lt;br /&gt;
* Appium Server, you can install it via the Mobile Testing Supplement (see below), of which we regularly provide a new version&lt;br /&gt;
* Android SDK, you can also get it with the Mobile Testing Supplement&lt;br /&gt;
* Java JDK version 8, 9, 10 or 11&lt;br /&gt;
&#039;&#039;&#039;Computer connected to iOS devices&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
* Appium Server, you can install it via the Mobile Testing Supplement for MacOS (see below), of which we regularly provide a new version&lt;br /&gt;
* Xcode in a version that supports the iOS version used, available from the Apple App Store&lt;br /&gt;
* Java JDK version 8, 9, 10 or 11&lt;br /&gt;
* Apple Developer Certificate incl. matching private key (to sign the WebDriverAgent)&lt;br /&gt;
* Provisioning Profile for the mobile devices to be used&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; Please note that due to the requirements (no connection to non-Apple devices available) iOS devices can only be controlled from a Mac.&lt;br /&gt;
&lt;br /&gt;
Depending on the setup, the above-mentioned computers can also be the same device. expecco can either connect to a remote Appium Server and mobile devices connected to it via the network, or start an Appium Server locally itself and use it with local mobile devices. However, some of expecco&#039;s functions that make it easier to create test cases are only available if the mobile devices are connected to the same computer on which expecco is running. A possible setup may therefore look like the following figure:&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAufbau.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
The following explains how to install Appium and other necessary applications for Windows and Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
The easiest way is to install everything from our Mobile Testing Supplement. However, newer versions do not contain a JDK anymore due to a change in Oracle&#039;s license terms, so you have to install it additionally. Of course, you are free to install Appium directly to use the version you want. However, to then be able to start an Appium server with expecco, a suitable batch file must be available and specified in the [[Mobile_Testing_Plugin/en#Plugin_Configuration|settings]]. However, connections can also be established to other running Appium servers.&lt;br /&gt;
*&#039;&#039;&#039;expecco 23.2&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-23.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.2]&lt;br /&gt;
:Same versions as in the predecessor, but with updated chromedriver versions&lt;br /&gt;
*expecco 23.1: [https://download.exept.de/transfer/h-expecco-23.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.1]&lt;br /&gt;
:Same versions as in the predecessor, but the installer now allows to add Appium to the Autostart.&lt;br /&gt;
*expecco 22.2 and 22.1: [https://download.exept.de/transfer/h-expecco-22.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.2.0]&lt;br /&gt;
:Appium 1.22.3*&lt;br /&gt;
:Node 14.17.5&lt;br /&gt;
:adb 1.0.41 from platform-tools 33.0.2&lt;br /&gt;
:&#039;&#039;* We added the capability&#039;&#039; startChromedriverTimeout &#039;&#039;to Appium, to get a timeout earlier, if Chromedriver cannot be initialized. (see [[#startChromedriverTimeout|Problems and Solutions]])&#039;&#039;&lt;br /&gt;
*expecco 21.2: [https://download.exept.de/transfer/h-expecco-21.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.12.0.0]&lt;br /&gt;
:Contains Appium version 1.22.0, Node still is version 12.13.1.&lt;br /&gt;
*expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.1.0]&lt;br /&gt;
:Only minor changes compared to the previous version.&lt;br /&gt;
*expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.0.0]&lt;br /&gt;
:Compared to the previous version, Appium was updated to version 1.16.0-rc.1 and node 12 is used. &lt;br /&gt;
*expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.8.1.0]&lt;br /&gt;
:This installs Appium in the version 1.12.0 and now additionally contains build-tools in the version 28.0.3 in the android-sdk. Apart from this, it is the same as the previous version.&lt;br /&gt;
*expecco 18.2: [http://download.exept.de/transfer/h-expecco-18.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.7.3.0]&lt;br /&gt;
:This installs Appium in the version 1.8.1. In addition, an installation of &#039;&#039;Android Debug Bridge&#039;&#039; and &#039;&#039;Google USB Driver&#039;&#039; ([https://gsmusbdrivers.com/download/adb-fastboot-drivers/ adb-setup-1.4.3]) is offered. This covers drivers for a broad range of Android devices, and you won&#039;t have to install an individual driver for each device. A &#039;&#039;&#039;JDK is not contained anymore (due to a change in Oracle&#039;s license terms)&#039;&#039;&#039;, you have to download it on your own, e.g. from [https://www.oracle.com/technetwork/java/javase/downloads/index.html Oracle].&lt;br /&gt;
*expecco 18.1: same procedure as for expecco 2.11&lt;br /&gt;
*expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/MobileTestingSupplement_1.6.0.2_Setup.exe Mobile Testing Supplement 1.6.0.2]&lt;br /&gt;
:This installs a Java JDK Version 8, android-sdk and Appium Version 1.6.4. The supplement also offers a universal adb driver ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]). This driver supports a wide range of Android Devise, and avoids the need to search for individual device-specific drivers.&lt;br /&gt;
*expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_1.5.0.0_Setup.exe Mobile Testing Supplement 1.5.0.0]&lt;br /&gt;
:It installs a Java JDK version 8, android-sdk and Appium version 1.4.16. During the installation the graphical user interface of Appium is started, you can close this window immediately. The supplement also offers a universal adb driver (ClockworkMod). This combines drivers for a wide range of Android devices so that you do not have to search for and install a separate driver for each device.&lt;br /&gt;
&lt;br /&gt;
If expecco has to use mobile devices that are connected to another computer, you have to start an Appium server there. You can do this by using the file &amp;lt;code&amp;gt;appium_standalone.cmd&amp;lt;/code&amp;gt;. The server is then started on default port 4723. If you want to use a different port number, start the server with&lt;br /&gt;
&lt;br /&gt;
 appium_standalone.cmd -p &amp;lt;portnummer&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The server is ready, as soon as the line&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Appium REST http interface listener started on 0.0.0.0:4723&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
is displayed, where you can read the used port number at the end.&lt;br /&gt;
&lt;br /&gt;
If your Android device is connected to a remote machine,&lt;br /&gt;
you may want to see the live screen locally using a tool like&lt;br /&gt;
[https://github.com/Genymobile/scrcpy scrcpy].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When Appium is started for the first time – either standalone or by expecco – it may happen that the Windows firewall blocks access to the node server. Allow the access or Appium cannot be started.&lt;br /&gt;
&lt;br /&gt;
== Mac OS ==&lt;br /&gt;
Note: the following can be ignored if you do not plan to test iOS (iPhone) devices. The Mac setup is not needed for Android devices.&lt;br /&gt;
&lt;br /&gt;
=== Xcode ===&lt;br /&gt;
Automation with iOS devices needs [https://developer.apple.com/xcode/ Xcode]. You can install it from the App Store. Please make sure that the version matches the tested iOS versions.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;iOS&#039;&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp;  &lt;br /&gt;
|&#039;&#039;&#039;Xcode&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;macOS&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|10.x&lt;br /&gt;
|8.x&lt;br /&gt;
|10.12 (Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|11.x&lt;br /&gt;
|9.x&lt;br /&gt;
|10.13 (High Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|12.x&lt;br /&gt;
|10.x&lt;br /&gt;
|10.14 (Mojave)&lt;br /&gt;
|-&lt;br /&gt;
|13.x&lt;br /&gt;
|11.x&lt;br /&gt;
|10.15 (Catalina)&lt;br /&gt;
|-&lt;br /&gt;
|14.x&lt;br /&gt;
|12.x&lt;br /&gt;
|11.0 (Big Sur)&lt;br /&gt;
|-&lt;br /&gt;
|15.x&lt;br /&gt;
|13.x&lt;br /&gt;
|12.0 (Monterey)&lt;br /&gt;
|-&lt;br /&gt;
|16.x&lt;br /&gt;
|14.x&lt;br /&gt;
|12.5 (Monterey)&lt;br /&gt;
|}&lt;br /&gt;
This table is only a simplified overview, better see [https://xcodereleases.com/ Xcode releases] or [https://en.wikipedia.org/wiki/Xcode#Version_comparison_table Xcode versions] for the exact versions. For new iOS minor versions, there is usually also a new release of Xcode, e.g. for iOS 10.2 you need at least Xcode 8.2, for iOS 10.3 at least Xcode 8.3, etc. So if you are upgrading to a newer iOS version, you will usually need a newer Xcode version as well. Newer versions of Xcode may not run on older operating systems, which in turn may require an operating system upgrade. If you also want to test older iOS versions, it can be useful to install the corresponding Xcode versions in parallel.&lt;br /&gt;
&lt;br /&gt;
=== Appium ===&lt;br /&gt;
You can install Appium either as command-line tool or use it with [https://github.com/appium/appium-desktop Appium Desktop], which provides a GUI to start the server. Meanwhile there is also Appium 2.0, which is not tested with expecco yet and therefore not recommended to use.&lt;br /&gt;
&lt;br /&gt;
==== Appium Desktop ====&lt;br /&gt;
Download the newest version of [https://github.com/appium/appium-desktop/releases/ Appium Desktop]. For the Mac, it is best to take the dmg file and install it to the applications. When starting &#039;&#039;Appium Server GUI&#039;&#039; you will probably get the error message, that it is not possible for security reasons. In this case, open the context menu of the app file (right click or Ctrl + click) and choose &#039;&#039;Open&#039;&#039; there. Then confirm that you really want to open the application. From now on you can open the application normally.&lt;br /&gt;
&lt;br /&gt;
[[Datei:OpenAppiumServerGUI1.png|text-top]] [[Datei:OpenAppiumServerGUI2.png|text-top]]&lt;br /&gt;
&lt;br /&gt;
Since Xcode 14 there are problems with signing the WebDriverAgent, which Appium loads on the device for the automation. This means that no connection is possible with version 1.22.3-4 of Appium Desktop. In newer versions of WebDriverAgent, this problem is solved, but currently there is no version of Appium Desktop using such a new version (as of November 2022). However, you can manually download a new version (e.g. 4.10.2) and replace the files in Appium. To do this, download one of the two archive files (zip or tar.gz) containing the source code from the [https://github.com/appium/WebDriverAgent/releases/ WebDriverAgent download page]. Then open and extract this file. Copy the contents of the folder &#039;&#039;WebDriverAgent-4.10.2&#039; to&lt;br /&gt;
&lt;br /&gt;
 /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
If you navigate there by Finder, make a context click (right click or Ctrl + click) on the application and choose &#039;&#039;Show Package Contents&#039;&#039; from the menu. Replace all files that are already present with the same name.&lt;br /&gt;
&lt;br /&gt;
==== Install Appium using npm ====&lt;br /&gt;
You can install Appium using npm (Node Package Manager) as well. To do this, you have to install node/npm first. This can be done using [https://github.com/nvm-sh/nvm nvm] (Node Version Manager), which you can get on Github. If the following installation instructions should not work for you, you will find detailed information in the [https://github.com/nvm-sh/nvm#readme Readme] there.&lt;br /&gt;
&lt;br /&gt;
Open a Terminal window. Then clone the Github repository of nvm&lt;br /&gt;
 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash&lt;br /&gt;
and load it&lt;br /&gt;
 export NVM_DIR=&amp;quot;$([ -z &amp;quot;${XDG_CONFIG_HOME-}&amp;quot; ] &amp;amp;&amp;amp; printf %s &amp;quot;${HOME}/.nvm&amp;quot; || printf %s &amp;quot;${XDG_CONFIG_HOME}/nvm&amp;quot;)&amp;quot; [ -s &amp;quot;$NVM_DIR/nvm.sh&amp;quot; ] &amp;amp;&amp;amp; \. &amp;quot;$NVM_DIR/nvm.sh&amp;quot; # This loads nvm&lt;br /&gt;
&lt;br /&gt;
Then execute&lt;br /&gt;
 command -v nvm&lt;br /&gt;
to see if it works. It should print &#039;&#039;nvm&#039;&#039;. If there is no response, execute&lt;br /&gt;
 touch ~/.zshrc&lt;br /&gt;
and try again.&lt;br /&gt;
&lt;br /&gt;
Now you can install node with the following command.&lt;br /&gt;
 nvm install 16.15.1&lt;br /&gt;
As there are problems installing Appium using the newest version of node, we recommend this version.&lt;br /&gt;
&lt;br /&gt;
After node is installed, you can use it to install Appium:&lt;br /&gt;
 npm install -g appium&lt;br /&gt;
&lt;br /&gt;
The Appium server now simply can be started with the command&lt;br /&gt;
 appium&lt;br /&gt;
The output will then be written directly to the terminal.&lt;br /&gt;
&lt;br /&gt;
This version also has problems with signing the WebDriverAgent, like explained in [[#Appium_Desktop | Appium Desktop]]. Therefore download a newer version of WebDriverAgent in this case as well and replace the old files. You will find them at&lt;br /&gt;
 /Users/&amp;lt;user&amp;gt;/.nvm/versions/16.15.1/lib/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
==== Mobile Testing Supplement ====&lt;br /&gt;
We provide older versions of Appium via the Mobile Testing Supplement for Mac OS, with which you can easily install it:&lt;br /&gt;
* &#039;&#039;&#039;expecco 20.2&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-20.2.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement for Mac OS (1.2.2)]&lt;br /&gt;
:Contains Appium version 1.18.3 and uses node 14.&lt;br /&gt;
&lt;br /&gt;
* expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement for Mac OS (1.2.0)]&lt;br /&gt;
:Only a few changes compared to the previous version.&lt;br /&gt;
&lt;br /&gt;
* expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement_for_MacOS.tar.bz2 Mobile Testing Supplement for Mac OS (1.1.98)]&lt;br /&gt;
:Appium is updated to version 1.16.0-rc.1 and node 12 is used.&lt;br /&gt;
&lt;br /&gt;
* expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.96.tar.bz2 Mobile Testing Supplement for Mac OS (1.1.96)]&lt;br /&gt;
:This version contains Appium 1.12.0.&lt;br /&gt;
&lt;br /&gt;
* expecco 18.1: [http://download.exept.de/transfer/h-expecco-18.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.94.tar.bz2 Mobile Testing Supplement for Mac OS (1.1.94)]&lt;br /&gt;
:This version contains Appium 1.8.0.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.11:[http://download.exept.de/transfer/h-expecco-2.11.1/Mobile_Testing_Supplement_for_Mac_OS_1.0.94.tar.bz2 Mobile Testing Supplement for Mac OS (1.0.94)]&lt;br /&gt;
:This version contains Appium 1.6.4.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_for_Mac_OS_1.0.tar.bz2 Mobile Testing Supplement for Mac OS]&lt;br /&gt;
:Diese Version entält Appium 1.4.16.&lt;br /&gt;
&lt;br /&gt;
After you have downloaded the supplement, you can move it to a directory of your choice (e.g. your home directory) and unpack it there. A suitable command in a shell could look like this, adjust the version number accordingly:&lt;br /&gt;
&lt;br /&gt;
 tar -xvpf Mobile_Testing_Supplement_for_Mac_OS_1.1.98.tar.bz2&lt;br /&gt;
&lt;br /&gt;
If your default Xcode installation is the one you want to use, you can start Appium directly from the file in the &#039;&#039;bin&#039;&#039; directory with the appropriate version number:&lt;br /&gt;
&lt;br /&gt;
 Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
If you want to use another Xcode than the one configured as default, you have to tell Appium the corresponding path by using the environment variable &#039;&#039;DEVELOPER_DIR&#039;&#039;. For example, if you have installed Xcode in &#039;&#039;/Applications/Xcode-11.3.app&#039;&#039;, you can start Appium this way:&lt;br /&gt;
&lt;br /&gt;
 DEVELOPER_DIR=&amp;quot;/Applications/Xcode-11.3.app/Contents/Developer&amp;quot; Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
To find out what is set as the default Xcode installation on your system, use this command:&lt;br /&gt;
&lt;br /&gt;
 xcode-select -p&lt;br /&gt;
&lt;br /&gt;
If Appium cannot find your Xcode installation, a message like this appears:&lt;br /&gt;
&#039;&#039;&amp;lt;blockquote&amp;gt;org.openqa.selenium.SessionNotCreatedException - A new session could not be created. (Original error: Could not find path to Xcode, environment variable DEVELOPER_DIR set to: /Applications/Xcode.app but no Xcode found)&amp;lt;/blockquote&amp;gt;&#039;&#039;&lt;br /&gt;
In such a case, restart Appium by specifying a valid &#039;&#039;DEVELOPER_DIR&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Signing WebDriverAgent ====&lt;br /&gt;
For automation, Appium installs an App called WebDriverAgent on the device and therefore has to be able to sign it. You need an Apple account and a respective certificate for this. For evaluation you can use a free account. This has the disadvantage that created profiles are only valid for one week and must be recreated afterwards. Also be careful when sharing the account, as certificates may be revoked or invalidated by automatic generation. As a result, apps that have already been signed can no longer be used.&lt;br /&gt;
&lt;br /&gt;
If you already have a respective certificate and its associated private key in your keychain on the Mac, you can have the WebDriverAgent automatically signed. If not, it is recommended to set and manage the signing using Xcode.&lt;br /&gt;
&lt;br /&gt;
First, connect the device you want to use to your Mac via USB. Make sure both the Mac and the device are in the same network or there will be problems when connection with Appium. Start Xcode and open &#039;&#039;Preferences&#039;&#039;. Go to the Accounts page and create an entry with your account. You can then click on &#039;&#039;Manage Certificates...&#039;&#039; to see the certificates that belong to that account. To run tests, you need an iOS Development Certificate and the associated private key. If you do not already have one, create one. If you already have one, but it is not in your keychain (indicated by &amp;quot;Not in Keychain&amp;quot;), you can import it. You can do that by the [https://support.apple.com/en-us/guide/keychain-access/welcome/mac keychain access] on your Mac, if you have exported it previously from the keychain, where it is stored. The certificate with the associated key should be in the keychain &#039;&#039;Login&#039;&#039;. It can be exported from there as PKCS#12 file (typical ending .p12). To import a certificate into your keychain, select the option &#039;&#039;Import objects&#039;&#039; from the &#039;&#039;File&#039;&#039; menu. If you don&#039;t know where the certificate is stored, you can also revoke it in Xcode and recreate it in your keychain. However, only do this if you know that the old certificate is no longer in use because it can no longer be used afterwards. Now the keychain should contain an iOS development certificate.&lt;br /&gt;
&amp;lt;!--(Den folgenden Teil braucht man wohl nicht mehr, wenn es in Xcode eingestellt ist)From the right-click menu, select Information. Under the details of the certificate you will find the Team ID, which is referred to here as the Organizational Unit. Enter it in the Team ID field of the plug-in&#039;s settings, see [[#Plugin_Configuration|Plugin Configuration]].--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now open the WebDriverAgent project in Xcode. If you have installed the Mobile Testing Supplement, you will find it in this directory at&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
If you have installed Appium Desktop, you will find it at&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;/Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You can use the Finder to navigate to the Xcode project file and open it by double clicking. Note, that you have to perform a context click (right click or Ctrl + click) on the Appium Server GUI app and select &#039;&#039;Show Package Contents&#039;&#039; in the menu, to get to its subdirectory.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingWebDriverAgentXcode.png]]&lt;br /&gt;
&lt;br /&gt;
Select &#039;&#039;WebDriverAgentLib&#039;&#039; and the page &#039;&#039;Signing &amp;amp; Capabilities&#039;&#039;. In the section &#039;&#039;Signing&#039;&#039; set the option &#039;&#039;Automatically manage signing&#039;&#039; and then select a team. Now switch to &#039;&#039;WebDriverAgentRunner&#039;&#039; and do the same there.&lt;br /&gt;
&amp;lt;!-- (The following seems to not be relevant anymore.) Here you should see errors indicating that no Provisioning Profiles have been created or found. Therefore, go to the &#039;&#039;Build Settings&#039;&#039; page and look for the entry &#039;&#039;Product Bundle Identifier&#039;&#039; in the &#039;&#039;Packaging&#039;&#039; section. Change this from com.facebook.WebDriverAgentRunner to something Xcode accepts by changing the prefix. Xcode can now generate a matching Provisioning Profile and the errors on the General page should disappear. After that you can quit Xcode. --&amp;gt;&lt;br /&gt;
By setting the team, the errors showing up for WebDriverAgentRunner should disappear. If Xcode should not be able to create a Provisioning Profile matching the Bundle ID &#039;&#039;com.facebook.WebDriverAgentRunner&#039;&#039;, you can edit the latter so that it fits your certificate. After that you can quit Xcode or you can, like explained further below, directly start the build in Xcode, so the project will be already built when Appium wants to use it.&lt;br /&gt;
&lt;br /&gt;
If you now connect to your device from expecco, the WebDriverAgent will be installed and started on it and then switch to the app to be tested. You may still have to trust the execution of the WebDriverAgent on the device. It maybe a sign that you have to do this, if the app WebDriverAgent first appears on the device and tries to start, but then is uninstalled again. To trust the execution, open the settings during the connection setup on the device and then the entry &#039;&#039;Device management&#039;&#039; under &#039;&#039;General&#039;&#039;. This entry is only visible if a developer app is installed on the device. You may therefore have to wait until the WebDriverAgent is installed before the entry appears. Select the entry of your Apple account and trust it. Since the WebDriverAgent will be uninstalled again if the start did not work, you have to do this during the connection setup. If this is too hectic for you, you can also execute the following code:&lt;br /&gt;
&lt;br /&gt;
 xcodebuild -project Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
 xcodebuild -project /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&lt;br /&gt;
&lt;br /&gt;
This installs the WebDriverAgent on the device without deleting it again.&lt;br /&gt;
&lt;br /&gt;
If there are problems while installing the WebDriverAgent, you can also try and start the build in Xcode. Make sure the right target &#039;&#039;WebDriverAgent&#039;&#039; is selected. Error messages in Xcode might indicate easier what the problem is about. Sometimes it even helps to try for a second time, if it took too long for the first time and got aborted. It may occur, that you are asked several times during the build to enter the password for the keychain.&lt;br /&gt;
&lt;br /&gt;
[[Datei:WebDriverAgentCodesign.png]]&lt;br /&gt;
&lt;br /&gt;
Read also the documentation of Appium on [https://github.com/appium/appium-xcuitest-driver/blob/master/docs/real-device-config.md Setting up tests with iOS devices]. Refer to the [https://support.apple.com/en-us/HT204460 Apple documentation] for details on installing and trusting of apps.&lt;br /&gt;
&lt;br /&gt;
Once the WebDriverAgent is installed on the device, it will be reused for later connections und connecting should work faster. The signed version is then already on your Mac as well and doesn&#039;t have to be built again. This should speed up the connect with other devices as well. If you know, that the connect has to build and sign the WebDriverAgent first, it is advisable to set the capability &#039;&#039;wdaLaunchTimeout&#039;&#039;. This timeout specifies how long Appium waits for the WebDriverAgents to start up on the device and is per default set to 60000&amp;amp;nbsp;ms. Building often takes a little longer than one minute, so the connect attempt will be canceled. A value of 120000 will be more reliable here.&lt;br /&gt;
&lt;br /&gt;
== Plugin Configuration ==&lt;br /&gt;
Before you start, please check the settings of the Mobile Testing Plugin and adjust them if necessary. Select the menu item &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Extensions&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot; (see fig.). By default, these paths are found automatically (1). To adjust a path manually, deactivate the corresponding check mark at the right. You&#039;ll see a drop-down list with some paths to choose from. If an entered path is wrong or cannot be found, the field is marked red and a message appears. Make sure that all paths are specified correctly.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingEinstellungen.png | thumb | 400px | Plugin Configuration]]&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;appium&#039;&#039;&#039;: Enter the path to the executable file with which Appium can be started in the command line. Under Windows this file will usually be called &amp;quot;&amp;lt;code&amp;gt;appium.cmd&amp;lt;/code&amp;gt;&amp;quot;. This path is used when expecco starts an Appium server.&lt;br /&gt;
*&#039;&#039;&#039;node&#039;&#039;&#039;: Enter the path to the executable that starts Node (also called (also called &amp;quot;Node.js&amp;quot;). This path is passed to Appium when a server is started so that Appium can find it independently of the PATH variable. Under Windows this file is usually called &amp;quot;&amp;lt;code&amp;gt;node.exe&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;JAVA_HOME&#039;&#039;&#039;: Enter the path to a JDK (Java Development Kit)here. This path is passed to each Appium server. Leave the field blank to use the value from the environment variable. To specify which Java should be used by expecco, set this path in the Java Bridge settings.&lt;br /&gt;
*&#039;&#039;&#039;ANDROID_HOME&#039;&#039;&#039;: Enter the path to an Android SDK here. This path is passed to each Appium server. Leave the field blank to use the value from the environment variable.&lt;br /&gt;
*&#039;&#039;&#039;adb&#039;&#039;&#039;: The path to the adb command. Under Windows the file is called &amp;quot;&amp;lt;code&amp;gt;adb.exe&amp;lt;/code&amp;gt;&amp;quot;. This file is used by expecco, for example, to get the list of connected devices. This path should be selected automatically, if the command is found in the ANDROID_HOME directory. This is also used by Appium. If expecco and Appium use different versions of adb, conflicts may occur.&lt;br /&gt;
*&#039;&#039;&#039;android.bat&#039;&#039;&#039;: This file is only needed to start the AVD and the SDK Manager, which deal with phone emulators. The file in the ANDROID_HOME directory will be selected automatically, if present there.&lt;br /&gt;
*&#039;&#039;&#039;aapt&#039;&#039;&#039;: The path to the &amp;quot;aapt&amp;quot; command here. Under Windows this file is called &amp;quot;&amp;lt;code&amp;gt;aapt.exe&amp;lt;/code&amp;gt;&amp;quot;. expecco uses &amp;quot;aapt&amp;quot; only in the connection editor to read the package and activities of an &amp;quot;apk&amp;quot; file. The file in the ANDROID_HOME directory will be selected automatically, if present there.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingJavaBridgeEinstellungen.png | thumb | 400px | JDK Configuration]]&lt;br /&gt;
&lt;br /&gt;
Starting with expecco 2.11, there is an additional field called &#039;&#039;Team ID&#039;&#039;. If you run iOS tests, enter the Team ID of your certificate here. This is used for every iOS connection, unless you change the value in the connection settings in individual cases. For information on how to obtain the team ID, please refer to the section on [[#Signing| signing]] for installations on Mac OS. With expecco 2.10 and older, you can only enter the Team ID as capability for each connection setting separately. However, you must use the [[#Extended_View|extended view]] to do this. Enter the capability &#039;&#039;xcodeOrgId&#039;&#039; here and set the Team ID of the certificate as value.&lt;br /&gt;
&lt;br /&gt;
The server address setting at the bottom of the page refers to the behavior of the connection editor. It checks at the end whether the server address ends in &#039;&#039;/wd/hub&#039;&#039; as this is the usual form. If not, a dialog asks how to react. The defined behavior can be viewed and changed here.&lt;br /&gt;
&lt;br /&gt;
Also switch to the entry &#039;&#039;Java Bridge&#039;&#039; (see figure). Here you have to specify the path to your Java installation, which is used by expecco. Enter a JDK here. If you want to use the one from the Mobile Testing Supplement under Windows, the path is&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;C:\Program Files (x86)\exept\Mobile Testing Supplement\jdk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can also use the system settings.&lt;br /&gt;
&lt;br /&gt;
== Prepare Android Device ==&lt;br /&gt;
If you connect an Android device under Windows, you may still need an adb driver for the device. You can usually find a suitable driver on the manufacturer&#039;s website. If you have installed the universal driver from the Mobile Testing Supplement, everything should already work for most devices. In some cases, Windows will automatically try to install a driver when you connect the device for the first time. &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Attention&#039;&#039;&#039;: Before you can control a mobile device with the Appium plugin, you have to allow this debugging!&lt;br /&gt;
&lt;br /&gt;
For Android devices, you can find this option in the settings under &#039;&#039;[https://developer.android.com/studio/debug/dev-options Developer Options]&#039;&#039; called &#039;&#039;USB-Debugging&#039;&#039;. If the developer options are not displayed, you can unlock them by tapping Build Number seven times in About the Phone.&lt;br /&gt;
&lt;br /&gt;
Also enable the &#039;&#039;Stay awake&#039;&#039; feature to prevent the device from turning off the screen during test creation or execution.&lt;br /&gt;
&lt;br /&gt;
For security reasons, USB debugging must be allowed for each computer individually. When connecting the device to the PC via USB, you must agree to the connection on the device. If you haven&#039;t done this for your computer yet, but no corresponding dialog appears on the device, it may help to unplug and reconnect the device. This can happen especially if you have installed the ADB driver while the device was already connected via USB. If this doesn&#039;t help either, open the notifications by dragging them from the top of the screen. There you will find the USB connection and you can open the options. Select another type of connection; usually MTP or PTP should work.&lt;br /&gt;
&lt;br /&gt;
You can also test on an emulator. It does not need to be prepared separately, as it is already designed for USB debugging. It is even possible to start an emulator at the beginning of the test.&lt;br /&gt;
&lt;br /&gt;
To check if a device you have connected to your computer can be used, open the [[#Connection_Editor|connection editor]]. The device should be displayed there.&lt;br /&gt;
&lt;br /&gt;
=== Connection via WLAN ===&lt;br /&gt;
It is possible to connect to Android devices via Wireless LAN. For devices using Android 11 or newer, this can be done wirelessly, else you have to connect initially via USB. Since expecco 22.1, WiFi connections can be established using the [[Mobile_Testing_Plugin/en#Connection_Editor|Connection Editor]]. It is also possible to do this using a command window.&lt;br /&gt;
==== Wireless Connect (Android 11) ====&lt;br /&gt;
In the developer options of your device, enable wireless debugging and open its options. You initially have to pair your machine with the device. To do this, choose &amp;quot;&#039;&#039;Pair device with pairing code&#039;&#039;&amp;quot; to get a pairing code and an IP address with port. Then open a command window (terminal window) on your machine and enter:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb pair &amp;lt;Device IP Address&amp;gt;:&amp;lt;Pairing Port&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
where &amp;lt;tt&amp;gt;&amp;lt;Device IP Address&amp;gt;:&amp;lt;Pairing Port&amp;gt;&amp;lt;/tt&amp;gt; is the IP address and port as shown on the device. After that, you will be asked for the pairing code. If everything went right, the popup on the device should have closed and your machine is added to the list of paired devices. Then enter at the command window:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;Device IP Address&amp;gt;:&amp;lt;Debugging Port&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The IP address is the same as for pairing, but the port is different. Both are shown as IP address &amp;amp; Port on the device. The device should now be connected via WLAN and can be used in the same way as with a USB connection. You can check this by entering &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; or open the connection dialog in expecco. In the list, the device appears with its IP address and port. Remember that the WLAN connection no longer exists when the ADB server or the device is restarted. Restarting the device often disables wireless debugging and the used port is changed. The pairing, however, is permanent and has not to be done again the next time you connect.&lt;br /&gt;
==== Start via USB ====&lt;br /&gt;
First, connect your device via USB. Then open a command window (terminal window) and enter:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The device listens for a TCP/IP connection on port 5555. If you have several devices connected or emulators running, you have to specify which device you mean. Enter in this case:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb devices -l&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
to get a list of all devices, where the first column gives the device&#039;s ID.&lt;br /&gt;
Then, enter:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb -s &amp;lt;deviceID&amp;gt; tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
with the device identification of the desired device. You can now disconnect the USB connection.&amp;lt;br&amp;gt;Now you have to find out the IP address of your device. You can usually find it somewhere in the device&#039;s settings, for example in the Status or WLAN settings of the phone. Then type in:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP address of device&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The device should now be connected via WLAN and can be used in the same way as with a USB connection. You can check this by entering &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; again or open the connection dialog in expecco. In the list, the device appears with its IP address and port. Remember that the WLAN connection no longer exists when the ADB server or the device is restarted.&lt;br /&gt;
&lt;br /&gt;
== Preparing an iOS-Device and App ==&lt;br /&gt;
Control of iOS devices is only possible via a Mac. Please also read the section [[#Mac_OS|Installation under Mac OS]].&lt;br /&gt;
&lt;br /&gt;
Before you can control a mobile device with the Mobile Testing Plugin, you must allow debugging for iOS devices with iOS 8 or higher. Activate the option &amp;quot;&#039;&#039;Enable UI Automation&#039;&#039;&amp;quot; under the &amp;quot;&#039;&#039;Developer&#039;&#039;&amp;quot; menu in the device settings.&amp;lt;br&amp;gt;If you cannot find the &amp;quot;&#039;&#039;Developer&#039;&#039;&amp;quot; entry in the settings, proceed as follows: Connect the device to the Mac via USB. If necessary, you must still agree to the connection on the device. Start Xcode and then select &amp;quot;&#039;&#039;Devices&#039;&#039;&amp;quot; from the menu bar at the top of the screen in the &amp;quot;&#039;&#039;Window&#039;&#039;&amp;quot; menu. A window opens in which a list of the connected devices is displayed. Select your device there. Then the entry &amp;quot;&#039;&#039;Developer&#039;&#039;&amp;quot; should appear in the settings on the device. You may have to exit the settings and restart.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Alert.png | thumb | 270px | Alert unter iOS]]&lt;br /&gt;
It is not possible to establish a connection to the device as long as it shows certain alerts. Such an alert may appear if FaceTime is activated (by displaying a message about SMS charges as shown in the screenshot). Be sure to configure the device so that it does not show such alerts when idle.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.11 and later ===&lt;br /&gt;
You can test any app which is executable or already installed on the device used. If the app is available as a development build, the UDID of the device must be stored in the app. In any case, the WebDriverAgent must be signed for the device. Please read the section about [[#Signing|signing]] under Mac OS.&lt;br /&gt;
&lt;br /&gt;
If you want to use the Home button in a test, you must activate &amp;quot;AssistiveTouch&amp;quot; on the device. You will find this option in the settings under &amp;quot;&#039;&#039;General&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;Operating Help&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;AssistiveTouch&#039;&#039;&amp;quot;. Then place the menu in the middle of the upper edge of the screen. You can then record pressing the Home button with the corresponding menu entry in the recorder or use the &amp;quot;&#039;&#039;Press Home Button&#039;&#039;&amp;quot; block directly.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.10 ===&lt;br /&gt;
The app you want to use must be available as a development build. The UDID of the device must also be stored in the app.&lt;br /&gt;
&lt;br /&gt;
=== Sign the development build ===&lt;br /&gt;
A development build of an app is only allowed for a limited number of devices and cannot be started on other devices. However, it is possible to exchange the certificate and the usable devices in a development build.&lt;br /&gt;
&lt;br /&gt;
* Evaluation with demo app of eXept:&lt;br /&gt;
:We will be happy to provide you with a demo app which is available as a development build and which we can sign for your device. Please send the UDID of your device to your eXept contact person. How to determine the UDID of your device is described in the following section.&lt;br /&gt;
&lt;br /&gt;
* Using your own app for your test device:&lt;br /&gt;
:If you receive a development build (IPA file) from the app developers that is approved for your test device, you can use it directly. To do this, you must tell the developers the UDID of your device so they can enter it. &#039;&#039;&#039;You can use Xcode to read the UDID of a device&#039;&#039;&#039;. Start Xcode and select &#039;&#039;Devices&#039;&#039; from the menu bar at the top of the screen in the &#039;&#039;Window&#039;&#039; menu. A window opens in which a list of the connected devices is displayed. Select your device and search for the &#039;&#039;Identifier&#039;&#039; entry in Properties. The UDID is a 40-digit hexadecimal number.&lt;br /&gt;
&lt;br /&gt;
* Externally developed app for your test device:&lt;br /&gt;
:You can also re-sign apps to make them run on other devices. However, this process is complicated and requires access to an Apple Developer account. A documentation on the procedure is currently in preparation.&lt;br /&gt;
&lt;br /&gt;
:For the evaluation we will gladly support you with the re-signing of your app..&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Log in to the [https://developer.apple.com/ Apple-Webinterface]. Navigate to &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039;. If necessary, create a Developer Certificate and a Provisioning Profile for your device here and download both. If you don&#039;t have a Developer Account yet, create one here: https://developer.apple.com/enroll/. For this you have to register with an Apple-ID.&lt;br /&gt;
&lt;br /&gt;
# Find out Team ID (&#039;&#039;Membership&#039;&#039; -&amp;gt; &#039;&#039;Team ID&#039;&#039;)&lt;br /&gt;
# Under &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039; select development certificate (under &#039;&#039;+&#039;&#039; create, if not available) and download&lt;br /&gt;
# Under &#039;&#039;App ID&#039;&#039; create Wildcard App ID, if not present. Note App ID (AppID = Prefix.ID)&lt;br /&gt;
# Add device, find out UDID (or &#039;&#039;Identifier&#039;&#039;) of the device (&#039;&#039;Xcode&#039;&#039; -&amp;gt; &#039;&#039;Window&#039;&#039; (above in menu bar) -&amp;gt; &#039;&#039;Devices&#039;&#039;)&lt;br /&gt;
# Create commission profiles: &#039;&#039;iOS App Development&#039;&#039; -&amp;gt; Select &#039;&#039;AppID&#039;&#039; -&amp;gt; Select certificate -&amp;gt; Select device -&amp;gt; Create profile name -&amp;gt; Download provisioning profiles.&lt;br /&gt;
# Import the downloaded certificate (&#039;&#039;Downloads&#039;&#039; -&amp;gt; Certificate (.cer)&lt;br /&gt;
# Copy SHA1 fingerprint. Right click on Certificate -&amp;gt; &#039;&#039;Information&#039;&#039;, then scroll to the bottom of the page).&lt;br /&gt;
# Create Entitlements.plist (&#039;&#039;Open Terminal&#039; -&amp;gt; Downloads/Mobile_Testing_Supplement/bin/gen-entitlements_plist &#039;Team-ID&#039; &#039;App ID&#039; Downloads/Mobile_Testing_Supplement/bin/re-sign-ipa &amp;lt;path to ipa (z.B. Downloads/expeccoMobileDemo.ipa)&amp;gt; \&lt;br /&gt;
&amp;quot;&amp;lt;Zertifikat (SHA1-Fingerabdruck, z.B. 76 E8 4B E8 78 D5 D7 F9 2E 09 8B D7 E8 FB CE 30 0C F5 D0 EF)&amp;gt;&amp;quot; \&lt;br /&gt;
&amp;lt;Path to Commission Profile (e.g. /Users/exept_test/Downloads/dut.mobileprovision)&amp;gt; \&lt;br /&gt;
&amp;lt;Path for the result ipa (z.B. Downloads/expeccoMobileDemo_re-signed.ipa)&amp;gt; \&lt;br /&gt;
[Pfad zur entitlements.plist] (z.B. /Users/exept_test/entitlements.plist)&lt;br /&gt;
&lt;br /&gt;
To re-sign, you can use the corresponding script from the Mobile Testing Supplement for Mac OS or any other tool (e.g. isign).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more information about using iOS devices, see also the &lt;br /&gt;
[http://appium.io/slate/en/master/?java#appium-on-real-ios-devices Appium documentation].&lt;br /&gt;
&lt;br /&gt;
=== Native iOS-Apps ===&lt;br /&gt;
You can also use apps that are already natively present on the device. To do this, you must know their bundle ID and then enter it in the connection settings. Here is a small selection of common apps:&lt;br /&gt;
{| style=&amp;quot;text-align:left&amp;quot;&lt;br /&gt;
! App&lt;br /&gt;
!&lt;br /&gt;
! Bundle-ID&lt;br /&gt;
|-&lt;br /&gt;
| App Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.AppStore&lt;br /&gt;
|-&lt;br /&gt;
| Calculator&lt;br /&gt;
| &lt;br /&gt;
| com.apple.calculator&lt;br /&gt;
|-&lt;br /&gt;
| Calendar&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilecal&lt;br /&gt;
|-&lt;br /&gt;
| Camera&lt;br /&gt;
| &lt;br /&gt;
| com.apple.camera&lt;br /&gt;
|-&lt;br /&gt;
| Contacts&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileAddressBook&lt;br /&gt;
|-&lt;br /&gt;
| iTunes Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileStore&lt;br /&gt;
|-&lt;br /&gt;
| Mail&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilemail&lt;br /&gt;
|-&lt;br /&gt;
| Maps&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Maps&lt;br /&gt;
|-&lt;br /&gt;
| Messages&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileSMS&lt;br /&gt;
|-&lt;br /&gt;
| Phone&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilephone&lt;br /&gt;
|-&lt;br /&gt;
| Photos&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobileslideshow&lt;br /&gt;
|-&lt;br /&gt;
| Settings&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Preferences&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
You can find further Bundle-IDs [https://github.com/joeblau/apple-bundle-identifiers here].&lt;br /&gt;
&lt;br /&gt;
= Examples =&lt;br /&gt;
In the demo test suites for expecco you will also find examples for tests with the Mobile Testing Plugin. To do this, select the option &amp;quot;&#039;&#039;Example from File&#039;&#039;&amp;quot; on the start screen and open the folder named &amp;quot;&#039;&#039;mobile&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;TestsuiteMobileTestingDemo&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m01_MobileTestingDemo.ets --&amp;gt;&amp;lt;/span&amp;gt; &#039;&#039;m01_MobileTestingDemo.ets&#039;&#039; ==&lt;br /&gt;
The test suite contains two simple test plans: &amp;quot;&#039;&#039;Simple CalculatorTest&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Complex Calculator and Messaging Test&#039;&#039;&amp;quot;. Both tests use an Android emulator, which you must start before starting. The apps used in the test are part of the basic equipment of the emulator and therefore no longer need to be installed. Since the apps may differ under every Android version, it is important that your emulator runs under Android 6.0. In addition, the language must be set to English.&lt;br /&gt;
&lt;br /&gt;
; Simple CalculatorTest&lt;br /&gt;
: This test connects to the calculator and enters the formula &#039;&#039;2+3&#039;&#039;. The result of the calculator is compared with the expected value &#039;&#039;5&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; Complex Calculator and Messaging Test&lt;br /&gt;
: This test connects to the calculator and then opens the message service. There it waits for an incoming message from the number &#039;&#039;15555215556&#039;&#039;, in which a formula to be calculated is sent. The message is generated before via a socket at the emulator. When the message arrives, it is opened by the test and its contents are read. Then the calculator is opened again, the received formula is entered and the result is read. The test then switches back to the message service and sends the result as an answer.&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;m02_expeccoMobileDemo.ets&#039;&#039; und &#039;&#039;m03_expeccoMobileDemoIOS.ets&#039;&#039; ==&lt;br /&gt;
These are part of the tutorial for the Mobile Testing Plugin. The included test case is incomplete and will be added during the tutorial. Please read the section [[#Tutorial|Tutorial]].&lt;br /&gt;
&lt;br /&gt;
= Tutorial =&lt;br /&gt;
There is a tutorial describing the basic procedure for creating tests with the Mobile Testing Plugin. It is based on a supplied example consisting of a simple app and an expecco test suite.&lt;br /&gt;
&lt;br /&gt;
You find it on the page [[Mobile_Testing_Tutorial/en|Mobile Testing Tutorial]] in two versions for Android and iOS devices.&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsAndroid&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m02_expeccoMobileDemo.ets --&amp;gt;&amp;lt;/span&amp;gt; [[Mobile_Testing_Tutorial/en#First_steps_with_Android|First steps with Android]]&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsIOS&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m03_expeccoMobileDemoIOS.ets --&amp;gt;&amp;lt;/span&amp;gt; [[Mobile_Testing_Tutorial/en#First_steps_with_iOS|First steps with iOS]]&lt;br /&gt;
&lt;br /&gt;
= Dialogs of the Mobile Testing Plugin =&lt;br /&gt;
== Connection Editor ==&lt;br /&gt;
You can use the Connection Editor to quickly define, change, or establish connections. Depending on the task, the dialog has small differences and is opened differently:&lt;br /&gt;
*If you want to establish a connection, access the dialog in the GUI browser by clicking on &#039;&#039;Connect&#039;&#039; and then selecting &#039;&#039;Mobile Testing&#039;&#039;.&lt;br /&gt;
*To change or copy an existing connection in the GUI browser, select it, right-click and select &#039;&#039;Edit Connection&#039;&#039; or &#039;&#039;Copy Connection&#039;&#039; from the context menu.&lt;br /&gt;
*If you do not want to create connection settings for the GUI browser but for use in a test, choose &#039;&#039;Create Connection Settings&#039;&#039; from the Mobile Testing Plugin menu.... This only allows you to create the settings for a connection without creating a connection in the GUI browser.&lt;br /&gt;
&lt;br /&gt;
The Connection Editor menu has several buttons, some of which are only visible when creating connection settings:&lt;br /&gt;
[[Datei:MobileTestingVerbindungseditorMenu.png]]&lt;br /&gt;
#&#039;&#039;Delete Settings&#039;&#039;: Resets all entries. (Only visible when creating settings.)&lt;br /&gt;
#&#039;&#039;Load settings from file&#039;&#039;: Allows to open a saved settings file (*.csf). Its settings are transferred to the dialog. Entries already made without conflict are retained.&lt;br /&gt;
#&#039;&#039;Load settings from attachment&#039;&#039;: Allows you to open an attachment with connection settings from an open project. These settings are applied to the dialog. Entries already made without conflict are retained.&lt;br /&gt;
#&#039;&#039;Save settings to file&#039;&#039; and&lt;br /&gt;
#&#039;&#039;Save settings to attachment&#039;&#039;: Here you can save the entered settings to a file (*.csf) or create them as an attachment in an open project. Both options have a delayed menu in which you can choose to save only a certain part of the settings. (Only visible when creating settings.)&lt;br /&gt;
#&#039;&#039;Advanced View&#039;&#039;: Allows you to switch to the advanced view to make additional settings. Read more about this at the end of this chapter. (Only visible when creating settings.)&lt;br /&gt;
#&#039;&#039;Help&#039;&#039;: A help text for the respective step is shown or hidden on the right side.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The dialog is divided into three steps. In the first step you select the device you want to use, in the second step you select which App should be used and in the last step the settings for the Appium server are made.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep1&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Step 1: Select Device ===&lt;br /&gt;
In the upper part you will see a list of all connected Appium devices that are detected. With the checkbox below you can hide devices that are detected but not ready. If you want to enter a device that is not connected, you can create it with the corresponding button &#039;&#039;Enter Android device&#039;&#039; or &#039;&#039;Enter iOS device&#039;&#039;. However, you need to know the required properties of your device. The device is then created in a second device list and can be selected there. If no list with connected elements can be displayed, various messages are displayed instead:&lt;br /&gt;
*No devices found&lt;br /&gt;
*:expecco could not find any Android devices.&lt;br /&gt;
*:To automatically configure a connection to a device, make sure&lt;br /&gt;
*:*it is connected&lt;br /&gt;
*:*it is turned on&lt;br /&gt;
*:*that it has an appropriate adb driver installed&lt;br /&gt;
*:*it is enabled for debugging (see below).&lt;br /&gt;
*No available devices found&lt;br /&gt;
*:expecco could not find any available Android devices. But not available ones were found, e.g. with the status &amp;quot;unauthorized&amp;quot;.&lt;br /&gt;
*:To configure a connection to a device automatically, make sure that &lt;br /&gt;
*:*it is connected&lt;br /&gt;
*:*it is turned on&lt;br /&gt;
*:*that it has an appropriate adb driver installed&lt;br /&gt;
*:*it is enabled for debugging (see below).&lt;br /&gt;
*:To view unavailable devices, enable this option below.&lt;br /&gt;
*Connection lost&lt;br /&gt;
*:expecco has lost the connection to the adb server. Try to re-establish the connection by clicking on the button.&lt;br /&gt;
*Connection failed&lt;br /&gt;
*:expecco could not connect to the adb server. Possibly it is not running or the specified path is not correct.&lt;br /&gt;
*:Check the adb configuration in the settings and try to start the adb server and establish a connection by clicking on the button.&lt;br /&gt;
*Connect ...&lt;br /&gt;
*:expecco connects to the adb server. This may take a few seconds.&lt;br /&gt;
*Start adb-Server ...&lt;br /&gt;
*:expecco starts the adb-Server. This may take a few seconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--With &#039;&#039;Automation by&#039;&#039; you can specify, which automation engine is to be used. If you leave the setting at &#039;&#039;(Default)&#039;&#039; the corresponding capability is not set at all. Otherwise Appium, Selendroid and from expecco 2.11 XCUITest are available. Selendroid is usually only used for Android devices prior to version 4.1.--&amp;gt;With &#039;&#039;Next&#039;&#039; you get to the next step. If you enter settings for the GUI browser, this is only possible once a device has been selected.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;UnlockingDeveloperOptions&amp;quot;&amp;gt;Note on unlocking&amp;lt;/span&amp;gt;: In newer Android versions the developer options are no longer offered in the settings at first. If your Android device does not show an entry for &amp;quot;&#039;&#039;Developer options&#039;&#039;&amp;quot; in the settings, first select the entry &amp;quot;&#039;&#039;Phone info&#039;&#039;&amp;quot;, then &amp;quot;&#039;&#039;SoftwareVersionsInfo&#039;&#039;&amp;quot; and click on the entry &amp;quot;&#039;&#039;BuildVersion&#039;&#039;&amp;quot; several times.&lt;br /&gt;
&lt;br /&gt;
==== Manage Chromedrivers ====&lt;br /&gt;
If the App you want to automate uses WebViews with Chrome, Appium needs to have access to an appropriate Chromedriver. If you have selected a device in the list, you can use &amp;quot;&#039;&#039;Manage Chromedrivers&#039;&#039;&amp;quot; to see, which Chrome versions are installed on the device and which Chromedriver versions are provided by expecco. With this dialog you can also download required Chromedriver versions. Beware that there may be several Chrome versions on the device. An App doesn&#039;t have to use the version of the installed Chrome browser for its WebViews. The Chromedriver you use should fit your app for everything to work properly. You can also change the path to the Chromedriver in the capabilities generated at the end of the connection editor.&lt;br /&gt;
&lt;br /&gt;
==== Connect WiFi Android Device ====&lt;br /&gt;
&lt;br /&gt;
You can connect to Android devices using WiFi as well. In this case, the device has to be connected to ADB first, see [[Mobile_Testing_Plugin/en#Connection_via_WLAN|Connection via WLAN]]. Since expecco 22.1, the connection editor provides a dialog helping to set this up, which can be used instead of the command window. For devices using Android 11 or newer, you can pair the device with your machine here by specifying the appropriate parameters and then establish the connection by specifying the IP address and port. You can also use this to establish a wireless connection for devices that are connected via USB. When you select the corresponding device in the list, the required information is read out automatically.&lt;br /&gt;
&lt;br /&gt;
Note that establishing a wireless connection is not part of the connection settings. If you want to establish a new connection with the generated settings, you must make sure that the device is connected to ADB with the specified IP address and port so that it can be found. The ADB connection will be lost if the ADB server or the device are restarted. The permission for wireless debugging is also often reset when the device is restarted and the debug port can then change. Therefore, a wireless connection must always be established manually.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep2&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Step 2: Select App===&lt;br /&gt;
Here you can enter information about the app to be tested. You can decide if you want to use an app that is already installed on the device or if you want to install an app for the test. Select the appropriate tab above. Depending on whether you selected an Android or an iOS device in the previous step, the required input will change.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Android&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App on Device&#039;&#039;&lt;br /&gt;
**:If you have selected a connected device in the first step, the packages of all installed apps are automatically retrieved and you can select from the drop-down lists. The installed apps are divided into third-party packages and system packages; select the appropriate package list. This selection does not belong to the settings, but only provides the corresponding package list. You can use the filter to further narrow down the list and then select the desired package. The activities of the selected package are also automatically retrieved and made available as a drop-down list. Select the activity you want to start. As a rule, an activity is automatically entered from the list. If you are not using a connected device, you must enter the package and the activity manually.&lt;br /&gt;
**&#039;&#039;Install App&#039;&#039;&lt;br /&gt;
**:Under &#039;&#039;App&#039;&#039;, enter the path to an app. The path must be valid for the Appium server being used. You can also specify a URL. If you are using a local Appium server, you can use the right button to navigate to the App installation file and enter this path. If possible, the corresponding package and the activity are also entered in the fields below. However, this entry is not necessary.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;iOS&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App on Device&#039;&#039;&lt;br /&gt;
**:Specify the bundle ID of an installed app. You can find out the IDs of the installed apps using Xcode, for example. Start Xcode and select &#039;&#039;Devices&#039;&#039; from the menu bar at the top of the screen in the &#039;&#039;Window&#039;&#039; menu. A window will open displaying a list of connected devices. If you select your device, you will see a list of the apps you have installed in the overview.&lt;br /&gt;
**&#039;&#039;Install App&#039;&#039;&lt;br /&gt;
**:Under &#039;&#039;App&#039;&#039;, enter the path to an app. The path must be valid for the Appium server being used. You can also specify a URL. For the requirements of apps for real devices, please read the section  [[#iOS-Ger.C3.A4t_and_App_Preparing|Preparing an iOS-Device and App]].&lt;br /&gt;
&lt;br /&gt;
In the lower part you can specify whether the app should be reset or uninstalled when the connection is terminated, and whether it should be reset initially. Again, the corresponding capability is not set if you select &#039;&#039;(Default)&#039;&#039;. With &#039;&#039;Next&#039;&#039; you get to the next step.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep3&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Step 3: Server Settings===&lt;br /&gt;
In the last step, a list of all the capabilities that result from your entries in the previous steps is first displayed in the upper part. If you are familiar with Appium and want to set additional capabilities that are not covered by the connection editor, you can click on &#039;&#039;Edit&#039;&#039; to open the extended view. See the section below for more information.&lt;br /&gt;
&lt;br /&gt;
If you enter settings for the GUI browser, you can enter the &#039;&#039;Connection name&#039;&#039; with which the connection is displayed. This is also the name under which devices can use this connection when it is established. If you leave the field blank, a name will be generated. If the box &amp;quot;&#039;&#039;Managed by expecco&#039;&#039;&amp;quot; is checked, expecco will start a local Appium server on a free port, or use a free server that has already been started. To use your own server, turn this feature off and enter the appropriate address. You will get the local default address and already used addresses to choose from.&lt;br /&gt;
&lt;br /&gt;
In older expecco versions the box is labeled &amp;quot;&#039;&#039;Start on demand&#039;&#039;&amp;quot;. In this case, you must also enter an address if you want expecco to start the server. expecco then tries to start an Appium server at the given address when connecting, if none is running there yet. This server will then also be shut down when the connection is terminated. This only works for local addresses. Make sure that you only use port numbers that are free. It is best to only use odd port numbers from the standard port 4723. The following port number is also used when establishing a connection, which could otherwise lead to conflicts.&lt;br /&gt;
&lt;br /&gt;
Depending on how you opened the dialog, there are now different buttons to close it. In any case you have the option to save. This opens a dialog where you can either select an open project to save the settings there as an attachment, or choose to save it to a file that you can then specify. Saving does not close the dialog, allowing you to select another option.&lt;br /&gt;
&lt;br /&gt;
If you have opened the editor for establishing a connection, you can finally click on &#039;&#039;Connect&#039;&#039; or &#039;&#039;Start and connect server&#039;&#039;, depending on whether the check mark for server start is set. For changing or copying a connection in the GUI Browser, this option is called &#039;&#039;Apply&#039;&#039;, since in this case only the connection entry is changed or created, but the connection setup is not started. If necessary, you can do this afterwards via the context menu. If you have changed capabilities of an existing connection, a dialog then prompts you to decide whether these changes should be applied directly by closing the connection and establishing the new connection or not. In this case, the changes only take effect after you reestablish the connection.&lt;br /&gt;
&lt;br /&gt;
To use the connection editor, also read the corresponding section in the respective tutorial in step 1. (Android: [[Mobile_Testing_Tutorial/en#Step_1:_Run_Demo|Run Demo]], iOS: [[Mobile_Testing_Tutorial/en#Step_1:_Run_Demo_2|Run Demo]]).&lt;br /&gt;
&lt;br /&gt;
===Extended View===&lt;br /&gt;
The extended view of the connection editor can be obtained either by clicking on &#039;&#039;Edit&#039;&#039; in the third step or at any time via the corresponding menu item if you have started the editor via the plugin menu. This view displays a list of all configured Appium Capabilities. You can add, change or remove further entries to this list. To add a capability, select it from the drop-down list of the input field. In this list all known capabilities are sorted into the categories &#039;&#039;Common&#039;&#039;, &#039;&#039;Android&#039;&#039; and &#039;&#039;iOS&#039;&#039;. If you have selected a capability, a short information text is displayed. You can also enter a capability manually in the field. Then click on &#039;&#039;Add&#039;&#039; to add the capability to the list. There you can set the value in the right column. To delete an entry, select it and click on &#039;&#039;Remove&#039;&#039;. With &#039;&#039;Back&#039;&#039; you leave the extended view.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingErweiterteAnsicht.png]]&lt;br /&gt;
&lt;br /&gt;
== Running Appium Servers ==&lt;br /&gt;
In the menu of the Mobile Testing Plugin you will find the entry &#039;&#039;Appium-Server...&#039;&#039;. This opens a window with an overview of all Appium servers started by expecco and on which port they are running. By clicking on the icon in the column &#039;&#039;Show Log&#039;&#039; you can view the logfile of the corresponding server. This is deleted when the server is shut down. With the icons in the column &#039;&#039;Exit&#039;&#039; the corresponding server can be terminated. However, this is prevented if expecco still has an open connection via this server. The rightmost column shows for which connection the server is in use. If it reads &#039;&#039;&amp;lt;idle&amp;gt;&#039;&#039;, the server is currently not used by expecco.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAppiumServer.png]]&lt;br /&gt;
&lt;br /&gt;
When opening the editor to start an Appium connection, an Appium server is started immediately to speed up the connection process. For this purpose, expecco always keeps one idle running Appium server. Additional running servers however, which are not in use anymore, will be terminated automatically after a while.&lt;br /&gt;
&lt;br /&gt;
In the menu of the Mobile Testing Plugin you will also find the entry &#039;&#039;Close all Connections and Servers&#039;&#039;. This is intended for cases where connections or servers cannot be terminated in any other way. If possible, always terminate connections in the GUI browser or by executing a corresponding block. Servers that you have started in the server overview should be terminated there; servers that were started with a connection are automatically terminated with this connection.&lt;br /&gt;
&lt;br /&gt;
Note that only servers started and managed by expecco are listed in the overview. Possible other Appium servers that were started in a different way are not recognized.&lt;br /&gt;
&lt;br /&gt;
== Recorder ==&lt;br /&gt;
If the GUI browser is connected to a device, the integrated recorder can be used to record a test section with that device. To start the recorder, select the appropriate connection in the GUI browser and click the Record button. A new window opens for the recorder. The recorded actions are created in the GUI browser work area. It is therefore possible to edit the recorded data in parallel.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingRecorder.png|caption|]]&lt;br /&gt;
&lt;br /&gt;
====Components of the Recorder Window====&lt;br /&gt;
#&#039;&#039;&#039;Continue/Pause Recording&#039;&#039;&#039;: You can pause the recording by clicking the right icon. You will then see a large pause sign in the view. All actions that you perform now in the recorder are executed, but no blocks are recorded. You can switch back to normal recording mode by clicking the left icon.&lt;br /&gt;
#&#039;&#039;&#039;Stop Recording&#039;&#039;&#039;: Stops the recording and closes the recorder window.&lt;br /&gt;
#&#039;&#039;&#039;Update&#039;&#039;&#039;: Gets the current image and element tree from the device. This is necessary if the device takes longer to execute an action or if something changes without being triggered by the recorder. Since expecco 21.2, there is an additional submenu here that can be used to enable automatic update by checking for changes in the background (see also &#039;&#039;Automatic Update&#039;&#039; further below).&lt;br /&gt;
#&#039;&#039;&#039;Follow Mouse&#039;&#039;&#039;: Select the element under the mouse pointer in the GUI browser.&lt;br /&gt;
#&#039;&#039;&#039;Element Highlighting&#039;&#039;&#039;: The element under the mouse is outlined in red.&lt;br /&gt;
#&#039;&#039;&#039;Show Elements&#039;&#039;&#039;: Show the borders of all elements in the view.&lt;br /&gt;
#&#039;&#039;&#039;Tools&#039;&#039;&#039;: Selection, which  tool is used for recording. The selected action is triggered with each click on the view. The following actions are available:&lt;br /&gt;
#*Element Actions:&lt;br /&gt;
#**Click: Short click on the element under cursor. To determine more precisely which element is used, use the Follow Mouse or Element Highlighting function.&lt;br /&gt;
#**Tap with Duration (Element): Similar to click, except that the duration of the click will be recorded as well. This allows the recording of long clicks.&lt;br /&gt;
#**Tap with Position (Element): Similar to click, but additionally records the position inside the element. The position can be recorded relative to the element size or, when pressing Ctrl while clicking, as absolute position from the upper left corner of the element.&lt;br /&gt;
#**Set Text: Allows to set the text of an input field.&lt;br /&gt;
#**Clear Text: Clears the text of an input field.&lt;br /&gt;
#*Device Actions:&lt;br /&gt;
#**Tap (Screen): Triggers a click at the screen position.&lt;br /&gt;
#**Tap with Duration (Screen): Triggers a click at the screen position, which also considers the duration.&lt;br /&gt;
#**Swipe: Swipe in a straight line from the point where you press the mouse button until you release it. The duration is also recorded.&lt;br /&gt;
#:Please note for this actions that the result may differ on different devices, e.g. with different screen resolutions.&lt;br /&gt;
#*Test Flow Blocks&lt;br /&gt;
#**Check Attribute: Compares the value of a specified attribute of the element with a predefined value. The result triggers the corresponding output.&lt;br /&gt;
#**Assert Attribut: Compares the value of a specified attribute of the element with a predefined value. If the values are not equal, the test fails.&lt;br /&gt;
#**Get Attribute: Gets the current value of a specified attribute of the element.&lt;br /&gt;
#*Auto&lt;br /&gt;
#:If the Auto tool is selected, you can use all actions by specific input methods: &#039;&#039;Click&#039;&#039;, &#039;&#039;Tap Element&#039;&#039; and &#039;&#039;Swipe&#039;&#039; still work by clicking, but are distinguished by the duration and movement of the cursor. To trigger a &#039;&#039;Tap&#039;&#039;, hold down Ctrl while clicking. The remaining actions are available in a context menu by right-clicking on the element.&lt;br /&gt;
#&#039;&#039;&#039;Context Actions&#039;&#039;&#039;: Here you can record actions concerning contexts:&lt;br /&gt;
#*Switch to Context: Shows a list of all currently available contexts and you can select to which one you want to switch.&lt;br /&gt;
#*Get Current Context: Gets the handle of the current context.&lt;br /&gt;
#*Get Context Handles: Gets a list of all currently available contexts.&lt;br /&gt;
#&#039;&#039;&#039;Softkeys&#039;&#039;&#039;: Only for Android. Simulates pressing the buttons Back, Home, Menu and Power.&lt;br /&gt;
#&#039;&#039;&#039;Home Button&#039;&#039;&#039;: Only for iOS since expecco 2.11. Allows pressing the Home button.Prior to expecco 19.2, it only works if AssistiveTouch is activated and the menu is located in the middle of the upper screen border. From expecco 19.2 on, the function no longer uses AssistiveTouch.&lt;br /&gt;
#&#039;&#039;&#039;Help&#039;&#039;&#039;: Opens this online documentation on the general page about [[GuiBrowser_Recorder/en|GUI Browser recorders]].&lt;br /&gt;
#&#039;&#039;&#039;View&#039;&#039;&#039;: Shows a screenshot of the device. Actions are triggerd by mouse depending on the selected tool. If a new action can be recorded, the window has a green frame, else it is red.&lt;br /&gt;
#&#039;&#039;&#039;Resize Window to Image&#039;&#039;&#039;: Resizes the recorder window so that the screenshot can be displayed completely.&lt;br /&gt;
#&#039;&#039;&#039;Resize Image to Window&#039;&#039;&#039;: Scales the screenshot to a size that makes use of the full size of the window.&lt;br /&gt;
#&#039;&#039;&#039;Adjust Display&#039;&#039;&#039;: Opens a dialog to adjust the displayed image, if expecco does not show it right. You can correct the scaling or rotate the image by 90°.&lt;br /&gt;
#&#039;&#039;&#039;Correct Orientation&#039;&#039;&#039;: Corrects the image if it is upside down. Using the arrow to the right, the image can also be rotated by 90°, if this should ever be necessary. Since expecco 19.1 you find this functionality under &#039;&#039;Adjust Display&#039;&#039;. The orientation of the image is irrelevant for the functionality of the recorder, it only works on the elements it receives.&lt;br /&gt;
#&#039;&#039;&#039;Scaling&#039;&#039;&#039;: Changes the scaling of the screenshots.&lt;br /&gt;
#&#039;&#039;&#039;Messages&#039;&#039;&#039;: Shows the path of the current selected element or other messages. It has a context menu to show a list of previous messages.&lt;br /&gt;
&lt;br /&gt;
====Usage====&lt;br /&gt;
Each click in the window triggers an action and is recorded in the workspace of the GUI browser. There you can run, edit, or create a new block from what you have recorded. You find the actions to trigger softkeys directly in the menu bar (see above). To record actions on elements, either change the selection of the tool in the menu bar (see above) and then click on the element or select the corresponding action from the context menu by right-clicking on the corresponding element. For text input it is also possible to place the cursor over the element and enter the text. This opens the input dialog for this action. On how to use the recorder, see also step 2 in the tutorial ([[Mobile_Testing_Tutorial/en#Step_2:_Creating_a_Block_with_the_Recorder|Android]] resp. [[Mobile_Testing_Tutorial/en#Step_2:_Creating_a_block_with_the_Recorder_2|iOS]]).&lt;br /&gt;
&lt;br /&gt;
====Hide elements====&lt;br /&gt;
Since expecco 21.2 it is also possible to hide the selected element in the recorder from the context menu. This means that this element cannot be selected from now on. This function is useful for ignoring elements that are in the foreground to be able to access elements below them. To undo this state, you have to find the corresponding element in the tree of the GUI browser, which also has such an entry in the context menu.&lt;br /&gt;
&lt;br /&gt;
====Automatic Update====&lt;br /&gt;
The recorder doesn&#039;t show a live image of the device, but only a snapshot. Therefore an update is needed after changes to match what is displayed on the device. The recorder updates automatically after executing an action. Since expecco 20.2 there are further automatic updates possible. You can enable the, in the menu &amp;quot;View&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
One option is, to check after an action has been executed, if there are further changes after the first update. If so, a second update is triggered. This shall fix the problem, that the recorder is not up to date after an action, because the update has been done too early.&lt;br /&gt;
&lt;br /&gt;
The second option is to enable a periodical update. After a set interval the recorder is automatically updated if there are changes. Thereby the recorder view is mostly up to date, but this causes an overhead regarding the communication to the device.&lt;br /&gt;
&lt;br /&gt;
== AVD Manager und SDK Manager ==&lt;br /&gt;
AVD Manager und SDK Manager sind beides Anwendungen von Android. Im Menü des Mobile Testing Plugins bietet expecco die Möglichkeit, diese zu starten. Ansonsten finden Sie diese Programme bei Ihrer Android-Installation. Mit dem AVD Manager können Sie AVDs, also Konfigurationen für Emulatoren, erstellen, bearbeiten und starten. Mit dem SDK Manager erhalten Sie einen Überblick über Ihre Android-Installation und können diese bei Bedarf erweitern.&lt;br /&gt;
&lt;br /&gt;
= Hybrid Apps and WebViews =&lt;br /&gt;
&#039;&#039;&#039;!!! IMPORTANT NOTICE - If you have problems switching to the webview, please set the &amp;quot;Default Application - Browser App&amp;quot; in Android Settings to &amp;quot;Chrome&amp;quot; !!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hybrid apps contain platform native elements as well as other elements that are integrated in a WebView. These elements can also be used, but you first have to switch to the corresponding context. With the block &#039;&#039;Get Current Context&#039;&#039; you get the current context. Initially this is &#039;&#039;NATIVE_APP&#039;&#039;, i.e. the context of the native elements. With the block &#039;&#039;Get Context Handles&#039;&#039; you get a collection of all existing contexts. If there is a WebView context, it is called &#039;&#039;WEBVIEW_1&#039;&#039; or &#039;&#039;WEBVIEW_&amp;lt;package&amp;gt;&#039;&#039; with the package of the WebView. Several WebView contexts are also possible. For each WebView context, there is a corresponding WebView element in the native context. You can use the &#039;&#039;Switch to Context&#039;&#039; block to switch to such a context and from now on only have access to the elements in this context.&lt;br /&gt;
&lt;br /&gt;
In the GUI browser, the existing contexts are displayed at the top of the tree as well as the tree of a context is inserted below the corresponding WebView element.&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span id=&amp;quot;Customizing XPath using the GUI Browsers&amp;quot;&amp;gt;&amp;lt;!-- name before 01.10.2020--&amp;gt;&amp;lt;/span&amp;gt;Customizing XPath using the GUI Browser=&lt;br /&gt;
Bausteine, die auf einem Gerät fehlerfrei funktionieren, tun dies auf anderen Geräten möglicherweise nicht. Auch können kleine Änderungen der App dazu führen, dass ein Baustein nicht mehr den gewünschten Effekt hat. Man sollte einen Baustein daher so robust formulieren, dass er für eine Vielzahl von Geräten verwendet werden kann und kleine Anpassungen an der App verkraftet. Dazu muss man das grundlegende Funktionsprinzip der Adressierung verstehen. Dies wird im Folgenden am Beispiel der App aus dem Tutorial erläutert.&lt;br /&gt;
&lt;br /&gt;
Die Ansicht der App setzt sich aus einzelnen Elementen zusammen. Dazu gehören die Schaltflächen &#039;&#039;GTIN-13 (EAN-13)&#039;&#039; und &#039;&#039;Verify&#039;&#039;, das Eingabefeld der Zahl &#039;&#039;4006381333986&#039;&#039; und das Ergebnisfeld, in dem OK erscheint, wie auch alle anderen auf der Anzeige sichtbaren Dinge. Diese sichtbaren Elemente sind in unsichtbare Strukturelemente eingebettet. Alle Elemente zusammen sind in einer zusammenhängenden Hierarchie, dem Elementbaum, organisiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingGUIBrowser.png | frame | left | Abb. 1: Funktionen des GUI-Browsers]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
Sie können sich diesen Baum im GUI-Browser ansehen. Wechseln Sie dazu in den GUI-Browser (Abb. 1) und starten Sie eine beliebige Verbindung. Sobald die Verbindung aufgebaut ist, können Sie den gesamten Baum aufklappen (1) (Klick bei gedrückter Strg-Taste). Er enthält alle Elemente der aktuellen Seite der App.&lt;br /&gt;
&lt;br /&gt;
Ein Baustein, der nun ein bestimmtes Element verwendet, muss dieses eindeutig angeben, indem er dessen Position im Elementbaum mit einem Pfad im XPath-Format beschreibt. Dieses Format ist ein verbreiteter Web-Standard für XML-Dokumente und -Datenbanken, eignet sich aber genauso für Pfade im Elementbaum.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie ein Element im Baum auswählen, wird unten der von expecco automatisch generierte XPath (2) für das Element angezeigt, der auch beim Aufzeichnen verwendet wird. Oberhalb davon in der Mitte des Fensters befindet sich eine Liste der Eigenschaften (3) des ausgewählten Elements. Man nennt diese Eigenschaften auch Attribute. Sie beschreiben das Element näher wie beispielsweise seinen Typ, seinen Text oder andere Informationen zu seinem Zustand. Links unten können Sie zur besseren Orientierung im Baum die &#039;&#039;Vorschau&#039;&#039; (4) aktivieren, um sich den Bildausschnitt des Elements anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Der Elementbaum für gleiche Ansicht einer App kann sich je nach Gerät unterscheiden. Es sind diese Unterschiede, die verhindern, eine Aufnahme von einem Gerät unverändert auch auf allen anderen Geräten abzuspielen: Ein XPath, der im einen Elementbaum ein bestimmtes Element identifiziert, beschreibt nicht unbedingt das gleiche Element im Elementbaum auf einem anderen Gerät. Es kann stattdessen passieren, dass der XPath auf kein Element, auf ein falsches Element oder auf mehrere Elemente passt. Dann schlägt der Test fehl oder er verhält sich unerwartet.&lt;br /&gt;
&lt;br /&gt;
Man könnte natürlich für jedes Gerät einen eigenen Testfall schreiben. Das brächte aber unverhältnismäßigen Aufwand bei Testerstellung und -wartung mit sich. Das Problem lässt sich auch anders lösen, da ein jeweiliges Element nicht nur durch genau einen XPath beschrieben wird. Vielmehr erlaubt der Standard mithilfe verschiedener Merkmale unterschiedliche Beschreibungen für ein und dasselbe Element zu formulieren. Das Ziel ist daher, einen Pfad zu finden, der auf allen für den Test verwendeten Geräten funktioniert und überall eindeutig zum richtigen Element führt.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel besteht die Verbindung zur Android-App aus dem Tutorial und der Eintrag des GTIN-13-Buttons ist ausgewählt (5). Dessen automatisch generierter XPath (2) kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[@resource id=&#039;android:id/content&#039;]/android.widget.RelativeLayout/android.widget.Button[@resource-id=&#039;de.exept.expeccomobiledemo:id/gtin_13&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Er ist offensichtlich lang und unübersichtlich. Der sehr viel kürzere Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@text=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
führt zum selben Element.&lt;br /&gt;
&lt;br /&gt;
Für die iOS-App lautet der automatisch generierte XPath für diesen Button beispielsweise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/XCUIElementTypeApplication/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/UIAApplication/UIAWindow[1]/UIAButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und kann kürzer als&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@name=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Sie können den Pfad entsprechend im GUI-Browser ändern und durch &#039;&#039;Pfad überprüfen&#039;&#039; (6) feststellen, ob er weiterhin auf das ausgewählte Element zeigt, was expecco mit &#039;&#039;Verify Path: OK&#039;&#039; (7) bestätigen sollte. Der erste, sehr viel längere Pfad, beschreibt den gesamten Weg vom obersten Element des Baumes bis hin zum gesuchten Button. Der zweite Pfad hingegen wählt mit * zunächst sämtliche Elemente des Baumes und schränkt die Auswahl dann auf genau die Elemente ein, die ein &#039;&#039;text&#039;&#039;- bzw. &#039;&#039;name&#039;&#039;-Attribut mit dem Wert &#039;&#039;GTIN-13 (EAN-13)&#039;&#039; besitzen, in unserem Fall also genau der eine Button, den wir suchen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden Android-ähnliche Pfade zur Veranschaulichung verwendet. Die Elemente in iOS-Apps heißen zwar anders, wodurch andere Pfade entstehen; das Prinzip ist jedoch das gleiche.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum1.png | frame | Abb. 2: Elementbaum einer fiktiven App]]&lt;br /&gt;
&lt;br /&gt;
Sie können solche Pfade mit Hilfe weniger Regeln selbst formulieren. Sehen Sie sich den einfachen Baum einer fiktiven Android-App in Abb. 2 an: Die Einrückungen innerhalb des Baumes geben die Hierarchie der Elemente wieder. Ein Element ist ein &#039;&#039;Kind&#039;&#039; eines anderen Elementes, wenn jenes andere Element das nächsthöhere Element mit einem um eins geringeren Einzug ist. Jenes Element ist das &#039;&#039;Elternelement&#039;&#039; des Kindes. Sind mehrere untereinander stehende Elemente gleich eingerückt, so sind sie also alle Kinder desselben Elternelements.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad durch alle Ebenen der Hierarchie zum TextView-Element ist nun:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Elemente sind mit Schrägstrichen voneinander getrennt. Es fällt auf, dass der Name des ersten Elements nicht mit dem im Baum übereinstimmt. Das oberste Element in der Hierarchie heißt immer &#039;&#039;hierarchy&#039;&#039; (für iOS wäre es &#039;&#039;AppiumAUT&#039;&#039;), expecco zeigt im Baum stattdessen den Namen der Verbindung an, damit man mehrere Verbindungen voneinander unterscheiden kann. Die weiteren Elemente tragen jeweils das Präfix &#039;&#039;android.widget.&#039;&#039;, das im Baum zur besseren Übersicht nicht angezeigt wird. Bei IOS gibt es kein Präfix, das durch einen Punkt abgetrennt wäre, expecco 2.11 blendet aber entsprechend &#039;&#039;XCUIElementType&#039;&#039; am Anfang aus. Mit jedem Schrägstrich führt der Pfad über eine Eltern-Kind-Beziehung in eine tiefere Hierarchie-Ebene, d. h. &#039;&#039;FrameLayout&#039;&#039; ist ein Kindelement von &#039;&#039;hierarchy&#039;&#039;, &#039;&#039;LinearLayout&#039;&#039; ist ein Kind von &#039;&#039;FrameLayout&#039;&#039; usw. Die in eckigen Klammern geschriebenen Wörter dienen nur als Orientierungshilfe im Baum. Sie gehören nicht zum Typ.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad muss nicht beim Element &#039;&#039;hierarchy&#039;&#039; beginnen. Man kann den Pfad beginnend mit einem beliebigen Element des Baumes bilden. Man kann also verkürzt auch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
schreiben. Der Pfad führt zum selben &#039;&#039;TextView&#039;&#039;-Element, da es nur ein Element dieses Typs gibt. Anders verhält es sich bei dem Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da es zwei Elemente vom Typ &#039;&#039;Button&#039;&#039; gibt, passt dieser Pfad auf zwei Elemente, nämlich den Button, der mit &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; markiert ist, und den &#039;&#039;Button&#039;&#039;, der mit &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; markiert ist. Es würde an dieser Stelle aber auch nicht helfen den langen Pfad von &#039;&#039;hierarchy&#039;&#039; aus beginnend anzugeben. Um einen mehrdeutigen Pfad weiter zu differenzieren, kann man explizit ein Element aus einer Menge wählen, indem man den numerischen Index in eckigen Klammern dahinter schreibt. Der Pfad aus dem obigen Beispiel lässt sich damit so anpassen, dass er eindeutig auf den &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; weist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[1].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ihnen fällt sicher auf, dass der Index eine 1 ist obwohl das zweite Element gemeint ist. Das kommt daher, dass die Zählung bei 0 beginnt. Der Button mit der Markierung &amp;quot;An&amp;quot; hat also die Nummer 0 und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Nummer 1.&lt;br /&gt;
&lt;br /&gt;
Dieser Ansatz, einen expliziten Index zu verwenden, hat zwei Nachteile: Zum einen lässt sich an dem Pfad nur schwer ablesen welches Element gemeint ist, zum andern ist der Pfad sehr empfindlich schon gegenüber kleinsten Änderungen, wie zum Beispiel dem Vertauschen der beiden &#039;&#039;Button&#039;&#039;-Elemente oder dem Einfügen eines weiteren &#039;&#039;Button&#039;&#039;-Elements in der App.&lt;br /&gt;
&lt;br /&gt;
Es wäre daher wünschenswert, das gemeinte Element über eine ihm charakteristische Eigenschaft wie einen Attributwert, zu adressieren. Für Android-Apps eignet sich hierfür häufig das Attribut &#039;&#039;resource-id&#039;&#039;. Im Idealfall muss bei der Entwicklung der App darauf geachtet werden, dass jedes Element eine eindeutige Id erhält. Die &#039;&#039;resource-id&#039;&#039; hat den großen Vorteil, dass sie unabhängig vom Text des Elements oder der Spracheinstellung des Geräts ist. Für iOS-Apps kann entsprechend das Attribut &#039;&#039;name&#039;&#039; verwendet werden, wenn es von der App sinnvoll gesetzt wird. Der XPath-Standard erlaubt solche Auswahlbedingungen zu einem Element anzugeben. Angenommen, der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Eigenschaft &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;off&#039;&#039; und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; hat als &#039;&#039;resource-id&#039;&#039; den Wert &#039;&#039;on&#039;&#039;, dann kann man als eindeutigen Pfad für den &amp;quot;Aus&amp;quot;-&#039;&#039;Button&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[@resource-id=&#039;off&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
formulieren. Wie an dem Beispiel zu sehen werden solche Bedingungen wie ein Index in eckigen Klammern an den Elementtyp angehängt. Der Name eines Attributes wird mit einem @ eingeleitet und der Wert mit einem = in Anführungszeichen angehängt. Ist der Attributwert global eindeutig, kann man den vorausgehenden Pfad sogar durch den globalen Platzhalter * ersetzen, der auf jedes Element passt. Das obige Beispiel mit dem GTIN-13-&#039;&#039;Button&#039;&#039; war ein solcher Fall.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum2.png | frame | Abb. 3: Elementbaum einer fiktiven App mit Erweiterungen]]&lt;br /&gt;
&lt;br /&gt;
Abb. 3 zeigt eine Erweiterung des Beispiels aus Abb. 2. Die App hat nun ein weiteres, nahezu identisches &#039;&#039;LinearLayout&#039;&#039; bekommen. Die &#039;&#039;Buttons&#039;&#039; sind in ihren Attributen jeweils ununterscheidbar. Deshalb funktioniert der vorige Ansatz nicht, einen eindeutigen Pfad nur mithilfe eines Attributwerts zu formulieren. Offensichtlich unterscheiden sich aber ihre benachbarten &#039;&#039;TextViews&#039;&#039;. Es ist möglich die jeweilige &#039;&#039;TextView&#039;&#039; in den Pfad mit aufzunehmen, um einen &#039;&#039;Button&#039;&#039; dennoch eindeutig zu adressieren. Ein Pfad zum &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; unterhalb der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; kann dabei wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView[@resource-id=&#039;push&#039;]/../android.widget.Button[@resource-id=&#039;on&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Teil beschreibt den Pfad zu der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; und der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;push&#039;&#039;. Danach folgt ein Schrägstrich gefolgt von zwei Punkten. Die zwei Punkte sind eine spezielle Elementbezeichnung, die nicht ein Kindelement benennt, sondern zum Elternelement wechselt, in diesem Fall also das &#039;&#039;LinearLayout&#039;&#039;, in dem die &#039;&#039;TextView&#039;&#039; eingebettet ist. Im Kontext dieses &#039;&#039;LinearLayout&#039;&#039; ist der restliche Pfad, nämlich der &#039;&#039;Button&#039;&#039; mit der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;on&#039;&#039;, eindeutig.&lt;br /&gt;
&lt;br /&gt;
Der XPath-Standard bietet noch sehr viel mehr Ausdrucksmittel. Mit der hier knapp vorgestellten Auswahl ist es aber bereits möglich für die meisten praktischen Testfälle gute Pfade zu formulieren. Eine vollständige Einführung in XPath ginge über den Umfang dieser Einführung weit hinaus. Sie finden zahlreiche weiterführende Dokumentationen im Web und in Büchern.&lt;br /&gt;
&lt;br /&gt;
Eine universelle Strategie zum Erstellen guter XPaths gibt es nicht, da sie von den Testanforderungen abhängt. In der Regel ist es sinnvoll, den XPath kurz und dennoch eindeutig zu halten. Häufig lassen sich Elemente über Eigenschaften identifizieren wie beispielsweise ihren Text. Will man aber gerade den Text eines Elements auslesen, kann dieser natürlich nicht im Pfad verwendet werden, da er vorher nicht bekannt ist. Ebenso wird der Text variieren, wenn die App mit verschiedenen Sprachen gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Jeder Baustein, der auf einem Element arbeitet, hat einen Eingangspin für den XPath. Im GUI-Browser finden Sie in der Mitte oben eine Liste von Bausteinen mit Aktionen, die Sie auf das ausgewählte Element anwenden können. Suchen Sie den Baustein &#039;&#039;Click&#039;&#039; (8) im Ordner Elements und wählen Sie ihn aus (Abb. 1). Er wird im rechten Teil unter &#039;&#039;Test&#039;&#039; eingefügt, der Pin für den XPath ist mit dem automatisch generierten Pfad des Elements vorbelegt (9). Sie können den Baustein hier auch ausführen. Die Ansicht wechselt dann auf &#039;&#039;Lauf&#039;&#039;. Ändert sich durch die Aktion der Zustand Ihrer App, müssen Sie den Baum anschließend aktualisieren (10).&lt;br /&gt;
&lt;br /&gt;
Wenn Sie in der unteren Liste eine Eigenschaft auswählen, wechselt die Anzeige der Bausteine zu &#039;&#039;Eigenschaften&#039;&#039;, wo Sie die eigenschaftsbezogenen Bausteine finden. Wie bei den Aktionen können Sie auch hier einen Baustein auswählen, der dann rechts in Test mit dem Pfad des Elements und der ausgewählten Eigenschaft eingetragen wird, sodass Sie ihn direkt ausführen können.&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span id=&amp;quot;troubleshooting&amp;quot;&amp;gt;&amp;lt;!-- Referenced by error dialog on connection error --&amp;gt;&amp;lt;/span&amp;gt;Problems and Solutions=&lt;br /&gt;
== Locators depend on the version or are variable ==&lt;br /&gt;
In this case consider to either store the locators (xPath) in a variable or to define a locator mapping inside a screenplay attachment. It is also possible to store just parts of an locator (e.g. locator path of a parent or attribute value) in a variable and add them in the freeze value of the locator pin by &amp;quot;&#039;&#039;$(varName)&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Invisible UI Elements ==&lt;br /&gt;
Note that the [[#Recorder|Recorder]] also considers items that you cannot see on the screen. Therefore, turn on element highlighting or use the follow mouse function and the element tree in the GUI browser to determine if the correct element is used. It can happen, that invisible elements are in front of other elements and cover them, so that the desired element cannot be selected in the recorder. See section [[#Hide_elements|Hide elements]] for a solution to this.&lt;br /&gt;
&lt;br /&gt;
== iOS: Cable not certified ==&lt;br /&gt;
In some cases, when connecting an iOS device via USB, a message appears indicating that the cable used is not certified. In this case, replacing the respective cable is the only solution.&lt;br /&gt;
&lt;br /&gt;
== iOS: Alerts when connecting ==&lt;br /&gt;
Make sure that no alerts are open when connecting to an iOS device. Otherwise the connection will fail because the app cannot be brought to the foreground. See also [[#Preparing_an_iOS-Device_and_App|Preparing an iOS-Device and App]].&lt;br /&gt;
&lt;br /&gt;
== iOS: .ipa cannot be installed ==&lt;br /&gt;
Note that on iOS simulators no &#039;&#039;.ipa&#039;&#039; files can be installed but only &#039;&#039;.app&#039;&#039; files.&lt;br /&gt;
&lt;br /&gt;
==iOS: First Connect is not working==&lt;br /&gt;
If there is not already a signed build of the WebDriverAgent on your Mac, it has to be created during the first connect. Usually, this can take a little longer than one minute. Per default Appium uses a timeout of 60000&amp;amp;nbsp;ms to wait for the WebDriverAgent to start on the device, so the connect will be canceled in that case. You can set this timeout with the capability &#039;&#039;wdaLaunchTimeout&#039;&#039;, e.g. to &#039;&#039;120000&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Moreover, the signing settings have to be correct. In our experience, the most reliable solution is to set automatic signing in the WebDriverAgent Xcode project an selecting the team there. See the explanation in section [[#Signing_WebDriverAgent|Signing WebDriverAgent]] for that. In this case you should &#039;&#039;&#039;not&#039;&#039;&#039; use the capabilities &#039;&#039;xcodeConfigFile&#039;&#039; resp. &#039;&#039;xcodeOrgId&#039;&#039; and &#039;&#039;xcodeSigningId&#039;&#039;, as they could cause a conflict. Caution: If you have set a Team ID in the Mobile Testing settings, expecco will automatically set this as &#039;&#039;xcodeOrgId&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
Pay attention to your device during the first connect. You might have to agree to the installation by entering your password. On the Mac you might need to enter the password to allow access to the key chain for signing, often several times.&lt;br /&gt;
&lt;br /&gt;
== Android: Device not visible in the connect editor ==&lt;br /&gt;
If an Android device connected via USB does not appear in the connection editor, try changing the USB connection type. Usually MTP or PTP should work. Check again, if &amp;quot;USB Debugging&amp;quot; is enabled in the developer options on the device (these options are disabled on some devices and have to be enabled first using a trick.) See also [[#Prepare_Android_Device|Prepare Android Device]].&lt;br /&gt;
&lt;br /&gt;
== Android: Truncated Elements at Bottom ==&lt;br /&gt;
For Android devices that automatically show and hide the navigation bar/softkeys, the recorder may cut off elements in the lower area that would be hidden by the softkeys, even if they are not displayed at this time. In this case it is advisable to set the softkeys so that they are permanently displayed.&lt;br /&gt;
&lt;br /&gt;
For newer Android versions there usually is no such option. Even if the controls are visible all the time, they don&#039;t have their own space, but are on top of the content of the app. Therefore, there is an area on the lower part of the screen, which cannot be automated, because it is not counted to the active area of the app. Appium will then truncate the elements there. This area can even be larger then the needed by the controls. This is a known issue for Samsung devices with Android 11. Since the information about the size of the app area is already provided on Android level, we cannot offer a solution for this, but can only hope that the problem will be fixed by the manufacturer. You may try to get better results by setting the control to gestures, but this bears the same issue.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;waitForIdleTimeout&amp;quot;&amp;gt;&amp;lt;!-- Referenced by expecco--&amp;gt;&amp;lt;/span&amp;gt; Android: Test Hangs While Finding an Element==&lt;br /&gt;
The block &#039;&#039;Find Element by XPath&#039;&#039; and all element blocks wait until an element is present for the given path. The timeout for this can be set either directly at the block or in the environment variables. However, if the element should already be present, but the test doesn&#039;t continue anyway, the reason could be in the UIAutomator/UIAutomator2. It waits for the app to go to the idle state before it even starts to search for the element. This may take longer, if the app e.g. runs an animation in the background or executes other kinds of actions. Fetching the page source, e.g. when updating in the GUI browser or in the recorder, can also take longer for this reason. There is a default timeout of 10 seconds after which it no longer waits for the idle state. This timeout can be set in Appium (waitForIdleTimeout). If you want to change the value of this timeout, you can do this since expecco 21.2 by executing the Smalltalk code &amp;lt;code&amp;gt;AppiumTestRunner::TestRunConnection waitForIdleTimeout:2000&amp;lt;/code&amp;gt; before the test. The timeout is given in milliseconds, so the example sets it to 2 seconds.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;startChromedriverTimeout/&amp;gt;Android: Updating the Tree or Switching to Webview Context takes too long==&lt;br /&gt;
Especially with older devices it can happen that newer Chromedriver cannot be initialized. This makes it impossible to switch to the webview context. However, this is only detected over a timeout by Appium, which is 4 minutes by default. Since expecco also tries to switch to the webview context when building the tree in the GUI browser, this can lead to very long loading times. Since there is no way to decrease this timeout in Appium, we have added a corresponding capability to the version we provide in the MobileTestingSupplement. Starting with version 1.13.1.0 of the [[#Windows|MobileTestingSupplement]], &#039;&#039;chromedriverStartTimeout&#039;&#039; can be used to set the timeout in milliseconds. The switch still doesn&#039;t work then, but expecco doesn&#039;t take as long to update the tree and the context switch module fails faster. The connection dialog adds this capability automatically starting with expecco 22.1. &lt;br /&gt;
&lt;br /&gt;
== No Action on Click ==&lt;br /&gt;
The block to click on an element is successful, but no action was performed on the device.&lt;br /&gt;
:This can happen if the element is hidden by another element and therefore clicking on the element is not possible. In this case, Appium does not throw an error, but simply nothing happens. If you would like to make a click at the position of the element anyways, even if it is hidden, use the block &#039;&#039;Tap&#039;&#039; instead and pass the location of the element to it (&#039;&#039;Get Location&#039;&#039;). If instead you want to check before a click whether the element is hidden at this moment, try whether the properties &#039;&#039;Is Displayed&#039;&#039; or &#039;&#039;Is Enabled&#039;&#039; might help you.&lt;br /&gt;
&lt;br /&gt;
== No Update After Action ==&lt;br /&gt;
An action was triggered on the recorder and a block has been recorded, but the recorder still shows the old image.&lt;br /&gt;
:The recorder doesn&#039;t show a live image of the device, but only a snapshot. After an action has been executed, the recorder will update automatically. However, it can happen, that the image has already been updated before the effects of the action are fully completed on the device. In this case you should update the recorder by hand using the icon with the blue arrows. Since expecco 20.2 you can also enable automatic updates for this case. See also the description for the [[#Recorder|recorder]].&lt;br /&gt;
&lt;br /&gt;
== Attribute &amp;quot;clickable&amp;quot; is wrong ==&lt;br /&gt;
An element has for the attribute/property &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; the value &amp;quot;&#039;&#039;false&#039;&#039;&amp;quot;, but is actually clickable.&lt;br /&gt;
:The attribute &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; has to be set explicitly by the app developer and does not affect the behavior of the app. You should generally disregard this attribute in your tests. Unfortunately, many apps exist where the programmer was &amp;quot;lazy&amp;quot; about this.&lt;br /&gt;
&lt;br /&gt;
==Connecting Fails==&lt;br /&gt;
If the connection to the Appium server fails, you will receive an error message in expecco similar to the one shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:MobileTestingVerbindungsfehler.png]]&lt;br /&gt;
&lt;br /&gt;
Here you can see the type of error that has occurred. Click on &amp;quot;&#039;&#039;Details&#039;&#039;&amp;quot; to get more information. Possible errors are:&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.remote.UnreachableBrowserException&#039;&#039;&lt;br /&gt;
:The specified server is not running or is not reachable. Check the server address.&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.WebDriverException&#039;&#039;&lt;br /&gt;
:Read the message after &#039;&#039;Original Error&#039;&#039; in the first line of the details:&lt;br /&gt;
:*&#039;&#039;Unknown device or simulator UDID&#039;&#039;&lt;br /&gt;
::Either the device is not connected properly or the udid is not correct.&lt;br /&gt;
:*&#039;&#039;Unable to launch WebDriverAgent because of xcodebuild failure: xcodebuild failed with code 65&#039;&#039;&lt;br /&gt;
::This error can have various causes. Either the WebDriverAgent could actually not be built because the signing settings are wrong or the appropriate provisioning profile is missing. Please read the section about [[#Signing|Signing]].  It is also possible that the WebDriverAgent cannot be started on the device, for example because an alert is in the foreground or you did not trust the developer.&lt;br /&gt;
:*&#039;&#039;Could not install app: &#039;Command &#039;ios-deploy [...] exited with code 253&#039;&#039;&#039;&lt;br /&gt;
::The specified app cannot be installed on the iOS device because it is not entered in the app&#039;s Provisioning Profile.&lt;br /&gt;
:*&#039;&#039;Bad app: [...] App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name.&#039;&#039;&lt;br /&gt;
::The path to the app is wrong. Make sure that the file is located in the specified path on your Mac.&lt;br /&gt;
:*&#039;&#039;packageAndLaunchActivityFromManifest failed.&#039;&#039;&lt;br /&gt;
::The specified &#039;&#039;apk&#039;&#039; file is probably broken.&lt;br /&gt;
:*&#039;&#039;Could not find app apk at [...]&#039;&#039;&lt;br /&gt;
::The path to the app is wrong. Make sure that the &#039;&#039;apk&#039;&#039; file is located in the specified path.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the error is not due to one of the causes listed above, the automation applications on the device may no longer function properly. In this case it helps to uninstall them from the mobile device. They are then automatically reinstalled the next time a connection is established.&lt;br /&gt;
&lt;br /&gt;
*For iOS devices, this is the WebDriverAgent, which you can simply uninstall from the home screen. This usually solves problems caused by changing the used Mac or the Xcode version.&lt;br /&gt;
&lt;br /&gt;
*For Android devices, it is the UIAutomator2; here, a problem occurs sporadically on some devices, the cause is currently unknown to us. To uninstall, on the device, navigate to &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;Applications&#039;&#039;&amp;quot;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; and search the list for the following entries:&lt;br /&gt;
    Appium Settings&lt;br /&gt;
    io.appium.uiautomator2.server&lt;br /&gt;
    io.appium.uiautomator2.server.test&lt;br /&gt;
:Click on the respective application and then on &amp;quot;&#039;&#039;Uninstall&#039;&#039;&amp;quot;.&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&#039;&#039;The corresponding entry may have a slightly different name on some devices.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If this doesn&#039;t help, check the output of the Appium server. For a server started by expecco, you can find the log in the list of [[#Running_Appium_Servers|Running Appium Servers]].&lt;br /&gt;
&lt;br /&gt;
==I do not have a Mac==&lt;br /&gt;
Maybe this site will help you: [https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10 https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin&amp;diff=29087</id>
		<title>Mobile Testing Plugin</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin&amp;diff=29087"/>
		<updated>2023-12-22T09:37:37Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Windows */ new supplement version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Deutsche Version&#039;&#039;&#039; | [[Mobile_Testing_Plugin/en|English Version]]&lt;br /&gt;
&lt;br /&gt;
= Einleitung =&lt;br /&gt;
Mit dem &#039;&#039;Mobile Testing Plugin&#039;&#039; können Anwendungen auf Android- und iOS-Geräten getestet werden. Dabei ist es egal, ob reale mobile Endgeräte oder emulierte Geräte verwendet werden. Das Plugin kann (und wird üblicherweise) zusammen mit dem [[Expecco_GUI_Tests_Extension_Reference|GUI-Browser]] verwendet werden, der das Erstellen von Tests unterstützt. Zudem ist damit das Aufzeichnen von Testabläufen möglich.&lt;br /&gt;
&lt;br /&gt;
Zur Verbindung mit den Geräten wird [http://appium.io/ Appium] verwendet. Appium ist ein freies Open-Source-Framework zum Testen und Automatisieren von mobilen Anwendungen.&lt;br /&gt;
&lt;br /&gt;
Zur Einarbeitung in das Mobile Plugin empfehlen wir das [[Mobile_Testing_Tutorial|Tutorial]] zu bearbeiten. Dieses führt anhand eines Beispiels Schritt für Schritt durch die Erstellung eines Testfalls und erklärt die nötigen Grundlagen.&lt;br /&gt;
&lt;br /&gt;
= Installation und Aufbau =&lt;br /&gt;
Zur Verwendung des Mobile Testing Plugins müssen Sie expecco inkl. des Plugins Mobile Testing installiert haben und Sie benötigen die entsprechenden Lizenzen. expecco kommuniziert mit den Mobilgeräten über einen Appium-Server, der entweder auf demselben Rechner wie expecco läuft, oder auf einem zweiten Rechner. Dieser muss für expecco erreichbar sein.&lt;br /&gt;
&lt;br /&gt;
==Installationsübersicht==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rechner, auf dem expecco läuft:&#039;&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rechner, an dem Android-Geräte angeschlossen sind:&#039;&#039;&#039;&lt;br /&gt;
* Appium-Server&#039;&#039;, diesen können Sie über das Mobile Testing Supplement installieren (s.u.), von dem wir regelmäßig einen neue Version zur Verfügung stellen&#039;&#039;&lt;br /&gt;
* Android SDK&#039;&#039;, dieses erhalten Sie ebenfalls mit dem Mobile Testing Supplement&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rechner, an dem iOS-Geräte angeschlossen sind&amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
* Appium-Server&#039;&#039;, diesen können Sie über das Mobile Testing Supplement für Mac OS installieren (s.u.), von dem wir regelmäßig einen neue Version zur Verfügung stellen&#039;&#039;&lt;br /&gt;
* Xcode &#039;&#039;in einer Version, die die verwendete iOS-Version unterstützt, erhältlich über den Apple App Store&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
* Apple-Entwickler-Zertifikat mit zugehörigem privaten Schlüssel &#039;&#039;(zum Signieren des WebDriverAgents)&#039;&#039;&lt;br /&gt;
* Provisioning Profile mit den verwendeten Mobilgeräten&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Je nach Aufbau können die oben genannten Rechner auch das selbe Gerät sein. expecco kann sich sowohl über das Netzwerk mit einem entfernten Appium-Server und dort angeschlossenen Mobilgeräten verbinden, als auch lokal selbst einen Appium-Server starten und diesen mit lokalen Mobilgeräten verwenden. Einige Funktionen von expecco, die die Erstellung von Testfällen erleichtern, sind jedoch nur verfügbar, wenn die Mobilgeräte am selben Rechner angeschlossen sind, auf dem auch expecco läuft. Ein möglicher Aufbau kann daher wie in folgender Abbildung aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAufbau.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird die Installation von Appium und anderer nötiger Programme für Windows und Mac OS erklärt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;: Zum Zeitpunkt der Erstellung dieses Dokuments wurden Versionen bis 11 auf Funktion verifiziert. Neuere Versionen sollten - sofern nicht grundlegende Änderungen von Oracle vorgenommen wurden, ebenfalls funktionieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;: Beachten Sie, dass aufgrund der Voraussetzungen (keine Anbindung an nicht-Apple Geräte verfügbar) iOS-Geräte nur von einem Mac aus angesteuert werden können. Sie benötigen also einen Mac als &amp;quot;Vermittler&amp;quot; (siehe auch unten: [[#Ich habe keinen Mac | &amp;quot;Ich habe keinen Mac&amp;quot;]])&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
Am einfachsten installieren Sie alles mit unserem Mobile Testing Supplement&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;. In neueren Versionen ist allerdings aufgrund geänderter Lizenzbedingungen seitens Oracle kein JDK mehr enthalten, sodass sie dieses zusätzlich installieren müssen. Sie können natürlich Appium auch direkt installieren, um die Version zu verwenden, die Sie möchten. Um dann einen Appium-Server mit expecco starten zu können, muss allerdings eine entsprechende Batchdatei vorhanden sein und in den [[Mobile_Testing_Plugin#Konfiguration_des_Plugins|Einstellungen]] angegeben werden. Verbindungen können aber auch zu anderen laufenden Appium-Servern aufgebaut werden.&lt;br /&gt;
*&#039;&#039;&#039;expecco 23.2&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-23.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.2]&lt;br /&gt;
:Im Vergleich zum Vorgänger aktualisierte Chromedriver Versionen.&lt;br /&gt;
*expecco 23.1: [https://download.exept.de/transfer/h-expecco-23.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.1]&lt;br /&gt;
:Gleiche Versionen wie der Vorgänger, aber der Installer erlaubt nun, Appium zum Autostart hinzuzufügen.&lt;br /&gt;
*expecco 22.2 und 22.1: [https://download.exept.de/transfer/h-expecco-22.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.2.0]&lt;br /&gt;
:Appium 1.22.3*&lt;br /&gt;
:Node 14.17.5&lt;br /&gt;
:adb 1.0.41 aus platform-tools 33.0.2&lt;br /&gt;
:&#039;&#039;* Wir haben Appium um die Capability&#039;&#039; startChromedriverTimeout &#039;&#039;erweitert, um schneller einen Timeout zu bekommen, wenn der Chromedriver nicht gestartet werden kann. (siehe [[#startChromedriverTimeout|Probleme und Lösungen]])&#039;&#039;&lt;br /&gt;
*expecco 21.2: [https://download.exept.de/transfer/h-expecco-21.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.12.0.0]&lt;br /&gt;
:Enthält die Appium-Version 1.22.0, Node ist weiterhin in der Version 12.13.1.&lt;br /&gt;
*expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.1.0]&lt;br /&gt;
:Nur kleine Änderungen im Vergleich zur vorigen Version.&lt;br /&gt;
*expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.0.0]&lt;br /&gt;
:Im Vergleich zur vorigen Version wurde Appium auf die Version 1.16.0-rc.1 aktualisiert und node 12 verwendet. &lt;br /&gt;
*expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.8.1.0]&lt;br /&gt;
:Dieses installiert Appium in der Version 1.12.0 und enthält nun zusätzlich build-tools der Version 28.0.3 im android-sdk. Ansonsten ist es gleich wie die vorige Version.&lt;br /&gt;
*expecco 18.2: [http://download.exept.de/transfer/h-expecco-18.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.7.3.0]&lt;br /&gt;
:Dieses installiert Appium in der Version 1.8.1. Außerdem bietet das Supplement auch an, &#039;&#039;Android Debug Bridge&#039;&#039; und &#039;&#039;Google USB Driver&#039;&#039; ([https://gsmusbdrivers.com/download/adb-fastboot-drivers/ adb-setup-1.4.3]) zu installieren. Damit sind Treiber für ein breites Spektrum an Android-Geräten abgedeckt, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen. Ein &#039;&#039;&#039;JDK ist (aufgrund geänderter Lizenzbedingungen seitens Oracle) nicht mehr enthalten&#039;&#039;&#039;, dieses müssen Sie selbst herunterladen, z.B. von [https://www.oracle.com/technetwork/java/javase/downloads/index.html Oracle].&lt;br /&gt;
*expecco 18.1: wie expecco 2.11&lt;br /&gt;
*expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/MobileTestingSupplement_1.6.0.2_Setup.exe Mobile Testing Supplement 1.6.0.2]&lt;br /&gt;
:Dieses installiert ein Java JDK der Version 8, android-sdk und Appium in der Version 1.6.4. Außerdem bietet das Supplement auch einen universellen adb-Treiber ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]) an. Dieser vereint Treiber für ein breites Spektrum an Android-Geräten, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen.&lt;br /&gt;
*expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_1.5.0.0_Setup.exe Mobile Testing Supplement 1.5.0.0]&lt;br /&gt;
:Dieses installiert ein Java JDK der Version 8, android-sdk und Appium in der Version 1.4.16. Während der Installation wird die grafische Oberfläche von Appium gestartet, dieses Fenster können Sie sofort wieder schließen. Außerdem bietet das Supplement auch einen universellen adb-Treiber ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]) an. Dieser vereint Treiber für ein breites Spektrum an Android-Geräten, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen.&lt;br /&gt;
&lt;br /&gt;
Wenn expecco Mobilgeräte verwenden soll, die an einem anderen Rechner angeschlossen sind, müssen Sie dort einen Appium-Server starten. Dies können Sie mit der Datei &amp;lt;code&amp;gt;appium_standalone.cmd&amp;lt;/code&amp;gt; tun. Der Server wird dann mit dem Standard-Port 4723 gestartet. Falls Sie eine andere Portnummer verwenden wollen, starten Sie den Server mit&lt;br /&gt;
&lt;br /&gt;
 appium_standalone.cmd -p &amp;lt;portnummer&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Server ist bereit, sobald die Zeile&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Appium REST http interface listener started on 0.0.0.0:4723&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
angezeigt wird, wobei Sie am Ende die verwendete Portnummer ablesen können.&lt;br /&gt;
&lt;br /&gt;
Beim ersten Starten von Appium – sowohl im Standalone als auch gestartet von expecco – kann es vorkommen, dass die Windows-Firewall den Node-Server blockiert. Lassen Sie den Zugriff zu, sonst kann Appium nicht gestartet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;) Sie können natürlich auch die Command Line Tools (adb, sdkmanager, avdmanager etc.) einer vorhandenen Android Studio Version verwenden, sowie Appium separat installieren.&lt;br /&gt;
Da sich diese Tools regelmäßig ändern, und es in der Vergangenheit zu Inkompatibilitäten und Fehlern nach Releasewechseln kam, empfehlen wir zu Beginn, das mitgelieferte Paket zu verwenden. Dies ist möglicherweise nicht das aktuellste, wurde aber auf Lauffähigkeit getestet.&lt;br /&gt;
&lt;br /&gt;
Falls das Android Mobilgerät an einem entfernen Rechner angeschlossen ist,&lt;br /&gt;
können Sie den aktuellen Bildschirminhalt z.B. mit dem [https://github.com/Genymobile/scrcpy scrcpy] tool live mitverfolgen.&lt;br /&gt;
&lt;br /&gt;
== Mac OS (nicht erforderlich für Android-Tests)==&lt;br /&gt;
Hinweis: Wenn Sie nicht vorhaben, iOS-Geräte (iPhone, iPad, etc.) zu testen, können Sie das Folgende ignorieren. &#039;&#039;&#039;Der Apple-Rechner sowie das Mac-Setup werden für Android-Geräte nicht benötigt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Xcode ===&lt;br /&gt;
Zur Automatisierung mit iOS-Geräten wird [https://developer.apple.com/xcode/ Xcode] benötigt. Sie erhalten dieses über den App Store. Dabei ist darauf zu achten, dass die Version zu den getesteten iOS-Versionen passt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;iOS&#039;&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp;  &lt;br /&gt;
|&#039;&#039;&#039;Xcode&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;macOS&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|10.x&lt;br /&gt;
|8.x&lt;br /&gt;
|10.12 (Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|11.x&lt;br /&gt;
|9.x&lt;br /&gt;
|10.13 (High Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|12.x&lt;br /&gt;
|10.x&lt;br /&gt;
|10.14 (Mojave)&lt;br /&gt;
|-&lt;br /&gt;
|13.x&lt;br /&gt;
|11.x&lt;br /&gt;
|10.15 (Catalina)&lt;br /&gt;
|-&lt;br /&gt;
|14.x&lt;br /&gt;
|12.x&lt;br /&gt;
|11.0 (Big Sur)&lt;br /&gt;
|-&lt;br /&gt;
|15.x&lt;br /&gt;
|13.x&lt;br /&gt;
|12.0 (Monterey)&lt;br /&gt;
|-&lt;br /&gt;
|16.x&lt;br /&gt;
|14.x&lt;br /&gt;
|12.5 (Monterey)&lt;br /&gt;
|}&lt;br /&gt;
Diese Tabelle gibt nur eine vereinfachte Übersicht, lesen Sie besser unter [https://xcodereleases.com/ Xcode Releases] oder [https://en.wikipedia.org/wiki/Xcode#Version_comparison_table Xcode-Versionen] welche Version Sie brauchen. Für neue iOS Minor-Versionen gibt es in der Regel auch ein Update für Xcode, z.B. brauchen Sie für iOS 10.2 mindestens Xcode 8.2, für iOS 10.3 mindestens Xcode 8.3 usw. &lt;br /&gt;
Wenn Sie also auf eine neuere iOS-Version wechseln, benötigen Sie in der Regel auch eine neuere Xcode-Version. Neuere Versionen von Xcode laufen möglicherweise nicht auf älteren Betriebssystemen, was wiederum eine Aktualisierung des Betriebssystems erforderlich machen kann. Falls Sie auch ältere iOS-Versionen testen wollen kann es sinnvoll sein, die entsprechenden Xcode-Versionen parallel zu installieren.&lt;br /&gt;
&lt;br /&gt;
=== Appium ===&lt;br /&gt;
Der Appium-Server kann entweder als Kommandozeilen-Anwendung installiert werden oder über [https://github.com/appium/appium-desktop Appium Desktop] verwendet werden, welcher den Server über ein GUI zur Verfügung stellt. Mittlerweile gibt es auch Appium 2.0, was wir aber bisher noch nicht mit expecco getestet haben und daher nicht empfehlen.&lt;br /&gt;
&lt;br /&gt;
==== Appium Desktop ====&lt;br /&gt;
Laden Sie die neueste Version von [https://github.com/appium/appium-desktop/releases/ Appium Desktop] herunter. Für den Mac nehmen Sie am besten die dmg-Datei und installieren sie in den Anwendungen. Beim Starten der Anwendung &#039;&#039;Appium Server GUI&#039;&#039; erhalten Sie wahrscheinlich eine Fehlermeldung, dass es aus Sicherheitsgründen nicht möglich ist. Öffnen Sie dann das Kontextmenü auf der Anwendungsdatei (Rechtsklick bzw. Strg + Klick) und wählen Sie dort &#039;&#039;Öffnen&#039;&#039; aus. Bestätigen Sie dann, dass Sie die Anwendung wirklich öffnen wollen. Fortan können Sie die Anwendung normal öffnen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:OpenAppiumServerGUI1.png|text-top]] [[Datei:OpenAppiumServerGUI2.png|text-top]]&lt;br /&gt;
&lt;br /&gt;
Ab Xcode 14 gibt es Probleme beim Signieren des WebDriverAgents, den Appium zur Automatisierung auf das Gerät spielt. Dadurch ist mit der Version 1.22.3-4 von Appium Desktop kein Verbindungsaufbau möglich. Das Problem ist in neueren Versionen des WebDriverAgents behoben, es gibt aber aktuell noch keine Version von Appium Desktop, die eine solche Version enthält (Stand November 2022). Sie können aber manuell eine neue Version herunterladen (z.B. 4.10.2)  und die Dateien in Appium ersetzen. Laden Sie dazu von der [https://github.com/appium/WebDriverAgent/releases/ WebDriverAgent Download-Seite] eine der beiden Archivdateien (zip oder tar.gz) mit dem Source Code herunter. Öffnen und entpacken Sie dann diese Datei. Den Inhalt des Ordners WebDriverAgent-4.10.2 müssen Sie nun nach&lt;br /&gt;
&lt;br /&gt;
 /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
kopieren. Wenn Sie über den Finder dorthin navigieren, machen Sie auf die Anwendung &#039;&#039;Appium Server GUI&#039;&#039; einen Kontextklick (Rechtsklick bzw. Strg + Klick) und wählen Sie im Menü &#039;&#039;Paketinhalt anzeigen&#039;&#039;. Ersetzen Sie alle Dateien, die bereits mit gleichem Namen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
==== Appium über npm installieren ====&lt;br /&gt;
Sie können Appium auch über npm (Node Package Manager) installieren. Dazu müsen Sie erst node/npm installieren. Das geht mit [https://github.com/nvm-sh/nvm nvm] (Node Version Manager) was Sie von Github bekommen. Falls die folgende Installationsanleitung bei Ihnen nicht funktionieren sollte, finden Sie dort ausführlichere Informationen im [https://github.com/nvm-sh/nvm#readme Readme].&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie ein Terminal-Fenster. Klonen Sie dann das Github-Repository von nvm&lt;br /&gt;
 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash&lt;br /&gt;
und laden Sie es&lt;br /&gt;
 export NVM_DIR=&amp;quot;$([ -z &amp;quot;${XDG_CONFIG_HOME-}&amp;quot; ] &amp;amp;&amp;amp; printf %s &amp;quot;${HOME}/.nvm&amp;quot; || printf %s &amp;quot;${XDG_CONFIG_HOME}/nvm&amp;quot;)&amp;quot; [ -s &amp;quot;$NVM_DIR/nvm.sh&amp;quot; ] &amp;amp;&amp;amp; \. &amp;quot;$NVM_DIR/nvm.sh&amp;quot; # This loads nvm&lt;br /&gt;
&lt;br /&gt;
Führen Sie danach&lt;br /&gt;
 command -v nvm&lt;br /&gt;
aus, um zu testen, ob es funktioniert hat. Es sollte &#039;&#039;nvm&#039;&#039; ausgegeben werden. Kommt keine Antwort, führen Sie&lt;br /&gt;
 touch ~/.zshrc&lt;br /&gt;
aus, und versuchen Sie es erneut.&lt;br /&gt;
&lt;br /&gt;
Nun können Sie node mit dem folgenden Befehl installieren.&lt;br /&gt;
 nvm install 16.15.1&lt;br /&gt;
Da es mit der aktuellen Version von node Probleme beim Installieren von Appium gibt, empfehlen wir diese Version.&lt;br /&gt;
&lt;br /&gt;
Nachdem node installiert ist, können Sie Appium darüber installieren:&lt;br /&gt;
 npm install -g appium&lt;br /&gt;
&lt;br /&gt;
Den Appium-Server können Sie nun einfach über den Befehl&lt;br /&gt;
 appium&lt;br /&gt;
starten. Die Ausgabe erfolgt dann direkt im Terminal.&lt;br /&gt;
&lt;br /&gt;
Auch bei dieser Version gibt es das Problem bei der Signierung des WebDriverAgents, wie bei [[#Appium_Desktop | Appium Desktop]] beschrieben. Laden Sie also auch in diesem Fall eine neuere Version des WebDriverAgents herunter und ersetzen Sie die alten Dateien. Diese finden Sie unter&lt;br /&gt;
 /Users/&amp;lt;user&amp;gt;/.nvm/versions/16.15.1/lib/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
==== Mobile Testing Supplement ====&lt;br /&gt;
Ältere Appium-Versionen stellen wir Ihnen über das Mobile Testing Supplement für Mac OS zur Verfügung, mit dem Sie es einfach installieren können:&lt;br /&gt;
* &#039;&#039;&#039;expecco 20.2&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-20.2.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement für Mac OS (1.2.2)]&lt;br /&gt;
:Enthält Appium Version 1.18.3 und verwendet node 14.&lt;br /&gt;
&lt;br /&gt;
* expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement für Mac OS (1.2.0)]&lt;br /&gt;
:Nur wenige Änderungen im Vergleich zur vorigen Version.&lt;br /&gt;
&lt;br /&gt;
* expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement_for_MacOS.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.98)]&lt;br /&gt;
:Im Vergleich zur vorigen Version wurde Appium auf die Version 1.16.0-rc.1 aktualisiert und es wird node 12 verwendet. &lt;br /&gt;
&lt;br /&gt;
* expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.96.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.96)]&lt;br /&gt;
:Diese Version enthält Appium 1.12.0. &lt;br /&gt;
&lt;br /&gt;
* expecco 18.1: [http://download.exept.de/transfer/h-expecco-18.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.94.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.94)]&lt;br /&gt;
:Diese Version enthält Appium 1.8.0.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/Mobile_Testing_Supplement_for_Mac_OS_1.0.94.tar.bz2 Mobile Testing Supplement für Mac OS (1.0.94)]&lt;br /&gt;
:Diese Version enthält Appium 1.6.4.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_for_Mac_OS_1.0.tar.bz2 Mobile Testing Supplement für Mac OS]&lt;br /&gt;
:Diese Version entält Appium 1.4.16.&lt;br /&gt;
&lt;br /&gt;
Nachdem Herunterladen des Supplements, können Sie es in ein Verzeichnis Ihrer Wahl (z. B. Ihr Home-Verzeichnis) verschieben und dort entpacken. Ein geeigneter Befehl in einer Shell könnte wie folgt aussehen, passen Sie dabei die Versionsnummer entsprechend an:&lt;br /&gt;
&lt;br /&gt;
 tar -xvpf Mobile_Testing_Supplement_for_Mac_OS_1.1.98.tar.bz2&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Ihre Standard-Xcode-Installation verwenden wollen, können Sie Appium direkt über die Datei im &#039;&#039;bin&#039;&#039;-Verzeichnis mit der entsprechenden Versionsnummer starten:&lt;br /&gt;
&lt;br /&gt;
 Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
Falls Sie ein anderes Xcode als das als Standard konfigurierte verwenden wollen, müssen Sie Appium den entsprechenden Pfad über die Umgebungsvariable &#039;&#039;DEVELOPER_DIR&#039;&#039; angeben. &lt;br /&gt;
Wenn Sie Xcode z. B. in &#039;&#039;/Applications/Xcode-11.3.app&#039;&#039; installiert haben, müssten Sie Appium so starten:&lt;br /&gt;
&lt;br /&gt;
 DEVELOPER_DIR=&amp;quot;/Applications/Xcode-11.3.app/Contents/Developer&amp;quot; Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
Was als Standard-Xcode-Installation gesetzt ist, zeigt der Befehl:&lt;br /&gt;
&lt;br /&gt;
 xcode-select -p&lt;br /&gt;
&lt;br /&gt;
Wenn Appium Ihre Xcode-Installation nicht findet, erscheint beim Verbinden eine Fehlermeldung in der Art:&lt;br /&gt;
&#039;&#039;&amp;lt;blockquote&amp;gt;org.openqa.selenium.SessionNotCreatedException - A new session could not be created. (Original error: Could not find path to Xcode, environment variable DEVELOPER_DIR set to: /Applications/Xcode.app but no Xcode found)&amp;lt;/blockquote&amp;gt;&#039;&#039;&lt;br /&gt;
Starten Sie in diesem Fall Appium erneut, unter Angabe eines gültigen &#039;&#039;DEVELOPER_DIR&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== WebDriverAgent-Signierung ====&lt;br /&gt;
Zur Automatisierung lädt Appium eine App namens WebDriverAgent auf das Gerät und muss sie dafür signieren können. Dazu brauchen Sie einen Apple-Account und ein entsprechendes Zertifikat. Zur Evaluierung können Sie einen kostenlosen Account verwenden. Dieser hat den Nachteil, dass erstellte Profile nur eine Woche gültig sind und danach neu erstellt werden müssen. Seien Sie auch vorsichtig, wenn Sie sich den Account teilen, da es vorkommen kann, dass Zertifikate widerrufen werden oder durch automatische Generierung ungültig werden. Als Folge können bereits signierte Apps nicht mehr verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie bereits ein entsprechendes Zertifikat mit dem zugehörigen privaten Schlüssel in Ihrer [https://support.apple.com/de-de/guide/keychain-access/welcome/mac Schlüsselbundverwaltung] auf dem Mac haben, können Sie den WebDriverAgent automatisch signieren lassen. Ansonsten empfiehlt es sich, die Signierung über Xcode einzustellen und zu verwalten.&lt;br /&gt;
&lt;br /&gt;
Schließen Sie zuerst das Gerät, das Sie verwenden möchten, über USB an den Mac an. Stellen Sie sicher, dass sich der Mac und das Gerät im selben Netzwerk befinden, ansonsten kann es beim Verbindungsaufbau mit Appium zu Problemen kommen. Starten Sie Xcode und öffnen Sie &#039;&#039;Preferences&#039;&#039;. Wechseln Sie zur Seite der Accounts und legen Sie einen Eintrag mit Ihrem Account an. Anschließend können Sie auf &#039;&#039;Manage Certificates...&#039;&#039; klicken, um die Zertifikate zu sehen, die zu diesem Account gehören. Zum Ausführen von Tests benötigen Sie ein iOS-Development-Zertifikat und den dazugehörigen privaten Schlüssel. Wenn Sie noch keines besitzen, erstellen Sie eines. Wenn Sie bereits eines haben, aber es nicht in Ihrem Schlüsselbund vorhanden ist (erkennbar an dem Hinweis &amp;quot;Not in Keychain&amp;quot;), können Sie es importieren. Das können Sie über die [https://support.apple.com/de-de/guide/keychain-access/welcome/mac Schlüsselbundverwaltung] auf dem Mac machen, wenn Sie es zuvor aus dem Schlüsselbund exportiert haben, in dem es sich befindet. Das Zertifikat mit dem zugehörigen Schlüssel sollte sich im Schlüsselbund &#039;&#039;Anmeldung&#039;&#039; befinden. Dort kann es als PKCS#12-Datei (Endung typischerweise .p12) exportiert werden. Um ein Zertifikat in Ihren Schlüsselbund zu importieren, wählen Sie im Menü &#039;&#039;Ablage&#039;&#039; die Option &#039;&#039;Objekte importieren&#039;&#039;. Falls Sie nicht wissen, wo das Zertifikat gespeichert ist, können Sie es in Xcode auch widerrufen und in Ihrem Schlüsselbund neu anlegen. Machen Sie das jedoch nur, wenn Sie wissen, dass das alte Zertifikat nicht mehr in Verwendung ist, da es danach nicht mehr benutzt werden kann. Nun sollte Ihr Schlüsselbund ein iOS-Development-Zertifikat enthalten.&lt;br /&gt;
&amp;lt;!---(Ich habe den folgenden Teil mal rausgenommen. Man braucht das nicht, wenn es in Xcode eingestellt ist.) Wählen Sie im Rechtsklick-Menü den Punkt &#039;&#039;Informationen&#039;&#039; aus. Unter den Details des Zertifikats finden Sie die Team-ID, die hier als Organisationseinheit bezeichnet wird. Tragen Sie diese in den Einstellungen des Plugins im Feld &#039;&#039;Team-ID&#039;&#039; ein, siehe [[#Konfiguration_des_Plugins|Konfiguration des Plugins]].--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie nun das WebDriverAgent-Projekt in Xcode. Wenn Sie das Mobile Testing Supplement installiert haben, finden Sie es in dessen Verzeichnis unter&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
Wenn Sie Appium Desktop installier haben, finden Sie es unter&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;/Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
Sie können einfach im Finder zu der Xcode-Project-Datei navigieren und Sie über einen Doppelklick öffnen. Beachten Sie dabei, dass Sie dabei auf die Anwendung Appium Server GUI einen Kontextklick (Rechtsklick bzw. Strg + Klick) machen und im Menü &#039;&#039;Paketinhalt anzeigen&#039;&#039; auswählen müssen, um in deren Unterverzeichnis zu gelangen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingWebDriverAgentXcode.png]]&lt;br /&gt;
&lt;br /&gt;
Wählen Sie &#039;&#039;WebDriverAgentLib&#039;&#039; und die Seite &#039;&#039;Signing &amp;amp; Capabilities&#039;&#039; aus. Setzen Sie dort im Abschnitt &#039;&#039;Signing&#039;&#039; die Option &#039;&#039;Automatically manage signing&#039;&#039; und wählen Sie dann ein Team aus. Wechseln Sie nun zu &#039;&#039;WebDriverAgentRunner&#039;&#039; und tun Sie dort dasselbe.&lt;br /&gt;
&amp;lt;!--(Das Folgende scheint nicht mehr aktuell zu sein.) Es sollten an dieser Stelle Fehler angezeigt werden, dass kein Provisioning Profile angelegt oder gefunden wurde. Wechseln Sie deshalb zur Seite &#039;&#039;Build Settings&#039;&#039; und suchen Sie hier im Abschnitt &#039;&#039;Packaging&#039;&#039; den Eintrag &#039;&#039;Product Bundle Identifier&#039;&#039;. Ändern Sie diesen von com.facebook.WebDriverAgentRunner zu etwas, das von Xcode akzeptiert wird, indem Sie den Präfix ändern. Xcode kann nun ein passendes Provisioning Profile generieren und die Fehler auf der General-Seite sollten verschwinden. Danach können Sie Xcode beenden. --&amp;gt;&lt;br /&gt;
Durch das Setzen des Teams sollten die Fehler für den WebDriverAgentRunner verschwinden. Sollte Xcode kein passendes Provisioning Profile für die Bundle ID &#039;&#039;com.facebook.WebDriverAgentRunner&#039;&#039; erstellen können, können Sie diese anpassen, dass sie zu Ihrem Zertifikat passt. Danach können Sie Xcode beenden oder auch, wie weiter unten beschrieben, direkt den Build über Xcode starten, damit das Projekt bereits gebaut ist, wenn Appium es verwenden möchte.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie sich nun von expecco eine Verbindung zu Ihrem Gerät aufbauen, wird der WebDriverAgent darauf installiert und gestartet, um anschließend zur zu testenden App zu wechseln. Eventuell muss auf dem Gerät muss der Ausführung des WebDriverAgents vertraut noch werden. Ein Anzeichnen dafür kann sein, dass die App WebDriverAgent zwar auf dem Gerät erscheint und zu starten versucht, danach aber wieder deinstalliert wird. Öffnen Sie dazu während des Verbindungsaufbaus auf dem Gerät in die Einstellungen und dort unter &#039;&#039;Allgemein&#039;&#039; den Eintrag &#039;&#039;Geräteverwaltung&#039;&#039;. Dieser Eintrag ist nur sichtbar, wenn eine Entwickler-App auf dem Gerät installiert ist. Sie müssen daher möglicherweise warten, bis der WebDriverAgent installiert ist, bevor der Eintrag erscheint. Wählen Sie dort den Eintrag Ihres Apple-Accounts und vertrauen Sie ihm. Da der WebDriverAgent wieder deinstalliert wird, wenn der Start nicht funktioniert hat, müssen Sie dies während des Verbindungsaufbaus tun. Falls Ihnen das zu hektisch ist, können Sie auch folgenden Code ausführen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;xcodebuild -project Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
  xcodebuild -project /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&lt;br /&gt;
&lt;br /&gt;
Damit wird der WebDriverAgent auf dem Gerät installiert ohne dass er wieder gelöscht wird.&lt;br /&gt;
&lt;br /&gt;
Wenn es Probleme beim Installieren des WebDriverAgents gibt, können Sie auch versuchen, den Build über Xcode zu starten. Stellen Sie sicher, dass das richtige Target &#039;&#039;WebDriverAgent&#039;&#039; ausgewählt ist. Fehlermeldungen in Xcode zeigen vielleicht einfacher, wo das Problem liegt. Manchmal hilft es auch, es ein zweites Mal zu versuchen, weil es möglicherweise beim ersten Mal zu lange gedauert hat und abgebrochen wurde. Es kann sein, dass Sie während des Builds mehrmals aufgefordert werden, das Passwort für Ihren Schlüsselbund anzugeben.&lt;br /&gt;
&lt;br /&gt;
[[Datei:WebDriverAgentCodesign.png]]&lt;br /&gt;
&lt;br /&gt;
Lesen Sie auch die Dokumentation von Appium zum [https://github.com/appium/appium-xcuitest-driver/blob/master/docs/real-device-config.md Aufsetzen von Tests mit iOS-Geräten]. In der [https://support.apple.com/en-us/HT204460 Dokumentation von Apple] finden Sie nähere Informationen zum Installieren und Vertrauen von Apps.&lt;br /&gt;
&lt;br /&gt;
Ist der WebDriverAgent einmal auf dem Gerät installiert, wird er für spätere Verbindungen wieder verwendet und der Verbindungsaufbau sollte schneller funktionieren. Ebenso liegt dann die signierte Version bereits auf Ihrem Mac und muss nicht erneut gebaut werden, was die Verbindung zu weiteren Geräten ebenfalls beschleunigt. Wenn Sie wissen, dass bei Ihrem Verbindungsaufbau der WebDriverAgent erst noch signiert und gebaut werden muss, ist es ratsam, die Capability &#039;&#039;wdaLaunchTimeout&#039;&#039; zu setzen. Dieser Timeout, wie lange auf den Start der WebDriverAgents auf dem Gerät gewartet werden soll, liegt standardmäßig bei 60000$nbsp;ms. Der Build dauert aber häufig über eine Minute, sodass der Versuch zum Verbindungsaufbau dann abgebrochen wird. Ein Wert von 120000 hat sich hier als besser erwiesen.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration des Plugins ==&lt;br /&gt;
Bevor Sie loslegen, sollten Sie die Einstellungen des Mobile Testing Plugins überprüfen und ggf. anpassen.&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie im Menü den Punkt &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; und dort unter &amp;quot;&#039;&#039;Erweiterungen&#039;&#039;&amp;quot; den Eintrag &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot; (s. Abb.). Standardmäßig werden diese Pfade automatisch gefunden (1). Um einen Pfad manuell anzupassen, deaktivieren Sie den entsprechenden Haken rechts davon. Sie erhalten in einer Drop-down-Liste einige Pfade zur Auswahl. Ist ein eingetragener Pfad falsch oder kann er nicht gefunden werden, wird das Feld rot markiert und es erscheint ein diesbezüglicher Hinweis. Stellen Sie sicher, dass alle Pfade richtig angegeben sind.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingEinstellungen.png | thumb | 400px | Konfiguration des Plugins]]&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;appium&#039;&#039;&#039;: Geben Sie hier den Pfad zur ausführbaren Datei an mit der Appium in der Kommandozeile gestartet werden kann. Unter Windows wird diese Datei in der Regel &amp;quot;&amp;lt;code&amp;gt;appium.cmd&amp;lt;/code&amp;gt;&amp;quot; heißen. Dieser Pfad wird benutzt, wenn expecco einen Appium-Server startet.&lt;br /&gt;
*&#039;&#039;&#039;node&#039;&#039;&#039;: Geben Sie hier den Pfad zur ausführbaren Datei an, die Node (auch &amp;quot;Node.js&amp;quot;) startet. Dieser Pfad wird beim Starten eines Servers an Appium weitergegeben, damit Appium ihn unabhängig von der PATH-Variablen findet. Unter Windows heißt diese Datei in der Regel &amp;quot;&amp;lt;code&amp;gt;node.exe&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;JAVA_HOME&#039;&#039;&#039;: Geben Sie hier den Pfad zu einem JDK an. Dieser Pfad wird an jeden Appium-Server weitergegeben. Lassen Sie das Feld frei, um den Wert aus der Umgebungsvariablen zu verwenden. Um einzustellen, welches Java von expecco verwendet werden soll, setzen Sie diesen Pfad in den Einstellungen für die Java Bridge.&lt;br /&gt;
*&#039;&#039;&#039;ANDROID_HOME&#039;&#039;&#039;: Geben Sie hier den Pfad zu einem SDK von Android an. Dieser Pfad wird an jeden Appium-Server weitergegeben. Lassen Sie das Feld frei, um den Wert aus der Umgebungsvariablen zu verwenden.&lt;br /&gt;
*&#039;&#039;&#039;adb&#039;&#039;&#039;: Hier steht der Pfad zum adb-Befehl. Unter Windows heißt die Datei adb.exe. Diese wird von expecco beispielsweise verwendet, um die Liste der angeschlossenen Geräte zu erhalten. Diesen Pfad sollten Sie automatisch wählen lassen, da dann der Befehl im ANDROID_HOME-Verzeichnis verwendet wird. Dieser wird auch von Appium verwendet. Falls expecco und Appium jedoch verschiedene Versionen von adb verwenden kann es zu Konflikten kommen.&lt;br /&gt;
*&#039;&#039;&#039;android.bat&#039;&#039;&#039;: Diese Datei wird nur benötigt, um damit den AVD und den SDK Manager zu starten. Automatisch wird hier die Datei im ANDROID_HOME-Verzeichnis gesucht.&lt;br /&gt;
*&#039;&#039;&#039;aapt&#039;&#039;&#039;: Geben Sie hier den Pfad zum aapt-Befehl an. Unter Windows heißt diese Datei &#039;&#039;aapt.exe&#039;&#039;. expecco verwendet aapt nur im Verbindungseditor, um das Paket und die Activities einer apk-Datei zu lesen. Automatisch wird hier die Datei im ANDROID_HOME-Verzeichnis gesucht.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingJavaBridgeEinstellungen.png | thumb | 400px | Konfiguration des JDKs]]&lt;br /&gt;
&lt;br /&gt;
Ab expecco 2.11 gibt es das Feld &#039;&#039;Team-ID&#039;&#039;. Wenn Sie iOS-Tests ausführen, tragen Sie hier die Team-ID Ihres Zertifikats ein. Diese wird für jede iOS-Verbindung verwendet, außer Sie setzen den Wert im Einzelfall in den Verbindungseinstellungen um. Wie Sie die Team-ID erhalten, lesen Sie im Abschnitt zur [[#Signierung|Signierung]] ber der Installation auf Mac OS. Mit expecco 2.10 können Sie die Team-ID nur für jede Verbindungseinstellung extra als Capability eintragen. Dazu müssen Sie jedoch die [[#Erweiterte_Ansicht|erweiterte Ansicht]] verwenden. Geben Sie hier die Capability &#039;&#039;xcodeOrgId&#039;&#039; an und setzen Sie als Wert die Team-ID des Zertifikats.&lt;br /&gt;
&lt;br /&gt;
Die Einstellung zur Serveradresse unten auf der Seite bezieht sich auf das Verhalten des Verbindungseditors. Dieser prüft am Ende, ob die Serveradresse auf &#039;&#039;/wd/hub&#039;&#039; endet, da dies die übliche Form ist. Falls nicht, wird in einem Dialog gefragt, wie darauf reagiert werden soll. Das festgelegte Verhalten kann hier eingesehen und verändert werden.&lt;br /&gt;
&lt;br /&gt;
Wechseln Sie ebenfalls zum Eintrag &#039;&#039;Java Bridge&#039;&#039; (s. Abb.). Hier muss der Pfad zu Ihrer Java-Installation angegeben werden, die von expecco benutzt wird. Tragen Sie hier ein JDK ein. Falls Sie unter Windows das aus dem Mobile Testing Supplement verwenden möchten, lautet der Pfad&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;C:\Program Files (x86)\exept\Mobile Testing Supplement\jdk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Sie können auch die Systemeinstellungen verwenden.&lt;br /&gt;
&lt;br /&gt;
== Android-Gerät vorbereiten ==&lt;br /&gt;
Wenn Sie ein Android-Gerät unter Windows anschließen benötigen Sie möglicherweise noch einen adb-Treiber für das Gerät. Einen passenden Treiber finden Sie üblicherweise auf der jeweiligen Webseite des Herstellers. Haben Sie den Universal-Treiber aus dem Mobile Testing Supplement installiert, sollte für die meisten Geräte bereits alles funktionieren. In einigen Fällen versucht auch Windows automatisch einen Treiber zu installieren, wenn Sie das Gerät zum ersten mal anschließen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===USB-Debugging Einschalten===&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Bevor Sie ein Mobilgerät mit dem Appium-Plugin ansteuern können, müssen Sie für dieses Debugging erlauben!&lt;br /&gt;
&lt;br /&gt;
Für Android-Geräte finden Sie diese Option in den Einstellungen unter &#039;&#039;[https://www.droidwiki.org/wiki/Entwickleroptionen Entwickleroptionen]&#039;&#039; mit dem Namen &#039;&#039;[https://www.droidwiki.org/USB-Debugging USB-Debugging]&#039;&#039;. Falls die Entwickleroptionen nicht angezeigt werden, können Sie diese freischalten, indem Sie unter &amp;quot;&#039;&#039;Über das Telefon&#039;&#039;&amp;quot; siebenmal auf &amp;quot;&#039;&#039;Build-Nummer&#039;&#039;&amp;quot; tippen.&lt;br /&gt;
&lt;br /&gt;
===Wach bleiben Aktivieren===&lt;br /&gt;
Aktivieren Sie auch die Funktion &#039;&#039;Wach bleiben&#039;&#039;, damit das Gerät nicht während der Testerstellung oder -ausführung den Bildschirm abschaltet.&lt;br /&gt;
&lt;br /&gt;
Aus Sicherheitsgründen muss USB-Debugging für jeden Computer einzeln zugelassen werden. Beim Verbinden des Geräts mit dem PC über USB müssen Sie dabei am Gerät der Verbindung zustimmen. Falls Sie dies für Ihren Computer noch nicht getan haben, aber auf dem Gerät kein entsprechender Dialog erscheint, kann es helfen, das Gerät aus- und wieder einzustecken. Das kann insbesondere dann passieren, wenn Sie den ADB-Treiber installiert haben während das Gerät bereits über USB angeschlossen war. Falls auch das nicht hilft, öffnen Sie die Benachrichtigungen, indem Sie sie vom oberen Bildschirmrand herunter ziehen. Dort finden Sie die USB-Verbindung und Sie können die Optionen dazu öffnen. Wählen Sie einen anderen Verbindungstypen aus; in der Regel sollten MTP oder PTP funktionieren.&lt;br /&gt;
&lt;br /&gt;
Sie können auch auf einem Emulator testen. Dieser muss nicht gesondert vorbereitet werden, da er bereits für USB-Debugging ausgelegt ist. Es ist sogar möglich, einen Emulator bei Testbeginn zu starten.&lt;br /&gt;
&lt;br /&gt;
Um zu überprüfen, ob ein Gerät, das Sie an Ihren Rechner angeschlossen haben, verwendet werden kann, öffnen Sie den [[#Verbindungseditor|Verbindungseditor]]. Das Gerät sollte dort angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Verbindung über WLAN ===&lt;br /&gt;
Es ist auch möglich, Android-Geräte über WLAN zu verbinden. Für Geräte mit Android 11 oder neuer ist dies direkt über WLAN möglich, im anderen Fall müssen Sie das Gerät zuerst über USB verbinden. Ab expecco 22.1 können Sie eine WLAN-Verbindung über den [[Mobile Testing Plugin#Verbindungseditor|Verbindungseditor]] aufbauen. Ansonsten ist es auch über die Eingabeaufforderung möglich.&lt;br /&gt;
==== Drahtlos verbinden über die Eingabeaufforderung mit expecco Versionen vor 22.1 (ab Android 11) ====&lt;br /&gt;
Mit expecco ab Version 22.1 funktioniert das einfacher über den Verbindungseditor.&lt;br /&gt;
&lt;br /&gt;
Erlauben Sie in den Entwickleroptionen des Geräts Debugging über WLAN und öffnen Sie dessen Optionen. Sie müssen zuerst das Gerät mit dem  Rechner koppeln. Wählen Sie dazu &amp;quot;&#039;&#039;Gerät mit einem Kopplungscode koppeln&#039;&#039;&amp;quot;, um einen Kopplungscode und eine IP-Adresse mit Port zu erhalten. Öffnen Sie dann auf dem Rechner die Eingabeaufforderung und geben Sie dort ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb pair &amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Kopplungsport&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
wobei Sie &amp;lt;tt&amp;gt;&amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Kopplungsport&amp;gt;&amp;lt;/tt&amp;gt; durch die auf dem Gerät angezeigte IP-Adresse &amp;amp; Port ersetzen. Danach werden Sie aufgefordert, den Kopplungscode einzugeben. Wenn alles geklappt hat, sollte sich das Popup auf dem Gerät schließen und der Rechner als gekoppeltes Gerät angezeigt werden. Geben Sie dann in der Eingabeaufforderung ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Debug-Port&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die IP-Adresse ist hier noch die gleiche wie beim Koppeln, aber der Port ist ein anderer. Beides wird als IP-Adresse &amp;amp; Port auf dem Gerät angezeigt. Damit sollte das Gerät nun über WLAN verbunden sein und kann genauso verwendet werden, wie mit USB-Verbindung. Sie können dies überprüfen, indem Sie entweder &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; eingeben oder in expecco den Verbindungsdialog öffnen. In der Liste taucht das Gerät mit seiner IP-Adresse und dem Port auf. Bedenken Sie, dass die WLAN-Verbindung nicht mehr besteht, wenn der ADB-Server oder das Gerät neu gestartet werden. Häufig wird beim Neustart des Geräts auch die Erlaubnis für das Debugging über WLAN wieder zurückgesetzt und der verwendete Port ändert sich. Die Kopplung bleibt aber bestehen und muss beim nächsten Verbinden nicht noch einmal durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==== WLAN Verbindung über USB starten (Android 10 und früher) ====&lt;br /&gt;
Verbinden Sie zunächst das Gerät über USB mit dem Rechner. Öffnen Sie dann die Eingabeaufforderung und geben Sie dort ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit lauscht das Gerät auf eine TCP/IP-Verbindung an Port 5555. Sollten Sie mehrere Geräte angeschlossen oder Emulatoren laufen haben, müssen Sie genauer angeben, welches Gerät Sie meinen. Geben Sie in diesem Fall ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb devices -l&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Sie erhalten eine Liste aller Geräte, wobei die erste Spalte deren Kennung ist. Schreiben Sie dann stattdessen&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb -s &amp;lt;Gerätekennung&amp;gt; tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
mit der Gerätekennung des gewünschten Geräts. Sie können die USB-Verbindung nun trennen. Jetzt müssen Sie die IP-Adresse Ihres Gerätes in Erfahrung bringen. Sie finden diese üblicherweise irgendwo in den Einstellungen des Geräts, beispielsweise beim Status oder in den WLAN-Einstellungen. Geben Sie dann ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP-Adresse des Geräts&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit sollte das Gerät nun über WLAN verbunden sein und kann genauso verwendet werden, wie mit USB-Verbindung. Sie können dies überprüfen, indem Sie wieder &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; eingeben oder in expecco den Verbindungsdialog öffnen. In der Liste taucht das Gerät mit seiner IP-Adresse und dem Port auf. Bedenken Sie, dass die WLAN-Verbindung nicht mehr besteht, wenn der ADB-Server oder das Gerät neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
=== Verbindung zu einem Emulator ===&lt;br /&gt;
Sie benötigen dazu den Emulator selbst, sowie mindestens ein AVD (Android Virtual Device). Hinweise zu Installation finden Sie in der [https://developer.android.com/studio/run/emulator Android Studio Dokumentation].&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Android Studio bereits mit den Defaulteinstellungen installiert haben &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;, sollte der Emulator bereits mitinstalliert sein. Falls nicht, wählen Sie in Android Studio &amp;quot;&#039;&#039;Configure&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;SDK Manager&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Android SDK&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;SDK Tools&#039;&#039;&amp;quot; - &#039;&#039;Android Emulator&#039;&#039;&amp;quot;, sowie dort die &amp;quot;&#039;&#039;Platform Tools&#039;&#039;&amp;quot;.&lt;br /&gt;
Alternativ geht das auch über die Kommandzeile mit dem &amp;quot;sdkmanager&amp;quot; Kommando.&lt;br /&gt;
&lt;br /&gt;
Als nächstes benötigen Sie mindestens ein AVD; auch dies geht am einfachsten über den Dialog in Android Studio:&lt;br /&gt;
wählen sie &amp;quot;&#039;&#039;Configure&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;AVD Manager&#039;&#039;&amp;quot; und folgen den Anweisungen (Deviceauswahl, Platform und Android Version).  &lt;br /&gt;
&lt;br /&gt;
Auch wenn Sie den Emulator automatisieren benötigen sie Appium; installieren Sie dieses entweder mit dem Mobile Testing Supplement, oder direkt von der Appium homepage (https://github.com/appium/appium-desktop/releases).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;Android Studio selbst wird nicht von expecco benötigt; es bietet aber kompfortable Dialoge zum Installieren von Paketen und AVDs.&lt;br /&gt;
&lt;br /&gt;
== iOS-Gerät und App vorbereiten ==&lt;br /&gt;
Das Ansteuern von iOS-Geräten ist nur über einen Mac möglich. Lesen Sie daher auch den Abschnitt zur [[#Mac_OS|Installation unter Mac OS]].&lt;br /&gt;
&lt;br /&gt;
Bevor Sie ein Mobilgerät mit dem Mobile Testing Plugin ansteuern können, müssen Sie für iOS-Geräte ab iOS 8 Debugging erlauben. Aktivieren Sie dazu die Option &#039;&#039;Enable UI Automation&#039;&#039; unter dem Menüpunkt &#039;&#039;Entwickler&#039;&#039; in den Einstellungen des Geräts. Falls Sie den Eintrag &#039;&#039;Entwickler&#039;&#039; in den Einstellungen nicht finden, gehen Sie wie folgt vor: Schließen Sie das Gerät über USB an den Mac an. Dabei müssen Sie ggf. am Gerät noch der Verbindung zustimmen. Starten Sie Xcode und wählen Sie dann in der Menüleiste am oberen Bildschirmrand im Menü &#039;&#039;Window&#039;&#039; den Eintrag &#039;&#039;Devices&#039;&#039;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wählen Sie dort Ihr Gerät aus. Danach sollte der Eintrag &#039;&#039;Entwickler&#039;&#039; in den Einstellungen auf dem Gerät auftauchen. Dazu müssen Sie möglicherweise die Einstellungen beenden und neu starten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Alert.png | thumb | 270px | Beispiel für einen Alert unter iOS]]&lt;br /&gt;
Ein Verbindungsaufbau zu dem Gerät ist nicht möglich solange es bestimmte Alerts zeigt. Ein solcher Alert kann z.&amp;amp;#x202f;B. erscheinen wenn FaceTime aktiviert ist, indem ein Hinweis auf anfallende SMS-Gebühren angezeigt wird (siehe Screenshot). Achten Sie darauf, das Gerät so zu konfigurieren, dass es im Leerlauf keine solchen Alerts zeigt.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.11 und später ===&lt;br /&gt;
Sie können beliebige Apps testen, die auf dem verwendeten Gerät lauffähig oder bereits installiert sind. Wenn die App als Development-Build vorliegt, muss die UDID des Geräts in der App hinterlegt sein. In jedem Fall muss der WebDriverAgent für das Gerät signiert werden. Lesen Sie dazu den Abschnitt zur [[#Signierung|Signierung]] unter Mac OS.&lt;br /&gt;
&lt;br /&gt;
Falls Sie in einem Test den Home-Button verwenden wollen, müssen Sie auf dem Gerät AssistiveTouch aktivieren. Sie finden diese Option in den Einstellungen unter &#039;&#039;Allgemein&#039;&#039; &amp;gt; &#039;&#039;Bedienungshilfen&#039;&#039; &amp;gt; &#039;&#039;AssistiveTouch&#039;&#039;. Platzieren Sie dann das Menü in der Mitte des oberen Bildschirmrands. Sie können das Drücken des Home-Buttons dann mit dem entsprechenden Menüeintrag im Recorder aufzeichnen oder direkt den Baustein &#039;&#039;Press Home Button&#039;&#039; benutzen.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.10 ===&lt;br /&gt;
Die App, die Sie verwenden wollen, muss als Development-Build vorliegen. Außerdem muss die UDID des Geräts in der App hinterlegt sein.&lt;br /&gt;
&lt;br /&gt;
=== Development-Build signieren ===&lt;br /&gt;
Ein Development-Build einer App ist nur für eine begrenzte Zahl von Geräten zugelassen und kann auf anderen Geräten nicht gestartet werden. Es ist aber möglich, das Zertifikat und die verwendbaren Geräte in einem Development-Build auszutauschen.&lt;br /&gt;
&lt;br /&gt;
* Evaluierung mit Demo-App von eXept:&lt;br /&gt;
:Gerne stellen wir Ihnen eine Demo-App zur Verfügung, die als Development-Build vorliegt und die wir für Ihr Gerät signieren können. Senden Sie dazu bitte Ihrem eXept-Ansprechpartner die UDID Ihres Gerätes zu. Wie Sie die UDID Ihres Gerätes ermitteln können, ist im folgenden Abschnitt beschrieben.&lt;br /&gt;
&lt;br /&gt;
* Eigene App für Ihr Testgerät verwenden:&lt;br /&gt;
:Wenn Sie von den App-Entwicklern einen Development-Build (IPA-Datei) erhalten, der für Ihr Testgerät zugelassen ist, können Sie diesen direkt verwenden. Dazu müssen Sie den Entwicklern die UDID Ihres Geräts mitteilen, damit sie diese eintragen können. &#039;&#039;&#039;Sie können die UDID eines Gerätes mithilfe von Xcode auslesen&#039;&#039;&#039;. Starten Sie dazu Xcode und wählen Sie in der Menüleiste am oberen Bildschirmrand im Menü &#039;&#039;Window&#039;&#039; den Eintrag &#039;&#039;Devices&#039;&#039;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wählen Sie Ihr Gerät aus und suchen Sie in Eigenschaften den Eintrag &#039;&#039;Identifier&#039;&#039;. Die UDID ist eine 40-stellige Hexadezimalzahl.&lt;br /&gt;
&lt;br /&gt;
* Extern entwickelte App für Ihr Testgerät umsignieren:&lt;br /&gt;
:Es können auch Apps umsigniert werden, damit Sie auf anderen Geräten lauffähig sind. Dieser Vorgang ist jedoch kompliziert und setzt insbesondere einen Zugang zu einem Apple-Developer-Account voraus. Eine Dokumentation zur Vorgehensweise ist derzeit in Vorbereitung.&lt;br /&gt;
&lt;br /&gt;
:Für die Evaluierung unterstützen wir Sie gerne beim Umsignieren Ihrer App.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Melden Sie sich beim [https://developer.apple.com/ Apple-Webinterface] an. Navigieren Sie zu &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039;. Erzeugen Sie hier ggf. ein Developer-Zertifikat und ein Provisioning Profile für Ihr Gerät und laden Sie beide herunter. Sollten Sie noch keinen Developer Account haben, erstellen Sie hier einen: https://developer.apple.com/enroll/. Hierzu müssen Sie sich mit einer Apple-ID anmelden.&lt;br /&gt;
&lt;br /&gt;
# Team-ID herausfinden (&#039;&#039;Membership&#039;&#039; -&amp;gt; &#039;&#039;Team ID&#039;&#039;)&lt;br /&gt;
# Unter &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039; Development-Zertifikat auswählen (unter &#039;&#039;+&#039;&#039; anlegen, falls nicht vorhanden) und herunterladen.&lt;br /&gt;
# Unter &#039;&#039;App ID&#039;&#039; Wildcard-App-ID erzeugen, falls nicht vorhanden. App-ID notieren (AppID = Prefix.ID)&lt;br /&gt;
# Gerät hinzufügen, dazu UDID (bzw. &#039;&#039;Identifier&#039;&#039;) des Geräts herausfinden (&#039;&#039;Xcode&#039;&#039; -&amp;gt; &#039;&#039;Window&#039;&#039; (oben in Menüleiste) -&amp;gt; &#039;&#039;Devices&#039;&#039;)&lt;br /&gt;
# Provisionen Profile erstellen: &#039;&#039;iOS App Development&#039;&#039; -&amp;gt; &#039;&#039;AppID&#039;&#039; auswählen -&amp;gt; Zertifikat wählen -&amp;gt; Gerät auswählen -&amp;gt; Profilname anlegen -&amp;gt; Provisioning Profile herunterladen.&lt;br /&gt;
# Das heruntergeladene Zertifikat importieren (&#039;&#039;Downloads&#039;&#039; -&amp;gt; Zertifikat (.cer)&lt;br /&gt;
# SHA1-Fingerabdruck kopieren. Dazu Rechtsklick auf Zertifikat -&amp;gt; &#039;&#039;Information&#039;&#039;, anschließend bis zum Ende der Seite scrollen).&lt;br /&gt;
# Entitlements.plist erstellen (&#039;&#039;Terminal&#039; öffnen -&amp;gt; Downloads/Mobile_Testing_Supplement/bin/gen-entitlements_plist &#039;Team-ID&#039; &#039;App ID&#039; Downloads/Mobile_Testing_Supplement/bin/re-sign-ipa &amp;lt;Pfad zum ipa (z.B. Downloads/expeccoMobileDemo.ipa)&amp;gt; \&lt;br /&gt;
&amp;quot;&amp;lt;Zertifikat (SHA1-Fingerabdruck, z.B. 76 E8 4B E8 78 D5 D7 F9 2E 09 8B D7 E8 FB CE 30 0C F5 D0 EF)&amp;gt;&amp;quot; \&lt;br /&gt;
&amp;lt;Pfad zum Provisionen Profile (z.B. /Users/exept_test/Downloads/dut.mobileprovision)&amp;gt; \&lt;br /&gt;
&amp;lt;Pfad für das Ergebnis-ipa (z.B. Downloads/expeccoMobileDemo_re-signed.ipa)&amp;gt; \&lt;br /&gt;
[Pfad zur entitlements.plist] (z.B. /Users/exept_test/entitlements.plist)&lt;br /&gt;
&lt;br /&gt;
Zum Umsignieren können Sie das entsprechende Skript aus dem Mobile Testing Supplement für Mac OS oder jedes beliebige andere Tool (z.B. isign) verwenden.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zur Verwendung von iOS-Geräten finden Sie auch in der [http://appium.io/slate/en/master/?java#appium-on-real-ios-devices Dokumentation von Appium].&lt;br /&gt;
&lt;br /&gt;
=== Native iOS-Apps ===&lt;br /&gt;
Sie können auch Apps verwenden, die bereits nativ auf dem Gerät vorhanden sind. Dazu müssen Sie deren Bundle-ID kennen und diese dann in die Verbindungseinstellungen eintragen. Hier eine kleine Auswahl gängiger Apps:&lt;br /&gt;
{| style=&amp;quot;text-align:left&amp;quot;&lt;br /&gt;
! App&lt;br /&gt;
!&lt;br /&gt;
! Bundle-ID&lt;br /&gt;
|-&lt;br /&gt;
| App Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.AppStore&lt;br /&gt;
|-&lt;br /&gt;
| Calculator&lt;br /&gt;
| &lt;br /&gt;
| com.apple.calculator&lt;br /&gt;
|-&lt;br /&gt;
| Calendar&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilecal&lt;br /&gt;
|-&lt;br /&gt;
| Camera&lt;br /&gt;
| &lt;br /&gt;
| com.apple.camera&lt;br /&gt;
|-&lt;br /&gt;
| Contacts&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileAddressBook&lt;br /&gt;
|-&lt;br /&gt;
| iTunes Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileStore&lt;br /&gt;
|-&lt;br /&gt;
| Mail&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilemail&lt;br /&gt;
|-&lt;br /&gt;
| Maps&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Maps&lt;br /&gt;
|-&lt;br /&gt;
| Messages&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileSMS&lt;br /&gt;
|-&lt;br /&gt;
| Phone&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilephone&lt;br /&gt;
|-&lt;br /&gt;
| Photos&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobileslideshow&lt;br /&gt;
|-&lt;br /&gt;
| Settings&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Preferences&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Weitere Bundle-IDs finden Sie [https://github.com/joeblau/apple-bundle-identifiers hier].&lt;br /&gt;
&lt;br /&gt;
= Beispiele =&lt;br /&gt;
Bei den Demo-Testsuiten für expecco finden Sie auch Beispiele für Tests mit dem Mobile Testing Plugin. Wählen Sie dazu auf dem Startbildschirm die Option &amp;quot;&#039;&#039;Beispiel aus Datei&#039;&#039;&amp;quot; und öffnen Sie den Ordner &amp;quot;&#039;&#039;mobile&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;TestsuiteMobileTestingDemo&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m01_MobileTestingDemo.ets --&amp;gt;&amp;lt;/span&amp;gt; &#039;&#039;m01_MobileTestingDemo.ets&#039;&#039; ==&lt;br /&gt;
Die Testsuite enthält zwei einfache Testpläne: &amp;quot;&#039;&#039;Simple CalculatorTest&#039;&#039;&amp;quot; und &amp;quot;&#039;&#039;Complex Calculator and Messaging Test&#039;&#039;&amp;quot;. Beide Tests verwenden einen Android-Emulator, den Sie vor Beginn starten müssen. Die Apps, die im Test verwendet werden, gehören zur Grundausstattung des Emulators und müssen daher nicht mehr installiert werden. Da sich die Apps unter jeder Android-Version unterscheiden können, ist es wichtig, dass Ihr Emulator unter Android 6.0 läuft. Außerdem muss die Sprache auf Englisch gestellt sein.&lt;br /&gt;
&lt;br /&gt;
; Simple CalculatorTest&lt;br /&gt;
: Dieser Test verbindet sich mit dem Taschenrechner und gibt die Formel &#039;&#039;2+3&#039;&#039; ein. Das Ergebnis des Rechners wird mit dem erwarteten Wert &#039;&#039;5&#039;&#039; verglichen.&lt;br /&gt;
&lt;br /&gt;
; Complex Calculator and Messaging Test&lt;br /&gt;
: Dieser Test verbindet sich mit dem Taschenrechner und öffnet anschließend den Nachrichtendienst. Dort wartet er auf eine einkommende Nachricht von der Nummer &#039;&#039;15555215556&#039;&#039;, in der eine zu berechnende Formel gesendet wird. Die Nachricht wird zuvor über einen Socket beim Emulator erzeugt. Nach dem Eintreffen der Nachricht wird diese vom Test geöffnet und deren Inhalt gelesen. Danach wird wieder der Taschenrechner geöffnet, die erhaltene Formel eingegeben und das Ergebnis gelesen. Anschließend wechselt der Test wieder zum Nachrichtendienst und sendet das Ergebnis als Antwort.&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;m02_expeccoMobileDemo.ets&#039;&#039; und &#039;&#039;m03_expeccoMobileDemoIOS.ets&#039;&#039; ==&lt;br /&gt;
Diese sind Bestandteil des Tutorials zum Mobile Testing Plugin. Der jeweils enthaltene Testfall ist unvollständig und wird im Zuge des Tutorials ergänzt. Lesen Sie dazu den Abschnitt [[#Tutorial|Tutorial]].&lt;br /&gt;
&lt;br /&gt;
= Tutorial =&lt;br /&gt;
Es gibt ein Tutorial, das das grundsätzliche Vorgehen zur Erstellung von Tests mit dem Mobile Testing Plugin beschreibt. Grundlage dafür ist ein mitgeliefertes Beispiel, bestehend aus einer einfachen App und einer expecco-Testsuite.&lt;br /&gt;
&lt;br /&gt;
Sie finden es auf der Seite [[Mobile_Testing_Tutorial|Mobile Testing Tutorial]] in zwei Versionen für Android und für iOS.&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsAndroid&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m02_expeccoMobileDemo.ets --&amp;gt;&amp;lt;/span&amp;gt;[[Mobile_Testing_Tutorial#Erste_Schritte_mit_Android|Erste Schritte mit Android]]&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsIOS&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m03_expeccoMobileDemoIOS.ets --&amp;gt;&amp;lt;/span&amp;gt;[[Mobile_Testing_Tutorial#Erste_Schritte_mit_iOS|Erste Schritte mit iOS]]&lt;br /&gt;
&lt;br /&gt;
= Dialoge des Mobile Testing Plugins =&lt;br /&gt;
== Verbindungseditor ==&lt;br /&gt;
Mithilfe des Verbindungseditors können Sie schnell Verbindungen definieren, ändern oder aufbauen. Je nach Aufgabe weist der Dialog kleine Unterschiede auf und wird unterschiedlich geöffnet:&lt;br /&gt;
*Um eine Verbindung aufzubauen, klicken Sie im GUI-Browser auf &amp;quot;&#039;&#039;Verbinden&#039;&amp;quot;&#039; klicken und wählen dann &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot;.&lt;br /&gt;
*Um eine bestehende Verbindung im GUI-Browser zu ändern oder zu kopieren, wählen Sie diese aus, machen einen Rechtsklick und wählen im Kontextmenü &amp;quot;&#039;&#039;Verbindung bearbeiten&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;Verbindung kopieren&#039;&#039;&amp;quot; aus.&lt;br /&gt;
*Wollen Sie Verbindungseinstellungen nicht für den GUI-Browser sondern zur Verwendung in einem Test erstellen, wählen Sie im Menü des Mobile Testing Plugins den Punkt &amp;quot;&#039;&#039;Verbindungseinstellungen erstellen...&#039;&#039;&amp;quot;. Darüber können nur die Einstellungen für eine Verbindung erstellt werden, ohne dass eine Verbindung tatsächlich angelegt wird.&lt;br /&gt;
&lt;br /&gt;
Einige der Schaltflächen sind nur beim Erstellen von Verbindungseinstellungen sichtbar:&lt;br /&gt;
[[Datei:MobileTestingVerbindungseditorMenu.png]]&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen löschen&#039;&#039;&amp;quot;: Setzt alle Einträge zurück. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen aus Datei laden&#039;&#039;&amp;quot;: Erlaubt das Öffnen einer gespeicherten Einstellungsdatei (*.csf). Deren Einstellungen werden in den Dialog übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen aus Anhang laden&#039;&#039;&amp;quot;: Erlaubt das Öffnen eines Anhangs mit Verbindungseinstellungen aus einem geöffneten Projekt. Diese Einstellungen werden in den Dialog übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen in Datei speichern&#039;&#039;&amp;quot; sowie&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen in Anhang speichern&#039;&#039;&amp;quot;: Hier können Sie die eingetragenen Einstellungen in eine Datei (*.csf) speichern oder als Anhang in einem geöffneten Projekt anlegen. Beide Optionen besitzen ein verzögertes Menü, in dem Sie auswählen können, nur einen bestimmten Teil der Einstellungen zu speichern. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Erweiterte Ansicht&#039;&#039;&amp;quot;: Damit können Sie in die erweiterte Ansicht wechseln, um zusätzliche Einstellungen vorzunehmen. Lesen Sie dazu mehr am Ende des Kapitels. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Hilfe&#039;&#039;&amp;quot;: An der rechten Seite wird ein Hilfetext zum jeweiligen Schritt ein- oder ausgeblendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Dialog ist in drei Schritte unterteilt. Im ersten Schritt wählen Sie das Gerät, das Sie verwenden möchten, im zweiten Schritt wählen Sie aus, welche App verwendet werden soll und im letzten Schritt erfolgen die Einstellungen zum Appium-Server.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep1&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 1: Gerät auswählen===&lt;br /&gt;
Im oberen Teil erhalten Sie eine Liste aller angeschlossenen Appium-Geräte, die erkannt werden. Mit der Checkbox darunter können Sie die Geräte ausblenden, die zwar erkannt werden, aber nicht bereit sind. Falls Sie ein Gerät eintragen wollen, das nicht angeschlossen ist, können Sie dies mit dem entsprechenden Knopf &amp;quot;&#039;&#039;Android-Gerät eingeben&#039;&#039;&amp;quot; bzw. &amp;quot;&#039;&#039;iOS-Gerät eingeben&#039;&#039;&amp;quot; anlegen. Dazu müssen Sie jedoch die benötigten Eigenschaften Ihres Geräts kennen. Das Gerät wird dann in einer zweiten Geräteliste angelegt und kann dort ausgewählt werden. Wenn keine Liste mit angeschlossenen Elementen angezeigt werden kann, werden stattdessen verschiedene Meldungen angezeigt:&lt;br /&gt;
*Keine Geräte gefunden&lt;br /&gt;
*:expecco konnte kein Android-Geräte finden.&lt;br /&gt;
*:Um eine Verbindung zu einem Gerät automatisch zu konfigurieren, stellen Sie sicher, dass es&lt;br /&gt;
*:*angeschlossen ist&lt;br /&gt;
*:*eingeschaltet ist&lt;br /&gt;
*:*einen passenden adb-Treiber installiert hat&lt;br /&gt;
*:*für Debugging freigeschaltet ist (siehe unten).&lt;br /&gt;
*Keine verfügbaren Geräte gefunden&lt;br /&gt;
*:expecco konnte keine verfügbaren Android-Geräte finden. Es wurden aber nicht verfügbare gefunden, z.B. mit dem Status &amp;quot;unauthorized&amp;quot;.&lt;br /&gt;
*:Um eine Verbindung zu einem Gerät automatisch zu konfigurieren, stellen Sie sicher, dass es&lt;br /&gt;
*:*angeschlossen ist&lt;br /&gt;
*:*eingeschaltet ist&lt;br /&gt;
*:*einen passenden adb-Treiber installiert hat&lt;br /&gt;
*:*für Debugging freigeschaltet ist (siehe unten).&lt;br /&gt;
*:Um nicht verfügbare Geräte anzuzeigen, aktivieren Sie unten diese Option.&lt;br /&gt;
*Verbindung verloren&lt;br /&gt;
*:expecco hat die Verbindung zum adb-Server verloren. Versuchen Sie die Verbindung wieder herzustellen, indem Sie auf den Button klicken.&lt;br /&gt;
*Verbindung fehlgeschlagen&lt;br /&gt;
*:expecco konnte sich nicht mit dem adb-Server verbinden. Möglicherweise läuft er nicht oder der angegebene Pfad stimmt nicht.&lt;br /&gt;
*:Überprüfen Sie die adb-Konfiguration in den Einstellungen und versuchen Sie den adb-Server zu starten und eine Verbindung herzustellen indem Sie auf den Knopf klicken.&lt;br /&gt;
*Verbinden ...&lt;br /&gt;
*:expecco verbindet sich mit dem adb-Server. Dies kann einige Sekunden dauern.&lt;br /&gt;
*adb-Server starten ...&lt;br /&gt;
*:expecco startet den adb-Server. Dies kann einige Sekunden dauern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Bei &amp;quot;&#039;&#039;Automatisierung durch&#039;&#039;&amp;quot; können Sie angeben, welche Automation-Engine verwendet werden soll. Lassen Sie die Einstellung auf &amp;quot;&#039;&#039;(Default)&#039;&#039;&amp;quot; wird die entsprechende Capability gar nicht gesetzt. Ansonsten stehen Appium, Selendroid und ab expecco 2.11 XCUITest zur Verfügung. In der Regel wird Selendroid nur für Android-Geräte vor Version 4.1 gebraucht.--&amp;gt;Mit &amp;quot;&#039;&#039;Weiter&#039;&#039;&amp;quot; gelangen Sie zum nächsten Schritt. Wenn Sie Einstellungen für den GUI-Browser eingeben, ist das erst möglich, wenn ein Gerät ausgewählt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;UnlockingDeveloperOptions&amp;quot;&amp;gt;Anmerkung zum Freischalten&amp;lt;/span&amp;gt;: In jüngeren Android Versionen werden die Entwickleroptionen zunächst nicht mehr in den Einstellungen angeboten. Falls ihr Android Gerät in den Einstellungen keinen Eintrag zu &amp;quot;&#039;&#039;Entwickleroptionen&#039;&#039;&amp;quot; zeigt, wählen Sie zunächst den Eintrag &amp;quot;&#039;&#039;Telefoninfo&#039;&#039;&amp;quot;, dann &amp;quot;&#039;&#039;SoftwareVersionsInfo&#039;&#039;&amp;quot; und klicken darin mehrfach auf den Eintrag &amp;quot;&#039;&#039;BuildVersion&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Chromedriver verwalten ====&lt;br /&gt;
Wenn die App, die Sie bedienen wollen, WebViews mit Chrome benutzt, benötigt Appium Zugriff auf einen passenden Chromedriver. Wenn Sie ein Gerät in der Liste auswählen, können Sie über &amp;quot;&#039;&#039;Chromedriver verwalten&#039;&#039;&amp;quot; sehen, welche Chrome-Versionen auf dem Gerät vorhanden sind und welche Chromedriver-Versionen durch expecco zur Verfügung stehen. Über diesen Dialog können Sie auch benötigte Chromedriver-Versionen herunterladen. Beachten Sie, dass auf dem Gerät verschiedene Chrome-Versionen vorhanden sein können, da die Apps in ihren WebViews nicht die gleiche Chrome-Version verwenden müssen, wie die als Browser installierte. Damit alles funktioniert, sollte der verwendete Chromedriver zur entsprechenden App passen. Sie können den Pfad zum Chromedriver auch am Ende des Verbindungsdialogs in den erstellten Capabilities ändern.&lt;br /&gt;
&lt;br /&gt;
==== WLAN-Android-Geräte verbinden ====&lt;br /&gt;
Sie können sich auch über WLAN zu Android-Geräten verbinden. Dazu muss das Gerät zunächst mit adb verbunden werden, siehe [[Mobile_Testing_Plugin#Verbindung_.C3.BCber_WLAN|Verbindung über WLAN]]. Ab expecco 22.1 bietet der Verbindungseditor hierfür einen Dialog, der Ihnen dabei hilft und den Sie anstatt der Eingabeaufforderung verwenden können. Für Geräte mit Android 11 oder höher können Sie hier das Gerät mit dem Rechner zu koppeln, indem Sie die entsprechenden Parameter angeben und anschließend die Verbindung unter Angabe von IP-Adresse und Port aufbauen. Sie können damit auch für Geräte, die über USB verbunden sind, eine WLAN-Verbindung aufbauen. Wenn Sie das entsprechende Gerät in der Liste auswählen, werden die benötigten Angaben automatisch ausgelesen.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass der Aufbau einer WLAN-Verbindung nicht Teil der Verbindungseinstellungen ist. Wenn Sie mit den erzeugten Einstellungen eine neue Verbindung aufbauen wollen, müssen Sie sicherstellen, dass das Gerät über mit der angegebenen IP-Adresse und dem Port mit adb verbunden ist, damit es gefunden wird. Die ADB-Verbindung geht verloren, wenn der ADB-Server oder das Gerät neu gestartet werden. Die Erlaubnis für das WLAN-Debugging wird beim Neustart des Geräts auch häufig zurückgesetzt und der Debug-Port kann dann wechseln. Daher muss eine WLAN-Verbindung immer manuell hergestellt werden.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep2&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 2: App auswählen===&lt;br /&gt;
Hier können Sie Angaben zur App machen, die getestet werden soll. Dabei können Sie entscheiden, ob Sie eine App verwenden wollen, die bereits auf dem Gerät installiert ist, oder ob für den Test eine App installiert werden soll. Wählen Sie oben den entsprechenden Reiter aus. Je nachdem, ob Sie im vorigen Schritt ein Android- oder ein iOS-Gerät ausgewählt haben, ändert sich die erforderte Eingabe.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Android&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App auf dem Gerät&#039;&#039;&lt;br /&gt;
**:Wenn Sie im ersten Schritt ein angeschlossenes Gerät ausgewählt haben, werden die Pakete aller installierten Apps automatisch abgerufen und Sie können die Auswahl aus den Drop-down-Listen treffen. Die installierten Apps sind in Fremdpakete und Systempakete unterteilt; wählen Sie die entsprechende Paketliste aus. Diese Auswahl gehört nicht zu den Einstellungen, sondern stellt nur die entsprechende Paketliste zur Verfügung. Sie können den Filter benutzen, um die Liste weiter einzuschränken und dann das gewünschte Paket auswählen. Die Activities des ausgwählten Pakets werden ebenfalls automatisch abgerufen und als Drop-down-Liste zur Verfügung gestellt. Wählen Sie die Activity aus, die gestartet werden soll. In der Regel wird automatisch eine Activity aus der Liste eingetragen. Falls Sie kein verbundenes Gerät verwenden, müssen Sie die Eingabe des Pakets und der Activity von Hand vornehmen.&lt;br /&gt;
**&#039;&#039;App installieren&#039;&#039;&lt;br /&gt;
**:Geben Sie bei &amp;quot;&#039;&#039;App&#039;&#039;&amp;quot; den Pfad zu einer App an. Der Pfad muss für den Appium-Server gültig sein, der verwendet wird. Sie können auch eine URL angeben. Benutzen Sie einen lokalen Appium-Server, können Sie den rechten Butten benutzen, um zu der Installationsdatei der App zu navigieren und diesen Pfad einzutragen. Wenn möglich werden dabei auch das entsprechende Paket und die Activity in den Feldern darunter eingetragen. Diese Angabe ist aber nicht notwendig.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;iOS&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App auf dem Gerät&#039;&#039;&lt;br /&gt;
**:Geben Sie die Bundle-ID einer installierten App an. Sie können die IDs der installierten Apps bspw. mithilfe von Xcode erfahren. Starten Sie dazu Xcode und wählen Sie in der Menüleiste am oberen Bildschirmrand im Menü &amp;quot;&#039;&#039;Window&#039;&#039;&amp;quot; den Eintrag &amp;quot;&#039;&#039;Devices&#039;&#039;&amp;quot;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wenn Sie Ihr Gerät auswählen, sehen Sie in der Übersicht eine Auflistung der von Ihnen installierten Apps.&lt;br /&gt;
**&#039;&#039;App installieren&#039;&#039;&lt;br /&gt;
**:Geben Sie bei &amp;quot;&#039;&#039;App&#039;&#039;&amp;quot; den Pfad zu einer App an. Der Pfad muss für den Appium-Server gültig sein, der verwendet wird. Sie können auch eine URL angeben. Zu den Vorraussetzungen an Apps für reale Geräte lesen Sie bitte den Abschnitt [[#iOS-Ger.C3.A4t_und_App_vorbereiten|iOS-Geräte und App vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
Im unteren Teil können Sie festlegen, ob die App beim Verbindungsabbau zurückgesetzt bzw. deinstalliert werden soll, und ob sie initial zurückgesetzt werden soll. Auch hier wird die entsprechende Capability gar nicht gesetzt, wenn Sie &amp;quot;&#039;&#039;(Default)&#039;&#039;&amp;quot; auswählen. Mit &amp;quot;&#039;&#039;Weiter&#039;&#039;&amp;quot; gelangen Sie zum nächsten Schritt.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep3&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 3: Servereinstellungen===&lt;br /&gt;
Im letzten Schritt befindet sich zunächst im oberen Teil eine Liste aller Capabilities, die sich aus Ihren Angaben der vorigen Schritte ergeben. Wenn Sie sich mit Appium auskennen und noch zusätzliche Capabilities setzen möchten, die der Verbindungseditor nicht abdeckt, können Sie durch Klicken auf &amp;quot;&#039;&#039;Bearbeiten&#039;&#039;&amp;quot; in die erweiterte Ansicht gelangen. Lesen Sie dazu den Abschnitt weiter unten.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Einstellungen für den GUI-Browser eingeben, können Sie den &#039;&#039;Verbindungsnamen&#039;&#039; eintragen, mit dem die Verbindung angezeigt wird. Dies ist auch der Name unter dem Bausteine diese Verbindung verwenden können, wenn sie aufgebaut ist. Wenn Sie das Feld frei lassen, wird ein Name generiert. Wenn der Haken für &amp;quot;&#039;&#039;Von expecco gesteuert&#039;&#039;&amp;quot; gesetzt ist, wird expecco einen lokalen Appium-Server an einem freien Port starten, oder einen bereits gestarteten freien Server verwenden. Um einen eigenen Server zu verwenden, schalten Sie diese Funktion ab und geben Sie die entsprechende Adresse ein. Sie erhalten die lokale Standard-Adresse und bereits verwendete Adressen zur Auswahl.&lt;br /&gt;
&lt;br /&gt;
In älteren expecco-Versionen ist der Haken mit &amp;quot;&#039;&#039;Bei Bedarf starten&#039;&#039;&amp;quot; beschriftet. In diesem Fall müssen Sie auch eine Adresse angeben, wenn expecco den Server starten soll. expecco versucht dann beim Verbinden einen Appium-Server an der angegebenen Adresse zu starten, wenn dort noch keiner läuft. Dieser Server wird dann beim Beenden der Verbindung ebenfalls heruntergefahren. Dies funktioniert nur für lokale Adressen. Achten Sie darauf, nur Portnummern zu verwenden, die auch frei sind. Verwenden Sie am besten nur ungerade Portnummern ab dem Standardport 4723. Beim Verbindungsaufbau wird ebenfalls die folgende Portnummer verwendet, wodurch es sonst zu Konflikten kommen könnte. &lt;br /&gt;
&lt;br /&gt;
Je nachdem, wie Sie den Dialog geöffnet haben, gibt es nun verschiedene Schaltflächen um ihn abzuschließen. In jedem Fall haben Sie die Option zu speichern. Dabei öffnet sich ein Dialog, indem Sie entweder ein geöffnet Projekt auswählen können, um die Einstellungen dort als Anhang zu speichern, oder auswählen es in einer Datei zu speichern, die Sie anschließend angeben können. Durch das Speichern wird der Dialog nicht beendet, wodurch Sie anschließend noch eine andere Option auswählen könnten.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie den Editor zum Verbindungsaufbau geöffnet haben, können Sie abschließend auf &amp;quot;&#039;&#039;Verbinden&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;Server starten und verbinden&#039;&#039;&amp;quot; klicken, je nachdem, ob der Haken für den Serverstart gesetzt ist. Für das Ändern oder Kopieren einer Verbindung im GUI-Brower heißt diese Option &amp;quot;&#039;&#039;Übernehmen&#039;&#039;&amp;quot;, da in diesem Fall nur der Verbindungseintrag geändert bzw. neu angelegt wird, der Verbindungsaufbau aber nicht gestartet wird. Das können Sie bei Bedarf anschließend über das Kontextmenü tun. Falls Sie Capabilities einer bestehenden Verbindung geändert haben, fordert Sie anschließend ein Dialog auf zu entscheiden, ob diese Änderungen direkt übernommen werden sollen, indem die Verbindung abgebaut und mit den neuen Verbindungen aufgebaut wird, oder nicht. In diesem Fall werden die Änderungen erst wirksam, nachdem Sie die Verbindung neu aufbauen.&lt;br /&gt;
&lt;br /&gt;
Zur Verwendung des Verbindungseditors lesen Sie auch den entsprechenden Abschnitt im jeweiligen Tutorial in Schritt 1 (Android: [[Mobile_Testing_Tutorial#Schritt_1:_Demo_ausf.C3.BChren|Demo ausführen]], iOS: [[Mobile_Testing_Tutorial#Schritt_1:_Demo_ausf.C3.BChren_.28iOS.29|Demo ausführen (iOS)]]).&lt;br /&gt;
&lt;br /&gt;
===Erweiterte Ansicht===&lt;br /&gt;
Die erweiterte Ansicht des Verbindungseditors erhalten Sie entweder durch Klicken auf &amp;quot;&#039;&#039;Bearbeiten&#039;&#039;&amp;quot; im dritten Schritt oder jederzeit über den entsprechenden Menüeintrag, wenn Sie den Editor über das Plugin-Menü gestartet haben. In dieser Ansicht erhalten Sie eine Liste aller eingestellten Appium-Capabilities. Zu dieser können Sie weitere hinzufügen, Einträge ändern oder entfernen. Um eine Capability hinzuzufügen, wählen Sie diese aus der Drop-down-Liste des Eingabefelds aus. In dieser befinden sich alle bekannten Capabilities sortiert in die Kategorien &#039;&#039;Common&#039;&#039;, &#039;&#039;Android&#039;&#039; und &#039;&#039;iOS&#039;&#039;. Haben Sie eine Capability ausgewählt, wird ein kurzer Informationstext dazu angezeigt. Sie können in das Feld auch von Hand eine Capability eingeben. Klicken Sie dann auf &amp;quot;&#039;&#039;Hinzufügen&#039;&#039;&amp;quot;, um die Capabilitiy in die Liste einzutragen. Dort können Sie in der rechten Spalte den Wert setzen. Um einen Entrag zu löschen, wählen Sie diesen aus und klicken Sie auf &amp;quot;&#039;&#039;Entfernen&#039;&#039;&amp;quot;. Mit &amp;quot;&#039;&#039;Zurück&#039;&#039;&amp;quot; verlassen Sie die erweiterte Ansicht.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingErweiterteAnsicht.png]]&lt;br /&gt;
&lt;br /&gt;
== Laufende Appium-Server ==&lt;br /&gt;
Im Menü des Mobile Testing Plugins finden Sie den Eintrag &amp;quot;&#039;&#039;Appium-Server...&#039;&#039;&amp;quot;. Mit diesem öffnen Sie ein Fenster mit einer Übersicht aller Appium-Server, die von expecco gestartet wurden und auf welchem Port diese laufen. Durch Klicken auf das Icon in der Spalte &amp;quot;&#039;&#039;Log anzeigen&#039;&#039;&amp;quot; können Sie das Logfile des entsprechenden Servers anschauen. Dieses wird beim Beenden des Servers wieder gelöscht. Mit den Icons in der Spalte &amp;quot;&#039;&#039;Beenden&#039;&#039;&amp;quot; kann der entsprechenden Server beendet werden. Allerdings wird dies verhindert, wenn expecco über diesen Server noch eine offene Verbindung hat. Für welche Verbindung ein Server verwendet wird, sehen Sie in der rechten Spalte. Steht dort &#039;&#039;&amp;lt;idle&amp;gt;&#039;&#039; wird er zur Zeit nicht von expecco verwendet.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAppiumServer.png]]&lt;br /&gt;
&lt;br /&gt;
Beim Öffnen des Editors um eine Appium-Verbindung aufzubauen, wird direkt ein Appium-Server gestartet, um den folgenden Verbindungsaufbau zu beschleunigen. Zu diesem Zweck hält sich expecco auch immer einen freien Appium-Server offen. Weitere laufende Server, die nicht mehr verwendet werden, werden jedoch nach einiger Zeit automatisch beendet.&lt;br /&gt;
&lt;br /&gt;
Im Menü des Mobile Testing Plugins finden Sie auch den Eintrag &amp;quot;&#039;&#039;Alle Verbindungen und Server beenden&#039;&#039;&amp;quot;. Dies ist für den Fall gedacht, dass Verbindungen oder Server auf andere Weise nicht beendet werden können. Beenden Sie Verbindungen wenn möglich immer im GUI-Browser oder durch Ausführen eines entsprechenden Bausteins. Server, die Sie in der Server-Übersicht gestartet haben, beenden Sie dort; Server, die mit einer Verbindung gestartet wurden, werden automatisch mit dieser beendet.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass in der Übersicht nur Server aufgelistet sind, die von expecco gestartet und verwaltet werden. Mögliche andere Appium-Server, die auf andere Art gestartet wurden, werden nicht erkannt.&lt;br /&gt;
&lt;br /&gt;
== Recorder ==&lt;br /&gt;
Besteht im GUI-Browser eine Verbindung zu einem Gerät, kann der integrierte Recorder verwendet werden, um mit diesem Gerät einen Testabschnitt aufzunehmen. Sie starten den Recorder, indem Sie im GUI-Browser die entsprechende Verbindung auswählen und dann auf den Aufnahme-Knopf klicken. Für den Recorder öffnet sich ein neues Fenster. Die aufgezeichneten Aktionen werden im Arbeitsbereich des GUI-Browsers angelegt. Daher ist es möglich, das Aufgenommene parallel zu editieren.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingRecorder.png|caption|]]&lt;br /&gt;
&lt;br /&gt;
====Komponenten des Recorderfensters====&lt;br /&gt;
#&#039;&#039;&#039;Aufnahme fortsetzen/pausieren&#039;&#039;&#039;: Über das rechte Symbol können Sie die Aufnahme pausieren. Sie sehen dann ein großes Pause-Symbol in der Anzeige. Alle Aktionen, die Sie währenddessen im Recorder machen werden zwar ausgeführt, es werden aber keine Bausteine aufgezeichnet. Über das linke Symbol können Sie dann wieder in den normalen Aufnahmemodus wechseln.&lt;br /&gt;
#&#039;&#039;&#039;Aufnahme stoppen&#039;&#039;&#039;: Stoppt die Aufnahme und schließt das Recorderfenster.&lt;br /&gt;
#&#039;&#039;&#039;Aktualisieren&#039;&#039;&#039;: Holt das aktuelle Bild und den aktuellen Elementbaum vom Gerät. Dies wird nötig, wenn das Gerät zur Ausführung einer Aktion länger braucht oder sich etwas ohne das Anstoßen durch den Recorder ändert. Seit expecco 21.2 gibt es hier zusätzlich ein Untermenü, mit dem automatisches Aktualisieren angeschaltet werden kann, indem im Hintergrund auf Änderungen geprüft wird (siehe auch &#039;&#039;Automatisches Aktualisieren&#039;&#039; weiter unten).&lt;br /&gt;
#&#039;&#039;&#039;Follow-Mouse&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird im GUI-Browser ausgewählt.&lt;br /&gt;
#&#039;&#039;&#039;Element-Highlighting&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird rot umrandet.&lt;br /&gt;
#&#039;&#039;&#039;Elemente einzeichnen&#039;&#039;&#039;: Die Rahmen aller Elemente der Ansicht werden angezeigt.&lt;br /&gt;
#&#039;&#039;&#039;Werkzeuge&#039;&#039;&#039;: Auswahl, mit welchem Werkzeug aufgenommen werden soll. Die gewählte Aktion wird bei einem Klick auf die Anzeige ausgelöst. Dabei stehen folgende Aktionen zur Verfügung:&lt;br /&gt;
#*Aktionen auf Elemente:&lt;br /&gt;
#**Klicken: Kurzer Klick auf das Element, über dem der Cursor steht. Zur genaueren Bestimmung, welches Element verwendet wird, benutzen Sie die Funktion Follow-Mouse oder Element-Highlighting.&lt;br /&gt;
#**Antippen mit Dauer (Element): Ähnlich zum Klicken, nur dass zusätzlich die Dauer des Klicks aufgezeichnet wird. Dadurch sind auch längere Klicks möglich.&lt;br /&gt;
#**Antippen mit Position (Element): Ähnlich zum Klicken, aber zusätzlich wird die Position innerhalb des Elements aufgenommen. Die Position kann relativ zur Größe des Elements aufgenommen werden oder, wenn Sie dabei Strg gedrückt halten, absolut zur linken oberen Ecke des Elements.&lt;br /&gt;
#**Text setzen: Ermöglicht das Setzen eines Textes in Eingabefelder.&lt;br /&gt;
#**Text löschen: Löscht den Text eines Eingabefelds.&lt;br /&gt;
#*Aktionen auf das Gerät:&lt;br /&gt;
#**Antippen (Bildschirm): Löst einen Klick auf die Bildschirmposition aus.&lt;br /&gt;
#**Antippen mit Dauer (Bildschirm): Löst einen Klick auf die Bildschirmposition aus, bei dem auch die Dauer berücksichtigt wird.&lt;br /&gt;
#**Wischen: Wischen in einer geraden Linie vom Punkt des Drückens des Mausknopfes bis zum Loslassen. Die Dauer wird ebenfalls aufgezeichnet.&lt;br /&gt;
#:Beachten Sie bei diesen Aktionen, dass das Ergebnis sich auf verschiedenen Geräten unterscheiden kann, bspw. bei verschiedenen Bildschirmauflösungen.&lt;br /&gt;
#*Erstellen von Testablauf-Bausteinen&lt;br /&gt;
#**Attribut prüfen: Vergleicht den Wert eines festgelegten Attributs des Elements mit einem vorgegebenen Wert. Das Ergebnis triggert den entsprechenden Ausgang.&lt;br /&gt;
#**Attribut zusichern: Vergleicht den Wert eines festgelegten Attributs des Elements mit einem vorgegebenen Wert. Bei Ungleichheit schlägt der Test fehl.&lt;br /&gt;
#**Attribut holen: Liest den aktuellen Wert eines Attributs aus.&lt;br /&gt;
#*Automatisch&lt;br /&gt;
#:Ist das Auto-Werkzeug ausgewählt, können alle Aktionen durch spezifische Eingabeweise benutzt werden: &#039;&#039;Klicken&#039;&#039;, &#039;&#039;Element antippen&#039;&#039; und &#039;&#039;Wischen&#039;&#039; funktionieren weiterhin durch Klicken, wobei sie anhand der Dauer und der Bewegung des Cursors unterschieden werden. Um ein &#039;&#039;Antippen&#039;&#039; auszulösen, halten Sie beim Klicken Strg gedrückt. Die übrigen Aktionen erhalten Sie durch einen Rechtsklick auf das Element in einem Kontextmenü.&lt;br /&gt;
#&#039;&#039;&#039;Kontext-Aktionen&#039;&#039;&#039;: Hier können Sie Aktionen aufzeichnen, die Kontexte betreffen:&lt;br /&gt;
#*Zu Kontext wechseln: Bietet eine Liste der aktuell verfügbaren Kontexte und Sie können auswählen, zu welchem gewechselt werden soll.&lt;br /&gt;
#*Aktuellen Kontext holen: Holt den Handle des aktuellen Kontexts.&lt;br /&gt;
#*Kontext-Handles holen: Holt eine Liste aller aktuell verfügbaren Kontext-Handles.&lt;br /&gt;
#&#039;&#039;&#039;Softkeys&#039;&#039;&#039;: Nur unter Android. Simuliert das Drücken der Knöpfe Zurück, Home, Fensterliste und Power.&lt;br /&gt;
#&#039;&#039;&#039;Home-Button&#039;&#039;&#039;: Nur unter iOS ab expecco 2.11. Ermöglicht das Drücken des Home-Buttons. Vor expecco 19.2 funktioniert es nur, wenn AssistiveTouch aktiviert ist und sich das Menü in der Mitte des oberen Bildschirmrands befindet. Ab expecco 19.2 verwendet die Funktion kein AssistiveTouch mehr.&lt;br /&gt;
#&#039;&#039;&#039;Hilfe&#039;&#039;&#039;: Öffnet diese Online-Dokumentation auf der allgemeinen Seite zu [[GuiBrowser_Recorder|GUI-Browser Recordern]].&lt;br /&gt;
#&#039;&#039;&#039;Anzeige&#039;&#039;&#039;: Zeigt einen Screenshot des Geräts. Aktionen werden mit der Maus je nach Werkzeug ausgelöst. Wenn eine neue Aktion eingegeben werden kann, hat das Fenster einen grünen Rahmen, sonst ist er rot.&lt;br /&gt;
#&#039;&#039;&#039;Fenster an Bild anpassen&#039;&#039;&#039;: Ändert die Größe des Fensters so, dass der Screenshot vollständig angezeigt werden kann.&lt;br /&gt;
#&#039;&#039;&#039;Bild an Fenster anpassen&#039;&#039;&#039;: Skaliert den Screenshot auf eine Größe, mit der er die volle Größe des Fensters ausnutzt.&lt;br /&gt;
#&#039;&#039;&#039;Ansicht anpassen&#039;&#039;&#039;: Öffnet einen Dialog um die Ansicht anzupassen, falls expecco das Bild nicht richtig darstellt. Sie können die Skalierung anpassen oder das Bild um 90° drehen.&lt;br /&gt;
#&#039;&#039;&#039;Ausrichtung anpassen&#039;&#039;&#039;: Korrigiert das Bild, falls dieses auf dem Kopf stehen sollte. Über den Pfeil rechts daneben kann das Bild auch um 90° gedreht werden, falls dies einmal nötig sein sollte. Ab expecco 19.1 finden Sie diese Funktion in &#039;&#039;Ansicht anpassen&#039;&#039;. Die Ausrichtung des Bildes ist für die Funktion des Recorders unerheblich, dieser arbeitet ausschließlich auf den erhaltenen Elementen.&lt;br /&gt;
#&#039;&#039;&#039;Skalierung&#039;&#039;&#039;: Ändert die Skalierung des Screenshots.&lt;br /&gt;
#&#039;&#039;&#039;Meldungen&#039;&#039;&#039;: Zeigt den Pfad des ausgewählten Elements oder andere Meldungen an. Es gibt ein Kontextmenü, um eine Liste der vorigen Meldungen zu sehen.&lt;br /&gt;
&lt;br /&gt;
====Verwendung====&lt;br /&gt;
Mit jedem Klick im Fenster wird eine Aktion ausgelöst und im Arbeitsbereich des GUI-Browsers aufgezeichnet. Dort können Sie das Aufgenommene abspielen, editieren oder daraus einen neuen Baustein erstellen.&lt;br /&gt;
Aktionen zum Auslösen von Sofkeys finden Sie direkt in der Menüleiste (s.o.). Um Aktionen auf Elemente aufzuzeichen, ändern Sie entweder die Auswahl des Werkzeugs in der Menüleiste (s.o.) und klicken dann auf das Element oder wählen Sie die entsprechende Aktion aus dem Kontextmenü durch einen Rechtsklick auf das entsprechende Element aus. Für Texteingabe ist es zudem möglich, den Cursor über dem Element zu platzieren und den Text einzugeben. Dabei öffnet sich der Eingabedialog für diese Aktion.&lt;br /&gt;
Zur Verwendung des Recorders lesen Sie auch Schritt 2 im Tutorial ([[Mobile_Testing_Tutorial#Schritt_2:_Einen_Baustein_mit_dem_Recorder_erstellen|Android]] bzw. [[Mobile_Testing_Tutorial#Schritt_2:_Einen_Baustein_mit_dem_Recorder_erstellen_.28iOS.29|iOS]]).&lt;br /&gt;
&lt;br /&gt;
====Elemente verbergen====&lt;br /&gt;
Ab expecco 21.2 gibt es im Kontextmenü außerdem die Möglichkeit, das ausgewählte Element im Recorder zu verbergen. Das bedeutet, dass dieses Element fortan nicht mehr ausgewählt werden kann. Diese Funktion eignet sich dazu, Elemente zu ignorieren, die im Vordergrund liegen, um auf Elemente darunter zugreifen zu können. Um diesen Zustand wieder rückgängig zu machen, müssen Sie das entsprechende Element im Baum des GUI-Browsers finden, dort gibt es im Kontextmenü ebenfalls einen solchen Eintrag.&lt;br /&gt;
&lt;br /&gt;
====Automatisches Aktualisieren====&lt;br /&gt;
Der Recorder zeigt kein Livebild des Geräts sondern nur eine Momentaufnahme. Um mit der Anzeige auf dem Gerät übereinzustimmen muss daher nach Änderungen aktualisiert werden. Der Recorder aktualisiert sich automatisch, nachdem er eine Aktion ausgeführt hat. Ab expecco 20.2 sind zudem weitere automatische Updates möglich. Sie können Sie im Menü &#039;&#039;Fenster&#039;&#039; aktivieren.&lt;br /&gt;
&lt;br /&gt;
Zum einen kann kurze Zeit nach dem Ausführen einer Aktion überprüft werden, ob es noch Änderungen nach der ersten Aktualisierung gegeben hat, damit in diesem Fall eine zweite Aktualisierung stattfinden kann. Dies soll das Problem beheben, dass der Recorder nach einer Aktion nicht aktuell ist, weil die Aktualisierung zu früh stattgefunden hat.&lt;br /&gt;
&lt;br /&gt;
Zum anderen kann eine periodische Aktualisierung eingeschaltet werden. Nach einem einstellbaren Interval wird der Recorder automatisch aktualisiert, sollte es Änderungen geben. Dadurch ist die Anzeige im Recorder immer weitgehend aktuell, allerdings entsteht dadurch auch ein Mehraufwand was die Kommunikation mit dem Gerät betrifft.&lt;br /&gt;
&lt;br /&gt;
== AVD Manager und SDK Manager ==&lt;br /&gt;
AVD Manager und SDK Manager sind beides Anwendungen von Android. Im Menü des Mobile Testing Plugins bietet expecco die Möglichkeit, diese zu starten. Ansonsten finden Sie diese Programme bei Ihrer Android-Installation. Mit dem AVD Manager können Sie AVDs, also Konfigurationen für Emulatoren, erstellen, bearbeiten und starten. Mit dem SDK Manager erhalten Sie einen Überblick über Ihre Android-Installation und können diese bei Bedarf erweitern.&lt;br /&gt;
&lt;br /&gt;
= Hybrid-Apps und WebViews =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;!!! WICHTIGER HINWEIS - Wenn Sie Probleme haben, auf den Webview zu wechseln, geben Sie bitte unter den Android Einstellungen - Apps -Standard Apps &amp;quot;Chrome&amp;quot; als &amp;quot;Browser-App&amp;quot; an !!!&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hybrid-Apps enthalten neben den Plattform-nativen Elementen weitere Elemente, die in einen WebView eingebunden sind. Diese Elemente können ebenfalls bedient werden, allerdings muss zuvor in den entsprechenden Kontext gewechselt werden. Mit dem Baustein &amp;quot;&#039;&#039;Get Current Context&#039;&#039;&amp;quot; erhalten Sie den aktuellen Kontext. Zu Beginn ist dies &amp;quot;&#039;&#039;NATIVE_APP&#039;&#039;&amp;quot;, also der Kontext der nativen Elemente. Mit dem Baustein &amp;quot;&#039;&#039;Get Context Handles&#039;&#039;&amp;quot; bekommen Sie eine Collection aller vorhandenen Kontexte. Gibt es einen WebView-Kontext, so heißt dieser &amp;quot;&#039;&#039;WEBVIEW_1&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;WEBVIEW_&amp;lt;package&amp;gt;&#039;&#039;&amp;quot; mit dem Paket des WebViews. Es kann auch mehrere WebView-Kontexte geben. Zu jedem WebView-Kontext gibt es im nativen Kontext ein entsprechendes WebView-Element. Mit dem Baustein &amp;quot;&#039;&#039;Switch to Context&#039;&#039;&amp;quot; können Sie in einen solchen Kontext wechseln und haben fortan nur Zugriff auf die Elemente in diesem Kontext.&lt;br /&gt;
&lt;br /&gt;
Im GUI-Browser werden zum einen oben im Baum die vorhandenen Kontexte angezeigt, zum anderen wird der Baum eines Kontexts unterhalb des entsprechenden WebView-Elements eingefügt.&lt;br /&gt;
&lt;br /&gt;
= XPath anpassen mithilfe des GUI-Browsers =&lt;br /&gt;
Bausteine, die auf einem Gerät fehlerfrei funktionieren, tun dies auf anderen Geräten möglicherweise nicht. Auch können kleine Änderungen der App dazu führen, dass ein Baustein nicht mehr den gewünschten Effekt hat. Man sollte einen Baustein daher so robust formulieren, dass er für eine Vielzahl von Geräten verwendet werden kann und kleine Anpassungen an der App verkraftet. Dazu muss man das grundlegende Funktionsprinzip der Adressierung verstehen. Dies wird im Folgenden am Beispiel der App aus dem Tutorial erläutert.&lt;br /&gt;
&lt;br /&gt;
Die Ansicht der App setzt sich aus einzelnen Elementen zusammen. Dazu gehören die Schaltflächen &amp;quot;&#039;&#039;GTIN-13 (EAN-13)&#039;&#039;&amp;quot; und &amp;quot;&#039;&#039;Verify&#039;&#039;&amp;quot;, das Eingabefeld der Zahl &amp;quot;&#039;&#039;4006381333986&#039;&#039;&amp;quot; und das Ergebnisfeld, in dem OK erscheint, wie auch alle anderen auf der Anzeige sichtbaren Dinge. Diese sichtbaren Elemente sind in unsichtbare Strukturelemente eingebettet. Alle Elemente zusammen sind in einer zusammenhängenden Hierarchie, dem Elementbaum, organisiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingGUIBrowser.png | frame | left | Abb. 1: Funktionen des GUI-Browsers]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
Sie können sich diesen Baum im GUI-Browser ansehen. Wechseln Sie dazu in den GUI-Browser (Abb. 1) und starten Sie eine beliebige Verbindung. Sobald die Verbindung aufgebaut ist, können Sie den gesamten Baum aufklappen (1) (Klick bei gedrückter Strg-Taste). Er enthält alle Elemente der aktuellen Seite der App.&lt;br /&gt;
&lt;br /&gt;
Ein Baustein, der nun ein bestimmtes Element verwendet, muss dieses eindeutig angeben, indem er dessen Position im Elementbaum mit einem Pfad im XPath-Format beschreibt. Dieses Format ist ein verbreiteter Web-Standard für XML-Dokumente und -Datenbanken, eignet sich aber genauso für Pfade im Elementbaum.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie ein Element im Baum auswählen, wird unten der von expecco automatisch generierte XPath (2) für das Element angezeigt, der auch beim Aufzeichnen verwendet wird. Oberhalb davon in der Mitte des Fensters befindet sich eine Liste der Eigenschaften (3) des ausgewählten Elements. Man nennt diese Eigenschaften auch Attribute. Sie beschreiben das Element näher wie beispielsweise seinen Typ, seinen Text oder andere Informationen zu seinem Zustand. Links unten können Sie zur besseren Orientierung im Baum die &#039;&#039;Vorschau&#039;&#039; (4) aktivieren, um sich den Bildausschnitt des Elements anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Der Elementbaum für gleiche Ansicht einer App kann sich je nach Gerät unterscheiden. Es sind diese Unterschiede, die verhindern, eine Aufnahme von einem Gerät unverändert auch auf allen anderen Geräten abzuspielen: Ein XPath, der im einen Elementbaum ein bestimmtes Element identifiziert, beschreibt nicht unbedingt das gleiche Element im Elementbaum auf einem anderen Gerät. Es kann stattdessen passieren, dass der XPath auf kein Element, auf ein falsches Element oder auf mehrere Elemente passt. Dann schlägt der Test fehl oder er verhält sich unerwartet.&lt;br /&gt;
&lt;br /&gt;
Man könnte natürlich für jedes Gerät einen eigenen Testfall schreiben. Das brächte aber unverhältnismäßigen Aufwand bei Testerstellung und -wartung mit sich. Das Problem lässt sich auch anders lösen, da ein jeweiliges Element nicht nur durch genau einen XPath beschrieben wird. Vielmehr erlaubt der Standard mithilfe verschiedener Merkmale unterschiedliche Beschreibungen für ein und dasselbe Element zu formulieren. Das Ziel ist daher, einen Pfad zu finden, der auf allen für den Test verwendeten Geräten funktioniert und überall eindeutig zum richtigen Element führt.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel besteht die Verbindung zur Android-App aus dem Tutorial und der Eintrag des &amp;quot;&#039;&#039;GTIN-13&#039;&#039;&amp;quot;-Buttons ist ausgewählt (5). Dessen automatisch generierter XPath (2) kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[@resource id=&#039;android:id/content&#039;]/android.widget.RelativeLayout/android.widget.Button[@resource-id=&#039;de.exept.expeccomobiledemo:id/gtin_13&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Er ist offensichtlich lang und unübersichtlich. Der sehr viel kürzere Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@text=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
führt zum selben Element.&lt;br /&gt;
&lt;br /&gt;
Für die iOS-App lautet der automatisch generierte XPath für diesen Button beispielsweise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/XCUIElementTypeApplication/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/UIAApplication/UIAWindow[1]/UIAButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und kann kürzer als&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@name=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Sie können den Pfad entsprechend im GUI-Browser ändern und durch &amp;quot;&#039;&#039;Pfad überprüfen&#039;&#039;&amp;quot; (6) feststellen, ob er weiterhin auf das ausgewählte Element zeigt, was expecco mit &amp;quot;&#039;&#039;Verify Path: OK&#039;&#039;&amp;quot; (7) bestätigen sollte. Der erste, sehr viel längere Pfad, beschreibt den gesamten Weg vom obersten Element des Baumes bis hin zum gesuchten Button. Der zweite Pfad hingegen wählt mit &amp;quot;*&amp;quot; zunächst sämtliche Elemente des Baumes und schränkt die Auswahl dann auf genau die Elemente ein, die ein &#039;&#039;text&#039;&#039;- bzw. &#039;&#039;name&#039;&#039;-Attribut mit dem Wert &amp;quot;&#039;&#039;GTIN-13 (EAN-13)&#039;&#039;&amp;quot; besitzen, in unserem Fall also genau der eine Button, den wir suchen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden Android-ähnliche Pfade zur Veranschaulichung verwendet. Die Elemente in iOS-Apps heißen zwar anders, wodurch andere Pfade entstehen; das Prinzip ist jedoch das gleiche.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum1.png | frame | Abb. 2: Elementbaum einer fiktiven App]]&lt;br /&gt;
&lt;br /&gt;
Sie können solche Pfade mit Hilfe weniger Regeln selbst formulieren. Sehen Sie sich den einfachen Baum einer fiktiven Android-App in Abb. 2 an: Die Einrückungen innerhalb des Baumes geben die Hierarchie der Elemente wieder. Ein Element ist ein &#039;&#039;Kind&#039;&#039; eines anderen Elementes, wenn jenes andere Element das nächsthöhere Element mit einem um eins geringeren Einzug ist. Jenes Element ist das &#039;&#039;Elternelement&#039;&#039; des Kindes. Sind mehrere untereinander stehende Elemente gleich eingerückt, so sind sie also alle Kinder desselben Elternelements.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad durch alle Ebenen der Hierarchie zum TextView-Element ist nun:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Elemente sind mit Schrägstrichen voneinander getrennt. Es fällt auf, dass der Name des ersten Elements nicht mit dem im Baum übereinstimmt. Das oberste Element in der Hierarchie heißt immer &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot; (für iOS wäre es &amp;quot;&#039;&#039;AppiumAUT&#039;&#039;&amp;quot;), expecco zeigt im Baum stattdessen den Namen der Verbindung an, damit man mehrere Verbindungen voneinander unterscheiden kann. Die weiteren Elemente tragen jeweils das Präfix &amp;quot;&#039;&#039;android.widget.&#039;&#039;&amp;quot;, das im Baum zur besseren Übersicht nicht angezeigt wird. Bei IOS gibt es kein Präfix, das durch einen Punkt abgetrennt wäre, expecco 2.11 blendet aber entsprechend &amp;quot;&#039;&#039;XCUIElementType&#039;&#039;&amp;quot; am Anfang aus. Mit jedem Schrägstrich führt der Pfad über eine Eltern-Kind-Beziehung in eine tiefere Hierarchie-Ebene, d. h. &amp;quot;&#039;&#039;FrameLayout&#039;&#039;&amp;quot; ist ein Kindelement von &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot;, &amp;quot;&#039;&#039;LinearLayout&#039;&#039;&amp;quot; ist ein Kind von &amp;quot;&#039;&#039;FrameLayout&#039;&#039;&amp;quot; usw. Die in eckigen Klammern geschriebenen Wörter dienen nur als Orientierungshilfe im Baum. Sie gehören nicht zum Typ.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad muss nicht beim Element &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot; beginnen. Man kann den Pfad beginnend mit einem beliebigen Element des Baumes bilden. Man kann also verkürzt auch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
schreiben. Der Pfad führt zum selben &amp;quot;&#039;&#039;TextView&#039;&#039;&amp;quot;-Element, da es nur ein Element dieses Typs gibt. Anders verhält es sich bei dem Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da es zwei Elemente vom Typ &amp;quot;&#039;&#039;Button&#039;&#039;&amp;quot; gibt, passt dieser Pfad auf zwei Elemente, nämlich den Button, der mit &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; markiert ist, und den &#039;&#039;Button&#039;&#039;, der mit &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; markiert ist. Es würde an dieser Stelle aber auch nicht helfen den langen Pfad von &#039;&#039;hierarchy&#039;&#039; aus beginnend anzugeben. Um einen mehrdeutigen Pfad weiter zu differenzieren, kann man explizit ein Element aus einer Menge wählen, indem man den numerischen Index in eckigen Klammern dahinter schreibt. Der Pfad aus dem obigen Beispiel lässt sich damit so anpassen, dass er eindeutig auf den &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; weist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[1].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ihnen fällt sicher auf, dass der Index eine 1 ist obwohl das zweite Element gemeint ist. Das kommt daher, dass die Zählung bei 0 beginnt. Der Button mit der Markierung &amp;quot;An&amp;quot; hat also die Nummer 0 und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Nummer 1.&lt;br /&gt;
&lt;br /&gt;
Dieser Ansatz, einen expliziten Index zu verwenden, hat zwei Nachteile: Zum einen lässt sich an dem Pfad nur schwer ablesen welches Element gemeint ist, zum andern ist der Pfad sehr empfindlich schon gegenüber kleinsten Änderungen, wie zum Beispiel dem Vertauschen der beiden &#039;&#039;Button&#039;&#039;-Elemente oder dem Einfügen eines weiteren &#039;&#039;Button&#039;&#039;-Elements in der App.&lt;br /&gt;
&lt;br /&gt;
Es wäre daher wünschenswert, das gemeinte Element über eine ihm charakteristische Eigenschaft wie einen Attributwert, zu adressieren. Für Android-Apps eignet sich hierfür häufig das Attribut &amp;quot;&#039;&#039;resource-id&#039;&#039;&amp;quot;. Im Idealfall muss bei der Entwicklung der App darauf geachtet werden, dass jedes Element eine eindeutige Id erhält. Die &#039;&#039;resource-id&#039;&#039; hat den großen Vorteil, dass sie unabhängig vom Text des Elements oder der Spracheinstellung des Geräts ist. Für iOS-Apps kann entsprechend das Attribut &amp;quot;&#039;&#039;name&#039;&#039;&amp;quot; verwendet werden, wenn es von der App sinnvoll gesetzt wird. Der XPath-Standard erlaubt solche Auswahlbedingungen zu einem Element anzugeben. Angenommen, der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Eigenschaft &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;off&#039;&#039; und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; hat als &#039;&#039;resource-id&#039;&#039; den Wert &#039;&#039;on&#039;&#039;, dann kann man als eindeutigen Pfad für den &amp;quot;Aus&amp;quot;-&#039;&#039;Button&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[@resource-id=&#039;off&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
formulieren. Wie an dem Beispiel zu sehen werden solche Bedingungen wie ein Index in eckigen Klammern an den Elementtyp angehängt. Der Name eines Attributes wird mit einem &amp;quot;@&amp;quot; eingeleitet und der Wert mit einem &amp;quot;=&amp;quot; in Anführungszeichen angehängt. Ist der Attributwert global eindeutig, kann man den vorausgehenden Pfad sogar durch den globalen Platzhalter * ersetzen, der auf jedes Element passt. Das obige Beispiel mit dem GTIN-13-&#039;&#039;Button&#039;&#039; war ein solcher Fall.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum2.png | frame | Abb. 3: Elementbaum einer fiktiven App mit Erweiterungen]]&lt;br /&gt;
&lt;br /&gt;
Abb. 3 zeigt eine Erweiterung des Beispiels aus Abb. 2. Die App hat nun ein weiteres, nahezu identisches &#039;&#039;LinearLayout&#039;&#039; bekommen. Die &#039;&#039;Buttons&#039;&#039; sind in ihren Attributen jeweils ununterscheidbar. Deshalb funktioniert der vorige Ansatz nicht, einen eindeutigen Pfad nur mithilfe eines Attributwerts zu formulieren. Offensichtlich unterscheiden sich aber ihre benachbarten &#039;&#039;TextViews&#039;&#039;. Es ist möglich die jeweilige &#039;&#039;TextView&#039;&#039; in den Pfad mit aufzunehmen, um einen &#039;&#039;Button&#039;&#039; dennoch eindeutig zu adressieren. Ein Pfad zum &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; unterhalb der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; kann dabei wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView[@resource-id=&#039;push&#039;]/../android.widget.Button[@resource-id=&#039;on&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Teil beschreibt den Pfad zu der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; und der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;push&#039;&#039;. Danach folgt ein Schrägstrich gefolgt von zwei Punkten. Die zwei Punkte sind eine spezielle Elementbezeichnung, die nicht ein Kindelement benennt, sondern zum Elternelement wechselt, in diesem Fall also das &#039;&#039;LinearLayout&#039;&#039;, in dem die &#039;&#039;TextView&#039;&#039; eingebettet ist. Im Kontext dieses &#039;&#039;LinearLayout&#039;&#039; ist der restliche Pfad, nämlich der &#039;&#039;Button&#039;&#039; mit der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;on&#039;&#039;, eindeutig.&lt;br /&gt;
&lt;br /&gt;
Der XPath-Standard bietet noch sehr viel mehr Ausdrucksmittel. Mit der hier knapp vorgestellten Auswahl ist es aber bereits möglich für die meisten praktischen Testfälle gute Pfade zu formulieren. Eine vollständige Einführung in XPath ginge über den Umfang dieser Einführung weit hinaus. Sie finden zahlreiche weiterführende Dokumentationen im Web und in Büchern.&lt;br /&gt;
&lt;br /&gt;
Eine universelle Strategie zum Erstellen guter XPaths gibt es nicht, da sie von den Testanforderungen abhängt. In der Regel ist es sinnvoll, den XPath kurz und dennoch eindeutig zu halten. Häufig lassen sich Elemente über Eigenschaften identifizieren wie beispielsweise ihren Text. Will man aber gerade den Text eines Elements auslesen, kann dieser natürlich nicht im Pfad verwendet werden, da er vorher nicht bekannt ist. Ebenso wird der Text variieren, wenn die App mit verschiedenen Sprachen gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Jeder Baustein, der auf einem Element arbeitet, hat einen Eingangspin für den XPath. Im GUI-Browser finden Sie in der Mitte oben eine Liste von Bausteinen mit Aktionen, die Sie auf das ausgewählte Element anwenden können. Suchen Sie den Baustein &#039;&#039;Click&#039;&#039; (8) im Ordner Elements und wählen Sie ihn aus (Abb. 1). Er wird im rechten Teil unter &amp;quot;&#039;&#039;Test&#039;&#039;&amp;quot; eingefügt, der Pin für den XPath ist mit dem automatisch generierten Pfad des Elements vorbelegt (9). Sie können den Baustein hier auch ausführen. Die Ansicht wechselt dann auf &amp;quot;&#039;&#039;Lauf&#039;&#039;&amp;quot;. Ändert sich durch die Aktion der Zustand Ihrer App, müssen Sie den Baum anschließend aktualisieren (10).&lt;br /&gt;
&lt;br /&gt;
Wenn Sie in der unteren Liste eine Eigenschaft auswählen, wechselt die Anzeige der Bausteine zu &amp;quot;&#039;&#039;Eigenschaften&#039;&#039;&amp;quot;, wo Sie die eigenschaftsbezogenen Bausteine finden. Wie bei den Aktionen können Sie auch hier einen Baustein auswählen, der dann rechts in Test mit dem Pfad des Elements und der ausgewählten Eigenschaft eingetragen wird, sodass Sie ihn direkt ausführen können.&lt;br /&gt;
&lt;br /&gt;
== Weitere Locator-Strategien ==&lt;br /&gt;
Appium bietet neben XPath noch weitere Strategien zur Adressierung von Elementen an. Einige davon stehen Ihnen &#039;&#039;&#039;ab Version 20.1&#039;&#039;&#039; ebenfalls mit expecco zur Verfügung. Diese sind nicht ganz so mächtig wie XPath, dafür aber häufig schneller bei der Auflösung auf dem Gerät. Insbesondere bei der Verwendung mit iPhones, wo die Hierarchie bei jeder XPath-Auflösung erst aufgebaut werden muss, bieten alternative Strategien einen Vorteil für die Laufzeit.&lt;br /&gt;
&lt;br /&gt;
XPath ist weiterhin der Standard, das heißt alle Locator ohne besondere Angabe werden als XPath interpretiert. Um eine der anderen Strategien zu verwenden, schreiben Sie diese mit einem Gleichzeichen vor den gewünschten Locator. Diese Technik können Sie sowohl an den Blöcken verwenden, als auch im GUI-Browser testen.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | AccessibilityId || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Wert des Elements, der dazu dient, die App barrierefrei zu machen. Für iOS ist das das Attribut &#039;&#039;&#039;Accessibility-id&#039;&#039;&#039;, für Android das Attribut &#039;&#039;&#039;content-descr&#039;&#039;&#039;. &#039;&#039;Beispiel: accessibilityId=Löschen&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | className || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Namen der Klasse des Elements. &#039;&#039;Beispiel: className=android.widget.FrameLayout&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | id || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet die Kennung des Elements. Für iOS ist das das Attribut &#039;&#039;&#039;name&#039;&#039;&#039;, für Android das Attribut &#039;&#039;&#039;resource-id&#039;&#039;&#039;. &#039;&#039;Beispiel: id=android:id/text1&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | iOSClassChain&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet die Hierarchie der Elemente ähnlich wie bei XPath. Eine Erklärung zum Aufbau finden Sie [https://github.com/facebookarchive/WebDriverAgent/wiki/Class-Chain-Queries-Construction-Rules hier]. &#039;&#039;Beispiel: iOSClassChain=XCUIElementTypeWindow/XCUIElementTypeButton[`label == &amp;quot;Ok&amp;quot;`]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; padding-right:1em&amp;quot; | iOSNsPredicateString&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet einfache Kriterien, wie Attribute, die auch kombiniert werden können. &#039;&#039;Beispiel: iOSNsPredicateString=type == &#039;XCUIElementTypeButton&#039; AND name == &#039;Weiter&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | name&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Namen des Elements. &#039;&#039;Beispiel: name=Bestätigen&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &#039;&#039;nur für iOS&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Um eine direkte Beschleunigung mit iOS zu erzielen, ohne dass Sie Ihre bisherigen Pfade anpassen müssen, wandelt expecco zudem Pfade, die nur aus einem Element mit Klasse und name-Attribut bestehen, zur Laufzeit automatisch in einen entsprechenden Locator der Strategie iOSNsPredicateString um. Wenn Sie einen Pfad explizit als XPath markieren, wird diese Anpassung nicht vorgenommen.&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span id=&amp;quot;troubleshooting&amp;quot;&amp;gt;&amp;lt;!-- Referenced by error dialog on connection error --&amp;gt;&amp;lt;/span&amp;gt;Probleme und Lösungen=&lt;br /&gt;
== Locator sind versionsabhängig oder variabel ==&lt;br /&gt;
Dann sollten Sie die Locator (xPath) entweder in einer Variablen halten oder ein Locator-Mapping in einem Screenplay Anhang definieren. Es ist auch möglich, lediglich Teile des Locators (z.B. Locator-Pfad eines Elternelements oder Attributwert) in einer Variable zu halten und im Freezevalue des Locator-Pins mit &amp;quot;&#039;&#039;$(varName)&#039;&#039;&amp;quot; einzufügen.&lt;br /&gt;
&lt;br /&gt;
==Unsichtbare UI-Elemente==&lt;br /&gt;
Beachten Sie, dass im [[#Recorder|Recorder]] auch Elemente berücksichtigt werden, die Sie auf dem Bildschirm nicht sehen. Schalten Sie daher das Element-Highlighting an oder nutzen Sie die Follow-Mouse-Funktion und den Elementbaum im GUI-Browser, um festzustellen, ob das richtige Element verwendet wird. Es kann vorkommen, dass unsichtbare Elemente vor anderen Elementen liegen und diese verdecken, so dass die gewünschten Elemente im Recorder nicht ausgewählt werden können. Lesen Sie dazu den Abschnitt [[#Elemente_verbergen|Elemente verbergen]].&lt;br /&gt;
&lt;br /&gt;
==iOS: Kabel nicht zertifiziert==&lt;br /&gt;
In manchen Fällen erscheint beim Verbinden eines iOS-Geräts über USB der Hinweis, das verwendete Kabel sei nicht zertifiziert. In diesem Fall hilft es nur, das entsprechende Kabel auszutauschen.&lt;br /&gt;
==iOS: Alerts beim Verbindungsaufbau==&lt;br /&gt;
Stellen Sie sicher, dass beim Verbindungsaufbau mit einem iOS-Gerät keine Alerts geöffnet sind. Der Aufbau schlägt sonst fehl, da die App nicht in den Vordergrund kommen kann. Siehe auch [[#iOS-Ger.C3.A4t_und_App_vorbereiten|iOS-Gerät und App vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
==iOS: .ipa installieren nicht möglich==&lt;br /&gt;
Beachten Sie, dass auf iOS-Simulatoren keine &#039;&#039;.ipa&#039;&#039;-Dateien sondern nur &#039;&#039;.app&#039;&#039;-Dateien installiert werden können.&lt;br /&gt;
&lt;br /&gt;
==iOS: Erster Verbindungsaufbau funktioniert nicht==&lt;br /&gt;
Wenn auf Ihrem Mac noch kein signierter Build des WebDriverAgents liegt, muss dieser beim ersten Verbindungsaufbau erst erzeugt werden. Das kann in der Regel etwas länger als eine Minute dauern. Standardmäßig verwendet Appium aber einen Timeout von 60000&amp;amp;nbsp;ms um zu warten bis der WebDriverAgent auf dem Gerät startet, so dass der Aufbau in diesen Fällen abgebrochen wird. Sie können den Timeout mit der Capability &#039;&#039;wdaLaunchTimeout&#039;&#039; setzen, z.B. auf &#039;&#039;120000&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Außerdem müssen die Einstellungen für die Signierung passen. Am zuverlässigsten funktioniert das nach unserer Erfahrung, wenn man im Xcode-Projekt des WebDriverAgents auf automatische Signierung stellt und das Team setzt. Siehe dazu die Erklärung im Abschnitt [[#WebDriverAgent-Signierung|WebDriverAgent-Signierung]]. In diesem Fall sollten Sie die Capabilities &#039;&#039;xcodeConfigFile&#039;&#039; bzw. &#039;&#039;xcodeOrgId&#039;&#039; und &#039;&#039;xcodeSigningId&#039;&#039; &#039;&#039;&#039;nicht&#039;&#039;&#039; verwenden, da es sonst zu Konflikten kommen kann. Achtung: Wenn Sie eine Team-ID in den Mobile-Testing-Einstellungen gesetzt haben, setzt expecco diese automatisch als &#039;&#039;xcodeOrgId&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
Achten Sie beim ersten Verbindungsaufbau außerdem auf Ihr Gerät, da Sie dort möglicherweise der Installation per Passwort zustimmen müssen. Auf dem Mac kann die Eingabe des Passworts zur Freigabe des Schlüsselbunds für die Signierung nötig werden, häufig auch mehrmals.&lt;br /&gt;
&lt;br /&gt;
==Android: Gerät nicht im Verbindungsdialog==&lt;br /&gt;
Wenn ein über USB angeschlossenes Android-Gerät nicht im Verbindungsdialog auftaucht, versuchen Sie, den USB-Verbindungstyp zu ändern. In der Regel sollten MTP oder PTP funktionieren. Prüfen Sie nochmal, ob &amp;quot;USB Debugging&amp;quot; in den Entwicklereinstellungen des Geräts aktiviert ist (diese Einstellungen sind bei manchen Geräten zunächst unsichtbar, und müssen durch einen Trick zugänglich gemacht werden). Siehe auch [[#Android-Ger.C3.A4t_vorbereiten|Android-Gerät vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
==Android: Abgeschnittene Elemente unten==&lt;br /&gt;
Bei Android-Geräten, die die Steuerungsleiste bzw. Softkeys automatisch ein- und ausblenden, kann es vorkommen, dass der Recorder im unteren Bereich Elemente abschneidet, die durch die Softkeys verdeckt würden, auch wenn sie zu diesem Zeitpunkt gar nicht angezeigt werden. In diesem Fall hift es, die Softkeys so einzustellen, dass sie in einer permanenten Leiste angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
Bei neueren Android-Versionen gibt es eine solche Einstellung in der Regel nicht. Auch wenn die Steuerelemente permanent eingeblendet sind, liegen sie auf keiner extra Leiste, sondern vor dem Inhalt der App. Es gibt dann im unteren Teil einen Bereich, der nicht bedient werden kann, weil er nicht zum aktiven Bereich der App gezählt wird, weshalb die Elemente von Appium abgeschnitten werden. Dieser Bereich kann auch größer sein als von den Steuerungselementen beansprucht. Bekannt ist dies für Samsung-Geräte mit Android 11. Da die Information über die Größe des App-Bereichs bereits auf Android-Ebene so geliefert wird, können wir hierfür keine Lösung anbieten, sondern können nur hoffen, dass das Problem vom Hersteller behoben wird. Sie können versuchen, ob Sie mit der Einstellung von Gestensteuerung bessere Ergebnisse bekommen, allerdings gibt es hier das gleiche Problem.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;waitForIdleTimeout&amp;quot;&amp;gt;&amp;lt;!-- Referenced by expecco--&amp;gt;&amp;lt;/span&amp;gt; Android: Test hängt beim Suchen eines Elements==&lt;br /&gt;
Der Baustein &#039;&#039;Find Element by XPath&#039;&#039; und alle Element-Bausteine warten bis ein Element zum angegebenen Pfad auftaucht. Den Timeout dafür kann man entweder am Baustein direkt oder in den Umgebungsvariablen ändern. Wenn das Element aber bereits da sein sollte und es dennoch sehr lange dauert, bis der Test weitergeht, kann das am UIAutomator/UIAutomator2 liegen. Dieser wartet, bis die App in den Idle-Zustand geht, bevor er überhaupt nach Elementen sucht. Dies kann länger dauern, wenn die App z.B. im Hintergrund noch Animationen abspielt oder andere Aktionen ausführt. Auch das Holen des Page-Sources z.B. beim Aktualisieren im GUI-Browser oder im Recorder kann dadurch länger dauern. Standardmäßig gibt es hierfür einen Timeout von 10 Sekunden, nach dem nicht weiter auf den Idle-Zustand gewartet wird. Dieser Timeout lässt sich durch eine Einstellung in Appium anpassen (waitForIdleTimeout). Falls Sie einen anderen Wert für diesen Timeout setzen möchten, ist dies ab expecco 21.2 möglich, indem Sie vor dem Test den Smalltalk-Code &amp;lt;code&amp;gt;AppiumTestRunner::TestRunConnection waitForIdleTimeout:2000&amp;lt;/code&amp;gt; ausführen. Der Timeout wird in Millisekunden angegeben, das Beispiel setzt ihn also auf 2 Sekunden.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;startChromedriverTimeout/&amp;gt;Android: Aktualisieren des Trees oder Wechseln zum Webview-Kontext braucht zu lange==&lt;br /&gt;
Speziell mit älteren Geräten kann es vorkommen, dass neuere Chromedriver nicht initialisiert werden können. Das führt dann dazu, dass nicht in den Webview-Kontext gewechselt werden kann. Dies wird von Appium allerdings nur über einen Timeout festgestellt, der standardmäßig bei 4 Minuten liegt. Da expecco auch beim Aufbauen des Trees im GUI-Browser versucht in den Webview-Kontext zu wechseln, kann das zu sehr langen Ladezeiten führen. Da es in Appium keine Möglichkeit gibt, diesen Timeout herunter zu setzen, haben wir die Version, die wir im MobileTestingSupplement bereitstellen, um eine entsprechende Capability erweitert. Ab der Version 1.13.1.0 des [[#Windows|MobileTestingSupplements]] kann mit &#039;&#039;chromedriverStartTimeout&#039;&#039; der Timeout in Millisekunden gesetzt werden. Der Wechsel funktioniert dadurch zwar trotzdem nicht, aber expecco braucht dann nicht mehr so lange beim Aktualisieren des Trees und der Baustein zum Wechseln des Kontextes schlägt schneller fehl. Der Verbindungsdialog fügt diese Capability ab expecco 22.1 automatisch hinzu.&lt;br /&gt;
&lt;br /&gt;
==Keine Aktion bei Klick==&lt;br /&gt;
Der Baustein zum Klicken auf ein Element ist erfolgreich, aber auf dem Gerät wurde keine Aktion ausgeführt.&lt;br /&gt;
:Dies kann vorkommen, wenn das Element von einem anderen Element verdeckt ist und ein Klick auf das Element deshalb nicht möglich ist. In diesem Fall wird von Appium kein Fehler geworfen, sondern es passiert einfach nichts. Wenn Sie dennoch einen Klick an der Position des Elements machen möchten, auch wenn es verdeckt ist, benutzen Sie stattdessen den Baustein &#039;&#039;Tap&#039;&#039; und übergeben Sie diesem die Position des Elements (&#039;&#039;Get Location&#039;&#039;). Wenn Sie stattdessen vor einem Klick prüfen möchten, ob das Element zu diesem Zeitpunkt verdeckt ist, versuchen Sie, ob Ihnen die Eigenschaften &#039;&#039;Is Displayed&#039;&#039; oder &#039;&#039;Is Enabled&#039;&#039; weiterhelfen.&lt;br /&gt;
&lt;br /&gt;
==Kein Update nach Aktion==&lt;br /&gt;
Über den Recorder wurde eine Aktion ausgeführt, für die auch ein Baustein aufgezeichnet wurde, der Recorder zeigt aber immer noch das alte Bild.&lt;br /&gt;
:Der Recorder zeigt kein Livebild des Geräts, sondern immer nur eine Momentaufnahme. Nachdem eine Aktion ausgeführt wurde, aktualisiert sich der Recorder automatisch. Es kann aber vorkommen, dass das Bild schon aktualisiert wurde, bevor die Auswirkungen der Aktion auf dem Gerät vollständig abgeschlossen sind. In diesem Fall sollten Sie den Recorder von Hand aktualisieren über das Symbol mit den blauen Pfeilen. Ab expecco 20.2 können Sie für diesen Fall auch automatisches Aktualisieren einstellen. Siehe auch Beschreibung zum [[#Recorder|Recorder]].&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;clickable&amp;quot; Attribut falsch==&lt;br /&gt;
Ein Element hat im &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; Attribut/Property den Wert &amp;quot;&#039;&#039;false&#039;&#039;&amp;quot;, ist aber dennoch anklickbar.&lt;br /&gt;
:Das &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; Attribute muss explizit vom App-Programmierer gesetzt werden, und hat tatsächlich keine Relevanz für das tatsächliche Verhalten der App. Sie sollten dieses Attribut i.A. in Ihren Tests nicht beachten.&amp;lt;br&amp;gt;Leider existieren viele Apps, bei denen der Programmierer hier &amp;quot;lazy&amp;quot; war.&lt;br /&gt;
&lt;br /&gt;
==Verbindungsaufbau schlägt fehl==&lt;br /&gt;
Schlägt der Verbindungsaufbau mit dem Appium-Server fehl, erhalten Sie in expecco eine Fehlermeldung ähnlicher der unten abgebildeten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingVerbindungsfehler.png]]&lt;br /&gt;
&lt;br /&gt;
Hier sehen Sie die Art des aufgetretenen Fehlers. Klicken Sie auf &amp;quot;&#039;&#039;Details&#039;&#039;&amp;quot; um nähere Informationen zu erhalten. Mögliche Fehler sind:&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.remote.UnreachableBrowserException&#039;&#039;&lt;br /&gt;
:Der angegebene Server läuft nicht oder ist nicht erreichbar. Überprüfen Sie die Serveradresse.&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.WebDriverException&#039;&#039;&lt;br /&gt;
:Lesen Sie in den Details in der ersten Zeile die Meldung hinter &#039;&#039;Original Error&#039;&#039;:&lt;br /&gt;
:*&#039;&#039;Unknown device or simulator UDID&#039;&#039;&lt;br /&gt;
::Entweder ist das Gerät nicht richtig angeschlossen oder die udid stimmt nicht.&lt;br /&gt;
:*&#039;&#039;Unable to launch WebDriverAgent because of xcodebuild failure: xcodebuild failed with code 65&#039;&#039;&lt;br /&gt;
::Dieser Fehler kann verschiedene Ursachen haben. Entweder konnte tatsächlich der WebDriverAgent nicht gebaut werden, weil die Signierungseinstellungen falsch sind oder das passende Provisioning Profile fehlt. Lesen Sie dazu den Abschnitt zur [[#Signierung|Signierung]]. Es kann auch sein, dass der WebDriverAgent auf dem Gerät nicht gestartet werden kann, weil sich beispielsweise ein Alert im Vordergrund befindet oder Sie dem Entwickler nicht vertraut haben.&lt;br /&gt;
:*&#039;&#039;Could not install app: &#039;Command &#039;ios-deploy [...] exited with code 253&#039;&#039;&#039;&lt;br /&gt;
::Die angegebene App kann nicht auf dem iOS-Gerät installiert werden, weil es nicht im Provisioning Profile der App eingetragen ist.&lt;br /&gt;
:*&#039;&#039;Bad app: [...] App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name.&#039;&#039;&#039;&lt;br /&gt;
::Der Pfad zur App ist falsch. Stellen Sie sicher, dass sich die Datei unter dem angegebenen Pfad auf dem Mac befindet.&lt;br /&gt;
:*&#039;&#039;packageAndLaunchActivityFromManifest failed.&#039;&#039;&lt;br /&gt;
::Die angegebene &#039;&#039;apk&#039;&#039;-Datei ist vermutlich kaputt.&lt;br /&gt;
:*&#039;&#039;Could not find app apk at [...]&#039;&#039;&lt;br /&gt;
::Der Pfad zur App ist falsch. Stellen Sie sicher, dass sich die &#039;&#039;apk&#039;&#039;-Datei am angegebenen Pfad befindet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Falls der Fehler nicht durch eine der oben gelisteten Ursachen bedingt ist, kann es sein, dass die auf dem Gerät befindlichen Automation-Anwendungen nicht mehr richtig funktionieren. Hier hilft es, diese vom Mobilgerät zu deinstallieren. Beim nächsten Verbindungsaufbau werden sie dann automatisch neu installiert.&lt;br /&gt;
&lt;br /&gt;
*Für iOS-Geräte ist das der WebDriverAgent, den Sie einfach vom Home-Screen deinstallieren können. Dies behebt in der Regel Probleme durch den Wechsel des verwendeten Macs oder der Xcode-Version.&lt;br /&gt;
&lt;br /&gt;
*Für Android-Geräte ist es der UIAutomator2; hier tritt auf einigen Geräten sporadisch ein Problem auf, die Ursache dafür ist uns z.Z. noch nicht bekannt. Zur Deinstallation navigieren Sie auf dem Gerät zu &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;Anwendungen&#039;&#039;&amp;quot;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; und suchen in der Liste nach folgenden Einträgen:&lt;br /&gt;
    Appium Settings&lt;br /&gt;
    io.appium.uiautomator2.server&lt;br /&gt;
    io.appium.uiautomator2.server.test&lt;br /&gt;
:Klicken Sie auf die jeweilige Anwendung und dann auf &amp;quot;&#039;&#039;Deinstallieren&#039;&#039;&amp;quot;.&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&#039;&#039;Der entsprechende Eintrag heißt auf manchen Geräten möglicherweise etwas anders.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Falls dies nicht hilft, kann eventuell die Ausgabe des Appium-Servers weiterhelfen. Für einen von expecco gestarteten Server finden Sie das Log in der Liste der [[#Laufende_Appium-Server|laufenden Appium-Server]].&lt;br /&gt;
&lt;br /&gt;
==Ich habe keinen Mac==&lt;br /&gt;
Vielleicht hilft Ihnen diese Webseite weiter: [https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10 https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Timeline&amp;diff=29086</id>
		<title>Timeline</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Timeline&amp;diff=29086"/>
		<updated>2023-12-22T09:04:43Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Einleitung */ warning for large logs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Einleitung =&lt;br /&gt;
[[Datei:Timeline.png|800px|thumb|Der Reiter &amp;quot;Zeitleiste&amp;quot;]]&lt;br /&gt;
Die Zeitleiste (Timeline) kann ein hilfreiches Werkzeug sein, um die zeitliche Abfolge Ihrer Testsequenzen zu verstehen, insbesondere, wenn Aktionen parallel laufen. Sie finden sie in der &#039;&#039;Lauf&#039;&#039; Anzeige entweder eines Testplans oder eines Aktionsblocks. Sie verwendet die gesammelten [[Glossary/en#Activity_Log|Logdaten]] um anzuzeigen wann und wie lange eine Aktion ausgeführt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b style=&amp;quot;color:red&amp;quot;&amp;gt;Diese Funktionalität ist in expecco&amp;amp;nbsp;23.2 noch experimentell und kann bei großen Logs oder während des Laufs an ihre Grenzen stoßen.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Darstellung =&lt;br /&gt;
Die Zeitleiste zeigt die Unterblöcke des ausgewählten Blocks als Balken in der Farbe ihres Ausführungsstatus, wobei deren Länge und horizontale Position die Dauer und Startzeit der Ausführung widerspiegeln. Die Zeitskala oben passt sich der dargestellten Zeit an. Das aktuelle Zeitformat können Sie in der oberen rechten Ecke ablesen; z.B. bedeutet &#039;&#039;m:s&#039;&#039; eine Darstellung in Minuten und Sekunden, wobei die Sekunden noch Dezimalstellen aufweisen können, um die Millisekunden anzuzeigen.&lt;br /&gt;
&lt;br /&gt;
Anfangs wird nur die oberste Ebene der Unterblöcke des ausgewählten Blocks angezeigt. Wenn Blöcke parallel ausgeführt werden, landen sie in verschiedenen Zeilen; nacheinander ausgeführte Blocke stehen in einer Zeile. Allerdings bedeutet es für zwei Blöcke, die hintereinander stehen NICHT generell, dass der zweiten vom ersten gestartet wurde.&lt;br /&gt;
&lt;br /&gt;
Sie können Blöcke ausklappen, um deren Unterblöcke zu sehen. Ist ein Block breit genug, wird dies durch ein entsprechendes kleines Icon in der oberen linken Ecke angezeigt. Sie können Blöcke auf- und zuklappen, indem Sie auf dieses Icon klicken. Alternativ können Sie auf einen Block mit der rechten Maustaste klicken und erhalten im Kontextmenü die Möglichkeit, ihn auf- oder zuzuklappen. Die Unterblöcke werden unterhalb ihrer Eltern angezeigt, wobei sich etwaige parallele Blöcke weiter nach unten verschieben. Der Rahmen eines Blocks umfasst seine Unterblöcke um die Verschachtelung zu verdeutlichen. Sie können auch Strg gedrückt halten, um alle Kinder auszuklappen. Da die Zeitleiste nur die Informationen aus den Logdaten darstellt, werden auch nur Blöcke angezeigt, die einen Logeintrag haben. Blöcke, die im Log übersprungen wurden, werden nicht angezeigt.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie einen Block in der Zeitleiste anklicken, wird er ausgewählt, was durch einen roten Rahmen dargestellt wird. Die Hauptinformationen dieses Blocks werden zum Meldungsfenster in der unteren linken Ecke des expecco-Fensters hinzugefügt. Außerdem werden Sie als Tooltip angezeigt, wenn Sie mit der Maus über den Block fahren.&lt;br /&gt;
&lt;br /&gt;
= Navigation =&lt;br /&gt;
Standardmäßig wird die gesamte Dauer des Laufs im Fenster angezeigt. Sie können aber heranzoomen, um bestimmte Abschnitte besser zu analysieren. Sie können die Menübuttons und die Maus verwenden, um sich auf der Zeitleiste zu bewegen.&lt;br /&gt;
&lt;br /&gt;
== Menüzeile ==&lt;br /&gt;
[[Datei:Timeline_Menubar.png]]&lt;br /&gt;
# Höhe der Zeilen verringern&lt;br /&gt;
# Höhe der Zeilen vergrößern&lt;br /&gt;
# Zeitleiste auf verfügbaren Breite strecken&amp;lt;br&amp;gt;Ein Umschaltknopf: wenn er aktiviert ist, wird die gesamte Laufdauer auf die Breite des Reiters gestreckt.&lt;br /&gt;
# Herauszoomen&amp;lt;br&amp;gt;Die Breite der Zeitleiste verkleinern, sodass mehr Zeit auf weniger Platz dargestellt wird&lt;br /&gt;
# Hineinzoomen&amp;lt;br&amp;gt;Die Breite der Zeitleiste vergrößern, sodass weniger Zeit auf mehr Platz dargestellt wird und besser analysiert werden kann&lt;br /&gt;
# Springe zum Start der ausgewählten Aktion&lt;br /&gt;
# Springe zum Ende der ausgewählten Aktion&lt;br /&gt;
# Relative Ausführungszeiten&amp;lt;br&amp;gt;Die Block-Informationen bspw. im Tooltip zeigen die Startzeit relativ zum Beginn des dargestellten Blocks und die Dauer falls aktiviert, ansonsten absolute Start- und Endzeiten&lt;br /&gt;
&lt;br /&gt;
== Mauseingabe ==&lt;br /&gt;
Normales Scrollen verschiebt das Diagram vertikal, bei gedrückter Shift-Taste horizontal. Durch Scrollen bei gedrückter Strg-Taste können Sie an der Cursorposition zoomen. Falls das Strecken der Zeitleiste deaktiviert ist, können Sie an einem Punkt in der Zeitskala klicken und zu einem anderen ziehen, um einen Zeitabschnitt auszuwählen. Dieser wird dabei gelb markiert. Wenn Sie die Maustaste loslassen, wird die Zeitleiste auf diesen Abschnitt herangezoomt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Timeline_Select_Time.png]]&lt;br /&gt;
&lt;br /&gt;
= Auswählen =&lt;br /&gt;
Wie bereits erwähnt, können Sie einen Block durch Klicken auswählen. Wenn Sie doppelklicken, wird der Block im Baum ausgewählt und die Zeitleiste wechselt zur Darstellung seiner Unterblöcke.&lt;br /&gt;
&lt;br /&gt;
Sie können die Zeitleiste (und gleichzeitig das Netzwerk, die Logdaten und die Ein/Ausgänge) auch auf den ausgewählten Block fixieren, indem Sie den Toggle-Button [[Datei:Timeline_Lock_Button.png]] im Menü des Baums aktivieren. Dies wird durch ein kleines Schloss-Symbol neben dem Eintrag des fixierten Blocks im Baum angezeigt. Wenn Sie nun einen anderen Block im Baum auswählen, wird er in der Zeitleiste des fixierten Blocks ausgewählt. Genauso können Sie auf einen Block in der Zeitleiste doppelklicken und sein Eintrag wird im Baum ausgewählt ohne die angezeigte Zeitleiste zu ändern.&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Timeline/en&amp;diff=29085</id>
		<title>Timeline/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Timeline/en&amp;diff=29085"/>
		<updated>2023-12-22T09:02:04Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Introduction */ warning for large logs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
[[Datei:Timeline.png|800px|thumb|Timeline Tab]]&lt;br /&gt;
The Timeline can be a useful tool, when you want to understand the chronology of your test sequence, especially when actions are running in parallel. It can be found in the &#039;&#039;Run&#039;&#039; section of either a testplan or an action block. It uses the information collected in the [[Glossary/en#Activity_Log|Activity Log]] to show when and for how long an action was executed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b style=&amp;quot;color:red&amp;quot;&amp;gt;This feature is still experimental in expecco&amp;amp;nbsp;23.2 and may reach its limits with large logs or while running.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Representation =&lt;br /&gt;
The timeline shows the subblocks of the selected block as bars in the color of their execution state, where their length and horizontal position represents the duration and start time of their execution. The timescale at the top adapts to the presented time. You see the current time format in the top right corner, e.g. &#039;&#039;m:s&#039;&#039; means minutes and seconds separated by a colon, where the seconds may have digits after the decimal point to show the milliseconds.&lt;br /&gt;
&lt;br /&gt;
Initially only the top blocks of the selected blocks are shown. If blocks are executed in parallel, they go in different lines, consecutive blocks are in one line. However, if two blocks are one after the other in the same line, that does NOT indicate, that the first block triggered the second.&lt;br /&gt;
&lt;br /&gt;
You can expand blocks, to see its subblocks. If a block is wide enough, it shows a little expand icon in its left corner. You can expand or collapse the block by clicking on this icon. Alternatively, you can right click on a block and select expand or collapse from its context menu. The subblocks are displayed below their parent block, pushing any parallel block further down in the diagram. The frame of a block includes its subblocks, visualizing the nesting. If you hold Ctrl when expanding a block, it will expand all of its children. As the timeline only displays the information from the Activity Log, you can only see the blocks, that have an log entry. You cannot see blocks, that are skipped in the log.&lt;br /&gt;
&lt;br /&gt;
If you click on a block in the timeline it gets selected, which is indicated by a red frame. The main information of that block is added to the messages in the lower left corner of the expecco window. You also get this information as tooltip when hovering over a block.&lt;br /&gt;
&lt;br /&gt;
= Navigation =&lt;br /&gt;
As default the whole duration is displayed in the panel, but you can zoom in, to better see a certain section. You can use the buttons of the menu bar to navigate through the timeline and use the mouse.&lt;br /&gt;
&lt;br /&gt;
== Menu bar ==&lt;br /&gt;
[[Datei:Timeline_Menubar.png]]&lt;br /&gt;
# Decrease the height of lines&lt;br /&gt;
# Increase the height of lines&lt;br /&gt;
# Stretch the timeline to the available width&amp;lt;br&amp;gt;This is a toggle, if it is on, the whole run time is stretched to the width of the panel.&lt;br /&gt;
# Zoom out&amp;lt;br&amp;gt;Decrease the width of the timeline, so that more time is shown in less space.&lt;br /&gt;
# Zoom in&amp;lt;br&amp;gt;Increase the width of the timeline, so that less time is shown in more space and can be analyzed better.&lt;br /&gt;
# Jump to the start of the selected action&lt;br /&gt;
# Jump to the end of the selected action&lt;br /&gt;
# Relative execution times&amp;lt;br&amp;gt;The block information e.g. in the tooltip shows the start time relative to the start time of the displayed block and the duration if on, or the absolute start and end time if off.&lt;br /&gt;
&lt;br /&gt;
== Mouse Input ==&lt;br /&gt;
Normal scrolling moves the diagram vertically, scrolling with the Shift key held down moves it horizontally. You can zoom in and out on the cursor position by scrolling while holding down the Ctrl key. If stretch is disabled, you can click at a point in the timescale and drag to another to select a time period, which is highlighted in yellow. When you release the mouse button, the timeline zooms to that period.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Timeline_Select_Time.png]]&lt;br /&gt;
&lt;br /&gt;
= Selecting =&lt;br /&gt;
As earlier already mentioned, you can select a block by clicking on it. When double clicking on it, it gets selected in the tree and so the timeline will switch to only display the subblocks of this block.&lt;br /&gt;
&lt;br /&gt;
You can also lock the timeline (and as well the network, log and pin entries) to the block selected in the tree, by activating the toggle [[Datei:Timeline_Lock_Button.png]] in the menu of the tree. This will be indicated by a little lock icon next to the tree icon of the locked block. If you now select another block in the tree, it gets selected in the timeline of the locked block. Similar you can double click on a block in the timeline and its entry in the tree will be selected without changing the displayed timeline.&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Release_Notes_23.x&amp;diff=29084</id>
		<title>Release Notes 23.x</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Release_Notes_23.x&amp;diff=29084"/>
		<updated>2023-12-22T08:54:38Z</updated>

		<summary type="html">&lt;p&gt;Matilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See also: [[Release Notes 22.x]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Release 23.2 (December 2023) ==&lt;br /&gt;
*Feature: [[Environment_Editor/en#Fields|Static (Step-) Variables]]&lt;br /&gt;
*Feature: DOM inspector (try an XML attachment) generates better xpath suggestions (alternatives in [[Attachment_Editor/en#XML_Inspector | attachment editor]])&lt;br /&gt;
*Feature: [[Testplan_Editor/en#Log_Processor_Action|log processors]] are now configurable both for individual test cases and for the overall result of a testplan&lt;br /&gt;
*Feature: [[Testplan_Editor/en#Log_Processor_Action|log processor]] activities are shown in a testplan&#039;s activity log (but not in a report)&lt;br /&gt;
*Feature: Qt-Library: New Action &#039;&#039;QButton::Click&#039;&#039;: direct click, not being delegated to a thread&lt;br /&gt;
*Feature: Qt-Testing: ExpeccoTestService library and Inject-Tool for QT5.15.0 and VS2022:  [[QT_Testing/en#ExpeccoTestService_Library%3A_Delivery_in_Expecco_Versions|Delivered versions for QT and build environment]]&lt;br /&gt;
*Feature: [[Timeline/en|Timeline view]] for the activity log (Still experimental, might reach its limits with too large logs or while running)&lt;br /&gt;
*Feature: more [[Testplan_Editor/en#Execution_Settings | pathname options]] for testplan when generating ELF-per-run result files (in loops)&lt;br /&gt;
*Feature: a new [[Testplan_Editor/en#Execution_Settings | option]] in testplan to skip successful tests when looping&lt;br /&gt;
*Feature: enhanced manual test wizard with the option to execute the manual tests with a mobile device (Android, Apple IOS or Web-Browser) &lt;br /&gt;
*Feature: [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks |bridged Ruby elementary actions]]&lt;br /&gt;
*Feature: Improvements in the XML inspector (tree popup menu &amp;amp; string search)&lt;br /&gt;
*Feature: [[Expecco_API/en#Bridged_Python_Elementary_Blocks |bridged Python elementary actions]] can now be cancelled and terminated&lt;br /&gt;
*Feature: Python settings: Reorganize Python paths, export Python bridge code for debugging in external IDE ([[Installing additional Frameworks/en#Python_Installation|Python_Installation]])&lt;br /&gt;
*Feature: improved [[Tools_TestSuiteDifferenceBrowser|difference viewer]] (project and version compare UI)&lt;br /&gt;
*Feature: environment: current value (possibly changed from initial value) is saved in .elf log file&lt;br /&gt;
*Feature: StandardLibrary: additional optional pins for encoding (e.g. #utf8) in &amp;quot;FileStream [ Open For xxxx ]&amp;quot; blocks&lt;br /&gt;
*Feature: Values that cannot be saved in a .elf log file (e.g. web elements) are now saved and restored as UnrestoreableDate instead of nil&lt;br /&gt;
*New Python Version: Delivered installation package for Python 3.11.6&lt;br /&gt;
*Change in the format of .elf log files to store handled error states. Older expecco versions cannot handle this and might have problems to open such a file.&lt;br /&gt;
*Bug Fix: log processor actions were themself added to the log, possibly leading to problems when executed again&lt;br /&gt;
*Bug Fix: time-limited actions with the &#039;&#039;timeLimitOK&#039;&#039; flag set did not trigger the enable output pin.&lt;br /&gt;
*Bug Fix: zip archive view generated wrong name-list if language setting was EN-US (AM/PM from timestamp was interpreted as part of filename)&lt;br /&gt;
*Bug Fix: unicode strings in environment variables could not be stored to CSV files&lt;br /&gt;
*Bug Fix: a cancelled compound action did write to an output pin in certain situations&lt;br /&gt;
&lt;br /&gt;
== Release 23.1 ==&lt;br /&gt;
*Feature: Continue an interrupted test plan (i.e. even in a new expecco session and/or on another machine) &lt;br /&gt;
*Feature: Webtest (Selenium WebDriver): Support of [[Selenium_WebDriver_Plugin/en#Compound_Paths|compound paths]] for embedded elements.&lt;br /&gt;
*Feature: Webtest (Selenium WebDriver): [[Selenium_WebDriver_Plugin/en#Recorder|Recorder]] shows available windows and the current frame context.&lt;br /&gt;
*Feature: Webtest (Selenium WebDriver): Support of [[Selenium_WebDriver_Plugin/en#Shadow_Elements|shadow elements]] in the GUI browser and recorder, accessible by compound paths.&lt;br /&gt;
*Feature: Qt-Plugin supports Qt6 ([[QT_Testing/en#ExpeccoTestService_Library%3A_Delivery_in_Expecco_Versions|Qt-Versions]])&lt;br /&gt;
*Feature: Expecco Remote Control &amp;amp; Monitoring Service with Web Front-End (App for Android or Apple IOS is available on request) ([[Expecco_Remote_Control_App/en|expecco Mobile Remote App]])&lt;br /&gt;
*Feature: Diagram Editor: default style for new connections (e.g. hidden)&lt;br /&gt;
*Feature: Diagram Editor: shortcut keys for environment-freeze and others&lt;br /&gt;
*Feature: Diagram Editor: connections can be named&lt;br /&gt;
*Feature: User defined menu operations: Activity-Log in case of an error&lt;br /&gt;
*Feature: Zip-Archive viewer/extractor/inspector in [[Attachment_Editor/en#Zip_Archive_Inspector | attachment editor]]&lt;br /&gt;
*Feature: ManualTest actions are now part of the base system; the extra plugin licence is only needed to import Excel test descriptions&lt;br /&gt;
*Feature: Logging with microsecond resolution timestamps now works in Windows (if enabled in the settings) &lt;br /&gt;
*Feature: Support XML report file fetching via the REST interface&lt;br /&gt;
*Feature: PCAN (USB Can-Bus Adapter) is now supported in 64-bit expecco&lt;br /&gt;
*Feature: Folders can pass Tags to new sub-elements (inherit)&lt;br /&gt;
*Feature: Menu entry to set Test Groups for Tree Elements&lt;br /&gt;
*Standard Library: Warning Dialog with Opt-out option (show only once)&lt;br /&gt;
*FMU/CBridge: [[Functional Mockup Interface | support FMI2 API; partial support for FMI3]]&lt;br /&gt;
*FMU/CBridge: download resources to CBridge (eg. unifmu generated python FMUs work)&lt;br /&gt;
*Fix: nth-root: lost precision when applied to higher than 64bit floats.&lt;br /&gt;
*Fix: LargeFloats rounding was broken&lt;br /&gt;
*Fix: WSDL import with namespace redefinitions&lt;br /&gt;
*New [[Mobile_Testing_Plugin/en#Windows|Mobile Testing Supplement]] for Windows with an option in the installer to add Appium to the Autostart.&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Release_Notes_23.x&amp;diff=29074</id>
		<title>Release Notes 23.x</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Release_Notes_23.x&amp;diff=29074"/>
		<updated>2023-12-15T17:10:42Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Release 23.2 (upcoming) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See also: [[Release Notes 22.x]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Release 23.2 (upcoming) ==&lt;br /&gt;
*Feature: [[Environment_Editor/en#Fields|Static (Step-) Variables]]&lt;br /&gt;
*Feature: DOM inspector (try an XML attachment) generates better xpath suggestions (alternatives in [[Attachment_Editor/en#XML_Inspector | attachment editor]])&lt;br /&gt;
*Feature: [[Testplan_Editor/en#Log_Processor_Action|log processors]] are now configurable both for individual test cases and for the overall result of a testplan&lt;br /&gt;
*Feature: [[Testplan_Editor/en#Log_Processor_Action|log processor]] activities are shown in a testplan&#039;s activity log (but not in a report)&lt;br /&gt;
*Feature: Qt-Library: New Action &#039;&#039;QButton::Click&#039;&#039;: direct click, not being delegated to a thread&lt;br /&gt;
*Feature: Qt-Testing: ExpeccoTestService library and Inject-Tool for QT5.15.0 and VS2022:  [[QT_Testing/en#ExpeccoTestService_Library%3A_Delivery_in_Expecco_Versions|Delivered versions for QT and build environment]]&lt;br /&gt;
*Feature: [[Timeline/en|Timeline view]] for the activity log&lt;br /&gt;
*Feature: more [[Testplan_Editor/en#Execution_Settings | pathname options]] for testplan when generating ELF-per-run result files (in loops)&lt;br /&gt;
*Feature: a new [[Testplan_Editor/en#Execution_Settings | option]] in testplan to skip successful tests when looping&lt;br /&gt;
*Feature: enhanced manual test wizard with the option to execute the manual tests with a mobile device (Android, Apple IOS or Web-Browser) &lt;br /&gt;
*Feature: [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks |bridged Ruby elementary actions]]&lt;br /&gt;
*Feature: Improvements in the XML inspector (tree popup menu &amp;amp; string search)&lt;br /&gt;
*Feature: [[Expecco_API/en#Bridged_Python_Elementary_Blocks |bridged Python elementary actions]] can now be cancelled and terminated&lt;br /&gt;
*Feature: improved [[Tools_TestSuiteDifferenceBrowser|difference viewer]] (project and version compare UI)&lt;br /&gt;
*Feature: environment: current value (possibly changed from initial value) is saved in .elf log file&lt;br /&gt;
*Feature: StandardLibrary: additional optional pins for encoding (e.g. #utf8) in &amp;quot;FileStream [ Open For xxxx ]&amp;quot; blocks&lt;br /&gt;
*Feature: Values that cannot be saved in a .elf log file (e.g. web elements) are now saved and restored as UnrestoreableDate instead of nil&lt;br /&gt;
*New Python Version: Delivered installation package for Python 3.11.6&lt;br /&gt;
*Change in the format of .elf log files to store handled error states. Older expecco versions cannot handle this and might have problems to open such a file.&lt;br /&gt;
*Bug Fix: log processor actions were themself added to the log, possibly leading to problems when executed again&lt;br /&gt;
*Bug Fix: time-limited actions with the &#039;&#039;timeLimitOK&#039;&#039; flag set did not trigger the enable output pin.&lt;br /&gt;
*Bug Fix: zip archive view generated wrong name-list if language setting was EN-US (AM/PM from timestamp was interpreted as part of filename)&lt;br /&gt;
*Bug Fix: unicode strings in environment variables could not be stored to CSV files&lt;br /&gt;
*Bug Fix: a cancelled compound action did write to an output pin in certain situations&lt;br /&gt;
&lt;br /&gt;
== Release 23.1 ==&lt;br /&gt;
*Feature: Continue an interrupted test plan (i.e. even in a new expecco session and/or on another machine) &lt;br /&gt;
*Feature: Webtest (Selenium WebDriver): Support of [[Selenium_WebDriver_Plugin/en#Compound_Paths|compound paths]] for embedded elements.&lt;br /&gt;
*Feature: Webtest (Selenium WebDriver): [[Selenium_WebDriver_Plugin/en#Recorder|Recorder]] shows available windows and the current frame context.&lt;br /&gt;
*Feature: Webtest (Selenium WebDriver): Support of [[Selenium_WebDriver_Plugin/en#Shadow_Elements|shadow elements]] in the GUI browser and recorder, accessible by compound paths.&lt;br /&gt;
*Feature: Qt-Plugin supports Qt6 ([[QT_Testing/en#ExpeccoTestService_Library%3A_Delivery_in_Expecco_Versions|Qt-Versions]])&lt;br /&gt;
*Feature: Expecco Remote Control &amp;amp; Monitoring Service with Web Front-End (App for Android or Apple IOS is available on request) ([[Expecco_Remote_Control_App/en|expecco Mobile Remote App]])&lt;br /&gt;
*Feature: Diagram Editor: default style for new connections (e.g. hidden)&lt;br /&gt;
*Feature: Diagram Editor: shortcut keys for environment-freeze and others&lt;br /&gt;
*Feature: Diagram Editor: connections can be named&lt;br /&gt;
*Feature: User defined menu operations: Activity-Log in case of an error&lt;br /&gt;
*Feature: Zip-Archive viewer/extractor/inspector in [[Attachment_Editor/en#Zip_Archive_Inspector | attachment editor]]&lt;br /&gt;
*Feature: ManualTest actions are now part of the base system; the extra plugin licence is only needed to import Excel test descriptions&lt;br /&gt;
*Feature: Logging with microsecond resolution timestamps now works in Windows (if enabled in the settings) &lt;br /&gt;
*Feature: Support XML report file fetching via the REST interface&lt;br /&gt;
*Feature: PCAN (USB Can-Bus Adapter) is now supported in 64-bit expecco&lt;br /&gt;
*Feature: Folders can pass Tags to new sub-elements (inherit)&lt;br /&gt;
*Feature: Menu entry to set Test Groups for Tree Elements&lt;br /&gt;
*Standard Library: Warning Dialog with Opt-out option (show only once)&lt;br /&gt;
*FMU/CBridge: [[Functional Mockup Interface | support FMI2 API; partial support for FMI3]]&lt;br /&gt;
*FMU/CBridge: download resources to CBridge (eg. unifmu generated python FMUs work)&lt;br /&gt;
*Fix: nth-root: lost precision when applied to higher than 64bit floats.&lt;br /&gt;
*Fix: LargeFloats rounding was broken&lt;br /&gt;
*Fix: WSDL import with namespace redefinitions&lt;br /&gt;
*New [[Mobile_Testing_Plugin/en#Windows|Mobile Testing Supplement]] for Windows with an option in the installer to add Appium to the Autostart.&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Release_Notes_23.x&amp;diff=29073</id>
		<title>Release Notes 23.x</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Release_Notes_23.x&amp;diff=29073"/>
		<updated>2023-12-14T13:57:18Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Release 23.2 (upcoming) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See also: [[Release Notes 22.x]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Release 23.2 (upcoming) ==&lt;br /&gt;
*Feature: [[Environment_Editor/en#Fields|Static (Step-) Variables]]&lt;br /&gt;
*Feature: DOM inspector (try an XML attachment) generates better xpath suggestions (alternatives in [[Attachment_Editor/en#XML_Inspector | attachment editor]])&lt;br /&gt;
*Feature: [[Testplan_Editor/en#Log_Processor_Action|log processors]] are now configurable both for individual test cases and for the overall result of a testplan&lt;br /&gt;
*Feature: [[Testplan_Editor/en#Log_Processor_Action|log processor]] activities are shown in a testplan&#039;s activity log (but not in a report)&lt;br /&gt;
*Feature: Qt-Library: New Action &#039;&#039;QButton::Click&#039;&#039;: direct click, not being delegated to a thread&lt;br /&gt;
*Feature: Qt-Testing: ExpeccoTestService library and Inject-Tool for QT5.15.0 and VS2022:  [[QT_Testing/en#ExpeccoTestService_Library%3A_Delivery_in_Expecco_Versions|Delivered versions for QT and build environment]]&lt;br /&gt;
*Feature: [[Timeline/en|Timeline view]] for the activity log&lt;br /&gt;
*Feature: more [[Testplan_Editor/en#Execution_Settings | pathname options]] for testplan when generating ELF-per-run result files (in loops)&lt;br /&gt;
*Feature: a new [[Testplan_Editor/en#Execution_Settings | option]] in testplan to skip successful tests when looping&lt;br /&gt;
*Feature: enhanced manual test wizard with the option to execute the manual tests with a mobile device (Android, Apple IOS or Web-Browser) &lt;br /&gt;
*Feature: [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks |bridged Ruby elementary actions]]&lt;br /&gt;
*Feature: Improvements in the XML inspector (tree popup menu &amp;amp; string search)&lt;br /&gt;
*Feature: [[Expecco_API/en#Bridged_Python_Elementary_Blocks |bridged Python elementary actions]] can now be cancelled and terminated&lt;br /&gt;
*Feature: improved [[Tools_TestSuiteDifferenceBrowser|difference viewer]] (project and version compare UI)&lt;br /&gt;
*Feature: environment: current value (possibly changed from initial value) is saved in .elf log file&lt;br /&gt;
*Feature: StandardLibrary: additional optional pins for encoding (e.g. #utf8) in &amp;quot;FileStream [ Open For xxxx ]&amp;quot; blocks&lt;br /&gt;
*Feature: Values that cannot be saved in a .elf log file (e.g. web elements) are now saved and restored as UnrestoreableDate instead of nil&lt;br /&gt;
*New Python Version: Delivered installation package for Python 3.11.6&lt;br /&gt;
*Bug Fix: log processor actions were themself added to the log, possibly leading to problems when executed again&lt;br /&gt;
*Bug Fix: time-limited actions with the &#039;&#039;timeLimitOK&#039;&#039; flag set did not trigger the enable output pin.&lt;br /&gt;
*Bug Fix: zip archive view generated wrong name-list if language setting was EN-US (AM/PM from timestamp was interpreted as part of filename)&lt;br /&gt;
*Bug Fix: unicode strings in environment variables could not be stored to CSV files&lt;br /&gt;
*Bug Fix: a cancelled compound action did write to an output pin in certain situations&lt;br /&gt;
&lt;br /&gt;
== Release 23.1 ==&lt;br /&gt;
*Feature: Continue an interrupted test plan (i.e. even in a new expecco session and/or on another machine) &lt;br /&gt;
*Feature: Webtest (Selenium WebDriver): Support of [[Selenium_WebDriver_Plugin/en#Compound_Paths|compound paths]] for embedded elements.&lt;br /&gt;
*Feature: Webtest (Selenium WebDriver): [[Selenium_WebDriver_Plugin/en#Recorder|Recorder]] shows available windows and the current frame context.&lt;br /&gt;
*Feature: Webtest (Selenium WebDriver): Support of [[Selenium_WebDriver_Plugin/en#Shadow_Elements|shadow elements]] in the GUI browser and recorder, accessible by compound paths.&lt;br /&gt;
*Feature: Qt-Plugin supports Qt6 ([[QT_Testing/en#ExpeccoTestService_Library%3A_Delivery_in_Expecco_Versions|Qt-Versions]])&lt;br /&gt;
*Feature: Expecco Remote Control &amp;amp; Monitoring Service with Web Front-End (App for Android or Apple IOS is available on request) ([[Expecco_Remote_Control_App/en|expecco Mobile Remote App]])&lt;br /&gt;
*Feature: Diagram Editor: default style for new connections (e.g. hidden)&lt;br /&gt;
*Feature: Diagram Editor: shortcut keys for environment-freeze and others&lt;br /&gt;
*Feature: Diagram Editor: connections can be named&lt;br /&gt;
*Feature: User defined menu operations: Activity-Log in case of an error&lt;br /&gt;
*Feature: Zip-Archive viewer/extractor/inspector in [[Attachment_Editor/en#Zip_Archive_Inspector | attachment editor]]&lt;br /&gt;
*Feature: ManualTest actions are now part of the base system; the extra plugin licence is only needed to import Excel test descriptions&lt;br /&gt;
*Feature: Logging with microsecond resolution timestamps now works in Windows (if enabled in the settings) &lt;br /&gt;
*Feature: Support XML report file fetching via the REST interface&lt;br /&gt;
*Feature: PCAN (USB Can-Bus Adapter) is now supported in 64-bit expecco&lt;br /&gt;
*Feature: Folders can pass Tags to new sub-elements (inherit)&lt;br /&gt;
*Feature: Menu entry to set Test Groups for Tree Elements&lt;br /&gt;
*Standard Library: Warning Dialog with Opt-out option (show only once)&lt;br /&gt;
*FMU/CBridge: [[Functional Mockup Interface | support FMI2 API; partial support for FMI3]]&lt;br /&gt;
*FMU/CBridge: download resources to CBridge (eg. unifmu generated python FMUs work)&lt;br /&gt;
*Fix: nth-root: lost precision when applied to higher than 64bit floats.&lt;br /&gt;
*Fix: LargeFloats rounding was broken&lt;br /&gt;
*Fix: WSDL import with namespace redefinitions&lt;br /&gt;
*New [[Mobile_Testing_Plugin/en#Windows|Mobile Testing Supplement]] for Windows with an option in the installer to add Appium to the Autostart.&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin&amp;diff=29049</id>
		<title>Mobile Testing Plugin</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin&amp;diff=29049"/>
		<updated>2023-11-30T14:55:59Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* WebDriverAgent-Signierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Deutsche Version&#039;&#039;&#039; | [[Mobile_Testing_Plugin/en|English Version]]&lt;br /&gt;
&lt;br /&gt;
= Einleitung =&lt;br /&gt;
Mit dem &#039;&#039;Mobile Testing Plugin&#039;&#039; können Anwendungen auf Android- und iOS-Geräten getestet werden. Dabei ist es egal, ob reale mobile Endgeräte oder emulierte Geräte verwendet werden. Das Plugin kann (und wird üblicherweise) zusammen mit dem [[Expecco_GUI_Tests_Extension_Reference|GUI-Browser]] verwendet werden, der das Erstellen von Tests unterstützt. Zudem ist damit das Aufzeichnen von Testabläufen möglich.&lt;br /&gt;
&lt;br /&gt;
Zur Verbindung mit den Geräten wird [http://appium.io/ Appium] verwendet. Appium ist ein freies Open-Source-Framework zum Testen und Automatisieren von mobilen Anwendungen.&lt;br /&gt;
&lt;br /&gt;
Zur Einarbeitung in das Mobile Plugin empfehlen wir das [[Mobile_Testing_Tutorial|Tutorial]] zu bearbeiten. Dieses führt anhand eines Beispiels Schritt für Schritt durch die Erstellung eines Testfalls und erklärt die nötigen Grundlagen.&lt;br /&gt;
&lt;br /&gt;
= Installation und Aufbau =&lt;br /&gt;
Zur Verwendung des Mobile Testing Plugins müssen Sie expecco inkl. des Plugins Mobile Testing installiert haben und Sie benötigen die entsprechenden Lizenzen. expecco kommuniziert mit den Mobilgeräten über einen Appium-Server, der entweder auf demselben Rechner wie expecco läuft, oder auf einem zweiten Rechner. Dieser muss für expecco erreichbar sein.&lt;br /&gt;
&lt;br /&gt;
==Installationsübersicht==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rechner, auf dem expecco läuft:&#039;&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rechner, an dem Android-Geräte angeschlossen sind:&#039;&#039;&#039;&lt;br /&gt;
* Appium-Server&#039;&#039;, diesen können Sie über das Mobile Testing Supplement installieren (s.u.), von dem wir regelmäßig einen neue Version zur Verfügung stellen&#039;&#039;&lt;br /&gt;
* Android SDK&#039;&#039;, dieses erhalten Sie ebenfalls mit dem Mobile Testing Supplement&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rechner, an dem iOS-Geräte angeschlossen sind&amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
* Appium-Server&#039;&#039;, diesen können Sie über das Mobile Testing Supplement für Mac OS installieren (s.u.), von dem wir regelmäßig einen neue Version zur Verfügung stellen&#039;&#039;&lt;br /&gt;
* Xcode &#039;&#039;in einer Version, die die verwendete iOS-Version unterstützt, erhältlich über den Apple App Store&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
* Apple-Entwickler-Zertifikat mit zugehörigem privaten Schlüssel &#039;&#039;(zum Signieren des WebDriverAgents)&#039;&#039;&lt;br /&gt;
* Provisioning Profile mit den verwendeten Mobilgeräten&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Je nach Aufbau können die oben genannten Rechner auch das selbe Gerät sein. expecco kann sich sowohl über das Netzwerk mit einem entfernten Appium-Server und dort angeschlossenen Mobilgeräten verbinden, als auch lokal selbst einen Appium-Server starten und diesen mit lokalen Mobilgeräten verwenden. Einige Funktionen von expecco, die die Erstellung von Testfällen erleichtern, sind jedoch nur verfügbar, wenn die Mobilgeräte am selben Rechner angeschlossen sind, auf dem auch expecco läuft. Ein möglicher Aufbau kann daher wie in folgender Abbildung aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAufbau.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird die Installation von Appium und anderer nötiger Programme für Windows und Mac OS erklärt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;: Zum Zeitpunkt der Erstellung dieses Dokuments wurden Versionen bis 11 auf Funktion verifiziert. Neuere Versionen sollten - sofern nicht grundlegende Änderungen von Oracle vorgenommen wurden, ebenfalls funktionieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;: Beachten Sie, dass aufgrund der Voraussetzungen (keine Anbindung an nicht-Apple Geräte verfügbar) iOS-Geräte nur von einem Mac aus angesteuert werden können. Sie benötigen also einen Mac als &amp;quot;Vermittler&amp;quot; (siehe auch unten: [[#Ich habe keinen Mac | &amp;quot;Ich habe keinen Mac&amp;quot;]])&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
Am einfachsten installieren Sie alles mit unserem Mobile Testing Supplement&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;. In neueren Versionen ist allerdings aufgrund geänderter Lizenzbedingungen seitens Oracle kein JDK mehr enthalten, sodass sie dieses zusätzlich installieren müssen. Sie können natürlich Appium auch direkt installieren, um die Version zu verwenden, die Sie möchten. Um dann einen Appium-Server mit expecco starten zu können, muss allerdings eine entsprechende Batchdatei vorhanden sein und in den [[Mobile_Testing_Plugin#Konfiguration_des_Plugins|Einstellungen]] angegeben werden. Verbindungen können aber auch zu anderen laufenden Appium-Servern aufgebaut werden.&lt;br /&gt;
*&#039;&#039;&#039;expecco 23.1&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-23.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.1]&lt;br /&gt;
:Gleiche Versionen wie der Vorgänger, aber der Installer erlaubt nun, Appium zum Autostart hinzuzufügen.&lt;br /&gt;
*expecco 22.2 und 22.1: [https://download.exept.de/transfer/h-expecco-22.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.2.0]&lt;br /&gt;
:Appium 1.22.3*&lt;br /&gt;
:Node 14.17.5&lt;br /&gt;
:adb 1.0.41 aus platform-tools 33.0.2&lt;br /&gt;
:&#039;&#039;* Wir haben Appium um die Capability&#039;&#039; startChromedriverTimeout &#039;&#039;erweitert, um schneller einen Timeout zu bekommen, wenn der Chromedriver nicht gestartet werden kann. (siehe [[#startChromedriverTimeout|Probleme und Lösungen]])&#039;&#039;&lt;br /&gt;
*expecco 21.2: [https://download.exept.de/transfer/h-expecco-21.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.12.0.0]&lt;br /&gt;
:Enthält die Appium-Version 1.22.0, Node ist weiterhin in der Version 12.13.1.&lt;br /&gt;
*expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.1.0]&lt;br /&gt;
:Nur kleine Änderungen im Vergleich zur vorigen Version.&lt;br /&gt;
*expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.0.0]&lt;br /&gt;
:Im Vergleich zur vorigen Version wurde Appium auf die Version 1.16.0-rc.1 aktualisiert und node 12 verwendet. &lt;br /&gt;
*expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.8.1.0]&lt;br /&gt;
:Dieses installiert Appium in der Version 1.12.0 und enthält nun zusätzlich build-tools der Version 28.0.3 im android-sdk. Ansonsten ist es gleich wie die vorige Version.&lt;br /&gt;
*expecco 18.2: [http://download.exept.de/transfer/h-expecco-18.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.7.3.0]&lt;br /&gt;
:Dieses installiert Appium in der Version 1.8.1. Außerdem bietet das Supplement auch an, &#039;&#039;Android Debug Bridge&#039;&#039; und &#039;&#039;Google USB Driver&#039;&#039; ([https://gsmusbdrivers.com/download/adb-fastboot-drivers/ adb-setup-1.4.3]) zu installieren. Damit sind Treiber für ein breites Spektrum an Android-Geräten abgedeckt, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen. Ein &#039;&#039;&#039;JDK ist (aufgrund geänderter Lizenzbedingungen seitens Oracle) nicht mehr enthalten&#039;&#039;&#039;, dieses müssen Sie selbst herunterladen, z.B. von [https://www.oracle.com/technetwork/java/javase/downloads/index.html Oracle].&lt;br /&gt;
*expecco 18.1: wie expecco 2.11&lt;br /&gt;
*expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/MobileTestingSupplement_1.6.0.2_Setup.exe Mobile Testing Supplement 1.6.0.2]&lt;br /&gt;
:Dieses installiert ein Java JDK der Version 8, android-sdk und Appium in der Version 1.6.4. Außerdem bietet das Supplement auch einen universellen adb-Treiber ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]) an. Dieser vereint Treiber für ein breites Spektrum an Android-Geräten, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen.&lt;br /&gt;
*expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_1.5.0.0_Setup.exe Mobile Testing Supplement 1.5.0.0]&lt;br /&gt;
:Dieses installiert ein Java JDK der Version 8, android-sdk und Appium in der Version 1.4.16. Während der Installation wird die grafische Oberfläche von Appium gestartet, dieses Fenster können Sie sofort wieder schließen. Außerdem bietet das Supplement auch einen universellen adb-Treiber ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]) an. Dieser vereint Treiber für ein breites Spektrum an Android-Geräten, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen.&lt;br /&gt;
&lt;br /&gt;
Wenn expecco Mobilgeräte verwenden soll, die an einem anderen Rechner angeschlossen sind, müssen Sie dort einen Appium-Server starten. Dies können Sie mit der Datei &amp;lt;code&amp;gt;appium_standalone.cmd&amp;lt;/code&amp;gt; tun. Der Server wird dann mit dem Standard-Port 4723 gestartet. Falls Sie eine andere Portnummer verwenden wollen, starten Sie den Server mit&lt;br /&gt;
&lt;br /&gt;
 appium_standalone.cmd -p &amp;lt;portnummer&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Server ist bereit, sobald die Zeile&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Appium REST http interface listener started on 0.0.0.0:4723&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
angezeigt wird, wobei Sie am Ende die verwendete Portnummer ablesen können.&lt;br /&gt;
&lt;br /&gt;
Beim ersten Starten von Appium – sowohl im Standalone als auch gestartet von expecco – kann es vorkommen, dass die Windows-Firewall den Node-Server blockiert. Lassen Sie den Zugriff zu, sonst kann Appium nicht gestartet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;) Sie können natürlich auch die Command Line Tools (adb, sdkmanager, avdmanager etc.) einer vorhandenen Android Studio Version verwenden, sowie Appium separat installieren.&lt;br /&gt;
Da sich diese Tools regelmäßig ändern, und es in der Vergangenheit zu Inkompatibilitäten und Fehlern nach Releasewechseln kam, empfehlen wir zu Beginn, das mitgelieferte Paket zu verwenden. Dies ist möglicherweise nicht das aktuellste, wurde aber auf Lauffähigkeit getestet.&lt;br /&gt;
&lt;br /&gt;
Falls das Android Mobilgerät an einem entfernen Rechner angeschlossen ist,&lt;br /&gt;
können Sie den aktuellen Bildschirminhalt z.B. mit dem [https://github.com/Genymobile/scrcpy scrcpy] tool live mitverfolgen.&lt;br /&gt;
&lt;br /&gt;
== Mac OS (nicht erforderlich für Android-Tests)==&lt;br /&gt;
Hinweis: Wenn Sie nicht vorhaben, iOS-Geräte (iPhone, iPad, etc.) zu testen, können Sie das Folgende ignorieren. &#039;&#039;&#039;Der Apple-Rechner sowie das Mac-Setup werden für Android-Geräte nicht benötigt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Xcode ===&lt;br /&gt;
Zur Automatisierung mit iOS-Geräten wird [https://developer.apple.com/xcode/ Xcode] benötigt. Sie erhalten dieses über den App Store. Dabei ist darauf zu achten, dass die Version zu den getesteten iOS-Versionen passt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;iOS&#039;&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp;  &lt;br /&gt;
|&#039;&#039;&#039;Xcode&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;macOS&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|10.x&lt;br /&gt;
|8.x&lt;br /&gt;
|10.12 (Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|11.x&lt;br /&gt;
|9.x&lt;br /&gt;
|10.13 (High Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|12.x&lt;br /&gt;
|10.x&lt;br /&gt;
|10.14 (Mojave)&lt;br /&gt;
|-&lt;br /&gt;
|13.x&lt;br /&gt;
|11.x&lt;br /&gt;
|10.15 (Catalina)&lt;br /&gt;
|-&lt;br /&gt;
|14.x&lt;br /&gt;
|12.x&lt;br /&gt;
|11.0 (Big Sur)&lt;br /&gt;
|-&lt;br /&gt;
|15.x&lt;br /&gt;
|13.x&lt;br /&gt;
|12.0 (Monterey)&lt;br /&gt;
|-&lt;br /&gt;
|16.x&lt;br /&gt;
|14.x&lt;br /&gt;
|12.5 (Monterey)&lt;br /&gt;
|}&lt;br /&gt;
Diese Tabelle gibt nur eine vereinfachte Übersicht, lesen Sie besser unter [https://xcodereleases.com/ Xcode Releases] oder [https://en.wikipedia.org/wiki/Xcode#Version_comparison_table Xcode-Versionen] welche Version Sie brauchen. Für neue iOS Minor-Versionen gibt es in der Regel auch ein Update für Xcode, z.B. brauchen Sie für iOS 10.2 mindestens Xcode 8.2, für iOS 10.3 mindestens Xcode 8.3 usw. &lt;br /&gt;
Wenn Sie also auf eine neuere iOS-Version wechseln, benötigen Sie in der Regel auch eine neuere Xcode-Version. Neuere Versionen von Xcode laufen möglicherweise nicht auf älteren Betriebssystemen, was wiederum eine Aktualisierung des Betriebssystems erforderlich machen kann. Falls Sie auch ältere iOS-Versionen testen wollen kann es sinnvoll sein, die entsprechenden Xcode-Versionen parallel zu installieren.&lt;br /&gt;
&lt;br /&gt;
=== Appium ===&lt;br /&gt;
Der Appium-Server kann entweder als Kommandozeilen-Anwendung installiert werden oder über [https://github.com/appium/appium-desktop Appium Desktop] verwendet werden, welcher den Server über ein GUI zur Verfügung stellt. Mittlerweile gibt es auch Appium 2.0, was wir aber bisher noch nicht mit expecco getestet haben und daher nicht empfehlen.&lt;br /&gt;
&lt;br /&gt;
==== Appium Desktop ====&lt;br /&gt;
Laden Sie die neueste Version von [https://github.com/appium/appium-desktop/releases/ Appium Desktop] herunter. Für den Mac nehmen Sie am besten die dmg-Datei und installieren sie in den Anwendungen. Beim Starten der Anwendung &#039;&#039;Appium Server GUI&#039;&#039; erhalten Sie wahrscheinlich eine Fehlermeldung, dass es aus Sicherheitsgründen nicht möglich ist. Öffnen Sie dann das Kontextmenü auf der Anwendungsdatei (Rechtsklick bzw. Strg + Klick) und wählen Sie dort &#039;&#039;Öffnen&#039;&#039; aus. Bestätigen Sie dann, dass Sie die Anwendung wirklich öffnen wollen. Fortan können Sie die Anwendung normal öffnen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:OpenAppiumServerGUI1.png|text-top]] [[Datei:OpenAppiumServerGUI2.png|text-top]]&lt;br /&gt;
&lt;br /&gt;
Ab Xcode 14 gibt es Probleme beim Signieren des WebDriverAgents, den Appium zur Automatisierung auf das Gerät spielt. Dadurch ist mit der Version 1.22.3-4 von Appium Desktop kein Verbindungsaufbau möglich. Das Problem ist in neueren Versionen des WebDriverAgents behoben, es gibt aber aktuell noch keine Version von Appium Desktop, die eine solche Version enthält (Stand November 2022). Sie können aber manuell eine neue Version herunterladen (z.B. 4.10.2)  und die Dateien in Appium ersetzen. Laden Sie dazu von der [https://github.com/appium/WebDriverAgent/releases/ WebDriverAgent Download-Seite] eine der beiden Archivdateien (zip oder tar.gz) mit dem Source Code herunter. Öffnen und entpacken Sie dann diese Datei. Den Inhalt des Ordners WebDriverAgent-4.10.2 müssen Sie nun nach&lt;br /&gt;
&lt;br /&gt;
 /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
kopieren. Wenn Sie über den Finder dorthin navigieren, machen Sie auf die Anwendung &#039;&#039;Appium Server GUI&#039;&#039; einen Kontextklick (Rechtsklick bzw. Strg + Klick) und wählen Sie im Menü &#039;&#039;Paketinhalt anzeigen&#039;&#039;. Ersetzen Sie alle Dateien, die bereits mit gleichem Namen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
==== Appium über npm installieren ====&lt;br /&gt;
Sie können Appium auch über npm (Node Package Manager) installieren. Dazu müsen Sie erst node/npm installieren. Das geht mit [https://github.com/nvm-sh/nvm nvm] (Node Version Manager) was Sie von Github bekommen. Falls die folgende Installationsanleitung bei Ihnen nicht funktionieren sollte, finden Sie dort ausführlichere Informationen im [https://github.com/nvm-sh/nvm#readme Readme].&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie ein Terminal-Fenster. Klonen Sie dann das Github-Repository von nvm&lt;br /&gt;
 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash&lt;br /&gt;
und laden Sie es&lt;br /&gt;
 export NVM_DIR=&amp;quot;$([ -z &amp;quot;${XDG_CONFIG_HOME-}&amp;quot; ] &amp;amp;&amp;amp; printf %s &amp;quot;${HOME}/.nvm&amp;quot; || printf %s &amp;quot;${XDG_CONFIG_HOME}/nvm&amp;quot;)&amp;quot; [ -s &amp;quot;$NVM_DIR/nvm.sh&amp;quot; ] &amp;amp;&amp;amp; \. &amp;quot;$NVM_DIR/nvm.sh&amp;quot; # This loads nvm&lt;br /&gt;
&lt;br /&gt;
Führen Sie danach&lt;br /&gt;
 command -v nvm&lt;br /&gt;
aus, um zu testen, ob es funktioniert hat. Es sollte &#039;&#039;nvm&#039;&#039; ausgegeben werden. Kommt keine Antwort, führen Sie&lt;br /&gt;
 touch ~/.zshrc&lt;br /&gt;
aus, und versuchen Sie es erneut.&lt;br /&gt;
&lt;br /&gt;
Nun können Sie node mit dem folgenden Befehl installieren.&lt;br /&gt;
 nvm install 16.15.1&lt;br /&gt;
Da es mit der aktuellen Version von node Probleme beim Installieren von Appium gibt, empfehlen wir diese Version.&lt;br /&gt;
&lt;br /&gt;
Nachdem node installiert ist, können Sie Appium darüber installieren:&lt;br /&gt;
 npm install -g appium&lt;br /&gt;
&lt;br /&gt;
Den Appium-Server können Sie nun einfach über den Befehl&lt;br /&gt;
 appium&lt;br /&gt;
starten. Die Ausgabe erfolgt dann direkt im Terminal.&lt;br /&gt;
&lt;br /&gt;
Auch bei dieser Version gibt es das Problem bei der Signierung des WebDriverAgents, wie bei [[#Appium_Desktop | Appium Desktop]] beschrieben. Laden Sie also auch in diesem Fall eine neuere Version des WebDriverAgents herunter und ersetzen Sie die alten Dateien. Diese finden Sie unter&lt;br /&gt;
 /Users/&amp;lt;user&amp;gt;/.nvm/versions/16.15.1/lib/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
==== Mobile Testing Supplement ====&lt;br /&gt;
Ältere Appium-Versionen stellen wir Ihnen über das Mobile Testing Supplement für Mac OS zur Verfügung, mit dem Sie es einfach installieren können:&lt;br /&gt;
* &#039;&#039;&#039;expecco 20.2&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-20.2.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement für Mac OS (1.2.2)]&lt;br /&gt;
:Enthält Appium Version 1.18.3 und verwendet node 14.&lt;br /&gt;
&lt;br /&gt;
* expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement für Mac OS (1.2.0)]&lt;br /&gt;
:Nur wenige Änderungen im Vergleich zur vorigen Version.&lt;br /&gt;
&lt;br /&gt;
* expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement_for_MacOS.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.98)]&lt;br /&gt;
:Im Vergleich zur vorigen Version wurde Appium auf die Version 1.16.0-rc.1 aktualisiert und es wird node 12 verwendet. &lt;br /&gt;
&lt;br /&gt;
* expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.96.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.96)]&lt;br /&gt;
:Diese Version enthält Appium 1.12.0. &lt;br /&gt;
&lt;br /&gt;
* expecco 18.1: [http://download.exept.de/transfer/h-expecco-18.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.94.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.94)]&lt;br /&gt;
:Diese Version enthält Appium 1.8.0.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/Mobile_Testing_Supplement_for_Mac_OS_1.0.94.tar.bz2 Mobile Testing Supplement für Mac OS (1.0.94)]&lt;br /&gt;
:Diese Version enthält Appium 1.6.4.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_for_Mac_OS_1.0.tar.bz2 Mobile Testing Supplement für Mac OS]&lt;br /&gt;
:Diese Version entält Appium 1.4.16.&lt;br /&gt;
&lt;br /&gt;
Nachdem Herunterladen des Supplements, können Sie es in ein Verzeichnis Ihrer Wahl (z. B. Ihr Home-Verzeichnis) verschieben und dort entpacken. Ein geeigneter Befehl in einer Shell könnte wie folgt aussehen, passen Sie dabei die Versionsnummer entsprechend an:&lt;br /&gt;
&lt;br /&gt;
 tar -xvpf Mobile_Testing_Supplement_for_Mac_OS_1.1.98.tar.bz2&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Ihre Standard-Xcode-Installation verwenden wollen, können Sie Appium direkt über die Datei im &#039;&#039;bin&#039;&#039;-Verzeichnis mit der entsprechenden Versionsnummer starten:&lt;br /&gt;
&lt;br /&gt;
 Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
Falls Sie ein anderes Xcode als das als Standard konfigurierte verwenden wollen, müssen Sie Appium den entsprechenden Pfad über die Umgebungsvariable &#039;&#039;DEVELOPER_DIR&#039;&#039; angeben. &lt;br /&gt;
Wenn Sie Xcode z. B. in &#039;&#039;/Applications/Xcode-11.3.app&#039;&#039; installiert haben, müssten Sie Appium so starten:&lt;br /&gt;
&lt;br /&gt;
 DEVELOPER_DIR=&amp;quot;/Applications/Xcode-11.3.app/Contents/Developer&amp;quot; Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
Was als Standard-Xcode-Installation gesetzt ist, zeigt der Befehl:&lt;br /&gt;
&lt;br /&gt;
 xcode-select -p&lt;br /&gt;
&lt;br /&gt;
Wenn Appium Ihre Xcode-Installation nicht findet, erscheint beim Verbinden eine Fehlermeldung in der Art:&lt;br /&gt;
&#039;&#039;&amp;lt;blockquote&amp;gt;org.openqa.selenium.SessionNotCreatedException - A new session could not be created. (Original error: Could not find path to Xcode, environment variable DEVELOPER_DIR set to: /Applications/Xcode.app but no Xcode found)&amp;lt;/blockquote&amp;gt;&#039;&#039;&lt;br /&gt;
Starten Sie in diesem Fall Appium erneut, unter Angabe eines gültigen &#039;&#039;DEVELOPER_DIR&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== WebDriverAgent-Signierung ====&lt;br /&gt;
Zur Automatisierung lädt Appium eine App namens WebDriverAgent auf das Gerät und muss sie dafür signieren können. Dazu brauchen Sie einen Apple-Account und ein entsprechendes Zertifikat. Zur Evaluierung können Sie einen kostenlosen Account verwenden. Dieser hat den Nachteil, dass erstellte Profile nur eine Woche gültig sind und danach neu erstellt werden müssen. Seien Sie auch vorsichtig, wenn Sie sich den Account teilen, da es vorkommen kann, dass Zertifikate widerrufen werden oder durch automatische Generierung ungültig werden. Als Folge können bereits signierte Apps nicht mehr verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie bereits ein entsprechendes Zertifikat mit dem zugehörigen privaten Schlüssel in Ihrer [https://support.apple.com/de-de/guide/keychain-access/welcome/mac Schlüsselbundverwaltung] auf dem Mac haben, können Sie den WebDriverAgent automatisch signieren lassen. Ansonsten empfiehlt es sich, die Signierung über Xcode einzustellen und zu verwalten.&lt;br /&gt;
&lt;br /&gt;
Schließen Sie zuerst das Gerät, das Sie verwenden möchten, über USB an den Mac an. Stellen Sie sicher, dass sich der Mac und das Gerät im selben Netzwerk befinden, ansonsten kann es beim Verbindungsaufbau mit Appium zu Problemen kommen. Starten Sie Xcode und öffnen Sie &#039;&#039;Preferences&#039;&#039;. Wechseln Sie zur Seite der Accounts und legen Sie einen Eintrag mit Ihrem Account an. Anschließend können Sie auf &#039;&#039;Manage Certificates...&#039;&#039; klicken, um die Zertifikate zu sehen, die zu diesem Account gehören. Zum Ausführen von Tests benötigen Sie ein iOS-Development-Zertifikat und den dazugehörigen privaten Schlüssel. Wenn Sie noch keines besitzen, erstellen Sie eines. Wenn Sie bereits eines haben, aber es nicht in Ihrem Schlüsselbund vorhanden ist (erkennbar an dem Hinweis &amp;quot;Not in Keychain&amp;quot;), können Sie es importieren. Das können Sie über die [https://support.apple.com/de-de/guide/keychain-access/welcome/mac Schlüsselbundverwaltung] auf dem Mac machen, wenn Sie es zuvor aus dem Schlüsselbund exportiert haben, in dem es sich befindet. Das Zertifikat mit dem zugehörigen Schlüssel sollte sich im Schlüsselbund &#039;&#039;Anmeldung&#039;&#039; befinden. Dort kann es als PKCS#12-Datei (Endung typischerweise .p12) exportiert werden. Um ein Zertifikat in Ihren Schlüsselbund zu importieren, wählen Sie im Menü &#039;&#039;Ablage&#039;&#039; die Option &#039;&#039;Objekte importieren&#039;&#039;. Falls Sie nicht wissen, wo das Zertifikat gespeichert ist, können Sie es in Xcode auch widerrufen und in Ihrem Schlüsselbund neu anlegen. Machen Sie das jedoch nur, wenn Sie wissen, dass das alte Zertifikat nicht mehr in Verwendung ist, da es danach nicht mehr benutzt werden kann. Nun sollte Ihr Schlüsselbund ein iOS-Development-Zertifikat enthalten.&lt;br /&gt;
&amp;lt;!---(Ich habe den folgenden Teil mal rausgenommen. Man braucht das nicht, wenn es in Xcode eingestellt ist.) Wählen Sie im Rechtsklick-Menü den Punkt &#039;&#039;Informationen&#039;&#039; aus. Unter den Details des Zertifikats finden Sie die Team-ID, die hier als Organisationseinheit bezeichnet wird. Tragen Sie diese in den Einstellungen des Plugins im Feld &#039;&#039;Team-ID&#039;&#039; ein, siehe [[#Konfiguration_des_Plugins|Konfiguration des Plugins]].--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie nun das WebDriverAgent-Projekt in Xcode. Wenn Sie das Mobile Testing Supplement installiert haben, finden Sie es in dessen Verzeichnis unter&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
Wenn Sie Appium Desktop installier haben, finden Sie es unter&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;/Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
Sie können einfach im Finder zu der Xcode-Project-Datei navigieren und Sie über einen Doppelklick öffnen. Beachten Sie dabei, dass Sie dabei auf die Anwendung Appium Server GUI einen Kontextklick (Rechtsklick bzw. Strg + Klick) machen und im Menü &#039;&#039;Paketinhalt anzeigen&#039;&#039; auswählen müssen, um in deren Unterverzeichnis zu gelangen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingWebDriverAgentXcode.png]]&lt;br /&gt;
&lt;br /&gt;
Wählen Sie &#039;&#039;WebDriverAgentLib&#039;&#039; und die Seite &#039;&#039;Signing &amp;amp; Capabilities&#039;&#039; aus. Setzen Sie dort im Abschnitt &#039;&#039;Signing&#039;&#039; die Option &#039;&#039;Automatically manage signing&#039;&#039; und wählen Sie dann ein Team aus. Wechseln Sie nun zu &#039;&#039;WebDriverAgentRunner&#039;&#039; und tun Sie dort dasselbe.&lt;br /&gt;
&amp;lt;!--(Das Folgende scheint nicht mehr aktuell zu sein.) Es sollten an dieser Stelle Fehler angezeigt werden, dass kein Provisioning Profile angelegt oder gefunden wurde. Wechseln Sie deshalb zur Seite &#039;&#039;Build Settings&#039;&#039; und suchen Sie hier im Abschnitt &#039;&#039;Packaging&#039;&#039; den Eintrag &#039;&#039;Product Bundle Identifier&#039;&#039;. Ändern Sie diesen von com.facebook.WebDriverAgentRunner zu etwas, das von Xcode akzeptiert wird, indem Sie den Präfix ändern. Xcode kann nun ein passendes Provisioning Profile generieren und die Fehler auf der General-Seite sollten verschwinden. Danach können Sie Xcode beenden. --&amp;gt;&lt;br /&gt;
Durch das Setzen des Teams sollten die Fehler für den WebDriverAgentRunner verschwinden. Sollte Xcode kein passendes Provisioning Profile für die Bundle ID &#039;&#039;com.facebook.WebDriverAgentRunner&#039;&#039; erstellen können, können Sie diese anpassen, dass sie zu Ihrem Zertifikat passt. Danach können Sie Xcode beenden oder auch, wie weiter unten beschrieben, direkt den Build über Xcode starten, damit das Projekt bereits gebaut ist, wenn Appium es verwenden möchte.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie sich nun von expecco eine Verbindung zu Ihrem Gerät aufbauen, wird der WebDriverAgent darauf installiert und gestartet, um anschließend zur zu testenden App zu wechseln. Eventuell muss auf dem Gerät muss der Ausführung des WebDriverAgents vertraut noch werden. Ein Anzeichnen dafür kann sein, dass die App WebDriverAgent zwar auf dem Gerät erscheint und zu starten versucht, danach aber wieder deinstalliert wird. Öffnen Sie dazu während des Verbindungsaufbaus auf dem Gerät in die Einstellungen und dort unter &#039;&#039;Allgemein&#039;&#039; den Eintrag &#039;&#039;Geräteverwaltung&#039;&#039;. Dieser Eintrag ist nur sichtbar, wenn eine Entwickler-App auf dem Gerät installiert ist. Sie müssen daher möglicherweise warten, bis der WebDriverAgent installiert ist, bevor der Eintrag erscheint. Wählen Sie dort den Eintrag Ihres Apple-Accounts und vertrauen Sie ihm. Da der WebDriverAgent wieder deinstalliert wird, wenn der Start nicht funktioniert hat, müssen Sie dies während des Verbindungsaufbaus tun. Falls Ihnen das zu hektisch ist, können Sie auch folgenden Code ausführen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;xcodebuild -project Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
  xcodebuild -project /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&lt;br /&gt;
&lt;br /&gt;
Damit wird der WebDriverAgent auf dem Gerät installiert ohne dass er wieder gelöscht wird.&lt;br /&gt;
&lt;br /&gt;
Wenn es Probleme beim Installieren des WebDriverAgents gibt, können Sie auch versuchen, den Build über Xcode zu starten. Stellen Sie sicher, dass das richtige Target &#039;&#039;WebDriverAgent&#039;&#039; ausgewählt ist. Fehlermeldungen in Xcode zeigen vielleicht einfacher, wo das Problem liegt. Manchmal hilft es auch, es ein zweites Mal zu versuchen, weil es möglicherweise beim ersten Mal zu lange gedauert hat und abgebrochen wurde. Es kann sein, dass Sie während des Builds mehrmals aufgefordert werden, das Passwort für Ihren Schlüsselbund anzugeben.&lt;br /&gt;
&lt;br /&gt;
[[Datei:WebDriverAgentCodesign.png]]&lt;br /&gt;
&lt;br /&gt;
Lesen Sie auch die Dokumentation von Appium zum [https://github.com/appium/appium-xcuitest-driver/blob/master/docs/real-device-config.md Aufsetzen von Tests mit iOS-Geräten]. In der [https://support.apple.com/en-us/HT204460 Dokumentation von Apple] finden Sie nähere Informationen zum Installieren und Vertrauen von Apps.&lt;br /&gt;
&lt;br /&gt;
Ist der WebDriverAgent einmal auf dem Gerät installiert, wird er für spätere Verbindungen wieder verwendet und der Verbindungsaufbau sollte schneller funktionieren. Ebenso liegt dann die signierte Version bereits auf Ihrem Mac und muss nicht erneut gebaut werden, was die Verbindung zu weiteren Geräten ebenfalls beschleunigt. Wenn Sie wissen, dass bei Ihrem Verbindungsaufbau der WebDriverAgent erst noch signiert und gebaut werden muss, ist es ratsam, die Capability &#039;&#039;wdaLaunchTimeout&#039;&#039; zu setzen. Dieser Timeout, wie lange auf den Start der WebDriverAgents auf dem Gerät gewartet werden soll, liegt standardmäßig bei 60000$nbsp;ms. Der Build dauert aber häufig über eine Minute, sodass der Versuch zum Verbindungsaufbau dann abgebrochen wird. Ein Wert von 120000 hat sich hier als besser erwiesen.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration des Plugins ==&lt;br /&gt;
Bevor Sie loslegen, sollten Sie die Einstellungen des Mobile Testing Plugins überprüfen und ggf. anpassen.&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie im Menü den Punkt &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; und dort unter &amp;quot;&#039;&#039;Erweiterungen&#039;&#039;&amp;quot; den Eintrag &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot; (s. Abb.). Standardmäßig werden diese Pfade automatisch gefunden (1). Um einen Pfad manuell anzupassen, deaktivieren Sie den entsprechenden Haken rechts davon. Sie erhalten in einer Drop-down-Liste einige Pfade zur Auswahl. Ist ein eingetragener Pfad falsch oder kann er nicht gefunden werden, wird das Feld rot markiert und es erscheint ein diesbezüglicher Hinweis. Stellen Sie sicher, dass alle Pfade richtig angegeben sind.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingEinstellungen.png | thumb | 400px | Konfiguration des Plugins]]&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;appium&#039;&#039;&#039;: Geben Sie hier den Pfad zur ausführbaren Datei an mit der Appium in der Kommandozeile gestartet werden kann. Unter Windows wird diese Datei in der Regel &amp;quot;&amp;lt;code&amp;gt;appium.cmd&amp;lt;/code&amp;gt;&amp;quot; heißen. Dieser Pfad wird benutzt, wenn expecco einen Appium-Server startet.&lt;br /&gt;
*&#039;&#039;&#039;node&#039;&#039;&#039;: Geben Sie hier den Pfad zur ausführbaren Datei an, die Node (auch &amp;quot;Node.js&amp;quot;) startet. Dieser Pfad wird beim Starten eines Servers an Appium weitergegeben, damit Appium ihn unabhängig von der PATH-Variablen findet. Unter Windows heißt diese Datei in der Regel &amp;quot;&amp;lt;code&amp;gt;node.exe&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;JAVA_HOME&#039;&#039;&#039;: Geben Sie hier den Pfad zu einem JDK an. Dieser Pfad wird an jeden Appium-Server weitergegeben. Lassen Sie das Feld frei, um den Wert aus der Umgebungsvariablen zu verwenden. Um einzustellen, welches Java von expecco verwendet werden soll, setzen Sie diesen Pfad in den Einstellungen für die Java Bridge.&lt;br /&gt;
*&#039;&#039;&#039;ANDROID_HOME&#039;&#039;&#039;: Geben Sie hier den Pfad zu einem SDK von Android an. Dieser Pfad wird an jeden Appium-Server weitergegeben. Lassen Sie das Feld frei, um den Wert aus der Umgebungsvariablen zu verwenden.&lt;br /&gt;
*&#039;&#039;&#039;adb&#039;&#039;&#039;: Hier steht der Pfad zum adb-Befehl. Unter Windows heißt die Datei adb.exe. Diese wird von expecco beispielsweise verwendet, um die Liste der angeschlossenen Geräte zu erhalten. Diesen Pfad sollten Sie automatisch wählen lassen, da dann der Befehl im ANDROID_HOME-Verzeichnis verwendet wird. Dieser wird auch von Appium verwendet. Falls expecco und Appium jedoch verschiedene Versionen von adb verwenden kann es zu Konflikten kommen.&lt;br /&gt;
*&#039;&#039;&#039;android.bat&#039;&#039;&#039;: Diese Datei wird nur benötigt, um damit den AVD und den SDK Manager zu starten. Automatisch wird hier die Datei im ANDROID_HOME-Verzeichnis gesucht.&lt;br /&gt;
*&#039;&#039;&#039;aapt&#039;&#039;&#039;: Geben Sie hier den Pfad zum aapt-Befehl an. Unter Windows heißt diese Datei &#039;&#039;aapt.exe&#039;&#039;. expecco verwendet aapt nur im Verbindungseditor, um das Paket und die Activities einer apk-Datei zu lesen. Automatisch wird hier die Datei im ANDROID_HOME-Verzeichnis gesucht.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingJavaBridgeEinstellungen.png | thumb | 400px | Konfiguration des JDKs]]&lt;br /&gt;
&lt;br /&gt;
Ab expecco 2.11 gibt es das Feld &#039;&#039;Team-ID&#039;&#039;. Wenn Sie iOS-Tests ausführen, tragen Sie hier die Team-ID Ihres Zertifikats ein. Diese wird für jede iOS-Verbindung verwendet, außer Sie setzen den Wert im Einzelfall in den Verbindungseinstellungen um. Wie Sie die Team-ID erhalten, lesen Sie im Abschnitt zur [[#Signierung|Signierung]] ber der Installation auf Mac OS. Mit expecco 2.10 können Sie die Team-ID nur für jede Verbindungseinstellung extra als Capability eintragen. Dazu müssen Sie jedoch die [[#Erweiterte_Ansicht|erweiterte Ansicht]] verwenden. Geben Sie hier die Capability &#039;&#039;xcodeOrgId&#039;&#039; an und setzen Sie als Wert die Team-ID des Zertifikats.&lt;br /&gt;
&lt;br /&gt;
Die Einstellung zur Serveradresse unten auf der Seite bezieht sich auf das Verhalten des Verbindungseditors. Dieser prüft am Ende, ob die Serveradresse auf &#039;&#039;/wd/hub&#039;&#039; endet, da dies die übliche Form ist. Falls nicht, wird in einem Dialog gefragt, wie darauf reagiert werden soll. Das festgelegte Verhalten kann hier eingesehen und verändert werden.&lt;br /&gt;
&lt;br /&gt;
Wechseln Sie ebenfalls zum Eintrag &#039;&#039;Java Bridge&#039;&#039; (s. Abb.). Hier muss der Pfad zu Ihrer Java-Installation angegeben werden, die von expecco benutzt wird. Tragen Sie hier ein JDK ein. Falls Sie unter Windows das aus dem Mobile Testing Supplement verwenden möchten, lautet der Pfad&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;C:\Program Files (x86)\exept\Mobile Testing Supplement\jdk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Sie können auch die Systemeinstellungen verwenden.&lt;br /&gt;
&lt;br /&gt;
== Android-Gerät vorbereiten ==&lt;br /&gt;
Wenn Sie ein Android-Gerät unter Windows anschließen benötigen Sie möglicherweise noch einen adb-Treiber für das Gerät. Einen passenden Treiber finden Sie üblicherweise auf der jeweiligen Webseite des Herstellers. Haben Sie den Universal-Treiber aus dem Mobile Testing Supplement installiert, sollte für die meisten Geräte bereits alles funktionieren. In einigen Fällen versucht auch Windows automatisch einen Treiber zu installieren, wenn Sie das Gerät zum ersten mal anschließen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===USB-Debugging Einschalten===&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Bevor Sie ein Mobilgerät mit dem Appium-Plugin ansteuern können, müssen Sie für dieses Debugging erlauben!&lt;br /&gt;
&lt;br /&gt;
Für Android-Geräte finden Sie diese Option in den Einstellungen unter &#039;&#039;[https://www.droidwiki.org/wiki/Entwickleroptionen Entwickleroptionen]&#039;&#039; mit dem Namen &#039;&#039;[https://www.droidwiki.org/USB-Debugging USB-Debugging]&#039;&#039;. Falls die Entwickleroptionen nicht angezeigt werden, können Sie diese freischalten, indem Sie unter &amp;quot;&#039;&#039;Über das Telefon&#039;&#039;&amp;quot; siebenmal auf &amp;quot;&#039;&#039;Build-Nummer&#039;&#039;&amp;quot; tippen.&lt;br /&gt;
&lt;br /&gt;
===Wach bleiben Aktivieren===&lt;br /&gt;
Aktivieren Sie auch die Funktion &#039;&#039;Wach bleiben&#039;&#039;, damit das Gerät nicht während der Testerstellung oder -ausführung den Bildschirm abschaltet.&lt;br /&gt;
&lt;br /&gt;
Aus Sicherheitsgründen muss USB-Debugging für jeden Computer einzeln zugelassen werden. Beim Verbinden des Geräts mit dem PC über USB müssen Sie dabei am Gerät der Verbindung zustimmen. Falls Sie dies für Ihren Computer noch nicht getan haben, aber auf dem Gerät kein entsprechender Dialog erscheint, kann es helfen, das Gerät aus- und wieder einzustecken. Das kann insbesondere dann passieren, wenn Sie den ADB-Treiber installiert haben während das Gerät bereits über USB angeschlossen war. Falls auch das nicht hilft, öffnen Sie die Benachrichtigungen, indem Sie sie vom oberen Bildschirmrand herunter ziehen. Dort finden Sie die USB-Verbindung und Sie können die Optionen dazu öffnen. Wählen Sie einen anderen Verbindungstypen aus; in der Regel sollten MTP oder PTP funktionieren.&lt;br /&gt;
&lt;br /&gt;
Sie können auch auf einem Emulator testen. Dieser muss nicht gesondert vorbereitet werden, da er bereits für USB-Debugging ausgelegt ist. Es ist sogar möglich, einen Emulator bei Testbeginn zu starten.&lt;br /&gt;
&lt;br /&gt;
Um zu überprüfen, ob ein Gerät, das Sie an Ihren Rechner angeschlossen haben, verwendet werden kann, öffnen Sie den [[#Verbindungseditor|Verbindungseditor]]. Das Gerät sollte dort angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Verbindung über WLAN ===&lt;br /&gt;
Es ist auch möglich, Android-Geräte über WLAN zu verbinden. Für Geräte mit Android 11 oder neuer ist dies direkt über WLAN möglich, im anderen Fall müssen Sie das Gerät zuerst über USB verbinden. Ab expecco 22.1 können Sie eine WLAN-Verbindung über den [[Mobile Testing Plugin#Verbindungseditor|Verbindungseditor]] aufbauen. Ansonsten ist es auch über die Eingabeaufforderung möglich.&lt;br /&gt;
==== Drahtlos verbinden über die Eingabeaufforderung mit expecco Versionen vor 22.1 (ab Android 11) ====&lt;br /&gt;
Mit expecco ab Version 22.1 funktioniert das einfacher über den Verbindungseditor.&lt;br /&gt;
&lt;br /&gt;
Erlauben Sie in den Entwickleroptionen des Geräts Debugging über WLAN und öffnen Sie dessen Optionen. Sie müssen zuerst das Gerät mit dem  Rechner koppeln. Wählen Sie dazu &amp;quot;&#039;&#039;Gerät mit einem Kopplungscode koppeln&#039;&#039;&amp;quot;, um einen Kopplungscode und eine IP-Adresse mit Port zu erhalten. Öffnen Sie dann auf dem Rechner die Eingabeaufforderung und geben Sie dort ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb pair &amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Kopplungsport&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
wobei Sie &amp;lt;tt&amp;gt;&amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Kopplungsport&amp;gt;&amp;lt;/tt&amp;gt; durch die auf dem Gerät angezeigte IP-Adresse &amp;amp; Port ersetzen. Danach werden Sie aufgefordert, den Kopplungscode einzugeben. Wenn alles geklappt hat, sollte sich das Popup auf dem Gerät schließen und der Rechner als gekoppeltes Gerät angezeigt werden. Geben Sie dann in der Eingabeaufforderung ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Debug-Port&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die IP-Adresse ist hier noch die gleiche wie beim Koppeln, aber der Port ist ein anderer. Beides wird als IP-Adresse &amp;amp; Port auf dem Gerät angezeigt. Damit sollte das Gerät nun über WLAN verbunden sein und kann genauso verwendet werden, wie mit USB-Verbindung. Sie können dies überprüfen, indem Sie entweder &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; eingeben oder in expecco den Verbindungsdialog öffnen. In der Liste taucht das Gerät mit seiner IP-Adresse und dem Port auf. Bedenken Sie, dass die WLAN-Verbindung nicht mehr besteht, wenn der ADB-Server oder das Gerät neu gestartet werden. Häufig wird beim Neustart des Geräts auch die Erlaubnis für das Debugging über WLAN wieder zurückgesetzt und der verwendete Port ändert sich. Die Kopplung bleibt aber bestehen und muss beim nächsten Verbinden nicht noch einmal durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==== WLAN Verbindung über USB starten (Android 10 und früher) ====&lt;br /&gt;
Verbinden Sie zunächst das Gerät über USB mit dem Rechner. Öffnen Sie dann die Eingabeaufforderung und geben Sie dort ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit lauscht das Gerät auf eine TCP/IP-Verbindung an Port 5555. Sollten Sie mehrere Geräte angeschlossen oder Emulatoren laufen haben, müssen Sie genauer angeben, welches Gerät Sie meinen. Geben Sie in diesem Fall ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb devices -l&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Sie erhalten eine Liste aller Geräte, wobei die erste Spalte deren Kennung ist. Schreiben Sie dann stattdessen&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb -s &amp;lt;Gerätekennung&amp;gt; tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
mit der Gerätekennung des gewünschten Geräts. Sie können die USB-Verbindung nun trennen. Jetzt müssen Sie die IP-Adresse Ihres Gerätes in Erfahrung bringen. Sie finden diese üblicherweise irgendwo in den Einstellungen des Geräts, beispielsweise beim Status oder in den WLAN-Einstellungen. Geben Sie dann ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP-Adresse des Geräts&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit sollte das Gerät nun über WLAN verbunden sein und kann genauso verwendet werden, wie mit USB-Verbindung. Sie können dies überprüfen, indem Sie wieder &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; eingeben oder in expecco den Verbindungsdialog öffnen. In der Liste taucht das Gerät mit seiner IP-Adresse und dem Port auf. Bedenken Sie, dass die WLAN-Verbindung nicht mehr besteht, wenn der ADB-Server oder das Gerät neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
=== Verbindung zu einem Emulator ===&lt;br /&gt;
Sie benötigen dazu den Emulator selbst, sowie mindestens ein AVD (Android Virtual Device). Hinweise zu Installation finden Sie in der [https://developer.android.com/studio/run/emulator Android Studio Dokumentation].&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Android Studio bereits mit den Defaulteinstellungen installiert haben &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;, sollte der Emulator bereits mitinstalliert sein. Falls nicht, wählen Sie in Android Studio &amp;quot;&#039;&#039;Configure&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;SDK Manager&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Android SDK&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;SDK Tools&#039;&#039;&amp;quot; - &#039;&#039;Android Emulator&#039;&#039;&amp;quot;, sowie dort die &amp;quot;&#039;&#039;Platform Tools&#039;&#039;&amp;quot;.&lt;br /&gt;
Alternativ geht das auch über die Kommandzeile mit dem &amp;quot;sdkmanager&amp;quot; Kommando.&lt;br /&gt;
&lt;br /&gt;
Als nächstes benötigen Sie mindestens ein AVD; auch dies geht am einfachsten über den Dialog in Android Studio:&lt;br /&gt;
wählen sie &amp;quot;&#039;&#039;Configure&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;AVD Manager&#039;&#039;&amp;quot; und folgen den Anweisungen (Deviceauswahl, Platform und Android Version).  &lt;br /&gt;
&lt;br /&gt;
Auch wenn Sie den Emulator automatisieren benötigen sie Appium; installieren Sie dieses entweder mit dem Mobile Testing Supplement, oder direkt von der Appium homepage (https://github.com/appium/appium-desktop/releases).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;Android Studio selbst wird nicht von expecco benötigt; es bietet aber kompfortable Dialoge zum Installieren von Paketen und AVDs.&lt;br /&gt;
&lt;br /&gt;
== iOS-Gerät und App vorbereiten ==&lt;br /&gt;
Das Ansteuern von iOS-Geräten ist nur über einen Mac möglich. Lesen Sie daher auch den Abschnitt zur [[#Mac_OS|Installation unter Mac OS]].&lt;br /&gt;
&lt;br /&gt;
Bevor Sie ein Mobilgerät mit dem Mobile Testing Plugin ansteuern können, müssen Sie für iOS-Geräte ab iOS 8 Debugging erlauben. Aktivieren Sie dazu die Option &#039;&#039;Enable UI Automation&#039;&#039; unter dem Menüpunkt &#039;&#039;Entwickler&#039;&#039; in den Einstellungen des Geräts. Falls Sie den Eintrag &#039;&#039;Entwickler&#039;&#039; in den Einstellungen nicht finden, gehen Sie wie folgt vor: Schließen Sie das Gerät über USB an den Mac an. Dabei müssen Sie ggf. am Gerät noch der Verbindung zustimmen. Starten Sie Xcode und wählen Sie dann in der Menüleiste am oberen Bildschirmrand im Menü &#039;&#039;Window&#039;&#039; den Eintrag &#039;&#039;Devices&#039;&#039;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wählen Sie dort Ihr Gerät aus. Danach sollte der Eintrag &#039;&#039;Entwickler&#039;&#039; in den Einstellungen auf dem Gerät auftauchen. Dazu müssen Sie möglicherweise die Einstellungen beenden und neu starten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Alert.png | thumb | 270px | Beispiel für einen Alert unter iOS]]&lt;br /&gt;
Ein Verbindungsaufbau zu dem Gerät ist nicht möglich solange es bestimmte Alerts zeigt. Ein solcher Alert kann z.&amp;amp;#x202f;B. erscheinen wenn FaceTime aktiviert ist, indem ein Hinweis auf anfallende SMS-Gebühren angezeigt wird (siehe Screenshot). Achten Sie darauf, das Gerät so zu konfigurieren, dass es im Leerlauf keine solchen Alerts zeigt.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.11 und später ===&lt;br /&gt;
Sie können beliebige Apps testen, die auf dem verwendeten Gerät lauffähig oder bereits installiert sind. Wenn die App als Development-Build vorliegt, muss die UDID des Geräts in der App hinterlegt sein. In jedem Fall muss der WebDriverAgent für das Gerät signiert werden. Lesen Sie dazu den Abschnitt zur [[#Signierung|Signierung]] unter Mac OS.&lt;br /&gt;
&lt;br /&gt;
Falls Sie in einem Test den Home-Button verwenden wollen, müssen Sie auf dem Gerät AssistiveTouch aktivieren. Sie finden diese Option in den Einstellungen unter &#039;&#039;Allgemein&#039;&#039; &amp;gt; &#039;&#039;Bedienungshilfen&#039;&#039; &amp;gt; &#039;&#039;AssistiveTouch&#039;&#039;. Platzieren Sie dann das Menü in der Mitte des oberen Bildschirmrands. Sie können das Drücken des Home-Buttons dann mit dem entsprechenden Menüeintrag im Recorder aufzeichnen oder direkt den Baustein &#039;&#039;Press Home Button&#039;&#039; benutzen.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.10 ===&lt;br /&gt;
Die App, die Sie verwenden wollen, muss als Development-Build vorliegen. Außerdem muss die UDID des Geräts in der App hinterlegt sein.&lt;br /&gt;
&lt;br /&gt;
=== Development-Build signieren ===&lt;br /&gt;
Ein Development-Build einer App ist nur für eine begrenzte Zahl von Geräten zugelassen und kann auf anderen Geräten nicht gestartet werden. Es ist aber möglich, das Zertifikat und die verwendbaren Geräte in einem Development-Build auszutauschen.&lt;br /&gt;
&lt;br /&gt;
* Evaluierung mit Demo-App von eXept:&lt;br /&gt;
:Gerne stellen wir Ihnen eine Demo-App zur Verfügung, die als Development-Build vorliegt und die wir für Ihr Gerät signieren können. Senden Sie dazu bitte Ihrem eXept-Ansprechpartner die UDID Ihres Gerätes zu. Wie Sie die UDID Ihres Gerätes ermitteln können, ist im folgenden Abschnitt beschrieben.&lt;br /&gt;
&lt;br /&gt;
* Eigene App für Ihr Testgerät verwenden:&lt;br /&gt;
:Wenn Sie von den App-Entwicklern einen Development-Build (IPA-Datei) erhalten, der für Ihr Testgerät zugelassen ist, können Sie diesen direkt verwenden. Dazu müssen Sie den Entwicklern die UDID Ihres Geräts mitteilen, damit sie diese eintragen können. &#039;&#039;&#039;Sie können die UDID eines Gerätes mithilfe von Xcode auslesen&#039;&#039;&#039;. Starten Sie dazu Xcode und wählen Sie in der Menüleiste am oberen Bildschirmrand im Menü &#039;&#039;Window&#039;&#039; den Eintrag &#039;&#039;Devices&#039;&#039;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wählen Sie Ihr Gerät aus und suchen Sie in Eigenschaften den Eintrag &#039;&#039;Identifier&#039;&#039;. Die UDID ist eine 40-stellige Hexadezimalzahl.&lt;br /&gt;
&lt;br /&gt;
* Extern entwickelte App für Ihr Testgerät umsignieren:&lt;br /&gt;
:Es können auch Apps umsigniert werden, damit Sie auf anderen Geräten lauffähig sind. Dieser Vorgang ist jedoch kompliziert und setzt insbesondere einen Zugang zu einem Apple-Developer-Account voraus. Eine Dokumentation zur Vorgehensweise ist derzeit in Vorbereitung.&lt;br /&gt;
&lt;br /&gt;
:Für die Evaluierung unterstützen wir Sie gerne beim Umsignieren Ihrer App.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Melden Sie sich beim [https://developer.apple.com/ Apple-Webinterface] an. Navigieren Sie zu &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039;. Erzeugen Sie hier ggf. ein Developer-Zertifikat und ein Provisioning Profile für Ihr Gerät und laden Sie beide herunter. Sollten Sie noch keinen Developer Account haben, erstellen Sie hier einen: https://developer.apple.com/enroll/. Hierzu müssen Sie sich mit einer Apple-ID anmelden.&lt;br /&gt;
&lt;br /&gt;
# Team-ID herausfinden (&#039;&#039;Membership&#039;&#039; -&amp;gt; &#039;&#039;Team ID&#039;&#039;)&lt;br /&gt;
# Unter &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039; Development-Zertifikat auswählen (unter &#039;&#039;+&#039;&#039; anlegen, falls nicht vorhanden) und herunterladen.&lt;br /&gt;
# Unter &#039;&#039;App ID&#039;&#039; Wildcard-App-ID erzeugen, falls nicht vorhanden. App-ID notieren (AppID = Prefix.ID)&lt;br /&gt;
# Gerät hinzufügen, dazu UDID (bzw. &#039;&#039;Identifier&#039;&#039;) des Geräts herausfinden (&#039;&#039;Xcode&#039;&#039; -&amp;gt; &#039;&#039;Window&#039;&#039; (oben in Menüleiste) -&amp;gt; &#039;&#039;Devices&#039;&#039;)&lt;br /&gt;
# Provisionen Profile erstellen: &#039;&#039;iOS App Development&#039;&#039; -&amp;gt; &#039;&#039;AppID&#039;&#039; auswählen -&amp;gt; Zertifikat wählen -&amp;gt; Gerät auswählen -&amp;gt; Profilname anlegen -&amp;gt; Provisioning Profile herunterladen.&lt;br /&gt;
# Das heruntergeladene Zertifikat importieren (&#039;&#039;Downloads&#039;&#039; -&amp;gt; Zertifikat (.cer)&lt;br /&gt;
# SHA1-Fingerabdruck kopieren. Dazu Rechtsklick auf Zertifikat -&amp;gt; &#039;&#039;Information&#039;&#039;, anschließend bis zum Ende der Seite scrollen).&lt;br /&gt;
# Entitlements.plist erstellen (&#039;&#039;Terminal&#039; öffnen -&amp;gt; Downloads/Mobile_Testing_Supplement/bin/gen-entitlements_plist &#039;Team-ID&#039; &#039;App ID&#039; Downloads/Mobile_Testing_Supplement/bin/re-sign-ipa &amp;lt;Pfad zum ipa (z.B. Downloads/expeccoMobileDemo.ipa)&amp;gt; \&lt;br /&gt;
&amp;quot;&amp;lt;Zertifikat (SHA1-Fingerabdruck, z.B. 76 E8 4B E8 78 D5 D7 F9 2E 09 8B D7 E8 FB CE 30 0C F5 D0 EF)&amp;gt;&amp;quot; \&lt;br /&gt;
&amp;lt;Pfad zum Provisionen Profile (z.B. /Users/exept_test/Downloads/dut.mobileprovision)&amp;gt; \&lt;br /&gt;
&amp;lt;Pfad für das Ergebnis-ipa (z.B. Downloads/expeccoMobileDemo_re-signed.ipa)&amp;gt; \&lt;br /&gt;
[Pfad zur entitlements.plist] (z.B. /Users/exept_test/entitlements.plist)&lt;br /&gt;
&lt;br /&gt;
Zum Umsignieren können Sie das entsprechende Skript aus dem Mobile Testing Supplement für Mac OS oder jedes beliebige andere Tool (z.B. isign) verwenden.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zur Verwendung von iOS-Geräten finden Sie auch in der [http://appium.io/slate/en/master/?java#appium-on-real-ios-devices Dokumentation von Appium].&lt;br /&gt;
&lt;br /&gt;
=== Native iOS-Apps ===&lt;br /&gt;
Sie können auch Apps verwenden, die bereits nativ auf dem Gerät vorhanden sind. Dazu müssen Sie deren Bundle-ID kennen und diese dann in die Verbindungseinstellungen eintragen. Hier eine kleine Auswahl gängiger Apps:&lt;br /&gt;
{| style=&amp;quot;text-align:left&amp;quot;&lt;br /&gt;
! App&lt;br /&gt;
!&lt;br /&gt;
! Bundle-ID&lt;br /&gt;
|-&lt;br /&gt;
| App Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.AppStore&lt;br /&gt;
|-&lt;br /&gt;
| Calculator&lt;br /&gt;
| &lt;br /&gt;
| com.apple.calculator&lt;br /&gt;
|-&lt;br /&gt;
| Calendar&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilecal&lt;br /&gt;
|-&lt;br /&gt;
| Camera&lt;br /&gt;
| &lt;br /&gt;
| com.apple.camera&lt;br /&gt;
|-&lt;br /&gt;
| Contacts&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileAddressBook&lt;br /&gt;
|-&lt;br /&gt;
| iTunes Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileStore&lt;br /&gt;
|-&lt;br /&gt;
| Mail&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilemail&lt;br /&gt;
|-&lt;br /&gt;
| Maps&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Maps&lt;br /&gt;
|-&lt;br /&gt;
| Messages&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileSMS&lt;br /&gt;
|-&lt;br /&gt;
| Phone&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilephone&lt;br /&gt;
|-&lt;br /&gt;
| Photos&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobileslideshow&lt;br /&gt;
|-&lt;br /&gt;
| Settings&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Preferences&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Weitere Bundle-IDs finden Sie [https://github.com/joeblau/apple-bundle-identifiers hier].&lt;br /&gt;
&lt;br /&gt;
= Beispiele =&lt;br /&gt;
Bei den Demo-Testsuiten für expecco finden Sie auch Beispiele für Tests mit dem Mobile Testing Plugin. Wählen Sie dazu auf dem Startbildschirm die Option &amp;quot;&#039;&#039;Beispiel aus Datei&#039;&#039;&amp;quot; und öffnen Sie den Ordner &amp;quot;&#039;&#039;mobile&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;TestsuiteMobileTestingDemo&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m01_MobileTestingDemo.ets --&amp;gt;&amp;lt;/span&amp;gt; &#039;&#039;m01_MobileTestingDemo.ets&#039;&#039; ==&lt;br /&gt;
Die Testsuite enthält zwei einfache Testpläne: &amp;quot;&#039;&#039;Simple CalculatorTest&#039;&#039;&amp;quot; und &amp;quot;&#039;&#039;Complex Calculator and Messaging Test&#039;&#039;&amp;quot;. Beide Tests verwenden einen Android-Emulator, den Sie vor Beginn starten müssen. Die Apps, die im Test verwendet werden, gehören zur Grundausstattung des Emulators und müssen daher nicht mehr installiert werden. Da sich die Apps unter jeder Android-Version unterscheiden können, ist es wichtig, dass Ihr Emulator unter Android 6.0 läuft. Außerdem muss die Sprache auf Englisch gestellt sein.&lt;br /&gt;
&lt;br /&gt;
; Simple CalculatorTest&lt;br /&gt;
: Dieser Test verbindet sich mit dem Taschenrechner und gibt die Formel &#039;&#039;2+3&#039;&#039; ein. Das Ergebnis des Rechners wird mit dem erwarteten Wert &#039;&#039;5&#039;&#039; verglichen.&lt;br /&gt;
&lt;br /&gt;
; Complex Calculator and Messaging Test&lt;br /&gt;
: Dieser Test verbindet sich mit dem Taschenrechner und öffnet anschließend den Nachrichtendienst. Dort wartet er auf eine einkommende Nachricht von der Nummer &#039;&#039;15555215556&#039;&#039;, in der eine zu berechnende Formel gesendet wird. Die Nachricht wird zuvor über einen Socket beim Emulator erzeugt. Nach dem Eintreffen der Nachricht wird diese vom Test geöffnet und deren Inhalt gelesen. Danach wird wieder der Taschenrechner geöffnet, die erhaltene Formel eingegeben und das Ergebnis gelesen. Anschließend wechselt der Test wieder zum Nachrichtendienst und sendet das Ergebnis als Antwort.&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;m02_expeccoMobileDemo.ets&#039;&#039; und &#039;&#039;m03_expeccoMobileDemoIOS.ets&#039;&#039; ==&lt;br /&gt;
Diese sind Bestandteil des Tutorials zum Mobile Testing Plugin. Der jeweils enthaltene Testfall ist unvollständig und wird im Zuge des Tutorials ergänzt. Lesen Sie dazu den Abschnitt [[#Tutorial|Tutorial]].&lt;br /&gt;
&lt;br /&gt;
= Tutorial =&lt;br /&gt;
Es gibt ein Tutorial, das das grundsätzliche Vorgehen zur Erstellung von Tests mit dem Mobile Testing Plugin beschreibt. Grundlage dafür ist ein mitgeliefertes Beispiel, bestehend aus einer einfachen App und einer expecco-Testsuite.&lt;br /&gt;
&lt;br /&gt;
Sie finden es auf der Seite [[Mobile_Testing_Tutorial|Mobile Testing Tutorial]] in zwei Versionen für Android und für iOS.&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsAndroid&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m02_expeccoMobileDemo.ets --&amp;gt;&amp;lt;/span&amp;gt;[[Mobile_Testing_Tutorial#Erste_Schritte_mit_Android|Erste Schritte mit Android]]&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsIOS&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m03_expeccoMobileDemoIOS.ets --&amp;gt;&amp;lt;/span&amp;gt;[[Mobile_Testing_Tutorial#Erste_Schritte_mit_iOS|Erste Schritte mit iOS]]&lt;br /&gt;
&lt;br /&gt;
= Dialoge des Mobile Testing Plugins =&lt;br /&gt;
== Verbindungseditor ==&lt;br /&gt;
Mithilfe des Verbindungseditors können Sie schnell Verbindungen definieren, ändern oder aufbauen. Je nach Aufgabe weist der Dialog kleine Unterschiede auf und wird unterschiedlich geöffnet:&lt;br /&gt;
*Um eine Verbindung aufzubauen, klicken Sie im GUI-Browser auf &amp;quot;&#039;&#039;Verbinden&#039;&amp;quot;&#039; klicken und wählen dann &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot;.&lt;br /&gt;
*Um eine bestehende Verbindung im GUI-Browser zu ändern oder zu kopieren, wählen Sie diese aus, machen einen Rechtsklick und wählen im Kontextmenü &amp;quot;&#039;&#039;Verbindung bearbeiten&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;Verbindung kopieren&#039;&#039;&amp;quot; aus.&lt;br /&gt;
*Wollen Sie Verbindungseinstellungen nicht für den GUI-Browser sondern zur Verwendung in einem Test erstellen, wählen Sie im Menü des Mobile Testing Plugins den Punkt &amp;quot;&#039;&#039;Verbindungseinstellungen erstellen...&#039;&#039;&amp;quot;. Darüber können nur die Einstellungen für eine Verbindung erstellt werden, ohne dass eine Verbindung tatsächlich angelegt wird.&lt;br /&gt;
&lt;br /&gt;
Einige der Schaltflächen sind nur beim Erstellen von Verbindungseinstellungen sichtbar:&lt;br /&gt;
[[Datei:MobileTestingVerbindungseditorMenu.png]]&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen löschen&#039;&#039;&amp;quot;: Setzt alle Einträge zurück. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen aus Datei laden&#039;&#039;&amp;quot;: Erlaubt das Öffnen einer gespeicherten Einstellungsdatei (*.csf). Deren Einstellungen werden in den Dialog übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen aus Anhang laden&#039;&#039;&amp;quot;: Erlaubt das Öffnen eines Anhangs mit Verbindungseinstellungen aus einem geöffneten Projekt. Diese Einstellungen werden in den Dialog übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen in Datei speichern&#039;&#039;&amp;quot; sowie&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen in Anhang speichern&#039;&#039;&amp;quot;: Hier können Sie die eingetragenen Einstellungen in eine Datei (*.csf) speichern oder als Anhang in einem geöffneten Projekt anlegen. Beide Optionen besitzen ein verzögertes Menü, in dem Sie auswählen können, nur einen bestimmten Teil der Einstellungen zu speichern. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Erweiterte Ansicht&#039;&#039;&amp;quot;: Damit können Sie in die erweiterte Ansicht wechseln, um zusätzliche Einstellungen vorzunehmen. Lesen Sie dazu mehr am Ende des Kapitels. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Hilfe&#039;&#039;&amp;quot;: An der rechten Seite wird ein Hilfetext zum jeweiligen Schritt ein- oder ausgeblendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Dialog ist in drei Schritte unterteilt. Im ersten Schritt wählen Sie das Gerät, das Sie verwenden möchten, im zweiten Schritt wählen Sie aus, welche App verwendet werden soll und im letzten Schritt erfolgen die Einstellungen zum Appium-Server.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep1&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 1: Gerät auswählen===&lt;br /&gt;
Im oberen Teil erhalten Sie eine Liste aller angeschlossenen Appium-Geräte, die erkannt werden. Mit der Checkbox darunter können Sie die Geräte ausblenden, die zwar erkannt werden, aber nicht bereit sind. Falls Sie ein Gerät eintragen wollen, das nicht angeschlossen ist, können Sie dies mit dem entsprechenden Knopf &amp;quot;&#039;&#039;Android-Gerät eingeben&#039;&#039;&amp;quot; bzw. &amp;quot;&#039;&#039;iOS-Gerät eingeben&#039;&#039;&amp;quot; anlegen. Dazu müssen Sie jedoch die benötigten Eigenschaften Ihres Geräts kennen. Das Gerät wird dann in einer zweiten Geräteliste angelegt und kann dort ausgewählt werden. Wenn keine Liste mit angeschlossenen Elementen angezeigt werden kann, werden stattdessen verschiedene Meldungen angezeigt:&lt;br /&gt;
*Keine Geräte gefunden&lt;br /&gt;
*:expecco konnte kein Android-Geräte finden.&lt;br /&gt;
*:Um eine Verbindung zu einem Gerät automatisch zu konfigurieren, stellen Sie sicher, dass es&lt;br /&gt;
*:*angeschlossen ist&lt;br /&gt;
*:*eingeschaltet ist&lt;br /&gt;
*:*einen passenden adb-Treiber installiert hat&lt;br /&gt;
*:*für Debugging freigeschaltet ist (siehe unten).&lt;br /&gt;
*Keine verfügbaren Geräte gefunden&lt;br /&gt;
*:expecco konnte keine verfügbaren Android-Geräte finden. Es wurden aber nicht verfügbare gefunden, z.B. mit dem Status &amp;quot;unauthorized&amp;quot;.&lt;br /&gt;
*:Um eine Verbindung zu einem Gerät automatisch zu konfigurieren, stellen Sie sicher, dass es&lt;br /&gt;
*:*angeschlossen ist&lt;br /&gt;
*:*eingeschaltet ist&lt;br /&gt;
*:*einen passenden adb-Treiber installiert hat&lt;br /&gt;
*:*für Debugging freigeschaltet ist (siehe unten).&lt;br /&gt;
*:Um nicht verfügbare Geräte anzuzeigen, aktivieren Sie unten diese Option.&lt;br /&gt;
*Verbindung verloren&lt;br /&gt;
*:expecco hat die Verbindung zum adb-Server verloren. Versuchen Sie die Verbindung wieder herzustellen, indem Sie auf den Button klicken.&lt;br /&gt;
*Verbindung fehlgeschlagen&lt;br /&gt;
*:expecco konnte sich nicht mit dem adb-Server verbinden. Möglicherweise läuft er nicht oder der angegebene Pfad stimmt nicht.&lt;br /&gt;
*:Überprüfen Sie die adb-Konfiguration in den Einstellungen und versuchen Sie den adb-Server zu starten und eine Verbindung herzustellen indem Sie auf den Knopf klicken.&lt;br /&gt;
*Verbinden ...&lt;br /&gt;
*:expecco verbindet sich mit dem adb-Server. Dies kann einige Sekunden dauern.&lt;br /&gt;
*adb-Server starten ...&lt;br /&gt;
*:expecco startet den adb-Server. Dies kann einige Sekunden dauern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Bei &amp;quot;&#039;&#039;Automatisierung durch&#039;&#039;&amp;quot; können Sie angeben, welche Automation-Engine verwendet werden soll. Lassen Sie die Einstellung auf &amp;quot;&#039;&#039;(Default)&#039;&#039;&amp;quot; wird die entsprechende Capability gar nicht gesetzt. Ansonsten stehen Appium, Selendroid und ab expecco 2.11 XCUITest zur Verfügung. In der Regel wird Selendroid nur für Android-Geräte vor Version 4.1 gebraucht.--&amp;gt;Mit &amp;quot;&#039;&#039;Weiter&#039;&#039;&amp;quot; gelangen Sie zum nächsten Schritt. Wenn Sie Einstellungen für den GUI-Browser eingeben, ist das erst möglich, wenn ein Gerät ausgewählt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;UnlockingDeveloperOptions&amp;quot;&amp;gt;Anmerkung zum Freischalten&amp;lt;/span&amp;gt;: In jüngeren Android Versionen werden die Entwickleroptionen zunächst nicht mehr in den Einstellungen angeboten. Falls ihr Android Gerät in den Einstellungen keinen Eintrag zu &amp;quot;&#039;&#039;Entwickleroptionen&#039;&#039;&amp;quot; zeigt, wählen Sie zunächst den Eintrag &amp;quot;&#039;&#039;Telefoninfo&#039;&#039;&amp;quot;, dann &amp;quot;&#039;&#039;SoftwareVersionsInfo&#039;&#039;&amp;quot; und klicken darin mehrfach auf den Eintrag &amp;quot;&#039;&#039;BuildVersion&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Chromedriver verwalten ====&lt;br /&gt;
Wenn die App, die Sie bedienen wollen, WebViews mit Chrome benutzt, benötigt Appium Zugriff auf einen passenden Chromedriver. Wenn Sie ein Gerät in der Liste auswählen, können Sie über &amp;quot;&#039;&#039;Chromedriver verwalten&#039;&#039;&amp;quot; sehen, welche Chrome-Versionen auf dem Gerät vorhanden sind und welche Chromedriver-Versionen durch expecco zur Verfügung stehen. Über diesen Dialog können Sie auch benötigte Chromedriver-Versionen herunterladen. Beachten Sie, dass auf dem Gerät verschiedene Chrome-Versionen vorhanden sein können, da die Apps in ihren WebViews nicht die gleiche Chrome-Version verwenden müssen, wie die als Browser installierte. Damit alles funktioniert, sollte der verwendete Chromedriver zur entsprechenden App passen. Sie können den Pfad zum Chromedriver auch am Ende des Verbindungsdialogs in den erstellten Capabilities ändern.&lt;br /&gt;
&lt;br /&gt;
==== WLAN-Android-Geräte verbinden ====&lt;br /&gt;
Sie können sich auch über WLAN zu Android-Geräten verbinden. Dazu muss das Gerät zunächst mit adb verbunden werden, siehe [[Mobile_Testing_Plugin#Verbindung_.C3.BCber_WLAN|Verbindung über WLAN]]. Ab expecco 22.1 bietet der Verbindungseditor hierfür einen Dialog, der Ihnen dabei hilft und den Sie anstatt der Eingabeaufforderung verwenden können. Für Geräte mit Android 11 oder höher können Sie hier das Gerät mit dem Rechner zu koppeln, indem Sie die entsprechenden Parameter angeben und anschließend die Verbindung unter Angabe von IP-Adresse und Port aufbauen. Sie können damit auch für Geräte, die über USB verbunden sind, eine WLAN-Verbindung aufbauen. Wenn Sie das entsprechende Gerät in der Liste auswählen, werden die benötigten Angaben automatisch ausgelesen.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass der Aufbau einer WLAN-Verbindung nicht Teil der Verbindungseinstellungen ist. Wenn Sie mit den erzeugten Einstellungen eine neue Verbindung aufbauen wollen, müssen Sie sicherstellen, dass das Gerät über mit der angegebenen IP-Adresse und dem Port mit adb verbunden ist, damit es gefunden wird. Die ADB-Verbindung geht verloren, wenn der ADB-Server oder das Gerät neu gestartet werden. Die Erlaubnis für das WLAN-Debugging wird beim Neustart des Geräts auch häufig zurückgesetzt und der Debug-Port kann dann wechseln. Daher muss eine WLAN-Verbindung immer manuell hergestellt werden.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep2&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 2: App auswählen===&lt;br /&gt;
Hier können Sie Angaben zur App machen, die getestet werden soll. Dabei können Sie entscheiden, ob Sie eine App verwenden wollen, die bereits auf dem Gerät installiert ist, oder ob für den Test eine App installiert werden soll. Wählen Sie oben den entsprechenden Reiter aus. Je nachdem, ob Sie im vorigen Schritt ein Android- oder ein iOS-Gerät ausgewählt haben, ändert sich die erforderte Eingabe.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Android&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App auf dem Gerät&#039;&#039;&lt;br /&gt;
**:Wenn Sie im ersten Schritt ein angeschlossenes Gerät ausgewählt haben, werden die Pakete aller installierten Apps automatisch abgerufen und Sie können die Auswahl aus den Drop-down-Listen treffen. Die installierten Apps sind in Fremdpakete und Systempakete unterteilt; wählen Sie die entsprechende Paketliste aus. Diese Auswahl gehört nicht zu den Einstellungen, sondern stellt nur die entsprechende Paketliste zur Verfügung. Sie können den Filter benutzen, um die Liste weiter einzuschränken und dann das gewünschte Paket auswählen. Die Activities des ausgwählten Pakets werden ebenfalls automatisch abgerufen und als Drop-down-Liste zur Verfügung gestellt. Wählen Sie die Activity aus, die gestartet werden soll. In der Regel wird automatisch eine Activity aus der Liste eingetragen. Falls Sie kein verbundenes Gerät verwenden, müssen Sie die Eingabe des Pakets und der Activity von Hand vornehmen.&lt;br /&gt;
**&#039;&#039;App installieren&#039;&#039;&lt;br /&gt;
**:Geben Sie bei &amp;quot;&#039;&#039;App&#039;&#039;&amp;quot; den Pfad zu einer App an. Der Pfad muss für den Appium-Server gültig sein, der verwendet wird. Sie können auch eine URL angeben. Benutzen Sie einen lokalen Appium-Server, können Sie den rechten Butten benutzen, um zu der Installationsdatei der App zu navigieren und diesen Pfad einzutragen. Wenn möglich werden dabei auch das entsprechende Paket und die Activity in den Feldern darunter eingetragen. Diese Angabe ist aber nicht notwendig.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;iOS&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App auf dem Gerät&#039;&#039;&lt;br /&gt;
**:Geben Sie die Bundle-ID einer installierten App an. Sie können die IDs der installierten Apps bspw. mithilfe von Xcode erfahren. Starten Sie dazu Xcode und wählen Sie in der Menüleiste am oberen Bildschirmrand im Menü &amp;quot;&#039;&#039;Window&#039;&#039;&amp;quot; den Eintrag &amp;quot;&#039;&#039;Devices&#039;&#039;&amp;quot;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wenn Sie Ihr Gerät auswählen, sehen Sie in der Übersicht eine Auflistung der von Ihnen installierten Apps.&lt;br /&gt;
**&#039;&#039;App installieren&#039;&#039;&lt;br /&gt;
**:Geben Sie bei &amp;quot;&#039;&#039;App&#039;&#039;&amp;quot; den Pfad zu einer App an. Der Pfad muss für den Appium-Server gültig sein, der verwendet wird. Sie können auch eine URL angeben. Zu den Vorraussetzungen an Apps für reale Geräte lesen Sie bitte den Abschnitt [[#iOS-Ger.C3.A4t_und_App_vorbereiten|iOS-Geräte und App vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
Im unteren Teil können Sie festlegen, ob die App beim Verbindungsabbau zurückgesetzt bzw. deinstalliert werden soll, und ob sie initial zurückgesetzt werden soll. Auch hier wird die entsprechende Capability gar nicht gesetzt, wenn Sie &amp;quot;&#039;&#039;(Default)&#039;&#039;&amp;quot; auswählen. Mit &amp;quot;&#039;&#039;Weiter&#039;&#039;&amp;quot; gelangen Sie zum nächsten Schritt.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep3&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 3: Servereinstellungen===&lt;br /&gt;
Im letzten Schritt befindet sich zunächst im oberen Teil eine Liste aller Capabilities, die sich aus Ihren Angaben der vorigen Schritte ergeben. Wenn Sie sich mit Appium auskennen und noch zusätzliche Capabilities setzen möchten, die der Verbindungseditor nicht abdeckt, können Sie durch Klicken auf &amp;quot;&#039;&#039;Bearbeiten&#039;&#039;&amp;quot; in die erweiterte Ansicht gelangen. Lesen Sie dazu den Abschnitt weiter unten.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Einstellungen für den GUI-Browser eingeben, können Sie den &#039;&#039;Verbindungsnamen&#039;&#039; eintragen, mit dem die Verbindung angezeigt wird. Dies ist auch der Name unter dem Bausteine diese Verbindung verwenden können, wenn sie aufgebaut ist. Wenn Sie das Feld frei lassen, wird ein Name generiert. Wenn der Haken für &amp;quot;&#039;&#039;Von expecco gesteuert&#039;&#039;&amp;quot; gesetzt ist, wird expecco einen lokalen Appium-Server an einem freien Port starten, oder einen bereits gestarteten freien Server verwenden. Um einen eigenen Server zu verwenden, schalten Sie diese Funktion ab und geben Sie die entsprechende Adresse ein. Sie erhalten die lokale Standard-Adresse und bereits verwendete Adressen zur Auswahl.&lt;br /&gt;
&lt;br /&gt;
In älteren expecco-Versionen ist der Haken mit &amp;quot;&#039;&#039;Bei Bedarf starten&#039;&#039;&amp;quot; beschriftet. In diesem Fall müssen Sie auch eine Adresse angeben, wenn expecco den Server starten soll. expecco versucht dann beim Verbinden einen Appium-Server an der angegebenen Adresse zu starten, wenn dort noch keiner läuft. Dieser Server wird dann beim Beenden der Verbindung ebenfalls heruntergefahren. Dies funktioniert nur für lokale Adressen. Achten Sie darauf, nur Portnummern zu verwenden, die auch frei sind. Verwenden Sie am besten nur ungerade Portnummern ab dem Standardport 4723. Beim Verbindungsaufbau wird ebenfalls die folgende Portnummer verwendet, wodurch es sonst zu Konflikten kommen könnte. &lt;br /&gt;
&lt;br /&gt;
Je nachdem, wie Sie den Dialog geöffnet haben, gibt es nun verschiedene Schaltflächen um ihn abzuschließen. In jedem Fall haben Sie die Option zu speichern. Dabei öffnet sich ein Dialog, indem Sie entweder ein geöffnet Projekt auswählen können, um die Einstellungen dort als Anhang zu speichern, oder auswählen es in einer Datei zu speichern, die Sie anschließend angeben können. Durch das Speichern wird der Dialog nicht beendet, wodurch Sie anschließend noch eine andere Option auswählen könnten.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie den Editor zum Verbindungsaufbau geöffnet haben, können Sie abschließend auf &amp;quot;&#039;&#039;Verbinden&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;Server starten und verbinden&#039;&#039;&amp;quot; klicken, je nachdem, ob der Haken für den Serverstart gesetzt ist. Für das Ändern oder Kopieren einer Verbindung im GUI-Brower heißt diese Option &amp;quot;&#039;&#039;Übernehmen&#039;&#039;&amp;quot;, da in diesem Fall nur der Verbindungseintrag geändert bzw. neu angelegt wird, der Verbindungsaufbau aber nicht gestartet wird. Das können Sie bei Bedarf anschließend über das Kontextmenü tun. Falls Sie Capabilities einer bestehenden Verbindung geändert haben, fordert Sie anschließend ein Dialog auf zu entscheiden, ob diese Änderungen direkt übernommen werden sollen, indem die Verbindung abgebaut und mit den neuen Verbindungen aufgebaut wird, oder nicht. In diesem Fall werden die Änderungen erst wirksam, nachdem Sie die Verbindung neu aufbauen.&lt;br /&gt;
&lt;br /&gt;
Zur Verwendung des Verbindungseditors lesen Sie auch den entsprechenden Abschnitt im jeweiligen Tutorial in Schritt 1 (Android: [[Mobile_Testing_Tutorial#Schritt_1:_Demo_ausf.C3.BChren|Demo ausführen]], iOS: [[Mobile_Testing_Tutorial#Schritt_1:_Demo_ausf.C3.BChren_.28iOS.29|Demo ausführen (iOS)]]).&lt;br /&gt;
&lt;br /&gt;
===Erweiterte Ansicht===&lt;br /&gt;
Die erweiterte Ansicht des Verbindungseditors erhalten Sie entweder durch Klicken auf &amp;quot;&#039;&#039;Bearbeiten&#039;&#039;&amp;quot; im dritten Schritt oder jederzeit über den entsprechenden Menüeintrag, wenn Sie den Editor über das Plugin-Menü gestartet haben. In dieser Ansicht erhalten Sie eine Liste aller eingestellten Appium-Capabilities. Zu dieser können Sie weitere hinzufügen, Einträge ändern oder entfernen. Um eine Capability hinzuzufügen, wählen Sie diese aus der Drop-down-Liste des Eingabefelds aus. In dieser befinden sich alle bekannten Capabilities sortiert in die Kategorien &#039;&#039;Common&#039;&#039;, &#039;&#039;Android&#039;&#039; und &#039;&#039;iOS&#039;&#039;. Haben Sie eine Capability ausgewählt, wird ein kurzer Informationstext dazu angezeigt. Sie können in das Feld auch von Hand eine Capability eingeben. Klicken Sie dann auf &amp;quot;&#039;&#039;Hinzufügen&#039;&#039;&amp;quot;, um die Capabilitiy in die Liste einzutragen. Dort können Sie in der rechten Spalte den Wert setzen. Um einen Entrag zu löschen, wählen Sie diesen aus und klicken Sie auf &amp;quot;&#039;&#039;Entfernen&#039;&#039;&amp;quot;. Mit &amp;quot;&#039;&#039;Zurück&#039;&#039;&amp;quot; verlassen Sie die erweiterte Ansicht.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingErweiterteAnsicht.png]]&lt;br /&gt;
&lt;br /&gt;
== Laufende Appium-Server ==&lt;br /&gt;
Im Menü des Mobile Testing Plugins finden Sie den Eintrag &amp;quot;&#039;&#039;Appium-Server...&#039;&#039;&amp;quot;. Mit diesem öffnen Sie ein Fenster mit einer Übersicht aller Appium-Server, die von expecco gestartet wurden und auf welchem Port diese laufen. Durch Klicken auf das Icon in der Spalte &amp;quot;&#039;&#039;Log anzeigen&#039;&#039;&amp;quot; können Sie das Logfile des entsprechenden Servers anschauen. Dieses wird beim Beenden des Servers wieder gelöscht. Mit den Icons in der Spalte &amp;quot;&#039;&#039;Beenden&#039;&#039;&amp;quot; kann der entsprechenden Server beendet werden. Allerdings wird dies verhindert, wenn expecco über diesen Server noch eine offene Verbindung hat. Für welche Verbindung ein Server verwendet wird, sehen Sie in der rechten Spalte. Steht dort &#039;&#039;&amp;lt;idle&amp;gt;&#039;&#039; wird er zur Zeit nicht von expecco verwendet.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAppiumServer.png]]&lt;br /&gt;
&lt;br /&gt;
Beim Öffnen des Editors um eine Appium-Verbindung aufzubauen, wird direkt ein Appium-Server gestartet, um den folgenden Verbindungsaufbau zu beschleunigen. Zu diesem Zweck hält sich expecco auch immer einen freien Appium-Server offen. Weitere laufende Server, die nicht mehr verwendet werden, werden jedoch nach einiger Zeit automatisch beendet.&lt;br /&gt;
&lt;br /&gt;
Im Menü des Mobile Testing Plugins finden Sie auch den Eintrag &amp;quot;&#039;&#039;Alle Verbindungen und Server beenden&#039;&#039;&amp;quot;. Dies ist für den Fall gedacht, dass Verbindungen oder Server auf andere Weise nicht beendet werden können. Beenden Sie Verbindungen wenn möglich immer im GUI-Browser oder durch Ausführen eines entsprechenden Bausteins. Server, die Sie in der Server-Übersicht gestartet haben, beenden Sie dort; Server, die mit einer Verbindung gestartet wurden, werden automatisch mit dieser beendet.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass in der Übersicht nur Server aufgelistet sind, die von expecco gestartet und verwaltet werden. Mögliche andere Appium-Server, die auf andere Art gestartet wurden, werden nicht erkannt.&lt;br /&gt;
&lt;br /&gt;
== Recorder ==&lt;br /&gt;
Besteht im GUI-Browser eine Verbindung zu einem Gerät, kann der integrierte Recorder verwendet werden, um mit diesem Gerät einen Testabschnitt aufzunehmen. Sie starten den Recorder, indem Sie im GUI-Browser die entsprechende Verbindung auswählen und dann auf den Aufnahme-Knopf klicken. Für den Recorder öffnet sich ein neues Fenster. Die aufgezeichneten Aktionen werden im Arbeitsbereich des GUI-Browsers angelegt. Daher ist es möglich, das Aufgenommene parallel zu editieren.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingRecorder.png|caption|]]&lt;br /&gt;
&lt;br /&gt;
====Komponenten des Recorderfensters====&lt;br /&gt;
#&#039;&#039;&#039;Aufnahme fortsetzen/pausieren&#039;&#039;&#039;: Über das rechte Symbol können Sie die Aufnahme pausieren. Sie sehen dann ein großes Pause-Symbol in der Anzeige. Alle Aktionen, die Sie währenddessen im Recorder machen werden zwar ausgeführt, es werden aber keine Bausteine aufgezeichnet. Über das linke Symbol können Sie dann wieder in den normalen Aufnahmemodus wechseln.&lt;br /&gt;
#&#039;&#039;&#039;Aufnahme stoppen&#039;&#039;&#039;: Stoppt die Aufnahme und schließt das Recorderfenster.&lt;br /&gt;
#&#039;&#039;&#039;Aktualisieren&#039;&#039;&#039;: Holt das aktuelle Bild und den aktuellen Elementbaum vom Gerät. Dies wird nötig, wenn das Gerät zur Ausführung einer Aktion länger braucht oder sich etwas ohne das Anstoßen durch den Recorder ändert. Seit expecco 21.2 gibt es hier zusätzlich ein Untermenü, mit dem automatisches Aktualisieren angeschaltet werden kann, indem im Hintergrund auf Änderungen geprüft wird (siehe auch &#039;&#039;Automatisches Aktualisieren&#039;&#039; weiter unten).&lt;br /&gt;
#&#039;&#039;&#039;Follow-Mouse&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird im GUI-Browser ausgewählt.&lt;br /&gt;
#&#039;&#039;&#039;Element-Highlighting&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird rot umrandet.&lt;br /&gt;
#&#039;&#039;&#039;Elemente einzeichnen&#039;&#039;&#039;: Die Rahmen aller Elemente der Ansicht werden angezeigt.&lt;br /&gt;
#&#039;&#039;&#039;Werkzeuge&#039;&#039;&#039;: Auswahl, mit welchem Werkzeug aufgenommen werden soll. Die gewählte Aktion wird bei einem Klick auf die Anzeige ausgelöst. Dabei stehen folgende Aktionen zur Verfügung:&lt;br /&gt;
#*Aktionen auf Elemente:&lt;br /&gt;
#**Klicken: Kurzer Klick auf das Element, über dem der Cursor steht. Zur genaueren Bestimmung, welches Element verwendet wird, benutzen Sie die Funktion Follow-Mouse oder Element-Highlighting.&lt;br /&gt;
#**Antippen mit Dauer (Element): Ähnlich zum Klicken, nur dass zusätzlich die Dauer des Klicks aufgezeichnet wird. Dadurch sind auch längere Klicks möglich.&lt;br /&gt;
#**Antippen mit Position (Element): Ähnlich zum Klicken, aber zusätzlich wird die Position innerhalb des Elements aufgenommen. Die Position kann relativ zur Größe des Elements aufgenommen werden oder, wenn Sie dabei Strg gedrückt halten, absolut zur linken oberen Ecke des Elements.&lt;br /&gt;
#**Text setzen: Ermöglicht das Setzen eines Textes in Eingabefelder.&lt;br /&gt;
#**Text löschen: Löscht den Text eines Eingabefelds.&lt;br /&gt;
#*Aktionen auf das Gerät:&lt;br /&gt;
#**Antippen (Bildschirm): Löst einen Klick auf die Bildschirmposition aus.&lt;br /&gt;
#**Antippen mit Dauer (Bildschirm): Löst einen Klick auf die Bildschirmposition aus, bei dem auch die Dauer berücksichtigt wird.&lt;br /&gt;
#**Wischen: Wischen in einer geraden Linie vom Punkt des Drückens des Mausknopfes bis zum Loslassen. Die Dauer wird ebenfalls aufgezeichnet.&lt;br /&gt;
#:Beachten Sie bei diesen Aktionen, dass das Ergebnis sich auf verschiedenen Geräten unterscheiden kann, bspw. bei verschiedenen Bildschirmauflösungen.&lt;br /&gt;
#*Erstellen von Testablauf-Bausteinen&lt;br /&gt;
#**Attribut prüfen: Vergleicht den Wert eines festgelegten Attributs des Elements mit einem vorgegebenen Wert. Das Ergebnis triggert den entsprechenden Ausgang.&lt;br /&gt;
#**Attribut zusichern: Vergleicht den Wert eines festgelegten Attributs des Elements mit einem vorgegebenen Wert. Bei Ungleichheit schlägt der Test fehl.&lt;br /&gt;
#**Attribut holen: Liest den aktuellen Wert eines Attributs aus.&lt;br /&gt;
#*Automatisch&lt;br /&gt;
#:Ist das Auto-Werkzeug ausgewählt, können alle Aktionen durch spezifische Eingabeweise benutzt werden: &#039;&#039;Klicken&#039;&#039;, &#039;&#039;Element antippen&#039;&#039; und &#039;&#039;Wischen&#039;&#039; funktionieren weiterhin durch Klicken, wobei sie anhand der Dauer und der Bewegung des Cursors unterschieden werden. Um ein &#039;&#039;Antippen&#039;&#039; auszulösen, halten Sie beim Klicken Strg gedrückt. Die übrigen Aktionen erhalten Sie durch einen Rechtsklick auf das Element in einem Kontextmenü.&lt;br /&gt;
#&#039;&#039;&#039;Kontext-Aktionen&#039;&#039;&#039;: Hier können Sie Aktionen aufzeichnen, die Kontexte betreffen:&lt;br /&gt;
#*Zu Kontext wechseln: Bietet eine Liste der aktuell verfügbaren Kontexte und Sie können auswählen, zu welchem gewechselt werden soll.&lt;br /&gt;
#*Aktuellen Kontext holen: Holt den Handle des aktuellen Kontexts.&lt;br /&gt;
#*Kontext-Handles holen: Holt eine Liste aller aktuell verfügbaren Kontext-Handles.&lt;br /&gt;
#&#039;&#039;&#039;Softkeys&#039;&#039;&#039;: Nur unter Android. Simuliert das Drücken der Knöpfe Zurück, Home, Fensterliste und Power.&lt;br /&gt;
#&#039;&#039;&#039;Home-Button&#039;&#039;&#039;: Nur unter iOS ab expecco 2.11. Ermöglicht das Drücken des Home-Buttons. Vor expecco 19.2 funktioniert es nur, wenn AssistiveTouch aktiviert ist und sich das Menü in der Mitte des oberen Bildschirmrands befindet. Ab expecco 19.2 verwendet die Funktion kein AssistiveTouch mehr.&lt;br /&gt;
#&#039;&#039;&#039;Hilfe&#039;&#039;&#039;: Öffnet diese Online-Dokumentation auf der allgemeinen Seite zu [[GuiBrowser_Recorder|GUI-Browser Recordern]].&lt;br /&gt;
#&#039;&#039;&#039;Anzeige&#039;&#039;&#039;: Zeigt einen Screenshot des Geräts. Aktionen werden mit der Maus je nach Werkzeug ausgelöst. Wenn eine neue Aktion eingegeben werden kann, hat das Fenster einen grünen Rahmen, sonst ist er rot.&lt;br /&gt;
#&#039;&#039;&#039;Fenster an Bild anpassen&#039;&#039;&#039;: Ändert die Größe des Fensters so, dass der Screenshot vollständig angezeigt werden kann.&lt;br /&gt;
#&#039;&#039;&#039;Bild an Fenster anpassen&#039;&#039;&#039;: Skaliert den Screenshot auf eine Größe, mit der er die volle Größe des Fensters ausnutzt.&lt;br /&gt;
#&#039;&#039;&#039;Ansicht anpassen&#039;&#039;&#039;: Öffnet einen Dialog um die Ansicht anzupassen, falls expecco das Bild nicht richtig darstellt. Sie können die Skalierung anpassen oder das Bild um 90° drehen.&lt;br /&gt;
#&#039;&#039;&#039;Ausrichtung anpassen&#039;&#039;&#039;: Korrigiert das Bild, falls dieses auf dem Kopf stehen sollte. Über den Pfeil rechts daneben kann das Bild auch um 90° gedreht werden, falls dies einmal nötig sein sollte. Ab expecco 19.1 finden Sie diese Funktion in &#039;&#039;Ansicht anpassen&#039;&#039;. Die Ausrichtung des Bildes ist für die Funktion des Recorders unerheblich, dieser arbeitet ausschließlich auf den erhaltenen Elementen.&lt;br /&gt;
#&#039;&#039;&#039;Skalierung&#039;&#039;&#039;: Ändert die Skalierung des Screenshots.&lt;br /&gt;
#&#039;&#039;&#039;Meldungen&#039;&#039;&#039;: Zeigt den Pfad des ausgewählten Elements oder andere Meldungen an. Es gibt ein Kontextmenü, um eine Liste der vorigen Meldungen zu sehen.&lt;br /&gt;
&lt;br /&gt;
====Verwendung====&lt;br /&gt;
Mit jedem Klick im Fenster wird eine Aktion ausgelöst und im Arbeitsbereich des GUI-Browsers aufgezeichnet. Dort können Sie das Aufgenommene abspielen, editieren oder daraus einen neuen Baustein erstellen.&lt;br /&gt;
Aktionen zum Auslösen von Sofkeys finden Sie direkt in der Menüleiste (s.o.). Um Aktionen auf Elemente aufzuzeichen, ändern Sie entweder die Auswahl des Werkzeugs in der Menüleiste (s.o.) und klicken dann auf das Element oder wählen Sie die entsprechende Aktion aus dem Kontextmenü durch einen Rechtsklick auf das entsprechende Element aus. Für Texteingabe ist es zudem möglich, den Cursor über dem Element zu platzieren und den Text einzugeben. Dabei öffnet sich der Eingabedialog für diese Aktion.&lt;br /&gt;
Zur Verwendung des Recorders lesen Sie auch Schritt 2 im Tutorial ([[Mobile_Testing_Tutorial#Schritt_2:_Einen_Baustein_mit_dem_Recorder_erstellen|Android]] bzw. [[Mobile_Testing_Tutorial#Schritt_2:_Einen_Baustein_mit_dem_Recorder_erstellen_.28iOS.29|iOS]]).&lt;br /&gt;
&lt;br /&gt;
====Elemente verbergen====&lt;br /&gt;
Ab expecco 21.2 gibt es im Kontextmenü außerdem die Möglichkeit, das ausgewählte Element im Recorder zu verbergen. Das bedeutet, dass dieses Element fortan nicht mehr ausgewählt werden kann. Diese Funktion eignet sich dazu, Elemente zu ignorieren, die im Vordergrund liegen, um auf Elemente darunter zugreifen zu können. Um diesen Zustand wieder rückgängig zu machen, müssen Sie das entsprechende Element im Baum des GUI-Browsers finden, dort gibt es im Kontextmenü ebenfalls einen solchen Eintrag.&lt;br /&gt;
&lt;br /&gt;
====Automatisches Aktualisieren====&lt;br /&gt;
Der Recorder zeigt kein Livebild des Geräts sondern nur eine Momentaufnahme. Um mit der Anzeige auf dem Gerät übereinzustimmen muss daher nach Änderungen aktualisiert werden. Der Recorder aktualisiert sich automatisch, nachdem er eine Aktion ausgeführt hat. Ab expecco 20.2 sind zudem weitere automatische Updates möglich. Sie können Sie im Menü &#039;&#039;Fenster&#039;&#039; aktivieren.&lt;br /&gt;
&lt;br /&gt;
Zum einen kann kurze Zeit nach dem Ausführen einer Aktion überprüft werden, ob es noch Änderungen nach der ersten Aktualisierung gegeben hat, damit in diesem Fall eine zweite Aktualisierung stattfinden kann. Dies soll das Problem beheben, dass der Recorder nach einer Aktion nicht aktuell ist, weil die Aktualisierung zu früh stattgefunden hat.&lt;br /&gt;
&lt;br /&gt;
Zum anderen kann eine periodische Aktualisierung eingeschaltet werden. Nach einem einstellbaren Interval wird der Recorder automatisch aktualisiert, sollte es Änderungen geben. Dadurch ist die Anzeige im Recorder immer weitgehend aktuell, allerdings entsteht dadurch auch ein Mehraufwand was die Kommunikation mit dem Gerät betrifft.&lt;br /&gt;
&lt;br /&gt;
== AVD Manager und SDK Manager ==&lt;br /&gt;
AVD Manager und SDK Manager sind beides Anwendungen von Android. Im Menü des Mobile Testing Plugins bietet expecco die Möglichkeit, diese zu starten. Ansonsten finden Sie diese Programme bei Ihrer Android-Installation. Mit dem AVD Manager können Sie AVDs, also Konfigurationen für Emulatoren, erstellen, bearbeiten und starten. Mit dem SDK Manager erhalten Sie einen Überblick über Ihre Android-Installation und können diese bei Bedarf erweitern.&lt;br /&gt;
&lt;br /&gt;
= Hybrid-Apps und WebViews =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;!!! WICHTIGER HINWEIS - Wenn Sie Probleme haben, auf den Webview zu wechseln, geben Sie bitte unter den Android Einstellungen - Apps -Standard Apps &amp;quot;Chrome&amp;quot; als &amp;quot;Browser-App&amp;quot; an !!!&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hybrid-Apps enthalten neben den Plattform-nativen Elementen weitere Elemente, die in einen WebView eingebunden sind. Diese Elemente können ebenfalls bedient werden, allerdings muss zuvor in den entsprechenden Kontext gewechselt werden. Mit dem Baustein &amp;quot;&#039;&#039;Get Current Context&#039;&#039;&amp;quot; erhalten Sie den aktuellen Kontext. Zu Beginn ist dies &amp;quot;&#039;&#039;NATIVE_APP&#039;&#039;&amp;quot;, also der Kontext der nativen Elemente. Mit dem Baustein &amp;quot;&#039;&#039;Get Context Handles&#039;&#039;&amp;quot; bekommen Sie eine Collection aller vorhandenen Kontexte. Gibt es einen WebView-Kontext, so heißt dieser &amp;quot;&#039;&#039;WEBVIEW_1&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;WEBVIEW_&amp;lt;package&amp;gt;&#039;&#039;&amp;quot; mit dem Paket des WebViews. Es kann auch mehrere WebView-Kontexte geben. Zu jedem WebView-Kontext gibt es im nativen Kontext ein entsprechendes WebView-Element. Mit dem Baustein &amp;quot;&#039;&#039;Switch to Context&#039;&#039;&amp;quot; können Sie in einen solchen Kontext wechseln und haben fortan nur Zugriff auf die Elemente in diesem Kontext.&lt;br /&gt;
&lt;br /&gt;
Im GUI-Browser werden zum einen oben im Baum die vorhandenen Kontexte angezeigt, zum anderen wird der Baum eines Kontexts unterhalb des entsprechenden WebView-Elements eingefügt.&lt;br /&gt;
&lt;br /&gt;
= XPath anpassen mithilfe des GUI-Browsers =&lt;br /&gt;
Bausteine, die auf einem Gerät fehlerfrei funktionieren, tun dies auf anderen Geräten möglicherweise nicht. Auch können kleine Änderungen der App dazu führen, dass ein Baustein nicht mehr den gewünschten Effekt hat. Man sollte einen Baustein daher so robust formulieren, dass er für eine Vielzahl von Geräten verwendet werden kann und kleine Anpassungen an der App verkraftet. Dazu muss man das grundlegende Funktionsprinzip der Adressierung verstehen. Dies wird im Folgenden am Beispiel der App aus dem Tutorial erläutert.&lt;br /&gt;
&lt;br /&gt;
Die Ansicht der App setzt sich aus einzelnen Elementen zusammen. Dazu gehören die Schaltflächen &amp;quot;&#039;&#039;GTIN-13 (EAN-13)&#039;&#039;&amp;quot; und &amp;quot;&#039;&#039;Verify&#039;&#039;&amp;quot;, das Eingabefeld der Zahl &amp;quot;&#039;&#039;4006381333986&#039;&#039;&amp;quot; und das Ergebnisfeld, in dem OK erscheint, wie auch alle anderen auf der Anzeige sichtbaren Dinge. Diese sichtbaren Elemente sind in unsichtbare Strukturelemente eingebettet. Alle Elemente zusammen sind in einer zusammenhängenden Hierarchie, dem Elementbaum, organisiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingGUIBrowser.png | frame | left | Abb. 1: Funktionen des GUI-Browsers]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
Sie können sich diesen Baum im GUI-Browser ansehen. Wechseln Sie dazu in den GUI-Browser (Abb. 1) und starten Sie eine beliebige Verbindung. Sobald die Verbindung aufgebaut ist, können Sie den gesamten Baum aufklappen (1) (Klick bei gedrückter Strg-Taste). Er enthält alle Elemente der aktuellen Seite der App.&lt;br /&gt;
&lt;br /&gt;
Ein Baustein, der nun ein bestimmtes Element verwendet, muss dieses eindeutig angeben, indem er dessen Position im Elementbaum mit einem Pfad im XPath-Format beschreibt. Dieses Format ist ein verbreiteter Web-Standard für XML-Dokumente und -Datenbanken, eignet sich aber genauso für Pfade im Elementbaum.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie ein Element im Baum auswählen, wird unten der von expecco automatisch generierte XPath (2) für das Element angezeigt, der auch beim Aufzeichnen verwendet wird. Oberhalb davon in der Mitte des Fensters befindet sich eine Liste der Eigenschaften (3) des ausgewählten Elements. Man nennt diese Eigenschaften auch Attribute. Sie beschreiben das Element näher wie beispielsweise seinen Typ, seinen Text oder andere Informationen zu seinem Zustand. Links unten können Sie zur besseren Orientierung im Baum die &#039;&#039;Vorschau&#039;&#039; (4) aktivieren, um sich den Bildausschnitt des Elements anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Der Elementbaum für gleiche Ansicht einer App kann sich je nach Gerät unterscheiden. Es sind diese Unterschiede, die verhindern, eine Aufnahme von einem Gerät unverändert auch auf allen anderen Geräten abzuspielen: Ein XPath, der im einen Elementbaum ein bestimmtes Element identifiziert, beschreibt nicht unbedingt das gleiche Element im Elementbaum auf einem anderen Gerät. Es kann stattdessen passieren, dass der XPath auf kein Element, auf ein falsches Element oder auf mehrere Elemente passt. Dann schlägt der Test fehl oder er verhält sich unerwartet.&lt;br /&gt;
&lt;br /&gt;
Man könnte natürlich für jedes Gerät einen eigenen Testfall schreiben. Das brächte aber unverhältnismäßigen Aufwand bei Testerstellung und -wartung mit sich. Das Problem lässt sich auch anders lösen, da ein jeweiliges Element nicht nur durch genau einen XPath beschrieben wird. Vielmehr erlaubt der Standard mithilfe verschiedener Merkmale unterschiedliche Beschreibungen für ein und dasselbe Element zu formulieren. Das Ziel ist daher, einen Pfad zu finden, der auf allen für den Test verwendeten Geräten funktioniert und überall eindeutig zum richtigen Element führt.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel besteht die Verbindung zur Android-App aus dem Tutorial und der Eintrag des &amp;quot;&#039;&#039;GTIN-13&#039;&#039;&amp;quot;-Buttons ist ausgewählt (5). Dessen automatisch generierter XPath (2) kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[@resource id=&#039;android:id/content&#039;]/android.widget.RelativeLayout/android.widget.Button[@resource-id=&#039;de.exept.expeccomobiledemo:id/gtin_13&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Er ist offensichtlich lang und unübersichtlich. Der sehr viel kürzere Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@text=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
führt zum selben Element.&lt;br /&gt;
&lt;br /&gt;
Für die iOS-App lautet der automatisch generierte XPath für diesen Button beispielsweise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/XCUIElementTypeApplication/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/UIAApplication/UIAWindow[1]/UIAButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und kann kürzer als&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@name=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Sie können den Pfad entsprechend im GUI-Browser ändern und durch &amp;quot;&#039;&#039;Pfad überprüfen&#039;&#039;&amp;quot; (6) feststellen, ob er weiterhin auf das ausgewählte Element zeigt, was expecco mit &amp;quot;&#039;&#039;Verify Path: OK&#039;&#039;&amp;quot; (7) bestätigen sollte. Der erste, sehr viel längere Pfad, beschreibt den gesamten Weg vom obersten Element des Baumes bis hin zum gesuchten Button. Der zweite Pfad hingegen wählt mit &amp;quot;*&amp;quot; zunächst sämtliche Elemente des Baumes und schränkt die Auswahl dann auf genau die Elemente ein, die ein &#039;&#039;text&#039;&#039;- bzw. &#039;&#039;name&#039;&#039;-Attribut mit dem Wert &amp;quot;&#039;&#039;GTIN-13 (EAN-13)&#039;&#039;&amp;quot; besitzen, in unserem Fall also genau der eine Button, den wir suchen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden Android-ähnliche Pfade zur Veranschaulichung verwendet. Die Elemente in iOS-Apps heißen zwar anders, wodurch andere Pfade entstehen; das Prinzip ist jedoch das gleiche.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum1.png | frame | Abb. 2: Elementbaum einer fiktiven App]]&lt;br /&gt;
&lt;br /&gt;
Sie können solche Pfade mit Hilfe weniger Regeln selbst formulieren. Sehen Sie sich den einfachen Baum einer fiktiven Android-App in Abb. 2 an: Die Einrückungen innerhalb des Baumes geben die Hierarchie der Elemente wieder. Ein Element ist ein &#039;&#039;Kind&#039;&#039; eines anderen Elementes, wenn jenes andere Element das nächsthöhere Element mit einem um eins geringeren Einzug ist. Jenes Element ist das &#039;&#039;Elternelement&#039;&#039; des Kindes. Sind mehrere untereinander stehende Elemente gleich eingerückt, so sind sie also alle Kinder desselben Elternelements.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad durch alle Ebenen der Hierarchie zum TextView-Element ist nun:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Elemente sind mit Schrägstrichen voneinander getrennt. Es fällt auf, dass der Name des ersten Elements nicht mit dem im Baum übereinstimmt. Das oberste Element in der Hierarchie heißt immer &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot; (für iOS wäre es &amp;quot;&#039;&#039;AppiumAUT&#039;&#039;&amp;quot;), expecco zeigt im Baum stattdessen den Namen der Verbindung an, damit man mehrere Verbindungen voneinander unterscheiden kann. Die weiteren Elemente tragen jeweils das Präfix &amp;quot;&#039;&#039;android.widget.&#039;&#039;&amp;quot;, das im Baum zur besseren Übersicht nicht angezeigt wird. Bei IOS gibt es kein Präfix, das durch einen Punkt abgetrennt wäre, expecco 2.11 blendet aber entsprechend &amp;quot;&#039;&#039;XCUIElementType&#039;&#039;&amp;quot; am Anfang aus. Mit jedem Schrägstrich führt der Pfad über eine Eltern-Kind-Beziehung in eine tiefere Hierarchie-Ebene, d. h. &amp;quot;&#039;&#039;FrameLayout&#039;&#039;&amp;quot; ist ein Kindelement von &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot;, &amp;quot;&#039;&#039;LinearLayout&#039;&#039;&amp;quot; ist ein Kind von &amp;quot;&#039;&#039;FrameLayout&#039;&#039;&amp;quot; usw. Die in eckigen Klammern geschriebenen Wörter dienen nur als Orientierungshilfe im Baum. Sie gehören nicht zum Typ.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad muss nicht beim Element &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot; beginnen. Man kann den Pfad beginnend mit einem beliebigen Element des Baumes bilden. Man kann also verkürzt auch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
schreiben. Der Pfad führt zum selben &amp;quot;&#039;&#039;TextView&#039;&#039;&amp;quot;-Element, da es nur ein Element dieses Typs gibt. Anders verhält es sich bei dem Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da es zwei Elemente vom Typ &amp;quot;&#039;&#039;Button&#039;&#039;&amp;quot; gibt, passt dieser Pfad auf zwei Elemente, nämlich den Button, der mit &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; markiert ist, und den &#039;&#039;Button&#039;&#039;, der mit &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; markiert ist. Es würde an dieser Stelle aber auch nicht helfen den langen Pfad von &#039;&#039;hierarchy&#039;&#039; aus beginnend anzugeben. Um einen mehrdeutigen Pfad weiter zu differenzieren, kann man explizit ein Element aus einer Menge wählen, indem man den numerischen Index in eckigen Klammern dahinter schreibt. Der Pfad aus dem obigen Beispiel lässt sich damit so anpassen, dass er eindeutig auf den &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; weist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[1].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ihnen fällt sicher auf, dass der Index eine 1 ist obwohl das zweite Element gemeint ist. Das kommt daher, dass die Zählung bei 0 beginnt. Der Button mit der Markierung &amp;quot;An&amp;quot; hat also die Nummer 0 und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Nummer 1.&lt;br /&gt;
&lt;br /&gt;
Dieser Ansatz, einen expliziten Index zu verwenden, hat zwei Nachteile: Zum einen lässt sich an dem Pfad nur schwer ablesen welches Element gemeint ist, zum andern ist der Pfad sehr empfindlich schon gegenüber kleinsten Änderungen, wie zum Beispiel dem Vertauschen der beiden &#039;&#039;Button&#039;&#039;-Elemente oder dem Einfügen eines weiteren &#039;&#039;Button&#039;&#039;-Elements in der App.&lt;br /&gt;
&lt;br /&gt;
Es wäre daher wünschenswert, das gemeinte Element über eine ihm charakteristische Eigenschaft wie einen Attributwert, zu adressieren. Für Android-Apps eignet sich hierfür häufig das Attribut &amp;quot;&#039;&#039;resource-id&#039;&#039;&amp;quot;. Im Idealfall muss bei der Entwicklung der App darauf geachtet werden, dass jedes Element eine eindeutige Id erhält. Die &#039;&#039;resource-id&#039;&#039; hat den großen Vorteil, dass sie unabhängig vom Text des Elements oder der Spracheinstellung des Geräts ist. Für iOS-Apps kann entsprechend das Attribut &amp;quot;&#039;&#039;name&#039;&#039;&amp;quot; verwendet werden, wenn es von der App sinnvoll gesetzt wird. Der XPath-Standard erlaubt solche Auswahlbedingungen zu einem Element anzugeben. Angenommen, der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Eigenschaft &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;off&#039;&#039; und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; hat als &#039;&#039;resource-id&#039;&#039; den Wert &#039;&#039;on&#039;&#039;, dann kann man als eindeutigen Pfad für den &amp;quot;Aus&amp;quot;-&#039;&#039;Button&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[@resource-id=&#039;off&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
formulieren. Wie an dem Beispiel zu sehen werden solche Bedingungen wie ein Index in eckigen Klammern an den Elementtyp angehängt. Der Name eines Attributes wird mit einem &amp;quot;@&amp;quot; eingeleitet und der Wert mit einem &amp;quot;=&amp;quot; in Anführungszeichen angehängt. Ist der Attributwert global eindeutig, kann man den vorausgehenden Pfad sogar durch den globalen Platzhalter * ersetzen, der auf jedes Element passt. Das obige Beispiel mit dem GTIN-13-&#039;&#039;Button&#039;&#039; war ein solcher Fall.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum2.png | frame | Abb. 3: Elementbaum einer fiktiven App mit Erweiterungen]]&lt;br /&gt;
&lt;br /&gt;
Abb. 3 zeigt eine Erweiterung des Beispiels aus Abb. 2. Die App hat nun ein weiteres, nahezu identisches &#039;&#039;LinearLayout&#039;&#039; bekommen. Die &#039;&#039;Buttons&#039;&#039; sind in ihren Attributen jeweils ununterscheidbar. Deshalb funktioniert der vorige Ansatz nicht, einen eindeutigen Pfad nur mithilfe eines Attributwerts zu formulieren. Offensichtlich unterscheiden sich aber ihre benachbarten &#039;&#039;TextViews&#039;&#039;. Es ist möglich die jeweilige &#039;&#039;TextView&#039;&#039; in den Pfad mit aufzunehmen, um einen &#039;&#039;Button&#039;&#039; dennoch eindeutig zu adressieren. Ein Pfad zum &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; unterhalb der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; kann dabei wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView[@resource-id=&#039;push&#039;]/../android.widget.Button[@resource-id=&#039;on&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Teil beschreibt den Pfad zu der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; und der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;push&#039;&#039;. Danach folgt ein Schrägstrich gefolgt von zwei Punkten. Die zwei Punkte sind eine spezielle Elementbezeichnung, die nicht ein Kindelement benennt, sondern zum Elternelement wechselt, in diesem Fall also das &#039;&#039;LinearLayout&#039;&#039;, in dem die &#039;&#039;TextView&#039;&#039; eingebettet ist. Im Kontext dieses &#039;&#039;LinearLayout&#039;&#039; ist der restliche Pfad, nämlich der &#039;&#039;Button&#039;&#039; mit der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;on&#039;&#039;, eindeutig.&lt;br /&gt;
&lt;br /&gt;
Der XPath-Standard bietet noch sehr viel mehr Ausdrucksmittel. Mit der hier knapp vorgestellten Auswahl ist es aber bereits möglich für die meisten praktischen Testfälle gute Pfade zu formulieren. Eine vollständige Einführung in XPath ginge über den Umfang dieser Einführung weit hinaus. Sie finden zahlreiche weiterführende Dokumentationen im Web und in Büchern.&lt;br /&gt;
&lt;br /&gt;
Eine universelle Strategie zum Erstellen guter XPaths gibt es nicht, da sie von den Testanforderungen abhängt. In der Regel ist es sinnvoll, den XPath kurz und dennoch eindeutig zu halten. Häufig lassen sich Elemente über Eigenschaften identifizieren wie beispielsweise ihren Text. Will man aber gerade den Text eines Elements auslesen, kann dieser natürlich nicht im Pfad verwendet werden, da er vorher nicht bekannt ist. Ebenso wird der Text variieren, wenn die App mit verschiedenen Sprachen gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Jeder Baustein, der auf einem Element arbeitet, hat einen Eingangspin für den XPath. Im GUI-Browser finden Sie in der Mitte oben eine Liste von Bausteinen mit Aktionen, die Sie auf das ausgewählte Element anwenden können. Suchen Sie den Baustein &#039;&#039;Click&#039;&#039; (8) im Ordner Elements und wählen Sie ihn aus (Abb. 1). Er wird im rechten Teil unter &amp;quot;&#039;&#039;Test&#039;&#039;&amp;quot; eingefügt, der Pin für den XPath ist mit dem automatisch generierten Pfad des Elements vorbelegt (9). Sie können den Baustein hier auch ausführen. Die Ansicht wechselt dann auf &amp;quot;&#039;&#039;Lauf&#039;&#039;&amp;quot;. Ändert sich durch die Aktion der Zustand Ihrer App, müssen Sie den Baum anschließend aktualisieren (10).&lt;br /&gt;
&lt;br /&gt;
Wenn Sie in der unteren Liste eine Eigenschaft auswählen, wechselt die Anzeige der Bausteine zu &amp;quot;&#039;&#039;Eigenschaften&#039;&#039;&amp;quot;, wo Sie die eigenschaftsbezogenen Bausteine finden. Wie bei den Aktionen können Sie auch hier einen Baustein auswählen, der dann rechts in Test mit dem Pfad des Elements und der ausgewählten Eigenschaft eingetragen wird, sodass Sie ihn direkt ausführen können.&lt;br /&gt;
&lt;br /&gt;
== Weitere Locator-Strategien ==&lt;br /&gt;
Appium bietet neben XPath noch weitere Strategien zur Adressierung von Elementen an. Einige davon stehen Ihnen &#039;&#039;&#039;ab Version 20.1&#039;&#039;&#039; ebenfalls mit expecco zur Verfügung. Diese sind nicht ganz so mächtig wie XPath, dafür aber häufig schneller bei der Auflösung auf dem Gerät. Insbesondere bei der Verwendung mit iPhones, wo die Hierarchie bei jeder XPath-Auflösung erst aufgebaut werden muss, bieten alternative Strategien einen Vorteil für die Laufzeit.&lt;br /&gt;
&lt;br /&gt;
XPath ist weiterhin der Standard, das heißt alle Locator ohne besondere Angabe werden als XPath interpretiert. Um eine der anderen Strategien zu verwenden, schreiben Sie diese mit einem Gleichzeichen vor den gewünschten Locator. Diese Technik können Sie sowohl an den Blöcken verwenden, als auch im GUI-Browser testen.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | AccessibilityId || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Wert des Elements, der dazu dient, die App barrierefrei zu machen. Für iOS ist das das Attribut &#039;&#039;&#039;Accessibility-id&#039;&#039;&#039;, für Android das Attribut &#039;&#039;&#039;content-descr&#039;&#039;&#039;. &#039;&#039;Beispiel: accessibilityId=Löschen&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | className || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Namen der Klasse des Elements. &#039;&#039;Beispiel: className=android.widget.FrameLayout&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | id || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet die Kennung des Elements. Für iOS ist das das Attribut &#039;&#039;&#039;name&#039;&#039;&#039;, für Android das Attribut &#039;&#039;&#039;resource-id&#039;&#039;&#039;. &#039;&#039;Beispiel: id=android:id/text1&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | iOSClassChain&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet die Hierarchie der Elemente ähnlich wie bei XPath. Eine Erklärung zum Aufbau finden Sie [https://github.com/facebookarchive/WebDriverAgent/wiki/Class-Chain-Queries-Construction-Rules hier]. &#039;&#039;Beispiel: iOSClassChain=XCUIElementTypeWindow/XCUIElementTypeButton[`label == &amp;quot;Ok&amp;quot;`]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; padding-right:1em&amp;quot; | iOSNsPredicateString&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet einfache Kriterien, wie Attribute, die auch kombiniert werden können. &#039;&#039;Beispiel: iOSNsPredicateString=type == &#039;XCUIElementTypeButton&#039; AND name == &#039;Weiter&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | name&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Namen des Elements. &#039;&#039;Beispiel: name=Bestätigen&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &#039;&#039;nur für iOS&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Um eine direkte Beschleunigung mit iOS zu erzielen, ohne dass Sie Ihre bisherigen Pfade anpassen müssen, wandelt expecco zudem Pfade, die nur aus einem Element mit Klasse und name-Attribut bestehen, zur Laufzeit automatisch in einen entsprechenden Locator der Strategie iOSNsPredicateString um. Wenn Sie einen Pfad explizit als XPath markieren, wird diese Anpassung nicht vorgenommen.&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span id=&amp;quot;troubleshooting&amp;quot;&amp;gt;&amp;lt;!-- Referenced by error dialog on connection error --&amp;gt;&amp;lt;/span&amp;gt;Probleme und Lösungen=&lt;br /&gt;
== Locator sind versionsabhängig oder variabel ==&lt;br /&gt;
Dann sollten Sie die Locator (xPath) entweder in einer Variablen halten oder ein Locator-Mapping in einem Screenplay Anhang definieren. Es ist auch möglich, lediglich Teile des Locators (z.B. Locator-Pfad eines Elternelements oder Attributwert) in einer Variable zu halten und im Freezevalue des Locator-Pins mit &amp;quot;&#039;&#039;$(varName)&#039;&#039;&amp;quot; einzufügen.&lt;br /&gt;
&lt;br /&gt;
==Unsichtbare UI-Elemente==&lt;br /&gt;
Beachten Sie, dass im [[#Recorder|Recorder]] auch Elemente berücksichtigt werden, die Sie auf dem Bildschirm nicht sehen. Schalten Sie daher das Element-Highlighting an oder nutzen Sie die Follow-Mouse-Funktion und den Elementbaum im GUI-Browser, um festzustellen, ob das richtige Element verwendet wird. Es kann vorkommen, dass unsichtbare Elemente vor anderen Elementen liegen und diese verdecken, so dass die gewünschten Elemente im Recorder nicht ausgewählt werden können. Lesen Sie dazu den Abschnitt [[#Elemente_verbergen|Elemente verbergen]].&lt;br /&gt;
&lt;br /&gt;
==iOS: Kabel nicht zertifiziert==&lt;br /&gt;
In manchen Fällen erscheint beim Verbinden eines iOS-Geräts über USB der Hinweis, das verwendete Kabel sei nicht zertifiziert. In diesem Fall hilft es nur, das entsprechende Kabel auszutauschen.&lt;br /&gt;
==iOS: Alerts beim Verbindungsaufbau==&lt;br /&gt;
Stellen Sie sicher, dass beim Verbindungsaufbau mit einem iOS-Gerät keine Alerts geöffnet sind. Der Aufbau schlägt sonst fehl, da die App nicht in den Vordergrund kommen kann. Siehe auch [[#iOS-Ger.C3.A4t_und_App_vorbereiten|iOS-Gerät und App vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
==iOS: .ipa installieren nicht möglich==&lt;br /&gt;
Beachten Sie, dass auf iOS-Simulatoren keine &#039;&#039;.ipa&#039;&#039;-Dateien sondern nur &#039;&#039;.app&#039;&#039;-Dateien installiert werden können.&lt;br /&gt;
&lt;br /&gt;
==iOS: Erster Verbindungsaufbau funktioniert nicht==&lt;br /&gt;
Wenn auf Ihrem Mac noch kein signierter Build des WebDriverAgents liegt, muss dieser beim ersten Verbindungsaufbau erst erzeugt werden. Das kann in der Regel etwas länger als eine Minute dauern. Standardmäßig verwendet Appium aber einen Timeout von 60000&amp;amp;nbsp;ms um zu warten bis der WebDriverAgent auf dem Gerät startet, so dass der Aufbau in diesen Fällen abgebrochen wird. Sie können den Timeout mit der Capability &#039;&#039;wdaLaunchTimeout&#039;&#039; setzen, z.B. auf &#039;&#039;120000&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Außerdem müssen die Einstellungen für die Signierung passen. Am zuverlässigsten funktioniert das nach unserer Erfahrung, wenn man im Xcode-Projekt des WebDriverAgents auf automatische Signierung stellt und das Team setzt. Siehe dazu die Erklärung im Abschnitt [[#WebDriverAgent-Signierung|WebDriverAgent-Signierung]]. In diesem Fall sollten Sie die Capabilities &#039;&#039;xcodeConfigFile&#039;&#039; bzw. &#039;&#039;xcodeOrgId&#039;&#039; und &#039;&#039;xcodeSigningId&#039;&#039; &#039;&#039;&#039;nicht&#039;&#039;&#039; verwenden, da es sonst zu Konflikten kommen kann. Achtung: Wenn Sie eine Team-ID in den Mobile-Testing-Einstellungen gesetzt haben, setzt expecco diese automatisch als &#039;&#039;xcodeOrgId&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
Achten Sie beim ersten Verbindungsaufbau außerdem auf Ihr Gerät, da Sie dort möglicherweise der Installation per Passwort zustimmen müssen. Auf dem Mac kann die Eingabe des Passworts zur Freigabe des Schlüsselbunds für die Signierung nötig werden, häufig auch mehrmals.&lt;br /&gt;
&lt;br /&gt;
==Android: Gerät nicht im Verbindungsdialog==&lt;br /&gt;
Wenn ein über USB angeschlossenes Android-Gerät nicht im Verbindungsdialog auftaucht, versuchen Sie, den USB-Verbindungstyp zu ändern. In der Regel sollten MTP oder PTP funktionieren. Prüfen Sie nochmal, ob &amp;quot;USB Debugging&amp;quot; in den Entwicklereinstellungen des Geräts aktiviert ist (diese Einstellungen sind bei manchen Geräten zunächst unsichtbar, und müssen durch einen Trick zugänglich gemacht werden). Siehe auch [[#Android-Ger.C3.A4t_vorbereiten|Android-Gerät vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
==Android: Abgeschnittene Elemente unten==&lt;br /&gt;
Bei Android-Geräten, die die Steuerungsleiste bzw. Softkeys automatisch ein- und ausblenden, kann es vorkommen, dass der Recorder im unteren Bereich Elemente abschneidet, die durch die Softkeys verdeckt würden, auch wenn sie zu diesem Zeitpunkt gar nicht angezeigt werden. In diesem Fall hift es, die Softkeys so einzustellen, dass sie in einer permanenten Leiste angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
Bei neueren Android-Versionen gibt es eine solche Einstellung in der Regel nicht. Auch wenn die Steuerelemente permanent eingeblendet sind, liegen sie auf keiner extra Leiste, sondern vor dem Inhalt der App. Es gibt dann im unteren Teil einen Bereich, der nicht bedient werden kann, weil er nicht zum aktiven Bereich der App gezählt wird, weshalb die Elemente von Appium abgeschnitten werden. Dieser Bereich kann auch größer sein als von den Steuerungselementen beansprucht. Bekannt ist dies für Samsung-Geräte mit Android 11. Da die Information über die Größe des App-Bereichs bereits auf Android-Ebene so geliefert wird, können wir hierfür keine Lösung anbieten, sondern können nur hoffen, dass das Problem vom Hersteller behoben wird. Sie können versuchen, ob Sie mit der Einstellung von Gestensteuerung bessere Ergebnisse bekommen, allerdings gibt es hier das gleiche Problem.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;waitForIdleTimeout&amp;quot;&amp;gt;&amp;lt;!-- Referenced by expecco--&amp;gt;&amp;lt;/span&amp;gt; Android: Test hängt beim Suchen eines Elements==&lt;br /&gt;
Der Baustein &#039;&#039;Find Element by XPath&#039;&#039; und alle Element-Bausteine warten bis ein Element zum angegebenen Pfad auftaucht. Den Timeout dafür kann man entweder am Baustein direkt oder in den Umgebungsvariablen ändern. Wenn das Element aber bereits da sein sollte und es dennoch sehr lange dauert, bis der Test weitergeht, kann das am UIAutomator/UIAutomator2 liegen. Dieser wartet, bis die App in den Idle-Zustand geht, bevor er überhaupt nach Elementen sucht. Dies kann länger dauern, wenn die App z.B. im Hintergrund noch Animationen abspielt oder andere Aktionen ausführt. Auch das Holen des Page-Sources z.B. beim Aktualisieren im GUI-Browser oder im Recorder kann dadurch länger dauern. Standardmäßig gibt es hierfür einen Timeout von 10 Sekunden, nach dem nicht weiter auf den Idle-Zustand gewartet wird. Dieser Timeout lässt sich durch eine Einstellung in Appium anpassen (waitForIdleTimeout). Falls Sie einen anderen Wert für diesen Timeout setzen möchten, ist dies ab expecco 21.2 möglich, indem Sie vor dem Test den Smalltalk-Code &amp;lt;code&amp;gt;AppiumTestRunner::TestRunConnection waitForIdleTimeout:2000&amp;lt;/code&amp;gt; ausführen. Der Timeout wird in Millisekunden angegeben, das Beispiel setzt ihn also auf 2 Sekunden.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;startChromedriverTimeout/&amp;gt;Android: Aktualisieren des Trees oder Wechseln zum Webview-Kontext braucht zu lange==&lt;br /&gt;
Speziell mit älteren Geräten kann es vorkommen, dass neuere Chromedriver nicht initialisiert werden können. Das führt dann dazu, dass nicht in den Webview-Kontext gewechselt werden kann. Dies wird von Appium allerdings nur über einen Timeout festgestellt, der standardmäßig bei 4 Minuten liegt. Da expecco auch beim Aufbauen des Trees im GUI-Browser versucht in den Webview-Kontext zu wechseln, kann das zu sehr langen Ladezeiten führen. Da es in Appium keine Möglichkeit gibt, diesen Timeout herunter zu setzen, haben wir die Version, die wir im MobileTestingSupplement bereitstellen, um eine entsprechende Capability erweitert. Ab der Version 1.13.1.0 des [[#Windows|MobileTestingSupplements]] kann mit &#039;&#039;chromedriverStartTimeout&#039;&#039; der Timeout in Millisekunden gesetzt werden. Der Wechsel funktioniert dadurch zwar trotzdem nicht, aber expecco braucht dann nicht mehr so lange beim Aktualisieren des Trees und der Baustein zum Wechseln des Kontextes schlägt schneller fehl. Der Verbindungsdialog fügt diese Capability ab expecco 22.1 automatisch hinzu.&lt;br /&gt;
&lt;br /&gt;
==Keine Aktion bei Klick==&lt;br /&gt;
Der Baustein zum Klicken auf ein Element ist erfolgreich, aber auf dem Gerät wurde keine Aktion ausgeführt.&lt;br /&gt;
:Dies kann vorkommen, wenn das Element von einem anderen Element verdeckt ist und ein Klick auf das Element deshalb nicht möglich ist. In diesem Fall wird von Appium kein Fehler geworfen, sondern es passiert einfach nichts. Wenn Sie dennoch einen Klick an der Position des Elements machen möchten, auch wenn es verdeckt ist, benutzen Sie stattdessen den Baustein &#039;&#039;Tap&#039;&#039; und übergeben Sie diesem die Position des Elements (&#039;&#039;Get Location&#039;&#039;). Wenn Sie stattdessen vor einem Klick prüfen möchten, ob das Element zu diesem Zeitpunkt verdeckt ist, versuchen Sie, ob Ihnen die Eigenschaften &#039;&#039;Is Displayed&#039;&#039; oder &#039;&#039;Is Enabled&#039;&#039; weiterhelfen.&lt;br /&gt;
&lt;br /&gt;
==Kein Update nach Aktion==&lt;br /&gt;
Über den Recorder wurde eine Aktion ausgeführt, für die auch ein Baustein aufgezeichnet wurde, der Recorder zeigt aber immer noch das alte Bild.&lt;br /&gt;
:Der Recorder zeigt kein Livebild des Geräts, sondern immer nur eine Momentaufnahme. Nachdem eine Aktion ausgeführt wurde, aktualisiert sich der Recorder automatisch. Es kann aber vorkommen, dass das Bild schon aktualisiert wurde, bevor die Auswirkungen der Aktion auf dem Gerät vollständig abgeschlossen sind. In diesem Fall sollten Sie den Recorder von Hand aktualisieren über das Symbol mit den blauen Pfeilen. Ab expecco 20.2 können Sie für diesen Fall auch automatisches Aktualisieren einstellen. Siehe auch Beschreibung zum [[#Recorder|Recorder]].&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;clickable&amp;quot; Attribut falsch==&lt;br /&gt;
Ein Element hat im &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; Attribut/Property den Wert &amp;quot;&#039;&#039;false&#039;&#039;&amp;quot;, ist aber dennoch anklickbar.&lt;br /&gt;
:Das &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; Attribute muss explizit vom App-Programmierer gesetzt werden, und hat tatsächlich keine Relevanz für das tatsächliche Verhalten der App. Sie sollten dieses Attribut i.A. in Ihren Tests nicht beachten.&amp;lt;br&amp;gt;Leider existieren viele Apps, bei denen der Programmierer hier &amp;quot;lazy&amp;quot; war.&lt;br /&gt;
&lt;br /&gt;
==Verbindungsaufbau schlägt fehl==&lt;br /&gt;
Schlägt der Verbindungsaufbau mit dem Appium-Server fehl, erhalten Sie in expecco eine Fehlermeldung ähnlicher der unten abgebildeten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingVerbindungsfehler.png]]&lt;br /&gt;
&lt;br /&gt;
Hier sehen Sie die Art des aufgetretenen Fehlers. Klicken Sie auf &amp;quot;&#039;&#039;Details&#039;&#039;&amp;quot; um nähere Informationen zu erhalten. Mögliche Fehler sind:&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.remote.UnreachableBrowserException&#039;&#039;&lt;br /&gt;
:Der angegebene Server läuft nicht oder ist nicht erreichbar. Überprüfen Sie die Serveradresse.&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.WebDriverException&#039;&#039;&lt;br /&gt;
:Lesen Sie in den Details in der ersten Zeile die Meldung hinter &#039;&#039;Original Error&#039;&#039;:&lt;br /&gt;
:*&#039;&#039;Unknown device or simulator UDID&#039;&#039;&lt;br /&gt;
::Entweder ist das Gerät nicht richtig angeschlossen oder die udid stimmt nicht.&lt;br /&gt;
:*&#039;&#039;Unable to launch WebDriverAgent because of xcodebuild failure: xcodebuild failed with code 65&#039;&#039;&lt;br /&gt;
::Dieser Fehler kann verschiedene Ursachen haben. Entweder konnte tatsächlich der WebDriverAgent nicht gebaut werden, weil die Signierungseinstellungen falsch sind oder das passende Provisioning Profile fehlt. Lesen Sie dazu den Abschnitt zur [[#Signierung|Signierung]]. Es kann auch sein, dass der WebDriverAgent auf dem Gerät nicht gestartet werden kann, weil sich beispielsweise ein Alert im Vordergrund befindet oder Sie dem Entwickler nicht vertraut haben.&lt;br /&gt;
:*&#039;&#039;Could not install app: &#039;Command &#039;ios-deploy [...] exited with code 253&#039;&#039;&#039;&lt;br /&gt;
::Die angegebene App kann nicht auf dem iOS-Gerät installiert werden, weil es nicht im Provisioning Profile der App eingetragen ist.&lt;br /&gt;
:*&#039;&#039;Bad app: [...] App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name.&#039;&#039;&#039;&lt;br /&gt;
::Der Pfad zur App ist falsch. Stellen Sie sicher, dass sich die Datei unter dem angegebenen Pfad auf dem Mac befindet.&lt;br /&gt;
:*&#039;&#039;packageAndLaunchActivityFromManifest failed.&#039;&#039;&lt;br /&gt;
::Die angegebene &#039;&#039;apk&#039;&#039;-Datei ist vermutlich kaputt.&lt;br /&gt;
:*&#039;&#039;Could not find app apk at [...]&#039;&#039;&lt;br /&gt;
::Der Pfad zur App ist falsch. Stellen Sie sicher, dass sich die &#039;&#039;apk&#039;&#039;-Datei am angegebenen Pfad befindet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Falls der Fehler nicht durch eine der oben gelisteten Ursachen bedingt ist, kann es sein, dass die auf dem Gerät befindlichen Automation-Anwendungen nicht mehr richtig funktionieren. Hier hilft es, diese vom Mobilgerät zu deinstallieren. Beim nächsten Verbindungsaufbau werden sie dann automatisch neu installiert.&lt;br /&gt;
&lt;br /&gt;
*Für iOS-Geräte ist das der WebDriverAgent, den Sie einfach vom Home-Screen deinstallieren können. Dies behebt in der Regel Probleme durch den Wechsel des verwendeten Macs oder der Xcode-Version.&lt;br /&gt;
&lt;br /&gt;
*Für Android-Geräte ist es der UIAutomator2; hier tritt auf einigen Geräten sporadisch ein Problem auf, die Ursache dafür ist uns z.Z. noch nicht bekannt. Zur Deinstallation navigieren Sie auf dem Gerät zu &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;Anwendungen&#039;&#039;&amp;quot;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; und suchen in der Liste nach folgenden Einträgen:&lt;br /&gt;
    Appium Settings&lt;br /&gt;
    io.appium.uiautomator2.server&lt;br /&gt;
    io.appium.uiautomator2.server.test&lt;br /&gt;
:Klicken Sie auf die jeweilige Anwendung und dann auf &amp;quot;&#039;&#039;Deinstallieren&#039;&#039;&amp;quot;.&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&#039;&#039;Der entsprechende Eintrag heißt auf manchen Geräten möglicherweise etwas anders.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Falls dies nicht hilft, kann eventuell die Ausgabe des Appium-Servers weiterhelfen. Für einen von expecco gestarteten Server finden Sie das Log in der Liste der [[#Laufende_Appium-Server|laufenden Appium-Server]].&lt;br /&gt;
&lt;br /&gt;
==Ich habe keinen Mac==&lt;br /&gt;
Vielleicht hilft Ihnen diese Webseite weiter: [https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10 https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin/en&amp;diff=29048</id>
		<title>Mobile Testing Plugin/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin/en&amp;diff=29048"/>
		<updated>2023-11-30T11:57:56Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Signing WebDriverAgent */ wdaLaunchTimeout&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile_Testing_Plugin|Deutsche Version]] | &#039;&#039;&#039;English Version&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
With the &#039;&#039;Mobile Testing Plugin&#039;&#039; applications can be tested on Android and iOS devices. This includes both real and emulated devices. It does not matter whether real mobile devices or emulated devices are used. The plugin can (and usually is) used in conjunction with the [[Expecco_GUI_Tests_Extension_Reference|GUI-Browser]], which supports the creation of tests. It can also be used to record test procedures.&lt;br /&gt;
&lt;br /&gt;
[http://appium.io/ Appium] is used to connect to the devices. Appium is a free open source framework for testing and automating mobile applications.&lt;br /&gt;
&lt;br /&gt;
We recommend to go through the [[Mobile_Testing_Tutorial/en|Tutorial]] to familiarize yourself with the Mobile Plugin. This tutorial leads step by step through the creation of a test case using an example and explains the necessary basics.&lt;br /&gt;
&lt;br /&gt;
= Installation and Setup =&lt;br /&gt;
To use the &#039;&#039;Mobile Testing Plugin&#039;&#039;, you must have installed expecco together with the corresponding plugin, and you need the appropriate licenses. expecco communicates with the mobile devices via an Appium server, which either runs on the same computer as expecco, or on a second computer. This must be accessible for expecco.&lt;br /&gt;
&lt;br /&gt;
== Installation Overview ==&lt;br /&gt;
&#039;&#039;&#039;Computer running expecco:&#039;&#039;&#039;&lt;br /&gt;
* Java JDK version 8, 9, 10 or 11&lt;br /&gt;
&#039;&#039;&#039;Computer connected to Android devices :&#039;&#039;&#039;&lt;br /&gt;
* Appium Server, you can install it via the Mobile Testing Supplement (see below), of which we regularly provide a new version&lt;br /&gt;
* Android SDK, you can also get it with the Mobile Testing Supplement&lt;br /&gt;
* Java JDK version 8, 9, 10 or 11&lt;br /&gt;
&#039;&#039;&#039;Computer connected to iOS devices&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
* Appium Server, you can install it via the Mobile Testing Supplement for MacOS (see below), of which we regularly provide a new version&lt;br /&gt;
* Xcode in a version that supports the iOS version used, available from the Apple App Store&lt;br /&gt;
* Java JDK version 8, 9, 10 or 11&lt;br /&gt;
* Apple Developer Certificate incl. matching private key (to sign the WebDriverAgent)&lt;br /&gt;
* Provisioning Profile for the mobile devices to be used&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; Please note that due to the requirements (no connection to non-Apple devices available) iOS devices can only be controlled from a Mac.&lt;br /&gt;
&lt;br /&gt;
Depending on the setup, the above-mentioned computers can also be the same device. expecco can either connect to a remote Appium Server and mobile devices connected to it via the network, or start an Appium Server locally itself and use it with local mobile devices. However, some of expecco&#039;s functions that make it easier to create test cases are only available if the mobile devices are connected to the same computer on which expecco is running. A possible setup may therefore look like the following figure:&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAufbau.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
The following explains how to install Appium and other necessary applications for Windows and Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
The easiest way is to install everything from our Mobile Testing Supplement. However, newer versions do not contain a JDK anymore due to a change in Oracle&#039;s license terms, so you have to install it additionally. Of course, you are free to install Appium directly to use the version you want. However, to then be able to start an Appium server with expecco, a suitable batch file must be available and specified in the [[Mobile_Testing_Plugin/en#Plugin_Configuration|settings]]. However, connections can also be established to other running Appium servers.&lt;br /&gt;
*&#039;&#039;&#039;expecco 23.1&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-23.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.1]&lt;br /&gt;
:Same versions as in the predecessor, but the installer now allows to add Appium to the Autostart.&lt;br /&gt;
*expecco 22.2 and 22.1: [https://download.exept.de/transfer/h-expecco-22.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.2.0]&lt;br /&gt;
:Appium 1.22.3*&lt;br /&gt;
:Node 14.17.5&lt;br /&gt;
:adb 1.0.41 from platform-tools 33.0.2&lt;br /&gt;
:&#039;&#039;* We added the capability&#039;&#039; startChromedriverTimeout &#039;&#039;to Appium, to get a timeout earlier, if Chromedriver cannot be initialized. (see [[#startChromedriverTimeout|Problems and Solutions]])&#039;&#039;&lt;br /&gt;
*expecco 21.2: [https://download.exept.de/transfer/h-expecco-21.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.12.0.0]&lt;br /&gt;
:Contains Appium version 1.22.0, Node still is version 12.13.1.&lt;br /&gt;
*expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.1.0]&lt;br /&gt;
:Only minor changes compared to the previous version.&lt;br /&gt;
*expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.0.0]&lt;br /&gt;
:Compared to the previous version, Appium was updated to version 1.16.0-rc.1 and node 12 is used. &lt;br /&gt;
*expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.8.1.0]&lt;br /&gt;
:This installs Appium in the version 1.12.0 and now additionally contains build-tools in the version 28.0.3 in the android-sdk. Apart from this, it is the same as the previous version.&lt;br /&gt;
*expecco 18.2: [http://download.exept.de/transfer/h-expecco-18.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.7.3.0]&lt;br /&gt;
:This installs Appium in the version 1.8.1. In addition, an installation of &#039;&#039;Android Debug Bridge&#039;&#039; and &#039;&#039;Google USB Driver&#039;&#039; ([https://gsmusbdrivers.com/download/adb-fastboot-drivers/ adb-setup-1.4.3]) is offered. This covers drivers for a broad range of Android devices, and you won&#039;t have to install an individual driver for each device. A &#039;&#039;&#039;JDK is not contained anymore (due to a change in Oracle&#039;s license terms)&#039;&#039;&#039;, you have to download it on your own, e.g. from [https://www.oracle.com/technetwork/java/javase/downloads/index.html Oracle].&lt;br /&gt;
*expecco 18.1: same procedure as for expecco 2.11&lt;br /&gt;
*expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/MobileTestingSupplement_1.6.0.2_Setup.exe Mobile Testing Supplement 1.6.0.2]&lt;br /&gt;
:This installs a Java JDK Version 8, android-sdk and Appium Version 1.6.4. The supplement also offers a universal adb driver ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]). This driver supports a wide range of Android Devise, and avoids the need to search for individual device-specific drivers.&lt;br /&gt;
*expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_1.5.0.0_Setup.exe Mobile Testing Supplement 1.5.0.0]&lt;br /&gt;
:It installs a Java JDK version 8, android-sdk and Appium version 1.4.16. During the installation the graphical user interface of Appium is started, you can close this window immediately. The supplement also offers a universal adb driver (ClockworkMod). This combines drivers for a wide range of Android devices so that you do not have to search for and install a separate driver for each device.&lt;br /&gt;
&lt;br /&gt;
If expecco has to use mobile devices that are connected to another computer, you have to start an Appium server there. You can do this by using the file &amp;lt;code&amp;gt;appium_standalone.cmd&amp;lt;/code&amp;gt;. The server is then started on default port 4723. If you want to use a different port number, start the server with&lt;br /&gt;
&lt;br /&gt;
 appium_standalone.cmd -p &amp;lt;portnummer&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The server is ready, as soon as the line&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Appium REST http interface listener started on 0.0.0.0:4723&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
is displayed, where you can read the used port number at the end.&lt;br /&gt;
&lt;br /&gt;
If your Android device is connected to a remote machine,&lt;br /&gt;
you may want to see the live screen locally using a tool like&lt;br /&gt;
[https://github.com/Genymobile/scrcpy scrcpy].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When Appium is started for the first time – either standalone or by expecco – it may happen that the Windows firewall blocks access to the node server. Allow the access or Appium cannot be started.&lt;br /&gt;
&lt;br /&gt;
== Mac OS ==&lt;br /&gt;
Note: the following can be ignored if you do not plan to test iOS (iPhone) devices. The Mac setup is not needed for Android devices.&lt;br /&gt;
&lt;br /&gt;
=== Xcode ===&lt;br /&gt;
Automation with iOS devices needs [https://developer.apple.com/xcode/ Xcode]. You can install it from the App Store. Please make sure that the version matches the tested iOS versions.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;iOS&#039;&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp;  &lt;br /&gt;
|&#039;&#039;&#039;Xcode&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;macOS&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|10.x&lt;br /&gt;
|8.x&lt;br /&gt;
|10.12 (Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|11.x&lt;br /&gt;
|9.x&lt;br /&gt;
|10.13 (High Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|12.x&lt;br /&gt;
|10.x&lt;br /&gt;
|10.14 (Mojave)&lt;br /&gt;
|-&lt;br /&gt;
|13.x&lt;br /&gt;
|11.x&lt;br /&gt;
|10.15 (Catalina)&lt;br /&gt;
|-&lt;br /&gt;
|14.x&lt;br /&gt;
|12.x&lt;br /&gt;
|11.0 (Big Sur)&lt;br /&gt;
|-&lt;br /&gt;
|15.x&lt;br /&gt;
|13.x&lt;br /&gt;
|12.0 (Monterey)&lt;br /&gt;
|-&lt;br /&gt;
|16.x&lt;br /&gt;
|14.x&lt;br /&gt;
|12.5 (Monterey)&lt;br /&gt;
|}&lt;br /&gt;
This table is only a simplified overview, better see [https://xcodereleases.com/ Xcode releases] or [https://en.wikipedia.org/wiki/Xcode#Version_comparison_table Xcode versions] for the exact versions. For new iOS minor versions, there is usually also a new release of Xcode, e.g. for iOS 10.2 you need at least Xcode 8.2, for iOS 10.3 at least Xcode 8.3, etc. So if you are upgrading to a newer iOS version, you will usually need a newer Xcode version as well. Newer versions of Xcode may not run on older operating systems, which in turn may require an operating system upgrade. If you also want to test older iOS versions, it can be useful to install the corresponding Xcode versions in parallel.&lt;br /&gt;
&lt;br /&gt;
=== Appium ===&lt;br /&gt;
You can install Appium either as command-line tool or use it with [https://github.com/appium/appium-desktop Appium Desktop], which provides a GUI to start the server. Meanwhile there is also Appium 2.0, which is not tested with expecco yet and therefore not recommended to use.&lt;br /&gt;
&lt;br /&gt;
==== Appium Desktop ====&lt;br /&gt;
Download the newest version of [https://github.com/appium/appium-desktop/releases/ Appium Desktop]. For the Mac, it is best to take the dmg file and install it to the applications. When starting &#039;&#039;Appium Server GUI&#039;&#039; you will probably get the error message, that it is not possible for security reasons. In this case, open the context menu of the app file (right click or Ctrl + click) and choose &#039;&#039;Open&#039;&#039; there. Then confirm that you really want to open the application. From now on you can open the application normally.&lt;br /&gt;
&lt;br /&gt;
[[Datei:OpenAppiumServerGUI1.png|text-top]] [[Datei:OpenAppiumServerGUI2.png|text-top]]&lt;br /&gt;
&lt;br /&gt;
Since Xcode 14 there are problems with signing the WebDriverAgent, which Appium loads on the device for the automation. This means that no connection is possible with version 1.22.3-4 of Appium Desktop. In newer versions of WebDriverAgent, this problem is solved, but currently there is no version of Appium Desktop using such a new version (as of November 2022). However, you can manually download a new version (e.g. 4.10.2) and replace the files in Appium. To do this, download one of the two archive files (zip or tar.gz) containing the source code from the [https://github.com/appium/WebDriverAgent/releases/ WebDriverAgent download page]. Then open and extract this file. Copy the contents of the folder &#039;&#039;WebDriverAgent-4.10.2&#039; to&lt;br /&gt;
&lt;br /&gt;
 /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
If you navigate there by Finder, make a context click (right click or Ctrl + click) on the application and choose &#039;&#039;Show Package Contents&#039;&#039; from the menu. Replace all files that are already present with the same name.&lt;br /&gt;
&lt;br /&gt;
==== Install Appium using npm ====&lt;br /&gt;
You can install Appium using npm (Node Package Manager) as well. To do this, you have to install node/npm first. This can be done using [https://github.com/nvm-sh/nvm nvm] (Node Version Manager), which you can get on Github. If the following installation instructions should not work for you, you will find detailed information in the [https://github.com/nvm-sh/nvm#readme Readme] there.&lt;br /&gt;
&lt;br /&gt;
Open a Terminal window. Then clone the Github repository of nvm&lt;br /&gt;
 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash&lt;br /&gt;
and load it&lt;br /&gt;
 export NVM_DIR=&amp;quot;$([ -z &amp;quot;${XDG_CONFIG_HOME-}&amp;quot; ] &amp;amp;&amp;amp; printf %s &amp;quot;${HOME}/.nvm&amp;quot; || printf %s &amp;quot;${XDG_CONFIG_HOME}/nvm&amp;quot;)&amp;quot; [ -s &amp;quot;$NVM_DIR/nvm.sh&amp;quot; ] &amp;amp;&amp;amp; \. &amp;quot;$NVM_DIR/nvm.sh&amp;quot; # This loads nvm&lt;br /&gt;
&lt;br /&gt;
Then execute&lt;br /&gt;
 command -v nvm&lt;br /&gt;
to see if it works. It should print &#039;&#039;nvm&#039;&#039;. If there is no response, execute&lt;br /&gt;
 touch ~/.zshrc&lt;br /&gt;
and try again.&lt;br /&gt;
&lt;br /&gt;
Now you can install node with the following command.&lt;br /&gt;
 nvm install 16.15.1&lt;br /&gt;
As there are problems installing Appium using the newest version of node, we recommend this version.&lt;br /&gt;
&lt;br /&gt;
After node is installed, you can use it to install Appium:&lt;br /&gt;
 npm install -g appium&lt;br /&gt;
&lt;br /&gt;
The Appium server now simply can be started with the command&lt;br /&gt;
 appium&lt;br /&gt;
The output will then be written directly to the terminal.&lt;br /&gt;
&lt;br /&gt;
This version also has problems with signing the WebDriverAgent, like explained in [[#Appium_Desktop | Appium Desktop]]. Therefore download a newer version of WebDriverAgent in this case as well and replace the old files. You will find them at&lt;br /&gt;
 /Users/&amp;lt;user&amp;gt;/.nvm/versions/16.15.1/lib/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
==== Mobile Testing Supplement ====&lt;br /&gt;
We provide older versions of Appium via the Mobile Testing Supplement for Mac OS, with which you can easily install it:&lt;br /&gt;
* &#039;&#039;&#039;expecco 20.2&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-20.2.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement for Mac OS (1.2.2)]&lt;br /&gt;
:Contains Appium version 1.18.3 and uses node 14.&lt;br /&gt;
&lt;br /&gt;
* expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement for Mac OS (1.2.0)]&lt;br /&gt;
:Only a few changes compared to the previous version.&lt;br /&gt;
&lt;br /&gt;
* expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement_for_MacOS.tar.bz2 Mobile Testing Supplement for Mac OS (1.1.98)]&lt;br /&gt;
:Appium is updated to version 1.16.0-rc.1 and node 12 is used.&lt;br /&gt;
&lt;br /&gt;
* expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.96.tar.bz2 Mobile Testing Supplement for Mac OS (1.1.96)]&lt;br /&gt;
:This version contains Appium 1.12.0.&lt;br /&gt;
&lt;br /&gt;
* expecco 18.1: [http://download.exept.de/transfer/h-expecco-18.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.94.tar.bz2 Mobile Testing Supplement for Mac OS (1.1.94)]&lt;br /&gt;
:This version contains Appium 1.8.0.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.11:[http://download.exept.de/transfer/h-expecco-2.11.1/Mobile_Testing_Supplement_for_Mac_OS_1.0.94.tar.bz2 Mobile Testing Supplement for Mac OS (1.0.94)]&lt;br /&gt;
:This version contains Appium 1.6.4.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_for_Mac_OS_1.0.tar.bz2 Mobile Testing Supplement for Mac OS]&lt;br /&gt;
:Diese Version entält Appium 1.4.16.&lt;br /&gt;
&lt;br /&gt;
After you have downloaded the supplement, you can move it to a directory of your choice (e.g. your home directory) and unpack it there. A suitable command in a shell could look like this, adjust the version number accordingly:&lt;br /&gt;
&lt;br /&gt;
 tar -xvpf Mobile_Testing_Supplement_for_Mac_OS_1.1.98.tar.bz2&lt;br /&gt;
&lt;br /&gt;
If your default Xcode installation is the one you want to use, you can start Appium directly from the file in the &#039;&#039;bin&#039;&#039; directory with the appropriate version number:&lt;br /&gt;
&lt;br /&gt;
 Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
If you want to use another Xcode than the one configured as default, you have to tell Appium the corresponding path by using the environment variable &#039;&#039;DEVELOPER_DIR&#039;&#039;. For example, if you have installed Xcode in &#039;&#039;/Applications/Xcode-11.3.app&#039;&#039;, you can start Appium this way:&lt;br /&gt;
&lt;br /&gt;
 DEVELOPER_DIR=&amp;quot;/Applications/Xcode-11.3.app/Contents/Developer&amp;quot; Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
To find out what is set as the default Xcode installation on your system, use this command:&lt;br /&gt;
&lt;br /&gt;
 xcode-select -p&lt;br /&gt;
&lt;br /&gt;
If Appium cannot find your Xcode installation, a message like this appears:&lt;br /&gt;
&#039;&#039;&amp;lt;blockquote&amp;gt;org.openqa.selenium.SessionNotCreatedException - A new session could not be created. (Original error: Could not find path to Xcode, environment variable DEVELOPER_DIR set to: /Applications/Xcode.app but no Xcode found)&amp;lt;/blockquote&amp;gt;&#039;&#039;&lt;br /&gt;
In such a case, restart Appium by specifying a valid &#039;&#039;DEVELOPER_DIR&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Signing WebDriverAgent ====&lt;br /&gt;
For automation, Appium installs an App called WebDriverAgent on the device and therefore has to be able to sign it. You need an Apple account and a respective certificate for this. For evaluation you can use a free account. This has the disadvantage that created profiles are only valid for one week and must be recreated afterwards. Also be careful when sharing the account, as certificates may be revoked or invalidated by automatic generation. As a result, apps that have already been signed can no longer be used.&lt;br /&gt;
&lt;br /&gt;
If you already have a respective certificate and its associated private key in your keychain on the Mac, you can have the WebDriverAgent automatically signed. If not, it is recommended to set and manage the signing using Xcode.&lt;br /&gt;
&lt;br /&gt;
First, connect the device you want to use to your Mac via USB. Make sure both the Mac and the device are in the same network or there will be problems when connection with Appium. Start Xcode and open &#039;&#039;Preferences&#039;&#039;. Go to the Accounts page and create an entry with your account. You can then click on &#039;&#039;Manage Certificates...&#039;&#039; to see the certificates that belong to that account. To run tests, you need an iOS Development Certificate and the associated private key. If you do not already have one, create one. If you already have one, but it is not in your keychain (indicated by &amp;quot;Not in Keychain&amp;quot;), you can import it. You can do that by the [https://support.apple.com/en-us/guide/keychain-access/welcome/mac keychain access] on your Mac, if you have exported it previously from the keychain, where it is stored. The certificate with the associated key should be in the keychain &#039;&#039;Login&#039;&#039;. It can be exported from there as PKCS#12 file (typical ending .p12). To import a certificate into your keychain, select the option &#039;&#039;Import objects&#039;&#039; from the &#039;&#039;File&#039;&#039; menu. If you don&#039;t know where the certificate is stored, you can also revoke it in Xcode and recreate it in your keychain. However, only do this if you know that the old certificate is no longer in use because it can no longer be used afterwards. Now the keychain should contain an iOS development certificate.&lt;br /&gt;
&amp;lt;!--(Den folgenden Teil braucht man wohl nicht mehr, wenn es in Xcode eingestellt ist)From the right-click menu, select Information. Under the details of the certificate you will find the Team ID, which is referred to here as the Organizational Unit. Enter it in the Team ID field of the plug-in&#039;s settings, see [[#Plugin_Configuration|Plugin Configuration]].--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now open the WebDriverAgent project in Xcode. If you have installed the Mobile Testing Supplement, you will find it in this directory at&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
If you have installed Appium Desktop, you will find it at&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;/Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You can use the Finder to navigate to the Xcode project file and open it by double clicking. Note, that you have to perform a context click (right click or Ctrl + click) on the Appium Server GUI app and select &#039;&#039;Show Package Contents&#039;&#039; in the menu, to get to its subdirectory.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingWebDriverAgentXcode.png]]&lt;br /&gt;
&lt;br /&gt;
Select &#039;&#039;WebDriverAgentLib&#039;&#039; and the page &#039;&#039;Signing &amp;amp; Capabilities&#039;&#039;. In the section &#039;&#039;Signing&#039;&#039; set the option &#039;&#039;Automatically manage signing&#039;&#039; and then select a team. Now switch to &#039;&#039;WebDriverAgentRunner&#039;&#039; and do the same there.&lt;br /&gt;
&amp;lt;!-- (The following seems to not be relevant anymore.) Here you should see errors indicating that no Provisioning Profiles have been created or found. Therefore, go to the &#039;&#039;Build Settings&#039;&#039; page and look for the entry &#039;&#039;Product Bundle Identifier&#039;&#039; in the &#039;&#039;Packaging&#039;&#039; section. Change this from com.facebook.WebDriverAgentRunner to something Xcode accepts by changing the prefix. Xcode can now generate a matching Provisioning Profile and the errors on the General page should disappear. After that you can quit Xcode. --&amp;gt;&lt;br /&gt;
By setting the team, the errors showing up for WebDriverAgentRunner should disappear. If Xcode should not be able to create a Provisioning Profile matching the Bundle ID &#039;&#039;com.facebook.WebDriverAgentRunner&#039;&#039;, you can edit the latter so that it fits your certificate. After that you can quit Xcode or you can, like explained further below, directly start the build in Xcode, so the project will be already built when Appium wants to use it.&lt;br /&gt;
&lt;br /&gt;
If you now connect to your device from expecco, the WebDriverAgent will be installed and started on it and then switch to the app to be tested. You may still have to trust the execution of the WebDriverAgent on the device. It maybe a sign that you have to do this, if the app WebDriverAgent first appears on the device and tries to start, but then is uninstalled again. To trust the execution, open the settings during the connection setup on the device and then the entry &#039;&#039;Device management&#039;&#039; under &#039;&#039;General&#039;&#039;. This entry is only visible if a developer app is installed on the device. You may therefore have to wait until the WebDriverAgent is installed before the entry appears. Select the entry of your Apple account and trust it. Since the WebDriverAgent will be uninstalled again if the start did not work, you have to do this during the connection setup. If this is too hectic for you, you can also execute the following code:&lt;br /&gt;
&lt;br /&gt;
 xcodebuild -project Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
 xcodebuild -project /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&lt;br /&gt;
&lt;br /&gt;
This installs the WebDriverAgent on the device without deleting it again.&lt;br /&gt;
&lt;br /&gt;
If there are problems while installing the WebDriverAgent, you can also try and start the build in Xcode. Make sure the right target &#039;&#039;WebDriverAgent&#039;&#039; is selected. Error messages in Xcode might indicate easier what the problem is about. Sometimes it even helps to try for a second time, if it took too long for the first time and got aborted. It may occur, that you are asked several times during the build to enter the password for the keychain.&lt;br /&gt;
&lt;br /&gt;
[[Datei:WebDriverAgentCodesign.png]]&lt;br /&gt;
&lt;br /&gt;
Read also the documentation of Appium on [https://github.com/appium/appium-xcuitest-driver/blob/master/docs/real-device-config.md Setting up tests with iOS devices]. Refer to the [https://support.apple.com/en-us/HT204460 Apple documentation] for details on installing and trusting of apps.&lt;br /&gt;
&lt;br /&gt;
Once the WebDriverAgent is installed on the device, it will be reused for later connections und connecting should work faster. The signed version is then already on your Mac as well and doesn&#039;t have to be built again. This should speed up the connect with other devices as well. If you know, that the connect has to build and sign the WebDriverAgent first, it is advisable to set the capability &#039;&#039;wdaLaunchTimeout&#039;&#039;. This timeout specifies how long Appium waits for the WebDriverAgents to start up on the device and is per default set to 60000&amp;amp;nbsp;ms. Building often takes a little longer than one minute, so the connect attempt will be canceled. A value of 120000 will be more reliable here.&lt;br /&gt;
&lt;br /&gt;
== Plugin Configuration ==&lt;br /&gt;
Before you start, please check the settings of the Mobile Testing Plugin and adjust them if necessary. Select the menu item &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Extensions&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot; (see fig.). By default, these paths are found automatically (1). To adjust a path manually, deactivate the corresponding check mark at the right. You&#039;ll see a drop-down list with some paths to choose from. If an entered path is wrong or cannot be found, the field is marked red and a message appears. Make sure that all paths are specified correctly.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingEinstellungen.png | thumb | 400px | Plugin Configuration]]&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;appium&#039;&#039;&#039;: Enter the path to the executable file with which Appium can be started in the command line. Under Windows this file will usually be called &amp;quot;&amp;lt;code&amp;gt;appium.cmd&amp;lt;/code&amp;gt;&amp;quot;. This path is used when expecco starts an Appium server.&lt;br /&gt;
*&#039;&#039;&#039;node&#039;&#039;&#039;: Enter the path to the executable that starts Node (also called (also called &amp;quot;Node.js&amp;quot;). This path is passed to Appium when a server is started so that Appium can find it independently of the PATH variable. Under Windows this file is usually called &amp;quot;&amp;lt;code&amp;gt;node.exe&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;JAVA_HOME&#039;&#039;&#039;: Enter the path to a JDK (Java Development Kit)here. This path is passed to each Appium server. Leave the field blank to use the value from the environment variable. To specify which Java should be used by expecco, set this path in the Java Bridge settings.&lt;br /&gt;
*&#039;&#039;&#039;ANDROID_HOME&#039;&#039;&#039;: Enter the path to an Android SDK here. This path is passed to each Appium server. Leave the field blank to use the value from the environment variable.&lt;br /&gt;
*&#039;&#039;&#039;adb&#039;&#039;&#039;: The path to the adb command. Under Windows the file is called &amp;quot;&amp;lt;code&amp;gt;adb.exe&amp;lt;/code&amp;gt;&amp;quot;. This file is used by expecco, for example, to get the list of connected devices. This path should be selected automatically, if the command is found in the ANDROID_HOME directory. This is also used by Appium. If expecco and Appium use different versions of adb, conflicts may occur.&lt;br /&gt;
*&#039;&#039;&#039;android.bat&#039;&#039;&#039;: This file is only needed to start the AVD and the SDK Manager, which deal with phone emulators. The file in the ANDROID_HOME directory will be selected automatically, if present there.&lt;br /&gt;
*&#039;&#039;&#039;aapt&#039;&#039;&#039;: The path to the &amp;quot;aapt&amp;quot; command here. Under Windows this file is called &amp;quot;&amp;lt;code&amp;gt;aapt.exe&amp;lt;/code&amp;gt;&amp;quot;. expecco uses &amp;quot;aapt&amp;quot; only in the connection editor to read the package and activities of an &amp;quot;apk&amp;quot; file. The file in the ANDROID_HOME directory will be selected automatically, if present there.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingJavaBridgeEinstellungen.png | thumb | 400px | JDK Configuration]]&lt;br /&gt;
&lt;br /&gt;
Starting with expecco 2.11, there is an additional field called &#039;&#039;Team ID&#039;&#039;. If you run iOS tests, enter the Team ID of your certificate here. This is used for every iOS connection, unless you change the value in the connection settings in individual cases. For information on how to obtain the team ID, please refer to the section on [[#Signing| signing]] for installations on Mac OS. With expecco 2.10 and older, you can only enter the Team ID as capability for each connection setting separately. However, you must use the [[#Extended_View|extended view]] to do this. Enter the capability &#039;&#039;xcodeOrgId&#039;&#039; here and set the Team ID of the certificate as value.&lt;br /&gt;
&lt;br /&gt;
The server address setting at the bottom of the page refers to the behavior of the connection editor. It checks at the end whether the server address ends in &#039;&#039;/wd/hub&#039;&#039; as this is the usual form. If not, a dialog asks how to react. The defined behavior can be viewed and changed here.&lt;br /&gt;
&lt;br /&gt;
Also switch to the entry &#039;&#039;Java Bridge&#039;&#039; (see figure). Here you have to specify the path to your Java installation, which is used by expecco. Enter a JDK here. If you want to use the one from the Mobile Testing Supplement under Windows, the path is&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;C:\Program Files (x86)\exept\Mobile Testing Supplement\jdk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can also use the system settings.&lt;br /&gt;
&lt;br /&gt;
== Prepare Android Device ==&lt;br /&gt;
If you connect an Android device under Windows, you may still need an adb driver for the device. You can usually find a suitable driver on the manufacturer&#039;s website. If you have installed the universal driver from the Mobile Testing Supplement, everything should already work for most devices. In some cases, Windows will automatically try to install a driver when you connect the device for the first time. &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Attention&#039;&#039;&#039;: Before you can control a mobile device with the Appium plugin, you have to allow this debugging!&lt;br /&gt;
&lt;br /&gt;
For Android devices, you can find this option in the settings under &#039;&#039;[https://developer.android.com/studio/debug/dev-options Developer Options]&#039;&#039; called &#039;&#039;USB-Debugging&#039;&#039;. If the developer options are not displayed, you can unlock them by tapping Build Number seven times in About the Phone.&lt;br /&gt;
&lt;br /&gt;
Also enable the &#039;&#039;Stay awake&#039;&#039; feature to prevent the device from turning off the screen during test creation or execution.&lt;br /&gt;
&lt;br /&gt;
For security reasons, USB debugging must be allowed for each computer individually. When connecting the device to the PC via USB, you must agree to the connection on the device. If you haven&#039;t done this for your computer yet, but no corresponding dialog appears on the device, it may help to unplug and reconnect the device. This can happen especially if you have installed the ADB driver while the device was already connected via USB. If this doesn&#039;t help either, open the notifications by dragging them from the top of the screen. There you will find the USB connection and you can open the options. Select another type of connection; usually MTP or PTP should work.&lt;br /&gt;
&lt;br /&gt;
You can also test on an emulator. It does not need to be prepared separately, as it is already designed for USB debugging. It is even possible to start an emulator at the beginning of the test.&lt;br /&gt;
&lt;br /&gt;
To check if a device you have connected to your computer can be used, open the [[#Connection_Editor|connection editor]]. The device should be displayed there.&lt;br /&gt;
&lt;br /&gt;
=== Connection via WLAN ===&lt;br /&gt;
It is possible to connect to Android devices via Wireless LAN. For devices using Android 11 or newer, this can be done wirelessly, else you have to connect initially via USB. Since expecco 22.1, WiFi connections can be established using the [[Mobile_Testing_Plugin/en#Connection_Editor|Connection Editor]]. It is also possible to do this using a command window.&lt;br /&gt;
==== Wireless Connect (Android 11) ====&lt;br /&gt;
In the developer options of your device, enable wireless debugging and open its options. You initially have to pair your machine with the device. To do this, choose &amp;quot;&#039;&#039;Pair device with pairing code&#039;&#039;&amp;quot; to get a pairing code and an IP address with port. Then open a command window (terminal window) on your machine and enter:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb pair &amp;lt;Device IP Address&amp;gt;:&amp;lt;Pairing Port&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
where &amp;lt;tt&amp;gt;&amp;lt;Device IP Address&amp;gt;:&amp;lt;Pairing Port&amp;gt;&amp;lt;/tt&amp;gt; is the IP address and port as shown on the device. After that, you will be asked for the pairing code. If everything went right, the popup on the device should have closed and your machine is added to the list of paired devices. Then enter at the command window:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;Device IP Address&amp;gt;:&amp;lt;Debugging Port&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The IP address is the same as for pairing, but the port is different. Both are shown as IP address &amp;amp; Port on the device. The device should now be connected via WLAN and can be used in the same way as with a USB connection. You can check this by entering &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; or open the connection dialog in expecco. In the list, the device appears with its IP address and port. Remember that the WLAN connection no longer exists when the ADB server or the device is restarted. Restarting the device often disables wireless debugging and the used port is changed. The pairing, however, is permanent and has not to be done again the next time you connect.&lt;br /&gt;
==== Start via USB ====&lt;br /&gt;
First, connect your device via USB. Then open a command window (terminal window) and enter:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The device listens for a TCP/IP connection on port 5555. If you have several devices connected or emulators running, you have to specify which device you mean. Enter in this case:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb devices -l&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
to get a list of all devices, where the first column gives the device&#039;s ID.&lt;br /&gt;
Then, enter:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb -s &amp;lt;deviceID&amp;gt; tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
with the device identification of the desired device. You can now disconnect the USB connection.&amp;lt;br&amp;gt;Now you have to find out the IP address of your device. You can usually find it somewhere in the device&#039;s settings, for example in the Status or WLAN settings of the phone. Then type in:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP address of device&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The device should now be connected via WLAN and can be used in the same way as with a USB connection. You can check this by entering &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; again or open the connection dialog in expecco. In the list, the device appears with its IP address and port. Remember that the WLAN connection no longer exists when the ADB server or the device is restarted.&lt;br /&gt;
&lt;br /&gt;
== Preparing an iOS-Device and App ==&lt;br /&gt;
Control of iOS devices is only possible via a Mac. Please also read the section [[#Mac_OS|Installation under Mac OS]].&lt;br /&gt;
&lt;br /&gt;
Before you can control a mobile device with the Mobile Testing Plugin, you must allow debugging for iOS devices with iOS 8 or higher. Activate the option &amp;quot;&#039;&#039;Enable UI Automation&#039;&#039;&amp;quot; under the &amp;quot;&#039;&#039;Developer&#039;&#039;&amp;quot; menu in the device settings.&amp;lt;br&amp;gt;If you cannot find the &amp;quot;&#039;&#039;Developer&#039;&#039;&amp;quot; entry in the settings, proceed as follows: Connect the device to the Mac via USB. If necessary, you must still agree to the connection on the device. Start Xcode and then select &amp;quot;&#039;&#039;Devices&#039;&#039;&amp;quot; from the menu bar at the top of the screen in the &amp;quot;&#039;&#039;Window&#039;&#039;&amp;quot; menu. A window opens in which a list of the connected devices is displayed. Select your device there. Then the entry &amp;quot;&#039;&#039;Developer&#039;&#039;&amp;quot; should appear in the settings on the device. You may have to exit the settings and restart.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Alert.png | thumb | 270px | Alert unter iOS]]&lt;br /&gt;
It is not possible to establish a connection to the device as long as it shows certain alerts. Such an alert may appear if FaceTime is activated (by displaying a message about SMS charges as shown in the screenshot). Be sure to configure the device so that it does not show such alerts when idle.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.11 and later ===&lt;br /&gt;
You can test any app which is executable or already installed on the device used. If the app is available as a development build, the UDID of the device must be stored in the app. In any case, the WebDriverAgent must be signed for the device. Please read the section about [[#Signing|signing]] under Mac OS.&lt;br /&gt;
&lt;br /&gt;
If you want to use the Home button in a test, you must activate &amp;quot;AssistiveTouch&amp;quot; on the device. You will find this option in the settings under &amp;quot;&#039;&#039;General&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;Operating Help&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;AssistiveTouch&#039;&#039;&amp;quot;. Then place the menu in the middle of the upper edge of the screen. You can then record pressing the Home button with the corresponding menu entry in the recorder or use the &amp;quot;&#039;&#039;Press Home Button&#039;&#039;&amp;quot; block directly.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.10 ===&lt;br /&gt;
The app you want to use must be available as a development build. The UDID of the device must also be stored in the app.&lt;br /&gt;
&lt;br /&gt;
=== Sign the development build ===&lt;br /&gt;
A development build of an app is only allowed for a limited number of devices and cannot be started on other devices. However, it is possible to exchange the certificate and the usable devices in a development build.&lt;br /&gt;
&lt;br /&gt;
* Evaluation with demo app of eXept:&lt;br /&gt;
:We will be happy to provide you with a demo app which is available as a development build and which we can sign for your device. Please send the UDID of your device to your eXept contact person. How to determine the UDID of your device is described in the following section.&lt;br /&gt;
&lt;br /&gt;
* Using your own app for your test device:&lt;br /&gt;
:If you receive a development build (IPA file) from the app developers that is approved for your test device, you can use it directly. To do this, you must tell the developers the UDID of your device so they can enter it. &#039;&#039;&#039;You can use Xcode to read the UDID of a device&#039;&#039;&#039;. Start Xcode and select &#039;&#039;Devices&#039;&#039; from the menu bar at the top of the screen in the &#039;&#039;Window&#039;&#039; menu. A window opens in which a list of the connected devices is displayed. Select your device and search for the &#039;&#039;Identifier&#039;&#039; entry in Properties. The UDID is a 40-digit hexadecimal number.&lt;br /&gt;
&lt;br /&gt;
* Externally developed app for your test device:&lt;br /&gt;
:You can also re-sign apps to make them run on other devices. However, this process is complicated and requires access to an Apple Developer account. A documentation on the procedure is currently in preparation.&lt;br /&gt;
&lt;br /&gt;
:For the evaluation we will gladly support you with the re-signing of your app..&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Log in to the [https://developer.apple.com/ Apple-Webinterface]. Navigate to &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039;. If necessary, create a Developer Certificate and a Provisioning Profile for your device here and download both. If you don&#039;t have a Developer Account yet, create one here: https://developer.apple.com/enroll/. For this you have to register with an Apple-ID.&lt;br /&gt;
&lt;br /&gt;
# Find out Team ID (&#039;&#039;Membership&#039;&#039; -&amp;gt; &#039;&#039;Team ID&#039;&#039;)&lt;br /&gt;
# Under &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039; select development certificate (under &#039;&#039;+&#039;&#039; create, if not available) and download&lt;br /&gt;
# Under &#039;&#039;App ID&#039;&#039; create Wildcard App ID, if not present. Note App ID (AppID = Prefix.ID)&lt;br /&gt;
# Add device, find out UDID (or &#039;&#039;Identifier&#039;&#039;) of the device (&#039;&#039;Xcode&#039;&#039; -&amp;gt; &#039;&#039;Window&#039;&#039; (above in menu bar) -&amp;gt; &#039;&#039;Devices&#039;&#039;)&lt;br /&gt;
# Create commission profiles: &#039;&#039;iOS App Development&#039;&#039; -&amp;gt; Select &#039;&#039;AppID&#039;&#039; -&amp;gt; Select certificate -&amp;gt; Select device -&amp;gt; Create profile name -&amp;gt; Download provisioning profiles.&lt;br /&gt;
# Import the downloaded certificate (&#039;&#039;Downloads&#039;&#039; -&amp;gt; Certificate (.cer)&lt;br /&gt;
# Copy SHA1 fingerprint. Right click on Certificate -&amp;gt; &#039;&#039;Information&#039;&#039;, then scroll to the bottom of the page).&lt;br /&gt;
# Create Entitlements.plist (&#039;&#039;Open Terminal&#039; -&amp;gt; Downloads/Mobile_Testing_Supplement/bin/gen-entitlements_plist &#039;Team-ID&#039; &#039;App ID&#039; Downloads/Mobile_Testing_Supplement/bin/re-sign-ipa &amp;lt;path to ipa (z.B. Downloads/expeccoMobileDemo.ipa)&amp;gt; \&lt;br /&gt;
&amp;quot;&amp;lt;Zertifikat (SHA1-Fingerabdruck, z.B. 76 E8 4B E8 78 D5 D7 F9 2E 09 8B D7 E8 FB CE 30 0C F5 D0 EF)&amp;gt;&amp;quot; \&lt;br /&gt;
&amp;lt;Path to Commission Profile (e.g. /Users/exept_test/Downloads/dut.mobileprovision)&amp;gt; \&lt;br /&gt;
&amp;lt;Path for the result ipa (z.B. Downloads/expeccoMobileDemo_re-signed.ipa)&amp;gt; \&lt;br /&gt;
[Pfad zur entitlements.plist] (z.B. /Users/exept_test/entitlements.plist)&lt;br /&gt;
&lt;br /&gt;
To re-sign, you can use the corresponding script from the Mobile Testing Supplement for Mac OS or any other tool (e.g. isign).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more information about using iOS devices, see also the &lt;br /&gt;
[http://appium.io/slate/en/master/?java#appium-on-real-ios-devices Appium documentation].&lt;br /&gt;
&lt;br /&gt;
=== Native iOS-Apps ===&lt;br /&gt;
You can also use apps that are already natively present on the device. To do this, you must know their bundle ID and then enter it in the connection settings. Here is a small selection of common apps:&lt;br /&gt;
{| style=&amp;quot;text-align:left&amp;quot;&lt;br /&gt;
! App&lt;br /&gt;
!&lt;br /&gt;
! Bundle-ID&lt;br /&gt;
|-&lt;br /&gt;
| App Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.AppStore&lt;br /&gt;
|-&lt;br /&gt;
| Calculator&lt;br /&gt;
| &lt;br /&gt;
| com.apple.calculator&lt;br /&gt;
|-&lt;br /&gt;
| Calendar&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilecal&lt;br /&gt;
|-&lt;br /&gt;
| Camera&lt;br /&gt;
| &lt;br /&gt;
| com.apple.camera&lt;br /&gt;
|-&lt;br /&gt;
| Contacts&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileAddressBook&lt;br /&gt;
|-&lt;br /&gt;
| iTunes Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileStore&lt;br /&gt;
|-&lt;br /&gt;
| Mail&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilemail&lt;br /&gt;
|-&lt;br /&gt;
| Maps&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Maps&lt;br /&gt;
|-&lt;br /&gt;
| Messages&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileSMS&lt;br /&gt;
|-&lt;br /&gt;
| Phone&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilephone&lt;br /&gt;
|-&lt;br /&gt;
| Photos&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobileslideshow&lt;br /&gt;
|-&lt;br /&gt;
| Settings&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Preferences&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
You can find further Bundle-IDs [https://github.com/joeblau/apple-bundle-identifiers here].&lt;br /&gt;
&lt;br /&gt;
= Examples =&lt;br /&gt;
In the demo test suites for expecco you will also find examples for tests with the Mobile Testing Plugin. To do this, select the option &amp;quot;&#039;&#039;Example from File&#039;&#039;&amp;quot; on the start screen and open the folder named &amp;quot;&#039;&#039;mobile&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;TestsuiteMobileTestingDemo&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m01_MobileTestingDemo.ets --&amp;gt;&amp;lt;/span&amp;gt; &#039;&#039;m01_MobileTestingDemo.ets&#039;&#039; ==&lt;br /&gt;
The test suite contains two simple test plans: &amp;quot;&#039;&#039;Simple CalculatorTest&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Complex Calculator and Messaging Test&#039;&#039;&amp;quot;. Both tests use an Android emulator, which you must start before starting. The apps used in the test are part of the basic equipment of the emulator and therefore no longer need to be installed. Since the apps may differ under every Android version, it is important that your emulator runs under Android 6.0. In addition, the language must be set to English.&lt;br /&gt;
&lt;br /&gt;
; Simple CalculatorTest&lt;br /&gt;
: This test connects to the calculator and enters the formula &#039;&#039;2+3&#039;&#039;. The result of the calculator is compared with the expected value &#039;&#039;5&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; Complex Calculator and Messaging Test&lt;br /&gt;
: This test connects to the calculator and then opens the message service. There it waits for an incoming message from the number &#039;&#039;15555215556&#039;&#039;, in which a formula to be calculated is sent. The message is generated before via a socket at the emulator. When the message arrives, it is opened by the test and its contents are read. Then the calculator is opened again, the received formula is entered and the result is read. The test then switches back to the message service and sends the result as an answer.&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;m02_expeccoMobileDemo.ets&#039;&#039; und &#039;&#039;m03_expeccoMobileDemoIOS.ets&#039;&#039; ==&lt;br /&gt;
These are part of the tutorial for the Mobile Testing Plugin. The included test case is incomplete and will be added during the tutorial. Please read the section [[#Tutorial|Tutorial]].&lt;br /&gt;
&lt;br /&gt;
= Tutorial =&lt;br /&gt;
There is a tutorial describing the basic procedure for creating tests with the Mobile Testing Plugin. It is based on a supplied example consisting of a simple app and an expecco test suite.&lt;br /&gt;
&lt;br /&gt;
You find it on the page [[Mobile_Testing_Tutorial/en|Mobile Testing Tutorial]] in two versions for Android and iOS devices.&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsAndroid&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m02_expeccoMobileDemo.ets --&amp;gt;&amp;lt;/span&amp;gt; [[Mobile_Testing_Tutorial/en#First_steps_with_Android|First steps with Android]]&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsIOS&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m03_expeccoMobileDemoIOS.ets --&amp;gt;&amp;lt;/span&amp;gt; [[Mobile_Testing_Tutorial/en#First_steps_with_iOS|First steps with iOS]]&lt;br /&gt;
&lt;br /&gt;
= Dialogs of the Mobile Testing Plugin =&lt;br /&gt;
== Connection Editor ==&lt;br /&gt;
You can use the Connection Editor to quickly define, change, or establish connections. Depending on the task, the dialog has small differences and is opened differently:&lt;br /&gt;
*If you want to establish a connection, access the dialog in the GUI browser by clicking on &#039;&#039;Connect&#039;&#039; and then selecting &#039;&#039;Mobile Testing&#039;&#039;.&lt;br /&gt;
*To change or copy an existing connection in the GUI browser, select it, right-click and select &#039;&#039;Edit Connection&#039;&#039; or &#039;&#039;Copy Connection&#039;&#039; from the context menu.&lt;br /&gt;
*If you do not want to create connection settings for the GUI browser but for use in a test, choose &#039;&#039;Create Connection Settings&#039;&#039; from the Mobile Testing Plugin menu.... This only allows you to create the settings for a connection without creating a connection in the GUI browser.&lt;br /&gt;
&lt;br /&gt;
The Connection Editor menu has several buttons, some of which are only visible when creating connection settings:&lt;br /&gt;
[[Datei:MobileTestingVerbindungseditorMenu.png]]&lt;br /&gt;
#&#039;&#039;Delete Settings&#039;&#039;: Resets all entries. (Only visible when creating settings.)&lt;br /&gt;
#&#039;&#039;Load settings from file&#039;&#039;: Allows to open a saved settings file (*.csf). Its settings are transferred to the dialog. Entries already made without conflict are retained.&lt;br /&gt;
#&#039;&#039;Load settings from attachment&#039;&#039;: Allows you to open an attachment with connection settings from an open project. These settings are applied to the dialog. Entries already made without conflict are retained.&lt;br /&gt;
#&#039;&#039;Save settings to file&#039;&#039; and&lt;br /&gt;
#&#039;&#039;Save settings to attachment&#039;&#039;: Here you can save the entered settings to a file (*.csf) or create them as an attachment in an open project. Both options have a delayed menu in which you can choose to save only a certain part of the settings. (Only visible when creating settings.)&lt;br /&gt;
#&#039;&#039;Advanced View&#039;&#039;: Allows you to switch to the advanced view to make additional settings. Read more about this at the end of this chapter. (Only visible when creating settings.)&lt;br /&gt;
#&#039;&#039;Help&#039;&#039;: A help text for the respective step is shown or hidden on the right side.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The dialog is divided into three steps. In the first step you select the device you want to use, in the second step you select which App should be used and in the last step the settings for the Appium server are made.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep1&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Step 1: Select Device ===&lt;br /&gt;
In the upper part you will see a list of all connected Appium devices that are detected. With the checkbox below you can hide devices that are detected but not ready. If you want to enter a device that is not connected, you can create it with the corresponding button &#039;&#039;Enter Android device&#039;&#039; or &#039;&#039;Enter iOS device&#039;&#039;. However, you need to know the required properties of your device. The device is then created in a second device list and can be selected there. If no list with connected elements can be displayed, various messages are displayed instead:&lt;br /&gt;
*No devices found&lt;br /&gt;
*:expecco could not find any Android devices.&lt;br /&gt;
*:To automatically configure a connection to a device, make sure&lt;br /&gt;
*:*it is connected&lt;br /&gt;
*:*it is turned on&lt;br /&gt;
*:*that it has an appropriate adb driver installed&lt;br /&gt;
*:*it is enabled for debugging (see below).&lt;br /&gt;
*No available devices found&lt;br /&gt;
*:expecco could not find any available Android devices. But not available ones were found, e.g. with the status &amp;quot;unauthorized&amp;quot;.&lt;br /&gt;
*:To configure a connection to a device automatically, make sure that &lt;br /&gt;
*:*it is connected&lt;br /&gt;
*:*it is turned on&lt;br /&gt;
*:*that it has an appropriate adb driver installed&lt;br /&gt;
*:*it is enabled for debugging (see below).&lt;br /&gt;
*:To view unavailable devices, enable this option below.&lt;br /&gt;
*Connection lost&lt;br /&gt;
*:expecco has lost the connection to the adb server. Try to re-establish the connection by clicking on the button.&lt;br /&gt;
*Connection failed&lt;br /&gt;
*:expecco could not connect to the adb server. Possibly it is not running or the specified path is not correct.&lt;br /&gt;
*:Check the adb configuration in the settings and try to start the adb server and establish a connection by clicking on the button.&lt;br /&gt;
*Connect ...&lt;br /&gt;
*:expecco connects to the adb server. This may take a few seconds.&lt;br /&gt;
*Start adb-Server ...&lt;br /&gt;
*:expecco starts the adb-Server. This may take a few seconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--With &#039;&#039;Automation by&#039;&#039; you can specify, which automation engine is to be used. If you leave the setting at &#039;&#039;(Default)&#039;&#039; the corresponding capability is not set at all. Otherwise Appium, Selendroid and from expecco 2.11 XCUITest are available. Selendroid is usually only used for Android devices prior to version 4.1.--&amp;gt;With &#039;&#039;Next&#039;&#039; you get to the next step. If you enter settings for the GUI browser, this is only possible once a device has been selected.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;UnlockingDeveloperOptions&amp;quot;&amp;gt;Note on unlocking&amp;lt;/span&amp;gt;: In newer Android versions the developer options are no longer offered in the settings at first. If your Android device does not show an entry for &amp;quot;&#039;&#039;Developer options&#039;&#039;&amp;quot; in the settings, first select the entry &amp;quot;&#039;&#039;Phone info&#039;&#039;&amp;quot;, then &amp;quot;&#039;&#039;SoftwareVersionsInfo&#039;&#039;&amp;quot; and click on the entry &amp;quot;&#039;&#039;BuildVersion&#039;&#039;&amp;quot; several times.&lt;br /&gt;
&lt;br /&gt;
==== Manage Chromedrivers ====&lt;br /&gt;
If the App you want to automate uses WebViews with Chrome, Appium needs to have access to an appropriate Chromedriver. If you have selected a device in the list, you can use &amp;quot;&#039;&#039;Manage Chromedrivers&#039;&#039;&amp;quot; to see, which Chrome versions are installed on the device and which Chromedriver versions are provided by expecco. With this dialog you can also download required Chromedriver versions. Beware that there may be several Chrome versions on the device. An App doesn&#039;t have to use the version of the installed Chrome browser for its WebViews. The Chromedriver you use should fit your app for everything to work properly. You can also change the path to the Chromedriver in the capabilities generated at the end of the connection editor.&lt;br /&gt;
&lt;br /&gt;
==== Connect WiFi Android Device ====&lt;br /&gt;
&lt;br /&gt;
You can connect to Android devices using WiFi as well. In this case, the device has to be connected to ADB first, see [[Mobile_Testing_Plugin/en#Connection_via_WLAN|Connection via WLAN]]. Since expecco 22.1, the connection editor provides a dialog helping to set this up, which can be used instead of the command window. For devices using Android 11 or newer, you can pair the device with your machine here by specifying the appropriate parameters and then establish the connection by specifying the IP address and port. You can also use this to establish a wireless connection for devices that are connected via USB. When you select the corresponding device in the list, the required information is read out automatically.&lt;br /&gt;
&lt;br /&gt;
Note that establishing a wireless connection is not part of the connection settings. If you want to establish a new connection with the generated settings, you must make sure that the device is connected to ADB with the specified IP address and port so that it can be found. The ADB connection will be lost if the ADB server or the device are restarted. The permission for wireless debugging is also often reset when the device is restarted and the debug port can then change. Therefore, a wireless connection must always be established manually.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep2&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Step 2: Select App===&lt;br /&gt;
Here you can enter information about the app to be tested. You can decide if you want to use an app that is already installed on the device or if you want to install an app for the test. Select the appropriate tab above. Depending on whether you selected an Android or an iOS device in the previous step, the required input will change.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Android&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App on Device&#039;&#039;&lt;br /&gt;
**:If you have selected a connected device in the first step, the packages of all installed apps are automatically retrieved and you can select from the drop-down lists. The installed apps are divided into third-party packages and system packages; select the appropriate package list. This selection does not belong to the settings, but only provides the corresponding package list. You can use the filter to further narrow down the list and then select the desired package. The activities of the selected package are also automatically retrieved and made available as a drop-down list. Select the activity you want to start. As a rule, an activity is automatically entered from the list. If you are not using a connected device, you must enter the package and the activity manually.&lt;br /&gt;
**&#039;&#039;Install App&#039;&#039;&lt;br /&gt;
**:Under &#039;&#039;App&#039;&#039;, enter the path to an app. The path must be valid for the Appium server being used. You can also specify a URL. If you are using a local Appium server, you can use the right button to navigate to the App installation file and enter this path. If possible, the corresponding package and the activity are also entered in the fields below. However, this entry is not necessary.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;iOS&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App on Device&#039;&#039;&lt;br /&gt;
**:Specify the bundle ID of an installed app. You can find out the IDs of the installed apps using Xcode, for example. Start Xcode and select &#039;&#039;Devices&#039;&#039; from the menu bar at the top of the screen in the &#039;&#039;Window&#039;&#039; menu. A window will open displaying a list of connected devices. If you select your device, you will see a list of the apps you have installed in the overview.&lt;br /&gt;
**&#039;&#039;Install App&#039;&#039;&lt;br /&gt;
**:Under &#039;&#039;App&#039;&#039;, enter the path to an app. The path must be valid for the Appium server being used. You can also specify a URL. For the requirements of apps for real devices, please read the section  [[#iOS-Ger.C3.A4t_and_App_Preparing|Preparing an iOS-Device and App]].&lt;br /&gt;
&lt;br /&gt;
In the lower part you can specify whether the app should be reset or uninstalled when the connection is terminated, and whether it should be reset initially. Again, the corresponding capability is not set if you select &#039;&#039;(Default)&#039;&#039;. With &#039;&#039;Next&#039;&#039; you get to the next step.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep3&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Step 3: Server Settings===&lt;br /&gt;
In the last step, a list of all the capabilities that result from your entries in the previous steps is first displayed in the upper part. If you are familiar with Appium and want to set additional capabilities that are not covered by the connection editor, you can click on &#039;&#039;Edit&#039;&#039; to open the extended view. See the section below for more information.&lt;br /&gt;
&lt;br /&gt;
If you enter settings for the GUI browser, you can enter the &#039;&#039;Connection name&#039;&#039; with which the connection is displayed. This is also the name under which devices can use this connection when it is established. If you leave the field blank, a name will be generated. If the box &amp;quot;&#039;&#039;Managed by expecco&#039;&#039;&amp;quot; is checked, expecco will start a local Appium server on a free port, or use a free server that has already been started. To use your own server, turn this feature off and enter the appropriate address. You will get the local default address and already used addresses to choose from.&lt;br /&gt;
&lt;br /&gt;
In older expecco versions the box is labeled &amp;quot;&#039;&#039;Start on demand&#039;&#039;&amp;quot;. In this case, you must also enter an address if you want expecco to start the server. expecco then tries to start an Appium server at the given address when connecting, if none is running there yet. This server will then also be shut down when the connection is terminated. This only works for local addresses. Make sure that you only use port numbers that are free. It is best to only use odd port numbers from the standard port 4723. The following port number is also used when establishing a connection, which could otherwise lead to conflicts.&lt;br /&gt;
&lt;br /&gt;
Depending on how you opened the dialog, there are now different buttons to close it. In any case you have the option to save. This opens a dialog where you can either select an open project to save the settings there as an attachment, or choose to save it to a file that you can then specify. Saving does not close the dialog, allowing you to select another option.&lt;br /&gt;
&lt;br /&gt;
If you have opened the editor for establishing a connection, you can finally click on &#039;&#039;Connect&#039;&#039; or &#039;&#039;Start and connect server&#039;&#039;, depending on whether the check mark for server start is set. For changing or copying a connection in the GUI Browser, this option is called &#039;&#039;Apply&#039;&#039;, since in this case only the connection entry is changed or created, but the connection setup is not started. If necessary, you can do this afterwards via the context menu. If you have changed capabilities of an existing connection, a dialog then prompts you to decide whether these changes should be applied directly by closing the connection and establishing the new connection or not. In this case, the changes only take effect after you reestablish the connection.&lt;br /&gt;
&lt;br /&gt;
To use the connection editor, also read the corresponding section in the respective tutorial in step 1. (Android: [[Mobile_Testing_Tutorial/en#Step_1:_Run_Demo|Run Demo]], iOS: [[Mobile_Testing_Tutorial/en#Step_1:_Run_Demo_2|Run Demo]]).&lt;br /&gt;
&lt;br /&gt;
===Extended View===&lt;br /&gt;
The extended view of the connection editor can be obtained either by clicking on &#039;&#039;Edit&#039;&#039; in the third step or at any time via the corresponding menu item if you have started the editor via the plugin menu. This view displays a list of all configured Appium Capabilities. You can add, change or remove further entries to this list. To add a capability, select it from the drop-down list of the input field. In this list all known capabilities are sorted into the categories &#039;&#039;Common&#039;&#039;, &#039;&#039;Android&#039;&#039; and &#039;&#039;iOS&#039;&#039;. If you have selected a capability, a short information text is displayed. You can also enter a capability manually in the field. Then click on &#039;&#039;Add&#039;&#039; to add the capability to the list. There you can set the value in the right column. To delete an entry, select it and click on &#039;&#039;Remove&#039;&#039;. With &#039;&#039;Back&#039;&#039; you leave the extended view.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingErweiterteAnsicht.png]]&lt;br /&gt;
&lt;br /&gt;
== Running Appium Servers ==&lt;br /&gt;
In the menu of the Mobile Testing Plugin you will find the entry &#039;&#039;Appium-Server...&#039;&#039;. This opens a window with an overview of all Appium servers started by expecco and on which port they are running. By clicking on the icon in the column &#039;&#039;Show Log&#039;&#039; you can view the logfile of the corresponding server. This is deleted when the server is shut down. With the icons in the column &#039;&#039;Exit&#039;&#039; the corresponding server can be terminated. However, this is prevented if expecco still has an open connection via this server. The rightmost column shows for which connection the server is in use. If it reads &#039;&#039;&amp;lt;idle&amp;gt;&#039;&#039;, the server is currently not used by expecco.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAppiumServer.png]]&lt;br /&gt;
&lt;br /&gt;
When opening the editor to start an Appium connection, an Appium server is started immediately to speed up the connection process. For this purpose, expecco always keeps one idle running Appium server. Additional running servers however, which are not in use anymore, will be terminated automatically after a while.&lt;br /&gt;
&lt;br /&gt;
In the menu of the Mobile Testing Plugin you will also find the entry &#039;&#039;Close all Connections and Servers&#039;&#039;. This is intended for cases where connections or servers cannot be terminated in any other way. If possible, always terminate connections in the GUI browser or by executing a corresponding block. Servers that you have started in the server overview should be terminated there; servers that were started with a connection are automatically terminated with this connection.&lt;br /&gt;
&lt;br /&gt;
Note that only servers started and managed by expecco are listed in the overview. Possible other Appium servers that were started in a different way are not recognized.&lt;br /&gt;
&lt;br /&gt;
== Recorder ==&lt;br /&gt;
If the GUI browser is connected to a device, the integrated recorder can be used to record a test section with that device. To start the recorder, select the appropriate connection in the GUI browser and click the Record button. A new window opens for the recorder. The recorded actions are created in the GUI browser work area. It is therefore possible to edit the recorded data in parallel.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingRecorder.png|caption|]]&lt;br /&gt;
&lt;br /&gt;
====Components of the Recorder Window====&lt;br /&gt;
#&#039;&#039;&#039;Continue/Pause Recording&#039;&#039;&#039;: You can pause the recording by clicking the right icon. You will then see a large pause sign in the view. All actions that you perform now in the recorder are executed, but no blocks are recorded. You can switch back to normal recording mode by clicking the left icon.&lt;br /&gt;
#&#039;&#039;&#039;Stop Recording&#039;&#039;&#039;: Stops the recording and closes the recorder window.&lt;br /&gt;
#&#039;&#039;&#039;Update&#039;&#039;&#039;: Gets the current image and element tree from the device. This is necessary if the device takes longer to execute an action or if something changes without being triggered by the recorder. Since expecco 21.2, there is an additional submenu here that can be used to enable automatic update by checking for changes in the background (see also &#039;&#039;Automatic Update&#039;&#039; further below).&lt;br /&gt;
#&#039;&#039;&#039;Follow Mouse&#039;&#039;&#039;: Select the element under the mouse pointer in the GUI browser.&lt;br /&gt;
#&#039;&#039;&#039;Element Highlighting&#039;&#039;&#039;: The element under the mouse is outlined in red.&lt;br /&gt;
#&#039;&#039;&#039;Show Elements&#039;&#039;&#039;: Show the borders of all elements in the view.&lt;br /&gt;
#&#039;&#039;&#039;Tools&#039;&#039;&#039;: Selection, which  tool is used for recording. The selected action is triggered with each click on the view. The following actions are available:&lt;br /&gt;
#*Element Actions:&lt;br /&gt;
#**Click: Short click on the element under cursor. To determine more precisely which element is used, use the Follow Mouse or Element Highlighting function.&lt;br /&gt;
#**Tap with Duration (Element): Similar to click, except that the duration of the click will be recorded as well. This allows the recording of long clicks.&lt;br /&gt;
#**Tap with Position (Element): Similar to click, but additionally records the position inside the element. The position can be recorded relative to the element size or, when pressing Ctrl while clicking, as absolute position from the upper left corner of the element.&lt;br /&gt;
#**Set Text: Allows to set the text of an input field.&lt;br /&gt;
#**Clear Text: Clears the text of an input field.&lt;br /&gt;
#*Device Actions:&lt;br /&gt;
#**Tap (Screen): Triggers a click at the screen position.&lt;br /&gt;
#**Tap with Duration (Screen): Triggers a click at the screen position, which also considers the duration.&lt;br /&gt;
#**Swipe: Swipe in a straight line from the point where you press the mouse button until you release it. The duration is also recorded.&lt;br /&gt;
#:Please note for this actions that the result may differ on different devices, e.g. with different screen resolutions.&lt;br /&gt;
#*Test Flow Blocks&lt;br /&gt;
#**Check Attribute: Compares the value of a specified attribute of the element with a predefined value. The result triggers the corresponding output.&lt;br /&gt;
#**Assert Attribut: Compares the value of a specified attribute of the element with a predefined value. If the values are not equal, the test fails.&lt;br /&gt;
#**Get Attribute: Gets the current value of a specified attribute of the element.&lt;br /&gt;
#*Auto&lt;br /&gt;
#:If the Auto tool is selected, you can use all actions by specific input methods: &#039;&#039;Click&#039;&#039;, &#039;&#039;Tap Element&#039;&#039; and &#039;&#039;Swipe&#039;&#039; still work by clicking, but are distinguished by the duration and movement of the cursor. To trigger a &#039;&#039;Tap&#039;&#039;, hold down Ctrl while clicking. The remaining actions are available in a context menu by right-clicking on the element.&lt;br /&gt;
#&#039;&#039;&#039;Context Actions&#039;&#039;&#039;: Here you can record actions concerning contexts:&lt;br /&gt;
#*Switch to Context: Shows a list of all currently available contexts and you can select to which one you want to switch.&lt;br /&gt;
#*Get Current Context: Gets the handle of the current context.&lt;br /&gt;
#*Get Context Handles: Gets a list of all currently available contexts.&lt;br /&gt;
#&#039;&#039;&#039;Softkeys&#039;&#039;&#039;: Only for Android. Simulates pressing the buttons Back, Home, Menu and Power.&lt;br /&gt;
#&#039;&#039;&#039;Home Button&#039;&#039;&#039;: Only for iOS since expecco 2.11. Allows pressing the Home button.Prior to expecco 19.2, it only works if AssistiveTouch is activated and the menu is located in the middle of the upper screen border. From expecco 19.2 on, the function no longer uses AssistiveTouch.&lt;br /&gt;
#&#039;&#039;&#039;Help&#039;&#039;&#039;: Opens this online documentation on the general page about [[GuiBrowser_Recorder/en|GUI Browser recorders]].&lt;br /&gt;
#&#039;&#039;&#039;View&#039;&#039;&#039;: Shows a screenshot of the device. Actions are triggerd by mouse depending on the selected tool. If a new action can be recorded, the window has a green frame, else it is red.&lt;br /&gt;
#&#039;&#039;&#039;Resize Window to Image&#039;&#039;&#039;: Resizes the recorder window so that the screenshot can be displayed completely.&lt;br /&gt;
#&#039;&#039;&#039;Resize Image to Window&#039;&#039;&#039;: Scales the screenshot to a size that makes use of the full size of the window.&lt;br /&gt;
#&#039;&#039;&#039;Adjust Display&#039;&#039;&#039;: Opens a dialog to adjust the displayed image, if expecco does not show it right. You can correct the scaling or rotate the image by 90°.&lt;br /&gt;
#&#039;&#039;&#039;Correct Orientation&#039;&#039;&#039;: Corrects the image if it is upside down. Using the arrow to the right, the image can also be rotated by 90°, if this should ever be necessary. Since expecco 19.1 you find this functionality under &#039;&#039;Adjust Display&#039;&#039;. The orientation of the image is irrelevant for the functionality of the recorder, it only works on the elements it receives.&lt;br /&gt;
#&#039;&#039;&#039;Scaling&#039;&#039;&#039;: Changes the scaling of the screenshots.&lt;br /&gt;
#&#039;&#039;&#039;Messages&#039;&#039;&#039;: Shows the path of the current selected element or other messages. It has a context menu to show a list of previous messages.&lt;br /&gt;
&lt;br /&gt;
====Usage====&lt;br /&gt;
Each click in the window triggers an action and is recorded in the workspace of the GUI browser. There you can run, edit, or create a new block from what you have recorded. You find the actions to trigger softkeys directly in the menu bar (see above). To record actions on elements, either change the selection of the tool in the menu bar (see above) and then click on the element or select the corresponding action from the context menu by right-clicking on the corresponding element. For text input it is also possible to place the cursor over the element and enter the text. This opens the input dialog for this action. On how to use the recorder, see also step 2 in the tutorial ([[Mobile_Testing_Tutorial/en#Step_2:_Creating_a_Block_with_the_Recorder|Android]] resp. [[Mobile_Testing_Tutorial/en#Step_2:_Creating_a_block_with_the_Recorder_2|iOS]]).&lt;br /&gt;
&lt;br /&gt;
====Hide elements====&lt;br /&gt;
Since expecco 21.2 it is also possible to hide the selected element in the recorder from the context menu. This means that this element cannot be selected from now on. This function is useful for ignoring elements that are in the foreground to be able to access elements below them. To undo this state, you have to find the corresponding element in the tree of the GUI browser, which also has such an entry in the context menu.&lt;br /&gt;
&lt;br /&gt;
====Automatic Update====&lt;br /&gt;
The recorder doesn&#039;t show a live image of the device, but only a snapshot. Therefore an update is needed after changes to match what is displayed on the device. The recorder updates automatically after executing an action. Since expecco 20.2 there are further automatic updates possible. You can enable the, in the menu &amp;quot;View&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
One option is, to check after an action has been executed, if there are further changes after the first update. If so, a second update is triggered. This shall fix the problem, that the recorder is not up to date after an action, because the update has been done too early.&lt;br /&gt;
&lt;br /&gt;
The second option is to enable a periodical update. After a set interval the recorder is automatically updated if there are changes. Thereby the recorder view is mostly up to date, but this causes an overhead regarding the communication to the device.&lt;br /&gt;
&lt;br /&gt;
== AVD Manager und SDK Manager ==&lt;br /&gt;
AVD Manager und SDK Manager sind beides Anwendungen von Android. Im Menü des Mobile Testing Plugins bietet expecco die Möglichkeit, diese zu starten. Ansonsten finden Sie diese Programme bei Ihrer Android-Installation. Mit dem AVD Manager können Sie AVDs, also Konfigurationen für Emulatoren, erstellen, bearbeiten und starten. Mit dem SDK Manager erhalten Sie einen Überblick über Ihre Android-Installation und können diese bei Bedarf erweitern.&lt;br /&gt;
&lt;br /&gt;
= Hybrid Apps and WebViews =&lt;br /&gt;
&#039;&#039;&#039;!!! IMPORTANT NOTICE - If you have problems switching to the webview, please set the &amp;quot;Default Application - Browser App&amp;quot; in Android Settings to &amp;quot;Chrome&amp;quot; !!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hybrid apps contain platform native elements as well as other elements that are integrated in a WebView. These elements can also be used, but you first have to switch to the corresponding context. With the block &#039;&#039;Get Current Context&#039;&#039; you get the current context. Initially this is &#039;&#039;NATIVE_APP&#039;&#039;, i.e. the context of the native elements. With the block &#039;&#039;Get Context Handles&#039;&#039; you get a collection of all existing contexts. If there is a WebView context, it is called &#039;&#039;WEBVIEW_1&#039;&#039; or &#039;&#039;WEBVIEW_&amp;lt;package&amp;gt;&#039;&#039; with the package of the WebView. Several WebView contexts are also possible. For each WebView context, there is a corresponding WebView element in the native context. You can use the &#039;&#039;Switch to Context&#039;&#039; block to switch to such a context and from now on only have access to the elements in this context.&lt;br /&gt;
&lt;br /&gt;
In the GUI browser, the existing contexts are displayed at the top of the tree as well as the tree of a context is inserted below the corresponding WebView element.&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span id=&amp;quot;Customizing XPath using the GUI Browsers&amp;quot;&amp;gt;&amp;lt;!-- name before 01.10.2020--&amp;gt;&amp;lt;/span&amp;gt;Customizing XPath using the GUI Browser=&lt;br /&gt;
Bausteine, die auf einem Gerät fehlerfrei funktionieren, tun dies auf anderen Geräten möglicherweise nicht. Auch können kleine Änderungen der App dazu führen, dass ein Baustein nicht mehr den gewünschten Effekt hat. Man sollte einen Baustein daher so robust formulieren, dass er für eine Vielzahl von Geräten verwendet werden kann und kleine Anpassungen an der App verkraftet. Dazu muss man das grundlegende Funktionsprinzip der Adressierung verstehen. Dies wird im Folgenden am Beispiel der App aus dem Tutorial erläutert.&lt;br /&gt;
&lt;br /&gt;
Die Ansicht der App setzt sich aus einzelnen Elementen zusammen. Dazu gehören die Schaltflächen &#039;&#039;GTIN-13 (EAN-13)&#039;&#039; und &#039;&#039;Verify&#039;&#039;, das Eingabefeld der Zahl &#039;&#039;4006381333986&#039;&#039; und das Ergebnisfeld, in dem OK erscheint, wie auch alle anderen auf der Anzeige sichtbaren Dinge. Diese sichtbaren Elemente sind in unsichtbare Strukturelemente eingebettet. Alle Elemente zusammen sind in einer zusammenhängenden Hierarchie, dem Elementbaum, organisiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingGUIBrowser.png | frame | left | Abb. 1: Funktionen des GUI-Browsers]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
Sie können sich diesen Baum im GUI-Browser ansehen. Wechseln Sie dazu in den GUI-Browser (Abb. 1) und starten Sie eine beliebige Verbindung. Sobald die Verbindung aufgebaut ist, können Sie den gesamten Baum aufklappen (1) (Klick bei gedrückter Strg-Taste). Er enthält alle Elemente der aktuellen Seite der App.&lt;br /&gt;
&lt;br /&gt;
Ein Baustein, der nun ein bestimmtes Element verwendet, muss dieses eindeutig angeben, indem er dessen Position im Elementbaum mit einem Pfad im XPath-Format beschreibt. Dieses Format ist ein verbreiteter Web-Standard für XML-Dokumente und -Datenbanken, eignet sich aber genauso für Pfade im Elementbaum.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie ein Element im Baum auswählen, wird unten der von expecco automatisch generierte XPath (2) für das Element angezeigt, der auch beim Aufzeichnen verwendet wird. Oberhalb davon in der Mitte des Fensters befindet sich eine Liste der Eigenschaften (3) des ausgewählten Elements. Man nennt diese Eigenschaften auch Attribute. Sie beschreiben das Element näher wie beispielsweise seinen Typ, seinen Text oder andere Informationen zu seinem Zustand. Links unten können Sie zur besseren Orientierung im Baum die &#039;&#039;Vorschau&#039;&#039; (4) aktivieren, um sich den Bildausschnitt des Elements anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Der Elementbaum für gleiche Ansicht einer App kann sich je nach Gerät unterscheiden. Es sind diese Unterschiede, die verhindern, eine Aufnahme von einem Gerät unverändert auch auf allen anderen Geräten abzuspielen: Ein XPath, der im einen Elementbaum ein bestimmtes Element identifiziert, beschreibt nicht unbedingt das gleiche Element im Elementbaum auf einem anderen Gerät. Es kann stattdessen passieren, dass der XPath auf kein Element, auf ein falsches Element oder auf mehrere Elemente passt. Dann schlägt der Test fehl oder er verhält sich unerwartet.&lt;br /&gt;
&lt;br /&gt;
Man könnte natürlich für jedes Gerät einen eigenen Testfall schreiben. Das brächte aber unverhältnismäßigen Aufwand bei Testerstellung und -wartung mit sich. Das Problem lässt sich auch anders lösen, da ein jeweiliges Element nicht nur durch genau einen XPath beschrieben wird. Vielmehr erlaubt der Standard mithilfe verschiedener Merkmale unterschiedliche Beschreibungen für ein und dasselbe Element zu formulieren. Das Ziel ist daher, einen Pfad zu finden, der auf allen für den Test verwendeten Geräten funktioniert und überall eindeutig zum richtigen Element führt.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel besteht die Verbindung zur Android-App aus dem Tutorial und der Eintrag des GTIN-13-Buttons ist ausgewählt (5). Dessen automatisch generierter XPath (2) kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[@resource id=&#039;android:id/content&#039;]/android.widget.RelativeLayout/android.widget.Button[@resource-id=&#039;de.exept.expeccomobiledemo:id/gtin_13&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Er ist offensichtlich lang und unübersichtlich. Der sehr viel kürzere Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@text=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
führt zum selben Element.&lt;br /&gt;
&lt;br /&gt;
Für die iOS-App lautet der automatisch generierte XPath für diesen Button beispielsweise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/XCUIElementTypeApplication/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/UIAApplication/UIAWindow[1]/UIAButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und kann kürzer als&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@name=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Sie können den Pfad entsprechend im GUI-Browser ändern und durch &#039;&#039;Pfad überprüfen&#039;&#039; (6) feststellen, ob er weiterhin auf das ausgewählte Element zeigt, was expecco mit &#039;&#039;Verify Path: OK&#039;&#039; (7) bestätigen sollte. Der erste, sehr viel längere Pfad, beschreibt den gesamten Weg vom obersten Element des Baumes bis hin zum gesuchten Button. Der zweite Pfad hingegen wählt mit * zunächst sämtliche Elemente des Baumes und schränkt die Auswahl dann auf genau die Elemente ein, die ein &#039;&#039;text&#039;&#039;- bzw. &#039;&#039;name&#039;&#039;-Attribut mit dem Wert &#039;&#039;GTIN-13 (EAN-13)&#039;&#039; besitzen, in unserem Fall also genau der eine Button, den wir suchen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden Android-ähnliche Pfade zur Veranschaulichung verwendet. Die Elemente in iOS-Apps heißen zwar anders, wodurch andere Pfade entstehen; das Prinzip ist jedoch das gleiche.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum1.png | frame | Abb. 2: Elementbaum einer fiktiven App]]&lt;br /&gt;
&lt;br /&gt;
Sie können solche Pfade mit Hilfe weniger Regeln selbst formulieren. Sehen Sie sich den einfachen Baum einer fiktiven Android-App in Abb. 2 an: Die Einrückungen innerhalb des Baumes geben die Hierarchie der Elemente wieder. Ein Element ist ein &#039;&#039;Kind&#039;&#039; eines anderen Elementes, wenn jenes andere Element das nächsthöhere Element mit einem um eins geringeren Einzug ist. Jenes Element ist das &#039;&#039;Elternelement&#039;&#039; des Kindes. Sind mehrere untereinander stehende Elemente gleich eingerückt, so sind sie also alle Kinder desselben Elternelements.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad durch alle Ebenen der Hierarchie zum TextView-Element ist nun:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Elemente sind mit Schrägstrichen voneinander getrennt. Es fällt auf, dass der Name des ersten Elements nicht mit dem im Baum übereinstimmt. Das oberste Element in der Hierarchie heißt immer &#039;&#039;hierarchy&#039;&#039; (für iOS wäre es &#039;&#039;AppiumAUT&#039;&#039;), expecco zeigt im Baum stattdessen den Namen der Verbindung an, damit man mehrere Verbindungen voneinander unterscheiden kann. Die weiteren Elemente tragen jeweils das Präfix &#039;&#039;android.widget.&#039;&#039;, das im Baum zur besseren Übersicht nicht angezeigt wird. Bei IOS gibt es kein Präfix, das durch einen Punkt abgetrennt wäre, expecco 2.11 blendet aber entsprechend &#039;&#039;XCUIElementType&#039;&#039; am Anfang aus. Mit jedem Schrägstrich führt der Pfad über eine Eltern-Kind-Beziehung in eine tiefere Hierarchie-Ebene, d. h. &#039;&#039;FrameLayout&#039;&#039; ist ein Kindelement von &#039;&#039;hierarchy&#039;&#039;, &#039;&#039;LinearLayout&#039;&#039; ist ein Kind von &#039;&#039;FrameLayout&#039;&#039; usw. Die in eckigen Klammern geschriebenen Wörter dienen nur als Orientierungshilfe im Baum. Sie gehören nicht zum Typ.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad muss nicht beim Element &#039;&#039;hierarchy&#039;&#039; beginnen. Man kann den Pfad beginnend mit einem beliebigen Element des Baumes bilden. Man kann also verkürzt auch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
schreiben. Der Pfad führt zum selben &#039;&#039;TextView&#039;&#039;-Element, da es nur ein Element dieses Typs gibt. Anders verhält es sich bei dem Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da es zwei Elemente vom Typ &#039;&#039;Button&#039;&#039; gibt, passt dieser Pfad auf zwei Elemente, nämlich den Button, der mit &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; markiert ist, und den &#039;&#039;Button&#039;&#039;, der mit &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; markiert ist. Es würde an dieser Stelle aber auch nicht helfen den langen Pfad von &#039;&#039;hierarchy&#039;&#039; aus beginnend anzugeben. Um einen mehrdeutigen Pfad weiter zu differenzieren, kann man explizit ein Element aus einer Menge wählen, indem man den numerischen Index in eckigen Klammern dahinter schreibt. Der Pfad aus dem obigen Beispiel lässt sich damit so anpassen, dass er eindeutig auf den &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; weist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[1].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ihnen fällt sicher auf, dass der Index eine 1 ist obwohl das zweite Element gemeint ist. Das kommt daher, dass die Zählung bei 0 beginnt. Der Button mit der Markierung &amp;quot;An&amp;quot; hat also die Nummer 0 und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Nummer 1.&lt;br /&gt;
&lt;br /&gt;
Dieser Ansatz, einen expliziten Index zu verwenden, hat zwei Nachteile: Zum einen lässt sich an dem Pfad nur schwer ablesen welches Element gemeint ist, zum andern ist der Pfad sehr empfindlich schon gegenüber kleinsten Änderungen, wie zum Beispiel dem Vertauschen der beiden &#039;&#039;Button&#039;&#039;-Elemente oder dem Einfügen eines weiteren &#039;&#039;Button&#039;&#039;-Elements in der App.&lt;br /&gt;
&lt;br /&gt;
Es wäre daher wünschenswert, das gemeinte Element über eine ihm charakteristische Eigenschaft wie einen Attributwert, zu adressieren. Für Android-Apps eignet sich hierfür häufig das Attribut &#039;&#039;resource-id&#039;&#039;. Im Idealfall muss bei der Entwicklung der App darauf geachtet werden, dass jedes Element eine eindeutige Id erhält. Die &#039;&#039;resource-id&#039;&#039; hat den großen Vorteil, dass sie unabhängig vom Text des Elements oder der Spracheinstellung des Geräts ist. Für iOS-Apps kann entsprechend das Attribut &#039;&#039;name&#039;&#039; verwendet werden, wenn es von der App sinnvoll gesetzt wird. Der XPath-Standard erlaubt solche Auswahlbedingungen zu einem Element anzugeben. Angenommen, der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Eigenschaft &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;off&#039;&#039; und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; hat als &#039;&#039;resource-id&#039;&#039; den Wert &#039;&#039;on&#039;&#039;, dann kann man als eindeutigen Pfad für den &amp;quot;Aus&amp;quot;-&#039;&#039;Button&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[@resource-id=&#039;off&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
formulieren. Wie an dem Beispiel zu sehen werden solche Bedingungen wie ein Index in eckigen Klammern an den Elementtyp angehängt. Der Name eines Attributes wird mit einem @ eingeleitet und der Wert mit einem = in Anführungszeichen angehängt. Ist der Attributwert global eindeutig, kann man den vorausgehenden Pfad sogar durch den globalen Platzhalter * ersetzen, der auf jedes Element passt. Das obige Beispiel mit dem GTIN-13-&#039;&#039;Button&#039;&#039; war ein solcher Fall.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum2.png | frame | Abb. 3: Elementbaum einer fiktiven App mit Erweiterungen]]&lt;br /&gt;
&lt;br /&gt;
Abb. 3 zeigt eine Erweiterung des Beispiels aus Abb. 2. Die App hat nun ein weiteres, nahezu identisches &#039;&#039;LinearLayout&#039;&#039; bekommen. Die &#039;&#039;Buttons&#039;&#039; sind in ihren Attributen jeweils ununterscheidbar. Deshalb funktioniert der vorige Ansatz nicht, einen eindeutigen Pfad nur mithilfe eines Attributwerts zu formulieren. Offensichtlich unterscheiden sich aber ihre benachbarten &#039;&#039;TextViews&#039;&#039;. Es ist möglich die jeweilige &#039;&#039;TextView&#039;&#039; in den Pfad mit aufzunehmen, um einen &#039;&#039;Button&#039;&#039; dennoch eindeutig zu adressieren. Ein Pfad zum &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; unterhalb der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; kann dabei wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView[@resource-id=&#039;push&#039;]/../android.widget.Button[@resource-id=&#039;on&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Teil beschreibt den Pfad zu der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; und der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;push&#039;&#039;. Danach folgt ein Schrägstrich gefolgt von zwei Punkten. Die zwei Punkte sind eine spezielle Elementbezeichnung, die nicht ein Kindelement benennt, sondern zum Elternelement wechselt, in diesem Fall also das &#039;&#039;LinearLayout&#039;&#039;, in dem die &#039;&#039;TextView&#039;&#039; eingebettet ist. Im Kontext dieses &#039;&#039;LinearLayout&#039;&#039; ist der restliche Pfad, nämlich der &#039;&#039;Button&#039;&#039; mit der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;on&#039;&#039;, eindeutig.&lt;br /&gt;
&lt;br /&gt;
Der XPath-Standard bietet noch sehr viel mehr Ausdrucksmittel. Mit der hier knapp vorgestellten Auswahl ist es aber bereits möglich für die meisten praktischen Testfälle gute Pfade zu formulieren. Eine vollständige Einführung in XPath ginge über den Umfang dieser Einführung weit hinaus. Sie finden zahlreiche weiterführende Dokumentationen im Web und in Büchern.&lt;br /&gt;
&lt;br /&gt;
Eine universelle Strategie zum Erstellen guter XPaths gibt es nicht, da sie von den Testanforderungen abhängt. In der Regel ist es sinnvoll, den XPath kurz und dennoch eindeutig zu halten. Häufig lassen sich Elemente über Eigenschaften identifizieren wie beispielsweise ihren Text. Will man aber gerade den Text eines Elements auslesen, kann dieser natürlich nicht im Pfad verwendet werden, da er vorher nicht bekannt ist. Ebenso wird der Text variieren, wenn die App mit verschiedenen Sprachen gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Jeder Baustein, der auf einem Element arbeitet, hat einen Eingangspin für den XPath. Im GUI-Browser finden Sie in der Mitte oben eine Liste von Bausteinen mit Aktionen, die Sie auf das ausgewählte Element anwenden können. Suchen Sie den Baustein &#039;&#039;Click&#039;&#039; (8) im Ordner Elements und wählen Sie ihn aus (Abb. 1). Er wird im rechten Teil unter &#039;&#039;Test&#039;&#039; eingefügt, der Pin für den XPath ist mit dem automatisch generierten Pfad des Elements vorbelegt (9). Sie können den Baustein hier auch ausführen. Die Ansicht wechselt dann auf &#039;&#039;Lauf&#039;&#039;. Ändert sich durch die Aktion der Zustand Ihrer App, müssen Sie den Baum anschließend aktualisieren (10).&lt;br /&gt;
&lt;br /&gt;
Wenn Sie in der unteren Liste eine Eigenschaft auswählen, wechselt die Anzeige der Bausteine zu &#039;&#039;Eigenschaften&#039;&#039;, wo Sie die eigenschaftsbezogenen Bausteine finden. Wie bei den Aktionen können Sie auch hier einen Baustein auswählen, der dann rechts in Test mit dem Pfad des Elements und der ausgewählten Eigenschaft eingetragen wird, sodass Sie ihn direkt ausführen können.&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span id=&amp;quot;troubleshooting&amp;quot;&amp;gt;&amp;lt;!-- Referenced by error dialog on connection error --&amp;gt;&amp;lt;/span&amp;gt;Problems and Solutions=&lt;br /&gt;
== Locators depend on the version or are variable ==&lt;br /&gt;
In this case consider to either store the locators (xPath) in a variable or to define a locator mapping inside a screenplay attachment. It is also possible to store just parts of an locator (e.g. locator path of a parent or attribute value) in a variable and add them in the freeze value of the locator pin by &amp;quot;&#039;&#039;$(varName)&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Invisible UI Elements ==&lt;br /&gt;
Note that the [[#Recorder|Recorder]] also considers items that you cannot see on the screen. Therefore, turn on element highlighting or use the follow mouse function and the element tree in the GUI browser to determine if the correct element is used. It can happen, that invisible elements are in front of other elements and cover them, so that the desired element cannot be selected in the recorder. See section [[#Hide_elements|Hide elements]] for a solution to this.&lt;br /&gt;
&lt;br /&gt;
== iOS: Cable not certified ==&lt;br /&gt;
In some cases, when connecting an iOS device via USB, a message appears indicating that the cable used is not certified. In this case, replacing the respective cable is the only solution.&lt;br /&gt;
&lt;br /&gt;
== iOS: Alerts when connecting ==&lt;br /&gt;
Make sure that no alerts are open when connecting to an iOS device. Otherwise the connection will fail because the app cannot be brought to the foreground. See also [[#Preparing_an_iOS-Device_and_App|Preparing an iOS-Device and App]].&lt;br /&gt;
&lt;br /&gt;
== iOS: .ipa cannot be installed ==&lt;br /&gt;
Note that on iOS simulators no &#039;&#039;.ipa&#039;&#039; files can be installed but only &#039;&#039;.app&#039;&#039; files.&lt;br /&gt;
&lt;br /&gt;
==iOS: First Connect is not working==&lt;br /&gt;
If there is not already a signed build of the WebDriverAgent on your Mac, it has to be created during the first connect. Usually, this can take a little longer than one minute. Per default Appium uses a timeout of 60000&amp;amp;nbsp;ms to wait for the WebDriverAgent to start on the device, so the connect will be canceled in that case. You can set this timeout with the capability &#039;&#039;wdaLaunchTimeout&#039;&#039;, e.g. to &#039;&#039;120000&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Moreover, the signing settings have to be correct. In our experience, the most reliable solution is to set automatic signing in the WebDriverAgent Xcode project an selecting the team there. See the explanation in section [[#Signing_WebDriverAgent|Signing WebDriverAgent]] for that. In this case you should &#039;&#039;&#039;not&#039;&#039;&#039; use the capabilities &#039;&#039;xcodeConfigFile&#039;&#039; resp. &#039;&#039;xcodeOrgId&#039;&#039; and &#039;&#039;xcodeSigningId&#039;&#039;, as they could cause a conflict. Caution: If you have set a Team ID in the Mobile Testing settings, expecco will automatically set this as &#039;&#039;xcodeOrgId&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
Pay attention to your device during the first connect. You might have to agree to the installation by entering your password. On the Mac you might need to enter the password to allow access to the key chain for signing, often several times.&lt;br /&gt;
&lt;br /&gt;
== Android: Device not visible in the connect editor ==&lt;br /&gt;
If an Android device connected via USB does not appear in the connection editor, try changing the USB connection type. Usually MTP or PTP should work. Check again, if &amp;quot;USB Debugging&amp;quot; is enabled in the developer options on the device (these options are disabled on some devices and have to be enabled first using a trick.) See also [[#Prepare_Android_Device|Prepare Android Device]].&lt;br /&gt;
&lt;br /&gt;
== Android: Truncated Elements at Bottom ==&lt;br /&gt;
For Android devices that automatically show and hide the navigation bar/softkeys, the recorder may cut off elements in the lower area that would be hidden by the softkeys, even if they are not displayed at this time. In this case it is advisable to set the softkeys so that they are permanently displayed.&lt;br /&gt;
&lt;br /&gt;
For newer Android versions there usually is no such option. Even if the controls are visible all the time, they don&#039;t have their own space, but are on top of the content of the app. Therefore, there is an area on the lower part of the screen, which cannot be automated, because it is not counted to the active area of the app. Appium will then truncate the elements there. This area can even be larger then the needed by the controls. This is a known issue for Samsung devices with Android 11. Since the information about the size of the app area is already provided on Android level, we cannot offer a solution for this, but can only hope that the problem will be fixed by the manufacturer. You may try to get better results by setting the control to gestures, but this bears the same issue.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;waitForIdleTimeout&amp;quot;&amp;gt;&amp;lt;!-- Referenced by expecco--&amp;gt;&amp;lt;/span&amp;gt; Android: Test Hangs While Finding an Element==&lt;br /&gt;
The block &#039;&#039;Find Element by XPath&#039;&#039; and all element blocks wait until an element is present for the given path. The timeout for this can be set either directly at the block or in the environment variables. However, if the element should already be present, but the test doesn&#039;t continue anyway, the reason could be in the UIAutomator/UIAutomator2. It waits for the app to go to the idle state before it even starts to search for the element. This may take longer, if the app e.g. runs an animation in the background or executes other kinds of actions. Fetching the page source, e.g. when updating in the GUI browser or in the recorder, can also take longer for this reason. There is a default timeout of 10 seconds after which it no longer waits for the idle state. This timeout can be set in Appium (waitForIdleTimeout). If you want to change the value of this timeout, you can do this since expecco 21.2 by executing the Smalltalk code &amp;lt;code&amp;gt;AppiumTestRunner::TestRunConnection waitForIdleTimeout:2000&amp;lt;/code&amp;gt; before the test. The timeout is given in milliseconds, so the example sets it to 2 seconds.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;startChromedriverTimeout/&amp;gt;Android: Updating the Tree or Switching to Webview Context takes too long==&lt;br /&gt;
Especially with older devices it can happen that newer Chromedriver cannot be initialized. This makes it impossible to switch to the webview context. However, this is only detected over a timeout by Appium, which is 4 minutes by default. Since expecco also tries to switch to the webview context when building the tree in the GUI browser, this can lead to very long loading times. Since there is no way to decrease this timeout in Appium, we have added a corresponding capability to the version we provide in the MobileTestingSupplement. Starting with version 1.13.1.0 of the [[#Windows|MobileTestingSupplement]], &#039;&#039;chromedriverStartTimeout&#039;&#039; can be used to set the timeout in milliseconds. The switch still doesn&#039;t work then, but expecco doesn&#039;t take as long to update the tree and the context switch module fails faster. The connection dialog adds this capability automatically starting with expecco 22.1. &lt;br /&gt;
&lt;br /&gt;
== No Action on Click ==&lt;br /&gt;
The block to click on an element is successful, but no action was performed on the device.&lt;br /&gt;
:This can happen if the element is hidden by another element and therefore clicking on the element is not possible. In this case, Appium does not throw an error, but simply nothing happens. If you would like to make a click at the position of the element anyways, even if it is hidden, use the block &#039;&#039;Tap&#039;&#039; instead and pass the location of the element to it (&#039;&#039;Get Location&#039;&#039;). If instead you want to check before a click whether the element is hidden at this moment, try whether the properties &#039;&#039;Is Displayed&#039;&#039; or &#039;&#039;Is Enabled&#039;&#039; might help you.&lt;br /&gt;
&lt;br /&gt;
== No Update After Action ==&lt;br /&gt;
An action was triggered on the recorder and a block has been recorded, but the recorder still shows the old image.&lt;br /&gt;
:The recorder doesn&#039;t show a live image of the device, but only a snapshot. After an action has been executed, the recorder will update automatically. However, it can happen, that the image has already been updated before the effects of the action are fully completed on the device. In this case you should update the recorder by hand using the icon with the blue arrows. Since expecco 20.2 you can also enable automatic updates for this case. See also the description for the [[#Recorder|recorder]].&lt;br /&gt;
&lt;br /&gt;
== Attribute &amp;quot;clickable&amp;quot; is wrong ==&lt;br /&gt;
An element has for the attribute/property &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; the value &amp;quot;&#039;&#039;false&#039;&#039;&amp;quot;, but is actually clickable.&lt;br /&gt;
:The attribute &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; has to be set explicitly by the app developer and does not affect the behavior of the app. You should generally disregard this attribute in your tests. Unfortunately, many apps exist where the programmer was &amp;quot;lazy&amp;quot; about this.&lt;br /&gt;
&lt;br /&gt;
==Connecting Fails==&lt;br /&gt;
If the connection to the Appium server fails, you will receive an error message in expecco similar to the one shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:MobileTestingVerbindungsfehler.png]]&lt;br /&gt;
&lt;br /&gt;
Here you can see the type of error that has occurred. Click on &amp;quot;&#039;&#039;Details&#039;&#039;&amp;quot; to get more information. Possible errors are:&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.remote.UnreachableBrowserException&#039;&#039;&lt;br /&gt;
:The specified server is not running or is not reachable. Check the server address.&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.WebDriverException&#039;&#039;&lt;br /&gt;
:Read the message after &#039;&#039;Original Error&#039;&#039; in the first line of the details:&lt;br /&gt;
:*&#039;&#039;Unknown device or simulator UDID&#039;&#039;&lt;br /&gt;
::Either the device is not connected properly or the udid is not correct.&lt;br /&gt;
:*&#039;&#039;Unable to launch WebDriverAgent because of xcodebuild failure: xcodebuild failed with code 65&#039;&#039;&lt;br /&gt;
::This error can have various causes. Either the WebDriverAgent could actually not be built because the signing settings are wrong or the appropriate provisioning profile is missing. Please read the section about [[#Signing|Signing]].  It is also possible that the WebDriverAgent cannot be started on the device, for example because an alert is in the foreground or you did not trust the developer.&lt;br /&gt;
:*&#039;&#039;Could not install app: &#039;Command &#039;ios-deploy [...] exited with code 253&#039;&#039;&#039;&lt;br /&gt;
::The specified app cannot be installed on the iOS device because it is not entered in the app&#039;s Provisioning Profile.&lt;br /&gt;
:*&#039;&#039;Bad app: [...] App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name.&#039;&#039;&lt;br /&gt;
::The path to the app is wrong. Make sure that the file is located in the specified path on your Mac.&lt;br /&gt;
:*&#039;&#039;packageAndLaunchActivityFromManifest failed.&#039;&#039;&lt;br /&gt;
::The specified &#039;&#039;apk&#039;&#039; file is probably broken.&lt;br /&gt;
:*&#039;&#039;Could not find app apk at [...]&#039;&#039;&lt;br /&gt;
::The path to the app is wrong. Make sure that the &#039;&#039;apk&#039;&#039; file is located in the specified path.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the error is not due to one of the causes listed above, the automation applications on the device may no longer function properly. In this case it helps to uninstall them from the mobile device. They are then automatically reinstalled the next time a connection is established.&lt;br /&gt;
&lt;br /&gt;
*For iOS devices, this is the WebDriverAgent, which you can simply uninstall from the home screen. This usually solves problems caused by changing the used Mac or the Xcode version.&lt;br /&gt;
&lt;br /&gt;
*For Android devices, it is the UIAutomator2; here, a problem occurs sporadically on some devices, the cause is currently unknown to us. To uninstall, on the device, navigate to &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;Applications&#039;&#039;&amp;quot;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; and search the list for the following entries:&lt;br /&gt;
    Appium Settings&lt;br /&gt;
    io.appium.uiautomator2.server&lt;br /&gt;
    io.appium.uiautomator2.server.test&lt;br /&gt;
:Click on the respective application and then on &amp;quot;&#039;&#039;Uninstall&#039;&#039;&amp;quot;.&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&#039;&#039;The corresponding entry may have a slightly different name on some devices.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If this doesn&#039;t help, check the output of the Appium server. For a server started by expecco, you can find the log in the list of [[#Running_Appium_Servers|Running Appium Servers]].&lt;br /&gt;
&lt;br /&gt;
==I do not have a Mac==&lt;br /&gt;
Maybe this site will help you: [https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10 https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin/en&amp;diff=29047</id>
		<title>Mobile Testing Plugin/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin/en&amp;diff=29047"/>
		<updated>2023-11-30T11:45:33Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Problems and Solutions */ first iOS connect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile_Testing_Plugin|Deutsche Version]] | &#039;&#039;&#039;English Version&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
With the &#039;&#039;Mobile Testing Plugin&#039;&#039; applications can be tested on Android and iOS devices. This includes both real and emulated devices. It does not matter whether real mobile devices or emulated devices are used. The plugin can (and usually is) used in conjunction with the [[Expecco_GUI_Tests_Extension_Reference|GUI-Browser]], which supports the creation of tests. It can also be used to record test procedures.&lt;br /&gt;
&lt;br /&gt;
[http://appium.io/ Appium] is used to connect to the devices. Appium is a free open source framework for testing and automating mobile applications.&lt;br /&gt;
&lt;br /&gt;
We recommend to go through the [[Mobile_Testing_Tutorial/en|Tutorial]] to familiarize yourself with the Mobile Plugin. This tutorial leads step by step through the creation of a test case using an example and explains the necessary basics.&lt;br /&gt;
&lt;br /&gt;
= Installation and Setup =&lt;br /&gt;
To use the &#039;&#039;Mobile Testing Plugin&#039;&#039;, you must have installed expecco together with the corresponding plugin, and you need the appropriate licenses. expecco communicates with the mobile devices via an Appium server, which either runs on the same computer as expecco, or on a second computer. This must be accessible for expecco.&lt;br /&gt;
&lt;br /&gt;
== Installation Overview ==&lt;br /&gt;
&#039;&#039;&#039;Computer running expecco:&#039;&#039;&#039;&lt;br /&gt;
* Java JDK version 8, 9, 10 or 11&lt;br /&gt;
&#039;&#039;&#039;Computer connected to Android devices :&#039;&#039;&#039;&lt;br /&gt;
* Appium Server, you can install it via the Mobile Testing Supplement (see below), of which we regularly provide a new version&lt;br /&gt;
* Android SDK, you can also get it with the Mobile Testing Supplement&lt;br /&gt;
* Java JDK version 8, 9, 10 or 11&lt;br /&gt;
&#039;&#039;&#039;Computer connected to iOS devices&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
* Appium Server, you can install it via the Mobile Testing Supplement for MacOS (see below), of which we regularly provide a new version&lt;br /&gt;
* Xcode in a version that supports the iOS version used, available from the Apple App Store&lt;br /&gt;
* Java JDK version 8, 9, 10 or 11&lt;br /&gt;
* Apple Developer Certificate incl. matching private key (to sign the WebDriverAgent)&lt;br /&gt;
* Provisioning Profile for the mobile devices to be used&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; Please note that due to the requirements (no connection to non-Apple devices available) iOS devices can only be controlled from a Mac.&lt;br /&gt;
&lt;br /&gt;
Depending on the setup, the above-mentioned computers can also be the same device. expecco can either connect to a remote Appium Server and mobile devices connected to it via the network, or start an Appium Server locally itself and use it with local mobile devices. However, some of expecco&#039;s functions that make it easier to create test cases are only available if the mobile devices are connected to the same computer on which expecco is running. A possible setup may therefore look like the following figure:&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAufbau.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
The following explains how to install Appium and other necessary applications for Windows and Mac OS.&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
The easiest way is to install everything from our Mobile Testing Supplement. However, newer versions do not contain a JDK anymore due to a change in Oracle&#039;s license terms, so you have to install it additionally. Of course, you are free to install Appium directly to use the version you want. However, to then be able to start an Appium server with expecco, a suitable batch file must be available and specified in the [[Mobile_Testing_Plugin/en#Plugin_Configuration|settings]]. However, connections can also be established to other running Appium servers.&lt;br /&gt;
*&#039;&#039;&#039;expecco 23.1&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-23.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.1]&lt;br /&gt;
:Same versions as in the predecessor, but the installer now allows to add Appium to the Autostart.&lt;br /&gt;
*expecco 22.2 and 22.1: [https://download.exept.de/transfer/h-expecco-22.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.2.0]&lt;br /&gt;
:Appium 1.22.3*&lt;br /&gt;
:Node 14.17.5&lt;br /&gt;
:adb 1.0.41 from platform-tools 33.0.2&lt;br /&gt;
:&#039;&#039;* We added the capability&#039;&#039; startChromedriverTimeout &#039;&#039;to Appium, to get a timeout earlier, if Chromedriver cannot be initialized. (see [[#startChromedriverTimeout|Problems and Solutions]])&#039;&#039;&lt;br /&gt;
*expecco 21.2: [https://download.exept.de/transfer/h-expecco-21.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.12.0.0]&lt;br /&gt;
:Contains Appium version 1.22.0, Node still is version 12.13.1.&lt;br /&gt;
*expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.1.0]&lt;br /&gt;
:Only minor changes compared to the previous version.&lt;br /&gt;
*expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.0.0]&lt;br /&gt;
:Compared to the previous version, Appium was updated to version 1.16.0-rc.1 and node 12 is used. &lt;br /&gt;
*expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.8.1.0]&lt;br /&gt;
:This installs Appium in the version 1.12.0 and now additionally contains build-tools in the version 28.0.3 in the android-sdk. Apart from this, it is the same as the previous version.&lt;br /&gt;
*expecco 18.2: [http://download.exept.de/transfer/h-expecco-18.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.7.3.0]&lt;br /&gt;
:This installs Appium in the version 1.8.1. In addition, an installation of &#039;&#039;Android Debug Bridge&#039;&#039; and &#039;&#039;Google USB Driver&#039;&#039; ([https://gsmusbdrivers.com/download/adb-fastboot-drivers/ adb-setup-1.4.3]) is offered. This covers drivers for a broad range of Android devices, and you won&#039;t have to install an individual driver for each device. A &#039;&#039;&#039;JDK is not contained anymore (due to a change in Oracle&#039;s license terms)&#039;&#039;&#039;, you have to download it on your own, e.g. from [https://www.oracle.com/technetwork/java/javase/downloads/index.html Oracle].&lt;br /&gt;
*expecco 18.1: same procedure as for expecco 2.11&lt;br /&gt;
*expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/MobileTestingSupplement_1.6.0.2_Setup.exe Mobile Testing Supplement 1.6.0.2]&lt;br /&gt;
:This installs a Java JDK Version 8, android-sdk and Appium Version 1.6.4. The supplement also offers a universal adb driver ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]). This driver supports a wide range of Android Devise, and avoids the need to search for individual device-specific drivers.&lt;br /&gt;
*expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_1.5.0.0_Setup.exe Mobile Testing Supplement 1.5.0.0]&lt;br /&gt;
:It installs a Java JDK version 8, android-sdk and Appium version 1.4.16. During the installation the graphical user interface of Appium is started, you can close this window immediately. The supplement also offers a universal adb driver (ClockworkMod). This combines drivers for a wide range of Android devices so that you do not have to search for and install a separate driver for each device.&lt;br /&gt;
&lt;br /&gt;
If expecco has to use mobile devices that are connected to another computer, you have to start an Appium server there. You can do this by using the file &amp;lt;code&amp;gt;appium_standalone.cmd&amp;lt;/code&amp;gt;. The server is then started on default port 4723. If you want to use a different port number, start the server with&lt;br /&gt;
&lt;br /&gt;
 appium_standalone.cmd -p &amp;lt;portnummer&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The server is ready, as soon as the line&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Appium REST http interface listener started on 0.0.0.0:4723&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
is displayed, where you can read the used port number at the end.&lt;br /&gt;
&lt;br /&gt;
If your Android device is connected to a remote machine,&lt;br /&gt;
you may want to see the live screen locally using a tool like&lt;br /&gt;
[https://github.com/Genymobile/scrcpy scrcpy].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When Appium is started for the first time – either standalone or by expecco – it may happen that the Windows firewall blocks access to the node server. Allow the access or Appium cannot be started.&lt;br /&gt;
&lt;br /&gt;
== Mac OS ==&lt;br /&gt;
Note: the following can be ignored if you do not plan to test iOS (iPhone) devices. The Mac setup is not needed for Android devices.&lt;br /&gt;
&lt;br /&gt;
=== Xcode ===&lt;br /&gt;
Automation with iOS devices needs [https://developer.apple.com/xcode/ Xcode]. You can install it from the App Store. Please make sure that the version matches the tested iOS versions.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;iOS&#039;&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp;  &lt;br /&gt;
|&#039;&#039;&#039;Xcode&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;macOS&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|10.x&lt;br /&gt;
|8.x&lt;br /&gt;
|10.12 (Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|11.x&lt;br /&gt;
|9.x&lt;br /&gt;
|10.13 (High Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|12.x&lt;br /&gt;
|10.x&lt;br /&gt;
|10.14 (Mojave)&lt;br /&gt;
|-&lt;br /&gt;
|13.x&lt;br /&gt;
|11.x&lt;br /&gt;
|10.15 (Catalina)&lt;br /&gt;
|-&lt;br /&gt;
|14.x&lt;br /&gt;
|12.x&lt;br /&gt;
|11.0 (Big Sur)&lt;br /&gt;
|-&lt;br /&gt;
|15.x&lt;br /&gt;
|13.x&lt;br /&gt;
|12.0 (Monterey)&lt;br /&gt;
|-&lt;br /&gt;
|16.x&lt;br /&gt;
|14.x&lt;br /&gt;
|12.5 (Monterey)&lt;br /&gt;
|}&lt;br /&gt;
This table is only a simplified overview, better see [https://xcodereleases.com/ Xcode releases] or [https://en.wikipedia.org/wiki/Xcode#Version_comparison_table Xcode versions] for the exact versions. For new iOS minor versions, there is usually also a new release of Xcode, e.g. for iOS 10.2 you need at least Xcode 8.2, for iOS 10.3 at least Xcode 8.3, etc. So if you are upgrading to a newer iOS version, you will usually need a newer Xcode version as well. Newer versions of Xcode may not run on older operating systems, which in turn may require an operating system upgrade. If you also want to test older iOS versions, it can be useful to install the corresponding Xcode versions in parallel.&lt;br /&gt;
&lt;br /&gt;
=== Appium ===&lt;br /&gt;
You can install Appium either as command-line tool or use it with [https://github.com/appium/appium-desktop Appium Desktop], which provides a GUI to start the server. Meanwhile there is also Appium 2.0, which is not tested with expecco yet and therefore not recommended to use.&lt;br /&gt;
&lt;br /&gt;
==== Appium Desktop ====&lt;br /&gt;
Download the newest version of [https://github.com/appium/appium-desktop/releases/ Appium Desktop]. For the Mac, it is best to take the dmg file and install it to the applications. When starting &#039;&#039;Appium Server GUI&#039;&#039; you will probably get the error message, that it is not possible for security reasons. In this case, open the context menu of the app file (right click or Ctrl + click) and choose &#039;&#039;Open&#039;&#039; there. Then confirm that you really want to open the application. From now on you can open the application normally.&lt;br /&gt;
&lt;br /&gt;
[[Datei:OpenAppiumServerGUI1.png|text-top]] [[Datei:OpenAppiumServerGUI2.png|text-top]]&lt;br /&gt;
&lt;br /&gt;
Since Xcode 14 there are problems with signing the WebDriverAgent, which Appium loads on the device for the automation. This means that no connection is possible with version 1.22.3-4 of Appium Desktop. In newer versions of WebDriverAgent, this problem is solved, but currently there is no version of Appium Desktop using such a new version (as of November 2022). However, you can manually download a new version (e.g. 4.10.2) and replace the files in Appium. To do this, download one of the two archive files (zip or tar.gz) containing the source code from the [https://github.com/appium/WebDriverAgent/releases/ WebDriverAgent download page]. Then open and extract this file. Copy the contents of the folder &#039;&#039;WebDriverAgent-4.10.2&#039; to&lt;br /&gt;
&lt;br /&gt;
 /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
If you navigate there by Finder, make a context click (right click or Ctrl + click) on the application and choose &#039;&#039;Show Package Contents&#039;&#039; from the menu. Replace all files that are already present with the same name.&lt;br /&gt;
&lt;br /&gt;
==== Install Appium using npm ====&lt;br /&gt;
You can install Appium using npm (Node Package Manager) as well. To do this, you have to install node/npm first. This can be done using [https://github.com/nvm-sh/nvm nvm] (Node Version Manager), which you can get on Github. If the following installation instructions should not work for you, you will find detailed information in the [https://github.com/nvm-sh/nvm#readme Readme] there.&lt;br /&gt;
&lt;br /&gt;
Open a Terminal window. Then clone the Github repository of nvm&lt;br /&gt;
 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash&lt;br /&gt;
and load it&lt;br /&gt;
 export NVM_DIR=&amp;quot;$([ -z &amp;quot;${XDG_CONFIG_HOME-}&amp;quot; ] &amp;amp;&amp;amp; printf %s &amp;quot;${HOME}/.nvm&amp;quot; || printf %s &amp;quot;${XDG_CONFIG_HOME}/nvm&amp;quot;)&amp;quot; [ -s &amp;quot;$NVM_DIR/nvm.sh&amp;quot; ] &amp;amp;&amp;amp; \. &amp;quot;$NVM_DIR/nvm.sh&amp;quot; # This loads nvm&lt;br /&gt;
&lt;br /&gt;
Then execute&lt;br /&gt;
 command -v nvm&lt;br /&gt;
to see if it works. It should print &#039;&#039;nvm&#039;&#039;. If there is no response, execute&lt;br /&gt;
 touch ~/.zshrc&lt;br /&gt;
and try again.&lt;br /&gt;
&lt;br /&gt;
Now you can install node with the following command.&lt;br /&gt;
 nvm install 16.15.1&lt;br /&gt;
As there are problems installing Appium using the newest version of node, we recommend this version.&lt;br /&gt;
&lt;br /&gt;
After node is installed, you can use it to install Appium:&lt;br /&gt;
 npm install -g appium&lt;br /&gt;
&lt;br /&gt;
The Appium server now simply can be started with the command&lt;br /&gt;
 appium&lt;br /&gt;
The output will then be written directly to the terminal.&lt;br /&gt;
&lt;br /&gt;
This version also has problems with signing the WebDriverAgent, like explained in [[#Appium_Desktop | Appium Desktop]]. Therefore download a newer version of WebDriverAgent in this case as well and replace the old files. You will find them at&lt;br /&gt;
 /Users/&amp;lt;user&amp;gt;/.nvm/versions/16.15.1/lib/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
==== Mobile Testing Supplement ====&lt;br /&gt;
We provide older versions of Appium via the Mobile Testing Supplement for Mac OS, with which you can easily install it:&lt;br /&gt;
* &#039;&#039;&#039;expecco 20.2&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-20.2.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement for Mac OS (1.2.2)]&lt;br /&gt;
:Contains Appium version 1.18.3 and uses node 14.&lt;br /&gt;
&lt;br /&gt;
* expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement for Mac OS (1.2.0)]&lt;br /&gt;
:Only a few changes compared to the previous version.&lt;br /&gt;
&lt;br /&gt;
* expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement_for_MacOS.tar.bz2 Mobile Testing Supplement for Mac OS (1.1.98)]&lt;br /&gt;
:Appium is updated to version 1.16.0-rc.1 and node 12 is used.&lt;br /&gt;
&lt;br /&gt;
* expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.96.tar.bz2 Mobile Testing Supplement for Mac OS (1.1.96)]&lt;br /&gt;
:This version contains Appium 1.12.0.&lt;br /&gt;
&lt;br /&gt;
* expecco 18.1: [http://download.exept.de/transfer/h-expecco-18.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.94.tar.bz2 Mobile Testing Supplement for Mac OS (1.1.94)]&lt;br /&gt;
:This version contains Appium 1.8.0.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.11:[http://download.exept.de/transfer/h-expecco-2.11.1/Mobile_Testing_Supplement_for_Mac_OS_1.0.94.tar.bz2 Mobile Testing Supplement for Mac OS (1.0.94)]&lt;br /&gt;
:This version contains Appium 1.6.4.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_for_Mac_OS_1.0.tar.bz2 Mobile Testing Supplement for Mac OS]&lt;br /&gt;
:Diese Version entält Appium 1.4.16.&lt;br /&gt;
&lt;br /&gt;
After you have downloaded the supplement, you can move it to a directory of your choice (e.g. your home directory) and unpack it there. A suitable command in a shell could look like this, adjust the version number accordingly:&lt;br /&gt;
&lt;br /&gt;
 tar -xvpf Mobile_Testing_Supplement_for_Mac_OS_1.1.98.tar.bz2&lt;br /&gt;
&lt;br /&gt;
If your default Xcode installation is the one you want to use, you can start Appium directly from the file in the &#039;&#039;bin&#039;&#039; directory with the appropriate version number:&lt;br /&gt;
&lt;br /&gt;
 Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
If you want to use another Xcode than the one configured as default, you have to tell Appium the corresponding path by using the environment variable &#039;&#039;DEVELOPER_DIR&#039;&#039;. For example, if you have installed Xcode in &#039;&#039;/Applications/Xcode-11.3.app&#039;&#039;, you can start Appium this way:&lt;br /&gt;
&lt;br /&gt;
 DEVELOPER_DIR=&amp;quot;/Applications/Xcode-11.3.app/Contents/Developer&amp;quot; Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
To find out what is set as the default Xcode installation on your system, use this command:&lt;br /&gt;
&lt;br /&gt;
 xcode-select -p&lt;br /&gt;
&lt;br /&gt;
If Appium cannot find your Xcode installation, a message like this appears:&lt;br /&gt;
&#039;&#039;&amp;lt;blockquote&amp;gt;org.openqa.selenium.SessionNotCreatedException - A new session could not be created. (Original error: Could not find path to Xcode, environment variable DEVELOPER_DIR set to: /Applications/Xcode.app but no Xcode found)&amp;lt;/blockquote&amp;gt;&#039;&#039;&lt;br /&gt;
In such a case, restart Appium by specifying a valid &#039;&#039;DEVELOPER_DIR&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Signing WebDriverAgent ====&lt;br /&gt;
For automation, Appium installs an App called WebDriverAgent on the device and therefore has to be able to sign it. You need an Apple account and a respective certificate for this. For evaluation you can use a free account. This has the disadvantage that created profiles are only valid for one week and must be recreated afterwards. Also be careful when sharing the account, as certificates may be revoked or invalidated by automatic generation. As a result, apps that have already been signed can no longer be used.&lt;br /&gt;
&lt;br /&gt;
If you already have a respective certificate and its associated private key in your keychain on the Mac, you can have the WebDriverAgent automatically signed. If not, it is recommended to set and manage the signing using Xcode.&lt;br /&gt;
&lt;br /&gt;
First, connect the device you want to use to your Mac via USB. Make sure both the Mac and the device are in the same network or there will be problems when connection with Appium. Start Xcode and open &#039;&#039;Preferences&#039;&#039;. Go to the Accounts page and create an entry with your account. You can then click on &#039;&#039;Manage Certificates...&#039;&#039; to see the certificates that belong to that account. To run tests, you need an iOS Development Certificate and the associated private key. If you do not already have one, create one. If you already have one, but it is not in your keychain (indicated by &amp;quot;Not in Keychain&amp;quot;), you can import it. You can do that by the [https://support.apple.com/en-us/guide/keychain-access/welcome/mac keychain access] on your Mac, if you have exported it previously from the keychain, where it is stored. The certificate with the associated key should be in the keychain &#039;&#039;Login&#039;&#039;. It can be exported from there as PKCS#12 file (typical ending .p12). To import a certificate into your keychain, select the option &#039;&#039;Import objects&#039;&#039; from the &#039;&#039;File&#039;&#039; menu. If you don&#039;t know where the certificate is stored, you can also revoke it in Xcode and recreate it in your keychain. However, only do this if you know that the old certificate is no longer in use because it can no longer be used afterwards. Now the keychain should contain an iOS development certificate.&lt;br /&gt;
&amp;lt;!--(Den folgenden Teil braucht man wohl nicht mehr, wenn es in Xcode eingestellt ist)From the right-click menu, select Information. Under the details of the certificate you will find the Team ID, which is referred to here as the Organizational Unit. Enter it in the Team ID field of the plug-in&#039;s settings, see [[#Plugin_Configuration|Plugin Configuration]].--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now open the WebDriverAgent project in Xcode. If you have installed the Mobile Testing Supplement, you will find it in this directory at&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
If you have installed Appium Desktop, you will find it at&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;/Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You can use the Finder to navigate to the Xcode project file and open it by double clicking. Note, that you have to perform a context click (right click or Ctrl + click) on the Appium Server GUI app and select &#039;&#039;Show Package Contents&#039;&#039; in the menu, to get to its subdirectory.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingWebDriverAgentXcode.png]]&lt;br /&gt;
&lt;br /&gt;
Select &#039;&#039;WebDriverAgentLib&#039;&#039; and the page &#039;&#039;Signing &amp;amp; Capabilities&#039;&#039;. In the section &#039;&#039;Signing&#039;&#039; set the option &#039;&#039;Automatically manage signing&#039;&#039; and then select a team. Now switch to &#039;&#039;WebDriverAgentRunner&#039;&#039; and do the same there.&lt;br /&gt;
&amp;lt;!-- (The following seems to not be relevant anymore.) Here you should see errors indicating that no Provisioning Profiles have been created or found. Therefore, go to the &#039;&#039;Build Settings&#039;&#039; page and look for the entry &#039;&#039;Product Bundle Identifier&#039;&#039; in the &#039;&#039;Packaging&#039;&#039; section. Change this from com.facebook.WebDriverAgentRunner to something Xcode accepts by changing the prefix. Xcode can now generate a matching Provisioning Profile and the errors on the General page should disappear. After that you can quit Xcode. --&amp;gt;&lt;br /&gt;
By setting the team, the errors showing up for WebDriverAgentRunner should disappear. If Xcode should not be able to create a Provisioning Profile matching the Bundle ID &#039;&#039;com.facebook.WebDriverAgentRunner&#039;&#039;, you can edit the latter so that it fits your certificate. After that you can quit Xcode or you can, like explained further below, directly start the build in Xcode, so the project will be already built when Appium wants to use it.&lt;br /&gt;
&lt;br /&gt;
If you now connect to your device from expecco, the WebDriverAgent will be installed and started on it and then switch to the app to be tested. You may still have to trust the execution of the WebDriverAgent on the device. It maybe a sign that you have to do this, if the app WebDriverAgent first appears on the device and tries to start, but then is uninstalled again. To trust the execution, open the settings during the connection setup on the device and then the entry &#039;&#039;Device management&#039;&#039; under &#039;&#039;General&#039;&#039;. This entry is only visible if a developer app is installed on the device. You may therefore have to wait until the WebDriverAgent is installed before the entry appears. Select the entry of your Apple account and trust it. Since the WebDriverAgent will be uninstalled again if the start did not work, you have to do this during the connection setup. If this is too hectic for you, you can also execute the following code:&lt;br /&gt;
&lt;br /&gt;
 xcodebuild -project Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
 xcodebuild -project /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&lt;br /&gt;
&lt;br /&gt;
This installs the WebDriverAgent on the device without deleting it again.&lt;br /&gt;
&lt;br /&gt;
If there are problems while installing the WebDriverAgent, you can also try and start the build in Xcode. Make sure the right target &#039;&#039;WebDriverAgent&#039;&#039; is selected. Error messages in Xcode might indicate easier what the problem is about. Sometimes it even helps to try for a second time, if it took too long for the first time and got aborted. It may occur, that you are asked several times during the build to enter the password for the keychain.&lt;br /&gt;
&lt;br /&gt;
[[Datei:WebDriverAgentCodesign.png]]&lt;br /&gt;
&lt;br /&gt;
Read also the documentation of Appium on [https://github.com/appium/appium-xcuitest-driver/blob/master/docs/real-device-config.md Setting up tests with iOS devices]. Refer to the [https://support.apple.com/en-us/HT204460 Apple documentation] for details on installing and trusting of apps.&lt;br /&gt;
&lt;br /&gt;
== Plugin Configuration ==&lt;br /&gt;
Before you start, please check the settings of the Mobile Testing Plugin and adjust them if necessary. Select the menu item &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Extensions&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot; (see fig.). By default, these paths are found automatically (1). To adjust a path manually, deactivate the corresponding check mark at the right. You&#039;ll see a drop-down list with some paths to choose from. If an entered path is wrong or cannot be found, the field is marked red and a message appears. Make sure that all paths are specified correctly.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingEinstellungen.png | thumb | 400px | Plugin Configuration]]&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;appium&#039;&#039;&#039;: Enter the path to the executable file with which Appium can be started in the command line. Under Windows this file will usually be called &amp;quot;&amp;lt;code&amp;gt;appium.cmd&amp;lt;/code&amp;gt;&amp;quot;. This path is used when expecco starts an Appium server.&lt;br /&gt;
*&#039;&#039;&#039;node&#039;&#039;&#039;: Enter the path to the executable that starts Node (also called (also called &amp;quot;Node.js&amp;quot;). This path is passed to Appium when a server is started so that Appium can find it independently of the PATH variable. Under Windows this file is usually called &amp;quot;&amp;lt;code&amp;gt;node.exe&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;JAVA_HOME&#039;&#039;&#039;: Enter the path to a JDK (Java Development Kit)here. This path is passed to each Appium server. Leave the field blank to use the value from the environment variable. To specify which Java should be used by expecco, set this path in the Java Bridge settings.&lt;br /&gt;
*&#039;&#039;&#039;ANDROID_HOME&#039;&#039;&#039;: Enter the path to an Android SDK here. This path is passed to each Appium server. Leave the field blank to use the value from the environment variable.&lt;br /&gt;
*&#039;&#039;&#039;adb&#039;&#039;&#039;: The path to the adb command. Under Windows the file is called &amp;quot;&amp;lt;code&amp;gt;adb.exe&amp;lt;/code&amp;gt;&amp;quot;. This file is used by expecco, for example, to get the list of connected devices. This path should be selected automatically, if the command is found in the ANDROID_HOME directory. This is also used by Appium. If expecco and Appium use different versions of adb, conflicts may occur.&lt;br /&gt;
*&#039;&#039;&#039;android.bat&#039;&#039;&#039;: This file is only needed to start the AVD and the SDK Manager, which deal with phone emulators. The file in the ANDROID_HOME directory will be selected automatically, if present there.&lt;br /&gt;
*&#039;&#039;&#039;aapt&#039;&#039;&#039;: The path to the &amp;quot;aapt&amp;quot; command here. Under Windows this file is called &amp;quot;&amp;lt;code&amp;gt;aapt.exe&amp;lt;/code&amp;gt;&amp;quot;. expecco uses &amp;quot;aapt&amp;quot; only in the connection editor to read the package and activities of an &amp;quot;apk&amp;quot; file. The file in the ANDROID_HOME directory will be selected automatically, if present there.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingJavaBridgeEinstellungen.png | thumb | 400px | JDK Configuration]]&lt;br /&gt;
&lt;br /&gt;
Starting with expecco 2.11, there is an additional field called &#039;&#039;Team ID&#039;&#039;. If you run iOS tests, enter the Team ID of your certificate here. This is used for every iOS connection, unless you change the value in the connection settings in individual cases. For information on how to obtain the team ID, please refer to the section on [[#Signing| signing]] for installations on Mac OS. With expecco 2.10 and older, you can only enter the Team ID as capability for each connection setting separately. However, you must use the [[#Extended_View|extended view]] to do this. Enter the capability &#039;&#039;xcodeOrgId&#039;&#039; here and set the Team ID of the certificate as value.&lt;br /&gt;
&lt;br /&gt;
The server address setting at the bottom of the page refers to the behavior of the connection editor. It checks at the end whether the server address ends in &#039;&#039;/wd/hub&#039;&#039; as this is the usual form. If not, a dialog asks how to react. The defined behavior can be viewed and changed here.&lt;br /&gt;
&lt;br /&gt;
Also switch to the entry &#039;&#039;Java Bridge&#039;&#039; (see figure). Here you have to specify the path to your Java installation, which is used by expecco. Enter a JDK here. If you want to use the one from the Mobile Testing Supplement under Windows, the path is&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;C:\Program Files (x86)\exept\Mobile Testing Supplement\jdk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can also use the system settings.&lt;br /&gt;
&lt;br /&gt;
== Prepare Android Device ==&lt;br /&gt;
If you connect an Android device under Windows, you may still need an adb driver for the device. You can usually find a suitable driver on the manufacturer&#039;s website. If you have installed the universal driver from the Mobile Testing Supplement, everything should already work for most devices. In some cases, Windows will automatically try to install a driver when you connect the device for the first time. &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Attention&#039;&#039;&#039;: Before you can control a mobile device with the Appium plugin, you have to allow this debugging!&lt;br /&gt;
&lt;br /&gt;
For Android devices, you can find this option in the settings under &#039;&#039;[https://developer.android.com/studio/debug/dev-options Developer Options]&#039;&#039; called &#039;&#039;USB-Debugging&#039;&#039;. If the developer options are not displayed, you can unlock them by tapping Build Number seven times in About the Phone.&lt;br /&gt;
&lt;br /&gt;
Also enable the &#039;&#039;Stay awake&#039;&#039; feature to prevent the device from turning off the screen during test creation or execution.&lt;br /&gt;
&lt;br /&gt;
For security reasons, USB debugging must be allowed for each computer individually. When connecting the device to the PC via USB, you must agree to the connection on the device. If you haven&#039;t done this for your computer yet, but no corresponding dialog appears on the device, it may help to unplug and reconnect the device. This can happen especially if you have installed the ADB driver while the device was already connected via USB. If this doesn&#039;t help either, open the notifications by dragging them from the top of the screen. There you will find the USB connection and you can open the options. Select another type of connection; usually MTP or PTP should work.&lt;br /&gt;
&lt;br /&gt;
You can also test on an emulator. It does not need to be prepared separately, as it is already designed for USB debugging. It is even possible to start an emulator at the beginning of the test.&lt;br /&gt;
&lt;br /&gt;
To check if a device you have connected to your computer can be used, open the [[#Connection_Editor|connection editor]]. The device should be displayed there.&lt;br /&gt;
&lt;br /&gt;
=== Connection via WLAN ===&lt;br /&gt;
It is possible to connect to Android devices via Wireless LAN. For devices using Android 11 or newer, this can be done wirelessly, else you have to connect initially via USB. Since expecco 22.1, WiFi connections can be established using the [[Mobile_Testing_Plugin/en#Connection_Editor|Connection Editor]]. It is also possible to do this using a command window.&lt;br /&gt;
==== Wireless Connect (Android 11) ====&lt;br /&gt;
In the developer options of your device, enable wireless debugging and open its options. You initially have to pair your machine with the device. To do this, choose &amp;quot;&#039;&#039;Pair device with pairing code&#039;&#039;&amp;quot; to get a pairing code and an IP address with port. Then open a command window (terminal window) on your machine and enter:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb pair &amp;lt;Device IP Address&amp;gt;:&amp;lt;Pairing Port&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
where &amp;lt;tt&amp;gt;&amp;lt;Device IP Address&amp;gt;:&amp;lt;Pairing Port&amp;gt;&amp;lt;/tt&amp;gt; is the IP address and port as shown on the device. After that, you will be asked for the pairing code. If everything went right, the popup on the device should have closed and your machine is added to the list of paired devices. Then enter at the command window:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;Device IP Address&amp;gt;:&amp;lt;Debugging Port&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The IP address is the same as for pairing, but the port is different. Both are shown as IP address &amp;amp; Port on the device. The device should now be connected via WLAN and can be used in the same way as with a USB connection. You can check this by entering &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; or open the connection dialog in expecco. In the list, the device appears with its IP address and port. Remember that the WLAN connection no longer exists when the ADB server or the device is restarted. Restarting the device often disables wireless debugging and the used port is changed. The pairing, however, is permanent and has not to be done again the next time you connect.&lt;br /&gt;
==== Start via USB ====&lt;br /&gt;
First, connect your device via USB. Then open a command window (terminal window) and enter:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The device listens for a TCP/IP connection on port 5555. If you have several devices connected or emulators running, you have to specify which device you mean. Enter in this case:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb devices -l&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
to get a list of all devices, where the first column gives the device&#039;s ID.&lt;br /&gt;
Then, enter:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb -s &amp;lt;deviceID&amp;gt; tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
with the device identification of the desired device. You can now disconnect the USB connection.&amp;lt;br&amp;gt;Now you have to find out the IP address of your device. You can usually find it somewhere in the device&#039;s settings, for example in the Status or WLAN settings of the phone. Then type in:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP address of device&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The device should now be connected via WLAN and can be used in the same way as with a USB connection. You can check this by entering &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; again or open the connection dialog in expecco. In the list, the device appears with its IP address and port. Remember that the WLAN connection no longer exists when the ADB server or the device is restarted.&lt;br /&gt;
&lt;br /&gt;
== Preparing an iOS-Device and App ==&lt;br /&gt;
Control of iOS devices is only possible via a Mac. Please also read the section [[#Mac_OS|Installation under Mac OS]].&lt;br /&gt;
&lt;br /&gt;
Before you can control a mobile device with the Mobile Testing Plugin, you must allow debugging for iOS devices with iOS 8 or higher. Activate the option &amp;quot;&#039;&#039;Enable UI Automation&#039;&#039;&amp;quot; under the &amp;quot;&#039;&#039;Developer&#039;&#039;&amp;quot; menu in the device settings.&amp;lt;br&amp;gt;If you cannot find the &amp;quot;&#039;&#039;Developer&#039;&#039;&amp;quot; entry in the settings, proceed as follows: Connect the device to the Mac via USB. If necessary, you must still agree to the connection on the device. Start Xcode and then select &amp;quot;&#039;&#039;Devices&#039;&#039;&amp;quot; from the menu bar at the top of the screen in the &amp;quot;&#039;&#039;Window&#039;&#039;&amp;quot; menu. A window opens in which a list of the connected devices is displayed. Select your device there. Then the entry &amp;quot;&#039;&#039;Developer&#039;&#039;&amp;quot; should appear in the settings on the device. You may have to exit the settings and restart.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Alert.png | thumb | 270px | Alert unter iOS]]&lt;br /&gt;
It is not possible to establish a connection to the device as long as it shows certain alerts. Such an alert may appear if FaceTime is activated (by displaying a message about SMS charges as shown in the screenshot). Be sure to configure the device so that it does not show such alerts when idle.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.11 and later ===&lt;br /&gt;
You can test any app which is executable or already installed on the device used. If the app is available as a development build, the UDID of the device must be stored in the app. In any case, the WebDriverAgent must be signed for the device. Please read the section about [[#Signing|signing]] under Mac OS.&lt;br /&gt;
&lt;br /&gt;
If you want to use the Home button in a test, you must activate &amp;quot;AssistiveTouch&amp;quot; on the device. You will find this option in the settings under &amp;quot;&#039;&#039;General&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;Operating Help&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;AssistiveTouch&#039;&#039;&amp;quot;. Then place the menu in the middle of the upper edge of the screen. You can then record pressing the Home button with the corresponding menu entry in the recorder or use the &amp;quot;&#039;&#039;Press Home Button&#039;&#039;&amp;quot; block directly.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.10 ===&lt;br /&gt;
The app you want to use must be available as a development build. The UDID of the device must also be stored in the app.&lt;br /&gt;
&lt;br /&gt;
=== Sign the development build ===&lt;br /&gt;
A development build of an app is only allowed for a limited number of devices and cannot be started on other devices. However, it is possible to exchange the certificate and the usable devices in a development build.&lt;br /&gt;
&lt;br /&gt;
* Evaluation with demo app of eXept:&lt;br /&gt;
:We will be happy to provide you with a demo app which is available as a development build and which we can sign for your device. Please send the UDID of your device to your eXept contact person. How to determine the UDID of your device is described in the following section.&lt;br /&gt;
&lt;br /&gt;
* Using your own app for your test device:&lt;br /&gt;
:If you receive a development build (IPA file) from the app developers that is approved for your test device, you can use it directly. To do this, you must tell the developers the UDID of your device so they can enter it. &#039;&#039;&#039;You can use Xcode to read the UDID of a device&#039;&#039;&#039;. Start Xcode and select &#039;&#039;Devices&#039;&#039; from the menu bar at the top of the screen in the &#039;&#039;Window&#039;&#039; menu. A window opens in which a list of the connected devices is displayed. Select your device and search for the &#039;&#039;Identifier&#039;&#039; entry in Properties. The UDID is a 40-digit hexadecimal number.&lt;br /&gt;
&lt;br /&gt;
* Externally developed app for your test device:&lt;br /&gt;
:You can also re-sign apps to make them run on other devices. However, this process is complicated and requires access to an Apple Developer account. A documentation on the procedure is currently in preparation.&lt;br /&gt;
&lt;br /&gt;
:For the evaluation we will gladly support you with the re-signing of your app..&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Log in to the [https://developer.apple.com/ Apple-Webinterface]. Navigate to &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039;. If necessary, create a Developer Certificate and a Provisioning Profile for your device here and download both. If you don&#039;t have a Developer Account yet, create one here: https://developer.apple.com/enroll/. For this you have to register with an Apple-ID.&lt;br /&gt;
&lt;br /&gt;
# Find out Team ID (&#039;&#039;Membership&#039;&#039; -&amp;gt; &#039;&#039;Team ID&#039;&#039;)&lt;br /&gt;
# Under &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039; select development certificate (under &#039;&#039;+&#039;&#039; create, if not available) and download&lt;br /&gt;
# Under &#039;&#039;App ID&#039;&#039; create Wildcard App ID, if not present. Note App ID (AppID = Prefix.ID)&lt;br /&gt;
# Add device, find out UDID (or &#039;&#039;Identifier&#039;&#039;) of the device (&#039;&#039;Xcode&#039;&#039; -&amp;gt; &#039;&#039;Window&#039;&#039; (above in menu bar) -&amp;gt; &#039;&#039;Devices&#039;&#039;)&lt;br /&gt;
# Create commission profiles: &#039;&#039;iOS App Development&#039;&#039; -&amp;gt; Select &#039;&#039;AppID&#039;&#039; -&amp;gt; Select certificate -&amp;gt; Select device -&amp;gt; Create profile name -&amp;gt; Download provisioning profiles.&lt;br /&gt;
# Import the downloaded certificate (&#039;&#039;Downloads&#039;&#039; -&amp;gt; Certificate (.cer)&lt;br /&gt;
# Copy SHA1 fingerprint. Right click on Certificate -&amp;gt; &#039;&#039;Information&#039;&#039;, then scroll to the bottom of the page).&lt;br /&gt;
# Create Entitlements.plist (&#039;&#039;Open Terminal&#039; -&amp;gt; Downloads/Mobile_Testing_Supplement/bin/gen-entitlements_plist &#039;Team-ID&#039; &#039;App ID&#039; Downloads/Mobile_Testing_Supplement/bin/re-sign-ipa &amp;lt;path to ipa (z.B. Downloads/expeccoMobileDemo.ipa)&amp;gt; \&lt;br /&gt;
&amp;quot;&amp;lt;Zertifikat (SHA1-Fingerabdruck, z.B. 76 E8 4B E8 78 D5 D7 F9 2E 09 8B D7 E8 FB CE 30 0C F5 D0 EF)&amp;gt;&amp;quot; \&lt;br /&gt;
&amp;lt;Path to Commission Profile (e.g. /Users/exept_test/Downloads/dut.mobileprovision)&amp;gt; \&lt;br /&gt;
&amp;lt;Path for the result ipa (z.B. Downloads/expeccoMobileDemo_re-signed.ipa)&amp;gt; \&lt;br /&gt;
[Pfad zur entitlements.plist] (z.B. /Users/exept_test/entitlements.plist)&lt;br /&gt;
&lt;br /&gt;
To re-sign, you can use the corresponding script from the Mobile Testing Supplement for Mac OS or any other tool (e.g. isign).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more information about using iOS devices, see also the &lt;br /&gt;
[http://appium.io/slate/en/master/?java#appium-on-real-ios-devices Appium documentation].&lt;br /&gt;
&lt;br /&gt;
=== Native iOS-Apps ===&lt;br /&gt;
You can also use apps that are already natively present on the device. To do this, you must know their bundle ID and then enter it in the connection settings. Here is a small selection of common apps:&lt;br /&gt;
{| style=&amp;quot;text-align:left&amp;quot;&lt;br /&gt;
! App&lt;br /&gt;
!&lt;br /&gt;
! Bundle-ID&lt;br /&gt;
|-&lt;br /&gt;
| App Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.AppStore&lt;br /&gt;
|-&lt;br /&gt;
| Calculator&lt;br /&gt;
| &lt;br /&gt;
| com.apple.calculator&lt;br /&gt;
|-&lt;br /&gt;
| Calendar&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilecal&lt;br /&gt;
|-&lt;br /&gt;
| Camera&lt;br /&gt;
| &lt;br /&gt;
| com.apple.camera&lt;br /&gt;
|-&lt;br /&gt;
| Contacts&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileAddressBook&lt;br /&gt;
|-&lt;br /&gt;
| iTunes Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileStore&lt;br /&gt;
|-&lt;br /&gt;
| Mail&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilemail&lt;br /&gt;
|-&lt;br /&gt;
| Maps&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Maps&lt;br /&gt;
|-&lt;br /&gt;
| Messages&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileSMS&lt;br /&gt;
|-&lt;br /&gt;
| Phone&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilephone&lt;br /&gt;
|-&lt;br /&gt;
| Photos&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobileslideshow&lt;br /&gt;
|-&lt;br /&gt;
| Settings&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Preferences&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
You can find further Bundle-IDs [https://github.com/joeblau/apple-bundle-identifiers here].&lt;br /&gt;
&lt;br /&gt;
= Examples =&lt;br /&gt;
In the demo test suites for expecco you will also find examples for tests with the Mobile Testing Plugin. To do this, select the option &amp;quot;&#039;&#039;Example from File&#039;&#039;&amp;quot; on the start screen and open the folder named &amp;quot;&#039;&#039;mobile&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;TestsuiteMobileTestingDemo&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m01_MobileTestingDemo.ets --&amp;gt;&amp;lt;/span&amp;gt; &#039;&#039;m01_MobileTestingDemo.ets&#039;&#039; ==&lt;br /&gt;
The test suite contains two simple test plans: &amp;quot;&#039;&#039;Simple CalculatorTest&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Complex Calculator and Messaging Test&#039;&#039;&amp;quot;. Both tests use an Android emulator, which you must start before starting. The apps used in the test are part of the basic equipment of the emulator and therefore no longer need to be installed. Since the apps may differ under every Android version, it is important that your emulator runs under Android 6.0. In addition, the language must be set to English.&lt;br /&gt;
&lt;br /&gt;
; Simple CalculatorTest&lt;br /&gt;
: This test connects to the calculator and enters the formula &#039;&#039;2+3&#039;&#039;. The result of the calculator is compared with the expected value &#039;&#039;5&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; Complex Calculator and Messaging Test&lt;br /&gt;
: This test connects to the calculator and then opens the message service. There it waits for an incoming message from the number &#039;&#039;15555215556&#039;&#039;, in which a formula to be calculated is sent. The message is generated before via a socket at the emulator. When the message arrives, it is opened by the test and its contents are read. Then the calculator is opened again, the received formula is entered and the result is read. The test then switches back to the message service and sends the result as an answer.&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;m02_expeccoMobileDemo.ets&#039;&#039; und &#039;&#039;m03_expeccoMobileDemoIOS.ets&#039;&#039; ==&lt;br /&gt;
These are part of the tutorial for the Mobile Testing Plugin. The included test case is incomplete and will be added during the tutorial. Please read the section [[#Tutorial|Tutorial]].&lt;br /&gt;
&lt;br /&gt;
= Tutorial =&lt;br /&gt;
There is a tutorial describing the basic procedure for creating tests with the Mobile Testing Plugin. It is based on a supplied example consisting of a simple app and an expecco test suite.&lt;br /&gt;
&lt;br /&gt;
You find it on the page [[Mobile_Testing_Tutorial/en|Mobile Testing Tutorial]] in two versions for Android and iOS devices.&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsAndroid&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m02_expeccoMobileDemo.ets --&amp;gt;&amp;lt;/span&amp;gt; [[Mobile_Testing_Tutorial/en#First_steps_with_Android|First steps with Android]]&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsIOS&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m03_expeccoMobileDemoIOS.ets --&amp;gt;&amp;lt;/span&amp;gt; [[Mobile_Testing_Tutorial/en#First_steps_with_iOS|First steps with iOS]]&lt;br /&gt;
&lt;br /&gt;
= Dialogs of the Mobile Testing Plugin =&lt;br /&gt;
== Connection Editor ==&lt;br /&gt;
You can use the Connection Editor to quickly define, change, or establish connections. Depending on the task, the dialog has small differences and is opened differently:&lt;br /&gt;
*If you want to establish a connection, access the dialog in the GUI browser by clicking on &#039;&#039;Connect&#039;&#039; and then selecting &#039;&#039;Mobile Testing&#039;&#039;.&lt;br /&gt;
*To change or copy an existing connection in the GUI browser, select it, right-click and select &#039;&#039;Edit Connection&#039;&#039; or &#039;&#039;Copy Connection&#039;&#039; from the context menu.&lt;br /&gt;
*If you do not want to create connection settings for the GUI browser but for use in a test, choose &#039;&#039;Create Connection Settings&#039;&#039; from the Mobile Testing Plugin menu.... This only allows you to create the settings for a connection without creating a connection in the GUI browser.&lt;br /&gt;
&lt;br /&gt;
The Connection Editor menu has several buttons, some of which are only visible when creating connection settings:&lt;br /&gt;
[[Datei:MobileTestingVerbindungseditorMenu.png]]&lt;br /&gt;
#&#039;&#039;Delete Settings&#039;&#039;: Resets all entries. (Only visible when creating settings.)&lt;br /&gt;
#&#039;&#039;Load settings from file&#039;&#039;: Allows to open a saved settings file (*.csf). Its settings are transferred to the dialog. Entries already made without conflict are retained.&lt;br /&gt;
#&#039;&#039;Load settings from attachment&#039;&#039;: Allows you to open an attachment with connection settings from an open project. These settings are applied to the dialog. Entries already made without conflict are retained.&lt;br /&gt;
#&#039;&#039;Save settings to file&#039;&#039; and&lt;br /&gt;
#&#039;&#039;Save settings to attachment&#039;&#039;: Here you can save the entered settings to a file (*.csf) or create them as an attachment in an open project. Both options have a delayed menu in which you can choose to save only a certain part of the settings. (Only visible when creating settings.)&lt;br /&gt;
#&#039;&#039;Advanced View&#039;&#039;: Allows you to switch to the advanced view to make additional settings. Read more about this at the end of this chapter. (Only visible when creating settings.)&lt;br /&gt;
#&#039;&#039;Help&#039;&#039;: A help text for the respective step is shown or hidden on the right side.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The dialog is divided into three steps. In the first step you select the device you want to use, in the second step you select which App should be used and in the last step the settings for the Appium server are made.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep1&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Step 1: Select Device ===&lt;br /&gt;
In the upper part you will see a list of all connected Appium devices that are detected. With the checkbox below you can hide devices that are detected but not ready. If you want to enter a device that is not connected, you can create it with the corresponding button &#039;&#039;Enter Android device&#039;&#039; or &#039;&#039;Enter iOS device&#039;&#039;. However, you need to know the required properties of your device. The device is then created in a second device list and can be selected there. If no list with connected elements can be displayed, various messages are displayed instead:&lt;br /&gt;
*No devices found&lt;br /&gt;
*:expecco could not find any Android devices.&lt;br /&gt;
*:To automatically configure a connection to a device, make sure&lt;br /&gt;
*:*it is connected&lt;br /&gt;
*:*it is turned on&lt;br /&gt;
*:*that it has an appropriate adb driver installed&lt;br /&gt;
*:*it is enabled for debugging (see below).&lt;br /&gt;
*No available devices found&lt;br /&gt;
*:expecco could not find any available Android devices. But not available ones were found, e.g. with the status &amp;quot;unauthorized&amp;quot;.&lt;br /&gt;
*:To configure a connection to a device automatically, make sure that &lt;br /&gt;
*:*it is connected&lt;br /&gt;
*:*it is turned on&lt;br /&gt;
*:*that it has an appropriate adb driver installed&lt;br /&gt;
*:*it is enabled for debugging (see below).&lt;br /&gt;
*:To view unavailable devices, enable this option below.&lt;br /&gt;
*Connection lost&lt;br /&gt;
*:expecco has lost the connection to the adb server. Try to re-establish the connection by clicking on the button.&lt;br /&gt;
*Connection failed&lt;br /&gt;
*:expecco could not connect to the adb server. Possibly it is not running or the specified path is not correct.&lt;br /&gt;
*:Check the adb configuration in the settings and try to start the adb server and establish a connection by clicking on the button.&lt;br /&gt;
*Connect ...&lt;br /&gt;
*:expecco connects to the adb server. This may take a few seconds.&lt;br /&gt;
*Start adb-Server ...&lt;br /&gt;
*:expecco starts the adb-Server. This may take a few seconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--With &#039;&#039;Automation by&#039;&#039; you can specify, which automation engine is to be used. If you leave the setting at &#039;&#039;(Default)&#039;&#039; the corresponding capability is not set at all. Otherwise Appium, Selendroid and from expecco 2.11 XCUITest are available. Selendroid is usually only used for Android devices prior to version 4.1.--&amp;gt;With &#039;&#039;Next&#039;&#039; you get to the next step. If you enter settings for the GUI browser, this is only possible once a device has been selected.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;UnlockingDeveloperOptions&amp;quot;&amp;gt;Note on unlocking&amp;lt;/span&amp;gt;: In newer Android versions the developer options are no longer offered in the settings at first. If your Android device does not show an entry for &amp;quot;&#039;&#039;Developer options&#039;&#039;&amp;quot; in the settings, first select the entry &amp;quot;&#039;&#039;Phone info&#039;&#039;&amp;quot;, then &amp;quot;&#039;&#039;SoftwareVersionsInfo&#039;&#039;&amp;quot; and click on the entry &amp;quot;&#039;&#039;BuildVersion&#039;&#039;&amp;quot; several times.&lt;br /&gt;
&lt;br /&gt;
==== Manage Chromedrivers ====&lt;br /&gt;
If the App you want to automate uses WebViews with Chrome, Appium needs to have access to an appropriate Chromedriver. If you have selected a device in the list, you can use &amp;quot;&#039;&#039;Manage Chromedrivers&#039;&#039;&amp;quot; to see, which Chrome versions are installed on the device and which Chromedriver versions are provided by expecco. With this dialog you can also download required Chromedriver versions. Beware that there may be several Chrome versions on the device. An App doesn&#039;t have to use the version of the installed Chrome browser for its WebViews. The Chromedriver you use should fit your app for everything to work properly. You can also change the path to the Chromedriver in the capabilities generated at the end of the connection editor.&lt;br /&gt;
&lt;br /&gt;
==== Connect WiFi Android Device ====&lt;br /&gt;
&lt;br /&gt;
You can connect to Android devices using WiFi as well. In this case, the device has to be connected to ADB first, see [[Mobile_Testing_Plugin/en#Connection_via_WLAN|Connection via WLAN]]. Since expecco 22.1, the connection editor provides a dialog helping to set this up, which can be used instead of the command window. For devices using Android 11 or newer, you can pair the device with your machine here by specifying the appropriate parameters and then establish the connection by specifying the IP address and port. You can also use this to establish a wireless connection for devices that are connected via USB. When you select the corresponding device in the list, the required information is read out automatically.&lt;br /&gt;
&lt;br /&gt;
Note that establishing a wireless connection is not part of the connection settings. If you want to establish a new connection with the generated settings, you must make sure that the device is connected to ADB with the specified IP address and port so that it can be found. The ADB connection will be lost if the ADB server or the device are restarted. The permission for wireless debugging is also often reset when the device is restarted and the debug port can then change. Therefore, a wireless connection must always be established manually.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep2&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Step 2: Select App===&lt;br /&gt;
Here you can enter information about the app to be tested. You can decide if you want to use an app that is already installed on the device or if you want to install an app for the test. Select the appropriate tab above. Depending on whether you selected an Android or an iOS device in the previous step, the required input will change.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Android&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App on Device&#039;&#039;&lt;br /&gt;
**:If you have selected a connected device in the first step, the packages of all installed apps are automatically retrieved and you can select from the drop-down lists. The installed apps are divided into third-party packages and system packages; select the appropriate package list. This selection does not belong to the settings, but only provides the corresponding package list. You can use the filter to further narrow down the list and then select the desired package. The activities of the selected package are also automatically retrieved and made available as a drop-down list. Select the activity you want to start. As a rule, an activity is automatically entered from the list. If you are not using a connected device, you must enter the package and the activity manually.&lt;br /&gt;
**&#039;&#039;Install App&#039;&#039;&lt;br /&gt;
**:Under &#039;&#039;App&#039;&#039;, enter the path to an app. The path must be valid for the Appium server being used. You can also specify a URL. If you are using a local Appium server, you can use the right button to navigate to the App installation file and enter this path. If possible, the corresponding package and the activity are also entered in the fields below. However, this entry is not necessary.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;iOS&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App on Device&#039;&#039;&lt;br /&gt;
**:Specify the bundle ID of an installed app. You can find out the IDs of the installed apps using Xcode, for example. Start Xcode and select &#039;&#039;Devices&#039;&#039; from the menu bar at the top of the screen in the &#039;&#039;Window&#039;&#039; menu. A window will open displaying a list of connected devices. If you select your device, you will see a list of the apps you have installed in the overview.&lt;br /&gt;
**&#039;&#039;Install App&#039;&#039;&lt;br /&gt;
**:Under &#039;&#039;App&#039;&#039;, enter the path to an app. The path must be valid for the Appium server being used. You can also specify a URL. For the requirements of apps for real devices, please read the section  [[#iOS-Ger.C3.A4t_and_App_Preparing|Preparing an iOS-Device and App]].&lt;br /&gt;
&lt;br /&gt;
In the lower part you can specify whether the app should be reset or uninstalled when the connection is terminated, and whether it should be reset initially. Again, the corresponding capability is not set if you select &#039;&#039;(Default)&#039;&#039;. With &#039;&#039;Next&#039;&#039; you get to the next step.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep3&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Step 3: Server Settings===&lt;br /&gt;
In the last step, a list of all the capabilities that result from your entries in the previous steps is first displayed in the upper part. If you are familiar with Appium and want to set additional capabilities that are not covered by the connection editor, you can click on &#039;&#039;Edit&#039;&#039; to open the extended view. See the section below for more information.&lt;br /&gt;
&lt;br /&gt;
If you enter settings for the GUI browser, you can enter the &#039;&#039;Connection name&#039;&#039; with which the connection is displayed. This is also the name under which devices can use this connection when it is established. If you leave the field blank, a name will be generated. If the box &amp;quot;&#039;&#039;Managed by expecco&#039;&#039;&amp;quot; is checked, expecco will start a local Appium server on a free port, or use a free server that has already been started. To use your own server, turn this feature off and enter the appropriate address. You will get the local default address and already used addresses to choose from.&lt;br /&gt;
&lt;br /&gt;
In older expecco versions the box is labeled &amp;quot;&#039;&#039;Start on demand&#039;&#039;&amp;quot;. In this case, you must also enter an address if you want expecco to start the server. expecco then tries to start an Appium server at the given address when connecting, if none is running there yet. This server will then also be shut down when the connection is terminated. This only works for local addresses. Make sure that you only use port numbers that are free. It is best to only use odd port numbers from the standard port 4723. The following port number is also used when establishing a connection, which could otherwise lead to conflicts.&lt;br /&gt;
&lt;br /&gt;
Depending on how you opened the dialog, there are now different buttons to close it. In any case you have the option to save. This opens a dialog where you can either select an open project to save the settings there as an attachment, or choose to save it to a file that you can then specify. Saving does not close the dialog, allowing you to select another option.&lt;br /&gt;
&lt;br /&gt;
If you have opened the editor for establishing a connection, you can finally click on &#039;&#039;Connect&#039;&#039; or &#039;&#039;Start and connect server&#039;&#039;, depending on whether the check mark for server start is set. For changing or copying a connection in the GUI Browser, this option is called &#039;&#039;Apply&#039;&#039;, since in this case only the connection entry is changed or created, but the connection setup is not started. If necessary, you can do this afterwards via the context menu. If you have changed capabilities of an existing connection, a dialog then prompts you to decide whether these changes should be applied directly by closing the connection and establishing the new connection or not. In this case, the changes only take effect after you reestablish the connection.&lt;br /&gt;
&lt;br /&gt;
To use the connection editor, also read the corresponding section in the respective tutorial in step 1. (Android: [[Mobile_Testing_Tutorial/en#Step_1:_Run_Demo|Run Demo]], iOS: [[Mobile_Testing_Tutorial/en#Step_1:_Run_Demo_2|Run Demo]]).&lt;br /&gt;
&lt;br /&gt;
===Extended View===&lt;br /&gt;
The extended view of the connection editor can be obtained either by clicking on &#039;&#039;Edit&#039;&#039; in the third step or at any time via the corresponding menu item if you have started the editor via the plugin menu. This view displays a list of all configured Appium Capabilities. You can add, change or remove further entries to this list. To add a capability, select it from the drop-down list of the input field. In this list all known capabilities are sorted into the categories &#039;&#039;Common&#039;&#039;, &#039;&#039;Android&#039;&#039; and &#039;&#039;iOS&#039;&#039;. If you have selected a capability, a short information text is displayed. You can also enter a capability manually in the field. Then click on &#039;&#039;Add&#039;&#039; to add the capability to the list. There you can set the value in the right column. To delete an entry, select it and click on &#039;&#039;Remove&#039;&#039;. With &#039;&#039;Back&#039;&#039; you leave the extended view.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingErweiterteAnsicht.png]]&lt;br /&gt;
&lt;br /&gt;
== Running Appium Servers ==&lt;br /&gt;
In the menu of the Mobile Testing Plugin you will find the entry &#039;&#039;Appium-Server...&#039;&#039;. This opens a window with an overview of all Appium servers started by expecco and on which port they are running. By clicking on the icon in the column &#039;&#039;Show Log&#039;&#039; you can view the logfile of the corresponding server. This is deleted when the server is shut down. With the icons in the column &#039;&#039;Exit&#039;&#039; the corresponding server can be terminated. However, this is prevented if expecco still has an open connection via this server. The rightmost column shows for which connection the server is in use. If it reads &#039;&#039;&amp;lt;idle&amp;gt;&#039;&#039;, the server is currently not used by expecco.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAppiumServer.png]]&lt;br /&gt;
&lt;br /&gt;
When opening the editor to start an Appium connection, an Appium server is started immediately to speed up the connection process. For this purpose, expecco always keeps one idle running Appium server. Additional running servers however, which are not in use anymore, will be terminated automatically after a while.&lt;br /&gt;
&lt;br /&gt;
In the menu of the Mobile Testing Plugin you will also find the entry &#039;&#039;Close all Connections and Servers&#039;&#039;. This is intended for cases where connections or servers cannot be terminated in any other way. If possible, always terminate connections in the GUI browser or by executing a corresponding block. Servers that you have started in the server overview should be terminated there; servers that were started with a connection are automatically terminated with this connection.&lt;br /&gt;
&lt;br /&gt;
Note that only servers started and managed by expecco are listed in the overview. Possible other Appium servers that were started in a different way are not recognized.&lt;br /&gt;
&lt;br /&gt;
== Recorder ==&lt;br /&gt;
If the GUI browser is connected to a device, the integrated recorder can be used to record a test section with that device. To start the recorder, select the appropriate connection in the GUI browser and click the Record button. A new window opens for the recorder. The recorded actions are created in the GUI browser work area. It is therefore possible to edit the recorded data in parallel.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingRecorder.png|caption|]]&lt;br /&gt;
&lt;br /&gt;
====Components of the Recorder Window====&lt;br /&gt;
#&#039;&#039;&#039;Continue/Pause Recording&#039;&#039;&#039;: You can pause the recording by clicking the right icon. You will then see a large pause sign in the view. All actions that you perform now in the recorder are executed, but no blocks are recorded. You can switch back to normal recording mode by clicking the left icon.&lt;br /&gt;
#&#039;&#039;&#039;Stop Recording&#039;&#039;&#039;: Stops the recording and closes the recorder window.&lt;br /&gt;
#&#039;&#039;&#039;Update&#039;&#039;&#039;: Gets the current image and element tree from the device. This is necessary if the device takes longer to execute an action or if something changes without being triggered by the recorder. Since expecco 21.2, there is an additional submenu here that can be used to enable automatic update by checking for changes in the background (see also &#039;&#039;Automatic Update&#039;&#039; further below).&lt;br /&gt;
#&#039;&#039;&#039;Follow Mouse&#039;&#039;&#039;: Select the element under the mouse pointer in the GUI browser.&lt;br /&gt;
#&#039;&#039;&#039;Element Highlighting&#039;&#039;&#039;: The element under the mouse is outlined in red.&lt;br /&gt;
#&#039;&#039;&#039;Show Elements&#039;&#039;&#039;: Show the borders of all elements in the view.&lt;br /&gt;
#&#039;&#039;&#039;Tools&#039;&#039;&#039;: Selection, which  tool is used for recording. The selected action is triggered with each click on the view. The following actions are available:&lt;br /&gt;
#*Element Actions:&lt;br /&gt;
#**Click: Short click on the element under cursor. To determine more precisely which element is used, use the Follow Mouse or Element Highlighting function.&lt;br /&gt;
#**Tap with Duration (Element): Similar to click, except that the duration of the click will be recorded as well. This allows the recording of long clicks.&lt;br /&gt;
#**Tap with Position (Element): Similar to click, but additionally records the position inside the element. The position can be recorded relative to the element size or, when pressing Ctrl while clicking, as absolute position from the upper left corner of the element.&lt;br /&gt;
#**Set Text: Allows to set the text of an input field.&lt;br /&gt;
#**Clear Text: Clears the text of an input field.&lt;br /&gt;
#*Device Actions:&lt;br /&gt;
#**Tap (Screen): Triggers a click at the screen position.&lt;br /&gt;
#**Tap with Duration (Screen): Triggers a click at the screen position, which also considers the duration.&lt;br /&gt;
#**Swipe: Swipe in a straight line from the point where you press the mouse button until you release it. The duration is also recorded.&lt;br /&gt;
#:Please note for this actions that the result may differ on different devices, e.g. with different screen resolutions.&lt;br /&gt;
#*Test Flow Blocks&lt;br /&gt;
#**Check Attribute: Compares the value of a specified attribute of the element with a predefined value. The result triggers the corresponding output.&lt;br /&gt;
#**Assert Attribut: Compares the value of a specified attribute of the element with a predefined value. If the values are not equal, the test fails.&lt;br /&gt;
#**Get Attribute: Gets the current value of a specified attribute of the element.&lt;br /&gt;
#*Auto&lt;br /&gt;
#:If the Auto tool is selected, you can use all actions by specific input methods: &#039;&#039;Click&#039;&#039;, &#039;&#039;Tap Element&#039;&#039; and &#039;&#039;Swipe&#039;&#039; still work by clicking, but are distinguished by the duration and movement of the cursor. To trigger a &#039;&#039;Tap&#039;&#039;, hold down Ctrl while clicking. The remaining actions are available in a context menu by right-clicking on the element.&lt;br /&gt;
#&#039;&#039;&#039;Context Actions&#039;&#039;&#039;: Here you can record actions concerning contexts:&lt;br /&gt;
#*Switch to Context: Shows a list of all currently available contexts and you can select to which one you want to switch.&lt;br /&gt;
#*Get Current Context: Gets the handle of the current context.&lt;br /&gt;
#*Get Context Handles: Gets a list of all currently available contexts.&lt;br /&gt;
#&#039;&#039;&#039;Softkeys&#039;&#039;&#039;: Only for Android. Simulates pressing the buttons Back, Home, Menu and Power.&lt;br /&gt;
#&#039;&#039;&#039;Home Button&#039;&#039;&#039;: Only for iOS since expecco 2.11. Allows pressing the Home button.Prior to expecco 19.2, it only works if AssistiveTouch is activated and the menu is located in the middle of the upper screen border. From expecco 19.2 on, the function no longer uses AssistiveTouch.&lt;br /&gt;
#&#039;&#039;&#039;Help&#039;&#039;&#039;: Opens this online documentation on the general page about [[GuiBrowser_Recorder/en|GUI Browser recorders]].&lt;br /&gt;
#&#039;&#039;&#039;View&#039;&#039;&#039;: Shows a screenshot of the device. Actions are triggerd by mouse depending on the selected tool. If a new action can be recorded, the window has a green frame, else it is red.&lt;br /&gt;
#&#039;&#039;&#039;Resize Window to Image&#039;&#039;&#039;: Resizes the recorder window so that the screenshot can be displayed completely.&lt;br /&gt;
#&#039;&#039;&#039;Resize Image to Window&#039;&#039;&#039;: Scales the screenshot to a size that makes use of the full size of the window.&lt;br /&gt;
#&#039;&#039;&#039;Adjust Display&#039;&#039;&#039;: Opens a dialog to adjust the displayed image, if expecco does not show it right. You can correct the scaling or rotate the image by 90°.&lt;br /&gt;
#&#039;&#039;&#039;Correct Orientation&#039;&#039;&#039;: Corrects the image if it is upside down. Using the arrow to the right, the image can also be rotated by 90°, if this should ever be necessary. Since expecco 19.1 you find this functionality under &#039;&#039;Adjust Display&#039;&#039;. The orientation of the image is irrelevant for the functionality of the recorder, it only works on the elements it receives.&lt;br /&gt;
#&#039;&#039;&#039;Scaling&#039;&#039;&#039;: Changes the scaling of the screenshots.&lt;br /&gt;
#&#039;&#039;&#039;Messages&#039;&#039;&#039;: Shows the path of the current selected element or other messages. It has a context menu to show a list of previous messages.&lt;br /&gt;
&lt;br /&gt;
====Usage====&lt;br /&gt;
Each click in the window triggers an action and is recorded in the workspace of the GUI browser. There you can run, edit, or create a new block from what you have recorded. You find the actions to trigger softkeys directly in the menu bar (see above). To record actions on elements, either change the selection of the tool in the menu bar (see above) and then click on the element or select the corresponding action from the context menu by right-clicking on the corresponding element. For text input it is also possible to place the cursor over the element and enter the text. This opens the input dialog for this action. On how to use the recorder, see also step 2 in the tutorial ([[Mobile_Testing_Tutorial/en#Step_2:_Creating_a_Block_with_the_Recorder|Android]] resp. [[Mobile_Testing_Tutorial/en#Step_2:_Creating_a_block_with_the_Recorder_2|iOS]]).&lt;br /&gt;
&lt;br /&gt;
====Hide elements====&lt;br /&gt;
Since expecco 21.2 it is also possible to hide the selected element in the recorder from the context menu. This means that this element cannot be selected from now on. This function is useful for ignoring elements that are in the foreground to be able to access elements below them. To undo this state, you have to find the corresponding element in the tree of the GUI browser, which also has such an entry in the context menu.&lt;br /&gt;
&lt;br /&gt;
====Automatic Update====&lt;br /&gt;
The recorder doesn&#039;t show a live image of the device, but only a snapshot. Therefore an update is needed after changes to match what is displayed on the device. The recorder updates automatically after executing an action. Since expecco 20.2 there are further automatic updates possible. You can enable the, in the menu &amp;quot;View&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
One option is, to check after an action has been executed, if there are further changes after the first update. If so, a second update is triggered. This shall fix the problem, that the recorder is not up to date after an action, because the update has been done too early.&lt;br /&gt;
&lt;br /&gt;
The second option is to enable a periodical update. After a set interval the recorder is automatically updated if there are changes. Thereby the recorder view is mostly up to date, but this causes an overhead regarding the communication to the device.&lt;br /&gt;
&lt;br /&gt;
== AVD Manager und SDK Manager ==&lt;br /&gt;
AVD Manager und SDK Manager sind beides Anwendungen von Android. Im Menü des Mobile Testing Plugins bietet expecco die Möglichkeit, diese zu starten. Ansonsten finden Sie diese Programme bei Ihrer Android-Installation. Mit dem AVD Manager können Sie AVDs, also Konfigurationen für Emulatoren, erstellen, bearbeiten und starten. Mit dem SDK Manager erhalten Sie einen Überblick über Ihre Android-Installation und können diese bei Bedarf erweitern.&lt;br /&gt;
&lt;br /&gt;
= Hybrid Apps and WebViews =&lt;br /&gt;
&#039;&#039;&#039;!!! IMPORTANT NOTICE - If you have problems switching to the webview, please set the &amp;quot;Default Application - Browser App&amp;quot; in Android Settings to &amp;quot;Chrome&amp;quot; !!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hybrid apps contain platform native elements as well as other elements that are integrated in a WebView. These elements can also be used, but you first have to switch to the corresponding context. With the block &#039;&#039;Get Current Context&#039;&#039; you get the current context. Initially this is &#039;&#039;NATIVE_APP&#039;&#039;, i.e. the context of the native elements. With the block &#039;&#039;Get Context Handles&#039;&#039; you get a collection of all existing contexts. If there is a WebView context, it is called &#039;&#039;WEBVIEW_1&#039;&#039; or &#039;&#039;WEBVIEW_&amp;lt;package&amp;gt;&#039;&#039; with the package of the WebView. Several WebView contexts are also possible. For each WebView context, there is a corresponding WebView element in the native context. You can use the &#039;&#039;Switch to Context&#039;&#039; block to switch to such a context and from now on only have access to the elements in this context.&lt;br /&gt;
&lt;br /&gt;
In the GUI browser, the existing contexts are displayed at the top of the tree as well as the tree of a context is inserted below the corresponding WebView element.&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span id=&amp;quot;Customizing XPath using the GUI Browsers&amp;quot;&amp;gt;&amp;lt;!-- name before 01.10.2020--&amp;gt;&amp;lt;/span&amp;gt;Customizing XPath using the GUI Browser=&lt;br /&gt;
Bausteine, die auf einem Gerät fehlerfrei funktionieren, tun dies auf anderen Geräten möglicherweise nicht. Auch können kleine Änderungen der App dazu führen, dass ein Baustein nicht mehr den gewünschten Effekt hat. Man sollte einen Baustein daher so robust formulieren, dass er für eine Vielzahl von Geräten verwendet werden kann und kleine Anpassungen an der App verkraftet. Dazu muss man das grundlegende Funktionsprinzip der Adressierung verstehen. Dies wird im Folgenden am Beispiel der App aus dem Tutorial erläutert.&lt;br /&gt;
&lt;br /&gt;
Die Ansicht der App setzt sich aus einzelnen Elementen zusammen. Dazu gehören die Schaltflächen &#039;&#039;GTIN-13 (EAN-13)&#039;&#039; und &#039;&#039;Verify&#039;&#039;, das Eingabefeld der Zahl &#039;&#039;4006381333986&#039;&#039; und das Ergebnisfeld, in dem OK erscheint, wie auch alle anderen auf der Anzeige sichtbaren Dinge. Diese sichtbaren Elemente sind in unsichtbare Strukturelemente eingebettet. Alle Elemente zusammen sind in einer zusammenhängenden Hierarchie, dem Elementbaum, organisiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingGUIBrowser.png | frame | left | Abb. 1: Funktionen des GUI-Browsers]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
Sie können sich diesen Baum im GUI-Browser ansehen. Wechseln Sie dazu in den GUI-Browser (Abb. 1) und starten Sie eine beliebige Verbindung. Sobald die Verbindung aufgebaut ist, können Sie den gesamten Baum aufklappen (1) (Klick bei gedrückter Strg-Taste). Er enthält alle Elemente der aktuellen Seite der App.&lt;br /&gt;
&lt;br /&gt;
Ein Baustein, der nun ein bestimmtes Element verwendet, muss dieses eindeutig angeben, indem er dessen Position im Elementbaum mit einem Pfad im XPath-Format beschreibt. Dieses Format ist ein verbreiteter Web-Standard für XML-Dokumente und -Datenbanken, eignet sich aber genauso für Pfade im Elementbaum.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie ein Element im Baum auswählen, wird unten der von expecco automatisch generierte XPath (2) für das Element angezeigt, der auch beim Aufzeichnen verwendet wird. Oberhalb davon in der Mitte des Fensters befindet sich eine Liste der Eigenschaften (3) des ausgewählten Elements. Man nennt diese Eigenschaften auch Attribute. Sie beschreiben das Element näher wie beispielsweise seinen Typ, seinen Text oder andere Informationen zu seinem Zustand. Links unten können Sie zur besseren Orientierung im Baum die &#039;&#039;Vorschau&#039;&#039; (4) aktivieren, um sich den Bildausschnitt des Elements anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Der Elementbaum für gleiche Ansicht einer App kann sich je nach Gerät unterscheiden. Es sind diese Unterschiede, die verhindern, eine Aufnahme von einem Gerät unverändert auch auf allen anderen Geräten abzuspielen: Ein XPath, der im einen Elementbaum ein bestimmtes Element identifiziert, beschreibt nicht unbedingt das gleiche Element im Elementbaum auf einem anderen Gerät. Es kann stattdessen passieren, dass der XPath auf kein Element, auf ein falsches Element oder auf mehrere Elemente passt. Dann schlägt der Test fehl oder er verhält sich unerwartet.&lt;br /&gt;
&lt;br /&gt;
Man könnte natürlich für jedes Gerät einen eigenen Testfall schreiben. Das brächte aber unverhältnismäßigen Aufwand bei Testerstellung und -wartung mit sich. Das Problem lässt sich auch anders lösen, da ein jeweiliges Element nicht nur durch genau einen XPath beschrieben wird. Vielmehr erlaubt der Standard mithilfe verschiedener Merkmale unterschiedliche Beschreibungen für ein und dasselbe Element zu formulieren. Das Ziel ist daher, einen Pfad zu finden, der auf allen für den Test verwendeten Geräten funktioniert und überall eindeutig zum richtigen Element führt.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel besteht die Verbindung zur Android-App aus dem Tutorial und der Eintrag des GTIN-13-Buttons ist ausgewählt (5). Dessen automatisch generierter XPath (2) kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[@resource id=&#039;android:id/content&#039;]/android.widget.RelativeLayout/android.widget.Button[@resource-id=&#039;de.exept.expeccomobiledemo:id/gtin_13&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Er ist offensichtlich lang und unübersichtlich. Der sehr viel kürzere Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@text=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
führt zum selben Element.&lt;br /&gt;
&lt;br /&gt;
Für die iOS-App lautet der automatisch generierte XPath für diesen Button beispielsweise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/XCUIElementTypeApplication/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/UIAApplication/UIAWindow[1]/UIAButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und kann kürzer als&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@name=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Sie können den Pfad entsprechend im GUI-Browser ändern und durch &#039;&#039;Pfad überprüfen&#039;&#039; (6) feststellen, ob er weiterhin auf das ausgewählte Element zeigt, was expecco mit &#039;&#039;Verify Path: OK&#039;&#039; (7) bestätigen sollte. Der erste, sehr viel längere Pfad, beschreibt den gesamten Weg vom obersten Element des Baumes bis hin zum gesuchten Button. Der zweite Pfad hingegen wählt mit * zunächst sämtliche Elemente des Baumes und schränkt die Auswahl dann auf genau die Elemente ein, die ein &#039;&#039;text&#039;&#039;- bzw. &#039;&#039;name&#039;&#039;-Attribut mit dem Wert &#039;&#039;GTIN-13 (EAN-13)&#039;&#039; besitzen, in unserem Fall also genau der eine Button, den wir suchen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden Android-ähnliche Pfade zur Veranschaulichung verwendet. Die Elemente in iOS-Apps heißen zwar anders, wodurch andere Pfade entstehen; das Prinzip ist jedoch das gleiche.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum1.png | frame | Abb. 2: Elementbaum einer fiktiven App]]&lt;br /&gt;
&lt;br /&gt;
Sie können solche Pfade mit Hilfe weniger Regeln selbst formulieren. Sehen Sie sich den einfachen Baum einer fiktiven Android-App in Abb. 2 an: Die Einrückungen innerhalb des Baumes geben die Hierarchie der Elemente wieder. Ein Element ist ein &#039;&#039;Kind&#039;&#039; eines anderen Elementes, wenn jenes andere Element das nächsthöhere Element mit einem um eins geringeren Einzug ist. Jenes Element ist das &#039;&#039;Elternelement&#039;&#039; des Kindes. Sind mehrere untereinander stehende Elemente gleich eingerückt, so sind sie also alle Kinder desselben Elternelements.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad durch alle Ebenen der Hierarchie zum TextView-Element ist nun:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Elemente sind mit Schrägstrichen voneinander getrennt. Es fällt auf, dass der Name des ersten Elements nicht mit dem im Baum übereinstimmt. Das oberste Element in der Hierarchie heißt immer &#039;&#039;hierarchy&#039;&#039; (für iOS wäre es &#039;&#039;AppiumAUT&#039;&#039;), expecco zeigt im Baum stattdessen den Namen der Verbindung an, damit man mehrere Verbindungen voneinander unterscheiden kann. Die weiteren Elemente tragen jeweils das Präfix &#039;&#039;android.widget.&#039;&#039;, das im Baum zur besseren Übersicht nicht angezeigt wird. Bei IOS gibt es kein Präfix, das durch einen Punkt abgetrennt wäre, expecco 2.11 blendet aber entsprechend &#039;&#039;XCUIElementType&#039;&#039; am Anfang aus. Mit jedem Schrägstrich führt der Pfad über eine Eltern-Kind-Beziehung in eine tiefere Hierarchie-Ebene, d. h. &#039;&#039;FrameLayout&#039;&#039; ist ein Kindelement von &#039;&#039;hierarchy&#039;&#039;, &#039;&#039;LinearLayout&#039;&#039; ist ein Kind von &#039;&#039;FrameLayout&#039;&#039; usw. Die in eckigen Klammern geschriebenen Wörter dienen nur als Orientierungshilfe im Baum. Sie gehören nicht zum Typ.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad muss nicht beim Element &#039;&#039;hierarchy&#039;&#039; beginnen. Man kann den Pfad beginnend mit einem beliebigen Element des Baumes bilden. Man kann also verkürzt auch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
schreiben. Der Pfad führt zum selben &#039;&#039;TextView&#039;&#039;-Element, da es nur ein Element dieses Typs gibt. Anders verhält es sich bei dem Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da es zwei Elemente vom Typ &#039;&#039;Button&#039;&#039; gibt, passt dieser Pfad auf zwei Elemente, nämlich den Button, der mit &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; markiert ist, und den &#039;&#039;Button&#039;&#039;, der mit &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; markiert ist. Es würde an dieser Stelle aber auch nicht helfen den langen Pfad von &#039;&#039;hierarchy&#039;&#039; aus beginnend anzugeben. Um einen mehrdeutigen Pfad weiter zu differenzieren, kann man explizit ein Element aus einer Menge wählen, indem man den numerischen Index in eckigen Klammern dahinter schreibt. Der Pfad aus dem obigen Beispiel lässt sich damit so anpassen, dass er eindeutig auf den &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; weist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[1].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ihnen fällt sicher auf, dass der Index eine 1 ist obwohl das zweite Element gemeint ist. Das kommt daher, dass die Zählung bei 0 beginnt. Der Button mit der Markierung &amp;quot;An&amp;quot; hat also die Nummer 0 und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Nummer 1.&lt;br /&gt;
&lt;br /&gt;
Dieser Ansatz, einen expliziten Index zu verwenden, hat zwei Nachteile: Zum einen lässt sich an dem Pfad nur schwer ablesen welches Element gemeint ist, zum andern ist der Pfad sehr empfindlich schon gegenüber kleinsten Änderungen, wie zum Beispiel dem Vertauschen der beiden &#039;&#039;Button&#039;&#039;-Elemente oder dem Einfügen eines weiteren &#039;&#039;Button&#039;&#039;-Elements in der App.&lt;br /&gt;
&lt;br /&gt;
Es wäre daher wünschenswert, das gemeinte Element über eine ihm charakteristische Eigenschaft wie einen Attributwert, zu adressieren. Für Android-Apps eignet sich hierfür häufig das Attribut &#039;&#039;resource-id&#039;&#039;. Im Idealfall muss bei der Entwicklung der App darauf geachtet werden, dass jedes Element eine eindeutige Id erhält. Die &#039;&#039;resource-id&#039;&#039; hat den großen Vorteil, dass sie unabhängig vom Text des Elements oder der Spracheinstellung des Geräts ist. Für iOS-Apps kann entsprechend das Attribut &#039;&#039;name&#039;&#039; verwendet werden, wenn es von der App sinnvoll gesetzt wird. Der XPath-Standard erlaubt solche Auswahlbedingungen zu einem Element anzugeben. Angenommen, der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Eigenschaft &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;off&#039;&#039; und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; hat als &#039;&#039;resource-id&#039;&#039; den Wert &#039;&#039;on&#039;&#039;, dann kann man als eindeutigen Pfad für den &amp;quot;Aus&amp;quot;-&#039;&#039;Button&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[@resource-id=&#039;off&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
formulieren. Wie an dem Beispiel zu sehen werden solche Bedingungen wie ein Index in eckigen Klammern an den Elementtyp angehängt. Der Name eines Attributes wird mit einem @ eingeleitet und der Wert mit einem = in Anführungszeichen angehängt. Ist der Attributwert global eindeutig, kann man den vorausgehenden Pfad sogar durch den globalen Platzhalter * ersetzen, der auf jedes Element passt. Das obige Beispiel mit dem GTIN-13-&#039;&#039;Button&#039;&#039; war ein solcher Fall.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum2.png | frame | Abb. 3: Elementbaum einer fiktiven App mit Erweiterungen]]&lt;br /&gt;
&lt;br /&gt;
Abb. 3 zeigt eine Erweiterung des Beispiels aus Abb. 2. Die App hat nun ein weiteres, nahezu identisches &#039;&#039;LinearLayout&#039;&#039; bekommen. Die &#039;&#039;Buttons&#039;&#039; sind in ihren Attributen jeweils ununterscheidbar. Deshalb funktioniert der vorige Ansatz nicht, einen eindeutigen Pfad nur mithilfe eines Attributwerts zu formulieren. Offensichtlich unterscheiden sich aber ihre benachbarten &#039;&#039;TextViews&#039;&#039;. Es ist möglich die jeweilige &#039;&#039;TextView&#039;&#039; in den Pfad mit aufzunehmen, um einen &#039;&#039;Button&#039;&#039; dennoch eindeutig zu adressieren. Ein Pfad zum &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; unterhalb der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; kann dabei wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView[@resource-id=&#039;push&#039;]/../android.widget.Button[@resource-id=&#039;on&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Teil beschreibt den Pfad zu der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; und der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;push&#039;&#039;. Danach folgt ein Schrägstrich gefolgt von zwei Punkten. Die zwei Punkte sind eine spezielle Elementbezeichnung, die nicht ein Kindelement benennt, sondern zum Elternelement wechselt, in diesem Fall also das &#039;&#039;LinearLayout&#039;&#039;, in dem die &#039;&#039;TextView&#039;&#039; eingebettet ist. Im Kontext dieses &#039;&#039;LinearLayout&#039;&#039; ist der restliche Pfad, nämlich der &#039;&#039;Button&#039;&#039; mit der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;on&#039;&#039;, eindeutig.&lt;br /&gt;
&lt;br /&gt;
Der XPath-Standard bietet noch sehr viel mehr Ausdrucksmittel. Mit der hier knapp vorgestellten Auswahl ist es aber bereits möglich für die meisten praktischen Testfälle gute Pfade zu formulieren. Eine vollständige Einführung in XPath ginge über den Umfang dieser Einführung weit hinaus. Sie finden zahlreiche weiterführende Dokumentationen im Web und in Büchern.&lt;br /&gt;
&lt;br /&gt;
Eine universelle Strategie zum Erstellen guter XPaths gibt es nicht, da sie von den Testanforderungen abhängt. In der Regel ist es sinnvoll, den XPath kurz und dennoch eindeutig zu halten. Häufig lassen sich Elemente über Eigenschaften identifizieren wie beispielsweise ihren Text. Will man aber gerade den Text eines Elements auslesen, kann dieser natürlich nicht im Pfad verwendet werden, da er vorher nicht bekannt ist. Ebenso wird der Text variieren, wenn die App mit verschiedenen Sprachen gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Jeder Baustein, der auf einem Element arbeitet, hat einen Eingangspin für den XPath. Im GUI-Browser finden Sie in der Mitte oben eine Liste von Bausteinen mit Aktionen, die Sie auf das ausgewählte Element anwenden können. Suchen Sie den Baustein &#039;&#039;Click&#039;&#039; (8) im Ordner Elements und wählen Sie ihn aus (Abb. 1). Er wird im rechten Teil unter &#039;&#039;Test&#039;&#039; eingefügt, der Pin für den XPath ist mit dem automatisch generierten Pfad des Elements vorbelegt (9). Sie können den Baustein hier auch ausführen. Die Ansicht wechselt dann auf &#039;&#039;Lauf&#039;&#039;. Ändert sich durch die Aktion der Zustand Ihrer App, müssen Sie den Baum anschließend aktualisieren (10).&lt;br /&gt;
&lt;br /&gt;
Wenn Sie in der unteren Liste eine Eigenschaft auswählen, wechselt die Anzeige der Bausteine zu &#039;&#039;Eigenschaften&#039;&#039;, wo Sie die eigenschaftsbezogenen Bausteine finden. Wie bei den Aktionen können Sie auch hier einen Baustein auswählen, der dann rechts in Test mit dem Pfad des Elements und der ausgewählten Eigenschaft eingetragen wird, sodass Sie ihn direkt ausführen können.&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span id=&amp;quot;troubleshooting&amp;quot;&amp;gt;&amp;lt;!-- Referenced by error dialog on connection error --&amp;gt;&amp;lt;/span&amp;gt;Problems and Solutions=&lt;br /&gt;
== Locators depend on the version or are variable ==&lt;br /&gt;
In this case consider to either store the locators (xPath) in a variable or to define a locator mapping inside a screenplay attachment. It is also possible to store just parts of an locator (e.g. locator path of a parent or attribute value) in a variable and add them in the freeze value of the locator pin by &amp;quot;&#039;&#039;$(varName)&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Invisible UI Elements ==&lt;br /&gt;
Note that the [[#Recorder|Recorder]] also considers items that you cannot see on the screen. Therefore, turn on element highlighting or use the follow mouse function and the element tree in the GUI browser to determine if the correct element is used. It can happen, that invisible elements are in front of other elements and cover them, so that the desired element cannot be selected in the recorder. See section [[#Hide_elements|Hide elements]] for a solution to this.&lt;br /&gt;
&lt;br /&gt;
== iOS: Cable not certified ==&lt;br /&gt;
In some cases, when connecting an iOS device via USB, a message appears indicating that the cable used is not certified. In this case, replacing the respective cable is the only solution.&lt;br /&gt;
&lt;br /&gt;
== iOS: Alerts when connecting ==&lt;br /&gt;
Make sure that no alerts are open when connecting to an iOS device. Otherwise the connection will fail because the app cannot be brought to the foreground. See also [[#Preparing_an_iOS-Device_and_App|Preparing an iOS-Device and App]].&lt;br /&gt;
&lt;br /&gt;
== iOS: .ipa cannot be installed ==&lt;br /&gt;
Note that on iOS simulators no &#039;&#039;.ipa&#039;&#039; files can be installed but only &#039;&#039;.app&#039;&#039; files.&lt;br /&gt;
&lt;br /&gt;
==iOS: First Connect is not working==&lt;br /&gt;
If there is not already a signed build of the WebDriverAgent on your Mac, it has to be created during the first connect. Usually, this can take a little longer than one minute. Per default Appium uses a timeout of 60000&amp;amp;nbsp;ms to wait for the WebDriverAgent to start on the device, so the connect will be canceled in that case. You can set this timeout with the capability &#039;&#039;wdaLaunchTimeout&#039;&#039;, e.g. to &#039;&#039;120000&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Moreover, the signing settings have to be correct. In our experience, the most reliable solution is to set automatic signing in the WebDriverAgent Xcode project an selecting the team there. See the explanation in section [[#Signing_WebDriverAgent|Signing WebDriverAgent]] for that. In this case you should &#039;&#039;&#039;not&#039;&#039;&#039; use the capabilities &#039;&#039;xcodeConfigFile&#039;&#039; resp. &#039;&#039;xcodeOrgId&#039;&#039; and &#039;&#039;xcodeSigningId&#039;&#039;, as they could cause a conflict. Caution: If you have set a Team ID in the Mobile Testing settings, expecco will automatically set this as &#039;&#039;xcodeOrgId&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
Pay attention to your device during the first connect. You might have to agree to the installation by entering your password. On the Mac you might need to enter the password to allow access to the key chain for signing, often several times.&lt;br /&gt;
&lt;br /&gt;
== Android: Device not visible in the connect editor ==&lt;br /&gt;
If an Android device connected via USB does not appear in the connection editor, try changing the USB connection type. Usually MTP or PTP should work. Check again, if &amp;quot;USB Debugging&amp;quot; is enabled in the developer options on the device (these options are disabled on some devices and have to be enabled first using a trick.) See also [[#Prepare_Android_Device|Prepare Android Device]].&lt;br /&gt;
&lt;br /&gt;
== Android: Truncated Elements at Bottom ==&lt;br /&gt;
For Android devices that automatically show and hide the navigation bar/softkeys, the recorder may cut off elements in the lower area that would be hidden by the softkeys, even if they are not displayed at this time. In this case it is advisable to set the softkeys so that they are permanently displayed.&lt;br /&gt;
&lt;br /&gt;
For newer Android versions there usually is no such option. Even if the controls are visible all the time, they don&#039;t have their own space, but are on top of the content of the app. Therefore, there is an area on the lower part of the screen, which cannot be automated, because it is not counted to the active area of the app. Appium will then truncate the elements there. This area can even be larger then the needed by the controls. This is a known issue for Samsung devices with Android 11. Since the information about the size of the app area is already provided on Android level, we cannot offer a solution for this, but can only hope that the problem will be fixed by the manufacturer. You may try to get better results by setting the control to gestures, but this bears the same issue.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;waitForIdleTimeout&amp;quot;&amp;gt;&amp;lt;!-- Referenced by expecco--&amp;gt;&amp;lt;/span&amp;gt; Android: Test Hangs While Finding an Element==&lt;br /&gt;
The block &#039;&#039;Find Element by XPath&#039;&#039; and all element blocks wait until an element is present for the given path. The timeout for this can be set either directly at the block or in the environment variables. However, if the element should already be present, but the test doesn&#039;t continue anyway, the reason could be in the UIAutomator/UIAutomator2. It waits for the app to go to the idle state before it even starts to search for the element. This may take longer, if the app e.g. runs an animation in the background or executes other kinds of actions. Fetching the page source, e.g. when updating in the GUI browser or in the recorder, can also take longer for this reason. There is a default timeout of 10 seconds after which it no longer waits for the idle state. This timeout can be set in Appium (waitForIdleTimeout). If you want to change the value of this timeout, you can do this since expecco 21.2 by executing the Smalltalk code &amp;lt;code&amp;gt;AppiumTestRunner::TestRunConnection waitForIdleTimeout:2000&amp;lt;/code&amp;gt; before the test. The timeout is given in milliseconds, so the example sets it to 2 seconds.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;startChromedriverTimeout/&amp;gt;Android: Updating the Tree or Switching to Webview Context takes too long==&lt;br /&gt;
Especially with older devices it can happen that newer Chromedriver cannot be initialized. This makes it impossible to switch to the webview context. However, this is only detected over a timeout by Appium, which is 4 minutes by default. Since expecco also tries to switch to the webview context when building the tree in the GUI browser, this can lead to very long loading times. Since there is no way to decrease this timeout in Appium, we have added a corresponding capability to the version we provide in the MobileTestingSupplement. Starting with version 1.13.1.0 of the [[#Windows|MobileTestingSupplement]], &#039;&#039;chromedriverStartTimeout&#039;&#039; can be used to set the timeout in milliseconds. The switch still doesn&#039;t work then, but expecco doesn&#039;t take as long to update the tree and the context switch module fails faster. The connection dialog adds this capability automatically starting with expecco 22.1. &lt;br /&gt;
&lt;br /&gt;
== No Action on Click ==&lt;br /&gt;
The block to click on an element is successful, but no action was performed on the device.&lt;br /&gt;
:This can happen if the element is hidden by another element and therefore clicking on the element is not possible. In this case, Appium does not throw an error, but simply nothing happens. If you would like to make a click at the position of the element anyways, even if it is hidden, use the block &#039;&#039;Tap&#039;&#039; instead and pass the location of the element to it (&#039;&#039;Get Location&#039;&#039;). If instead you want to check before a click whether the element is hidden at this moment, try whether the properties &#039;&#039;Is Displayed&#039;&#039; or &#039;&#039;Is Enabled&#039;&#039; might help you.&lt;br /&gt;
&lt;br /&gt;
== No Update After Action ==&lt;br /&gt;
An action was triggered on the recorder and a block has been recorded, but the recorder still shows the old image.&lt;br /&gt;
:The recorder doesn&#039;t show a live image of the device, but only a snapshot. After an action has been executed, the recorder will update automatically. However, it can happen, that the image has already been updated before the effects of the action are fully completed on the device. In this case you should update the recorder by hand using the icon with the blue arrows. Since expecco 20.2 you can also enable automatic updates for this case. See also the description for the [[#Recorder|recorder]].&lt;br /&gt;
&lt;br /&gt;
== Attribute &amp;quot;clickable&amp;quot; is wrong ==&lt;br /&gt;
An element has for the attribute/property &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; the value &amp;quot;&#039;&#039;false&#039;&#039;&amp;quot;, but is actually clickable.&lt;br /&gt;
:The attribute &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; has to be set explicitly by the app developer and does not affect the behavior of the app. You should generally disregard this attribute in your tests. Unfortunately, many apps exist where the programmer was &amp;quot;lazy&amp;quot; about this.&lt;br /&gt;
&lt;br /&gt;
==Connecting Fails==&lt;br /&gt;
If the connection to the Appium server fails, you will receive an error message in expecco similar to the one shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:MobileTestingVerbindungsfehler.png]]&lt;br /&gt;
&lt;br /&gt;
Here you can see the type of error that has occurred. Click on &amp;quot;&#039;&#039;Details&#039;&#039;&amp;quot; to get more information. Possible errors are:&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.remote.UnreachableBrowserException&#039;&#039;&lt;br /&gt;
:The specified server is not running or is not reachable. Check the server address.&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.WebDriverException&#039;&#039;&lt;br /&gt;
:Read the message after &#039;&#039;Original Error&#039;&#039; in the first line of the details:&lt;br /&gt;
:*&#039;&#039;Unknown device or simulator UDID&#039;&#039;&lt;br /&gt;
::Either the device is not connected properly or the udid is not correct.&lt;br /&gt;
:*&#039;&#039;Unable to launch WebDriverAgent because of xcodebuild failure: xcodebuild failed with code 65&#039;&#039;&lt;br /&gt;
::This error can have various causes. Either the WebDriverAgent could actually not be built because the signing settings are wrong or the appropriate provisioning profile is missing. Please read the section about [[#Signing|Signing]].  It is also possible that the WebDriverAgent cannot be started on the device, for example because an alert is in the foreground or you did not trust the developer.&lt;br /&gt;
:*&#039;&#039;Could not install app: &#039;Command &#039;ios-deploy [...] exited with code 253&#039;&#039;&#039;&lt;br /&gt;
::The specified app cannot be installed on the iOS device because it is not entered in the app&#039;s Provisioning Profile.&lt;br /&gt;
:*&#039;&#039;Bad app: [...] App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name.&#039;&#039;&lt;br /&gt;
::The path to the app is wrong. Make sure that the file is located in the specified path on your Mac.&lt;br /&gt;
:*&#039;&#039;packageAndLaunchActivityFromManifest failed.&#039;&#039;&lt;br /&gt;
::The specified &#039;&#039;apk&#039;&#039; file is probably broken.&lt;br /&gt;
:*&#039;&#039;Could not find app apk at [...]&#039;&#039;&lt;br /&gt;
::The path to the app is wrong. Make sure that the &#039;&#039;apk&#039;&#039; file is located in the specified path.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the error is not due to one of the causes listed above, the automation applications on the device may no longer function properly. In this case it helps to uninstall them from the mobile device. They are then automatically reinstalled the next time a connection is established.&lt;br /&gt;
&lt;br /&gt;
*For iOS devices, this is the WebDriverAgent, which you can simply uninstall from the home screen. This usually solves problems caused by changing the used Mac or the Xcode version.&lt;br /&gt;
&lt;br /&gt;
*For Android devices, it is the UIAutomator2; here, a problem occurs sporadically on some devices, the cause is currently unknown to us. To uninstall, on the device, navigate to &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;Applications&#039;&#039;&amp;quot;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; and search the list for the following entries:&lt;br /&gt;
    Appium Settings&lt;br /&gt;
    io.appium.uiautomator2.server&lt;br /&gt;
    io.appium.uiautomator2.server.test&lt;br /&gt;
:Click on the respective application and then on &amp;quot;&#039;&#039;Uninstall&#039;&#039;&amp;quot;.&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&#039;&#039;The corresponding entry may have a slightly different name on some devices.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If this doesn&#039;t help, check the output of the Appium server. For a server started by expecco, you can find the log in the list of [[#Running_Appium_Servers|Running Appium Servers]].&lt;br /&gt;
&lt;br /&gt;
==I do not have a Mac==&lt;br /&gt;
Maybe this site will help you: [https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10 https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin&amp;diff=29046</id>
		<title>Mobile Testing Plugin</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin&amp;diff=29046"/>
		<updated>2023-11-30T11:01:38Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Probleme und Lösungen */ erster Verbindungsaufbau iOS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Deutsche Version&#039;&#039;&#039; | [[Mobile_Testing_Plugin/en|English Version]]&lt;br /&gt;
&lt;br /&gt;
= Einleitung =&lt;br /&gt;
Mit dem &#039;&#039;Mobile Testing Plugin&#039;&#039; können Anwendungen auf Android- und iOS-Geräten getestet werden. Dabei ist es egal, ob reale mobile Endgeräte oder emulierte Geräte verwendet werden. Das Plugin kann (und wird üblicherweise) zusammen mit dem [[Expecco_GUI_Tests_Extension_Reference|GUI-Browser]] verwendet werden, der das Erstellen von Tests unterstützt. Zudem ist damit das Aufzeichnen von Testabläufen möglich.&lt;br /&gt;
&lt;br /&gt;
Zur Verbindung mit den Geräten wird [http://appium.io/ Appium] verwendet. Appium ist ein freies Open-Source-Framework zum Testen und Automatisieren von mobilen Anwendungen.&lt;br /&gt;
&lt;br /&gt;
Zur Einarbeitung in das Mobile Plugin empfehlen wir das [[Mobile_Testing_Tutorial|Tutorial]] zu bearbeiten. Dieses führt anhand eines Beispiels Schritt für Schritt durch die Erstellung eines Testfalls und erklärt die nötigen Grundlagen.&lt;br /&gt;
&lt;br /&gt;
= Installation und Aufbau =&lt;br /&gt;
Zur Verwendung des Mobile Testing Plugins müssen Sie expecco inkl. des Plugins Mobile Testing installiert haben und Sie benötigen die entsprechenden Lizenzen. expecco kommuniziert mit den Mobilgeräten über einen Appium-Server, der entweder auf demselben Rechner wie expecco läuft, oder auf einem zweiten Rechner. Dieser muss für expecco erreichbar sein.&lt;br /&gt;
&lt;br /&gt;
==Installationsübersicht==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rechner, auf dem expecco läuft:&#039;&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rechner, an dem Android-Geräte angeschlossen sind:&#039;&#039;&#039;&lt;br /&gt;
* Appium-Server&#039;&#039;, diesen können Sie über das Mobile Testing Supplement installieren (s.u.), von dem wir regelmäßig einen neue Version zur Verfügung stellen&#039;&#039;&lt;br /&gt;
* Android SDK&#039;&#039;, dieses erhalten Sie ebenfalls mit dem Mobile Testing Supplement&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rechner, an dem iOS-Geräte angeschlossen sind&amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
* Appium-Server&#039;&#039;, diesen können Sie über das Mobile Testing Supplement für Mac OS installieren (s.u.), von dem wir regelmäßig einen neue Version zur Verfügung stellen&#039;&#039;&lt;br /&gt;
* Xcode &#039;&#039;in einer Version, die die verwendete iOS-Version unterstützt, erhältlich über den Apple App Store&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
* Apple-Entwickler-Zertifikat mit zugehörigem privaten Schlüssel &#039;&#039;(zum Signieren des WebDriverAgents)&#039;&#039;&lt;br /&gt;
* Provisioning Profile mit den verwendeten Mobilgeräten&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Je nach Aufbau können die oben genannten Rechner auch das selbe Gerät sein. expecco kann sich sowohl über das Netzwerk mit einem entfernten Appium-Server und dort angeschlossenen Mobilgeräten verbinden, als auch lokal selbst einen Appium-Server starten und diesen mit lokalen Mobilgeräten verwenden. Einige Funktionen von expecco, die die Erstellung von Testfällen erleichtern, sind jedoch nur verfügbar, wenn die Mobilgeräte am selben Rechner angeschlossen sind, auf dem auch expecco läuft. Ein möglicher Aufbau kann daher wie in folgender Abbildung aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAufbau.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird die Installation von Appium und anderer nötiger Programme für Windows und Mac OS erklärt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;: Zum Zeitpunkt der Erstellung dieses Dokuments wurden Versionen bis 11 auf Funktion verifiziert. Neuere Versionen sollten - sofern nicht grundlegende Änderungen von Oracle vorgenommen wurden, ebenfalls funktionieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;: Beachten Sie, dass aufgrund der Voraussetzungen (keine Anbindung an nicht-Apple Geräte verfügbar) iOS-Geräte nur von einem Mac aus angesteuert werden können. Sie benötigen also einen Mac als &amp;quot;Vermittler&amp;quot; (siehe auch unten: [[#Ich habe keinen Mac | &amp;quot;Ich habe keinen Mac&amp;quot;]])&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
Am einfachsten installieren Sie alles mit unserem Mobile Testing Supplement&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;. In neueren Versionen ist allerdings aufgrund geänderter Lizenzbedingungen seitens Oracle kein JDK mehr enthalten, sodass sie dieses zusätzlich installieren müssen. Sie können natürlich Appium auch direkt installieren, um die Version zu verwenden, die Sie möchten. Um dann einen Appium-Server mit expecco starten zu können, muss allerdings eine entsprechende Batchdatei vorhanden sein und in den [[Mobile_Testing_Plugin#Konfiguration_des_Plugins|Einstellungen]] angegeben werden. Verbindungen können aber auch zu anderen laufenden Appium-Servern aufgebaut werden.&lt;br /&gt;
*&#039;&#039;&#039;expecco 23.1&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-23.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.1]&lt;br /&gt;
:Gleiche Versionen wie der Vorgänger, aber der Installer erlaubt nun, Appium zum Autostart hinzuzufügen.&lt;br /&gt;
*expecco 22.2 und 22.1: [https://download.exept.de/transfer/h-expecco-22.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.2.0]&lt;br /&gt;
:Appium 1.22.3*&lt;br /&gt;
:Node 14.17.5&lt;br /&gt;
:adb 1.0.41 aus platform-tools 33.0.2&lt;br /&gt;
:&#039;&#039;* Wir haben Appium um die Capability&#039;&#039; startChromedriverTimeout &#039;&#039;erweitert, um schneller einen Timeout zu bekommen, wenn der Chromedriver nicht gestartet werden kann. (siehe [[#startChromedriverTimeout|Probleme und Lösungen]])&#039;&#039;&lt;br /&gt;
*expecco 21.2: [https://download.exept.de/transfer/h-expecco-21.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.12.0.0]&lt;br /&gt;
:Enthält die Appium-Version 1.22.0, Node ist weiterhin in der Version 12.13.1.&lt;br /&gt;
*expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.1.0]&lt;br /&gt;
:Nur kleine Änderungen im Vergleich zur vorigen Version.&lt;br /&gt;
*expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.0.0]&lt;br /&gt;
:Im Vergleich zur vorigen Version wurde Appium auf die Version 1.16.0-rc.1 aktualisiert und node 12 verwendet. &lt;br /&gt;
*expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.8.1.0]&lt;br /&gt;
:Dieses installiert Appium in der Version 1.12.0 und enthält nun zusätzlich build-tools der Version 28.0.3 im android-sdk. Ansonsten ist es gleich wie die vorige Version.&lt;br /&gt;
*expecco 18.2: [http://download.exept.de/transfer/h-expecco-18.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.7.3.0]&lt;br /&gt;
:Dieses installiert Appium in der Version 1.8.1. Außerdem bietet das Supplement auch an, &#039;&#039;Android Debug Bridge&#039;&#039; und &#039;&#039;Google USB Driver&#039;&#039; ([https://gsmusbdrivers.com/download/adb-fastboot-drivers/ adb-setup-1.4.3]) zu installieren. Damit sind Treiber für ein breites Spektrum an Android-Geräten abgedeckt, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen. Ein &#039;&#039;&#039;JDK ist (aufgrund geänderter Lizenzbedingungen seitens Oracle) nicht mehr enthalten&#039;&#039;&#039;, dieses müssen Sie selbst herunterladen, z.B. von [https://www.oracle.com/technetwork/java/javase/downloads/index.html Oracle].&lt;br /&gt;
*expecco 18.1: wie expecco 2.11&lt;br /&gt;
*expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/MobileTestingSupplement_1.6.0.2_Setup.exe Mobile Testing Supplement 1.6.0.2]&lt;br /&gt;
:Dieses installiert ein Java JDK der Version 8, android-sdk und Appium in der Version 1.6.4. Außerdem bietet das Supplement auch einen universellen adb-Treiber ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]) an. Dieser vereint Treiber für ein breites Spektrum an Android-Geräten, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen.&lt;br /&gt;
*expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_1.5.0.0_Setup.exe Mobile Testing Supplement 1.5.0.0]&lt;br /&gt;
:Dieses installiert ein Java JDK der Version 8, android-sdk und Appium in der Version 1.4.16. Während der Installation wird die grafische Oberfläche von Appium gestartet, dieses Fenster können Sie sofort wieder schließen. Außerdem bietet das Supplement auch einen universellen adb-Treiber ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]) an. Dieser vereint Treiber für ein breites Spektrum an Android-Geräten, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen.&lt;br /&gt;
&lt;br /&gt;
Wenn expecco Mobilgeräte verwenden soll, die an einem anderen Rechner angeschlossen sind, müssen Sie dort einen Appium-Server starten. Dies können Sie mit der Datei &amp;lt;code&amp;gt;appium_standalone.cmd&amp;lt;/code&amp;gt; tun. Der Server wird dann mit dem Standard-Port 4723 gestartet. Falls Sie eine andere Portnummer verwenden wollen, starten Sie den Server mit&lt;br /&gt;
&lt;br /&gt;
 appium_standalone.cmd -p &amp;lt;portnummer&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Server ist bereit, sobald die Zeile&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Appium REST http interface listener started on 0.0.0.0:4723&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
angezeigt wird, wobei Sie am Ende die verwendete Portnummer ablesen können.&lt;br /&gt;
&lt;br /&gt;
Beim ersten Starten von Appium – sowohl im Standalone als auch gestartet von expecco – kann es vorkommen, dass die Windows-Firewall den Node-Server blockiert. Lassen Sie den Zugriff zu, sonst kann Appium nicht gestartet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;) Sie können natürlich auch die Command Line Tools (adb, sdkmanager, avdmanager etc.) einer vorhandenen Android Studio Version verwenden, sowie Appium separat installieren.&lt;br /&gt;
Da sich diese Tools regelmäßig ändern, und es in der Vergangenheit zu Inkompatibilitäten und Fehlern nach Releasewechseln kam, empfehlen wir zu Beginn, das mitgelieferte Paket zu verwenden. Dies ist möglicherweise nicht das aktuellste, wurde aber auf Lauffähigkeit getestet.&lt;br /&gt;
&lt;br /&gt;
Falls das Android Mobilgerät an einem entfernen Rechner angeschlossen ist,&lt;br /&gt;
können Sie den aktuellen Bildschirminhalt z.B. mit dem [https://github.com/Genymobile/scrcpy scrcpy] tool live mitverfolgen.&lt;br /&gt;
&lt;br /&gt;
== Mac OS (nicht erforderlich für Android-Tests)==&lt;br /&gt;
Hinweis: Wenn Sie nicht vorhaben, iOS-Geräte (iPhone, iPad, etc.) zu testen, können Sie das Folgende ignorieren. &#039;&#039;&#039;Der Apple-Rechner sowie das Mac-Setup werden für Android-Geräte nicht benötigt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Xcode ===&lt;br /&gt;
Zur Automatisierung mit iOS-Geräten wird [https://developer.apple.com/xcode/ Xcode] benötigt. Sie erhalten dieses über den App Store. Dabei ist darauf zu achten, dass die Version zu den getesteten iOS-Versionen passt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;iOS&#039;&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp;  &lt;br /&gt;
|&#039;&#039;&#039;Xcode&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;macOS&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|10.x&lt;br /&gt;
|8.x&lt;br /&gt;
|10.12 (Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|11.x&lt;br /&gt;
|9.x&lt;br /&gt;
|10.13 (High Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|12.x&lt;br /&gt;
|10.x&lt;br /&gt;
|10.14 (Mojave)&lt;br /&gt;
|-&lt;br /&gt;
|13.x&lt;br /&gt;
|11.x&lt;br /&gt;
|10.15 (Catalina)&lt;br /&gt;
|-&lt;br /&gt;
|14.x&lt;br /&gt;
|12.x&lt;br /&gt;
|11.0 (Big Sur)&lt;br /&gt;
|-&lt;br /&gt;
|15.x&lt;br /&gt;
|13.x&lt;br /&gt;
|12.0 (Monterey)&lt;br /&gt;
|-&lt;br /&gt;
|16.x&lt;br /&gt;
|14.x&lt;br /&gt;
|12.5 (Monterey)&lt;br /&gt;
|}&lt;br /&gt;
Diese Tabelle gibt nur eine vereinfachte Übersicht, lesen Sie besser unter [https://xcodereleases.com/ Xcode Releases] oder [https://en.wikipedia.org/wiki/Xcode#Version_comparison_table Xcode-Versionen] welche Version Sie brauchen. Für neue iOS Minor-Versionen gibt es in der Regel auch ein Update für Xcode, z.B. brauchen Sie für iOS 10.2 mindestens Xcode 8.2, für iOS 10.3 mindestens Xcode 8.3 usw. &lt;br /&gt;
Wenn Sie also auf eine neuere iOS-Version wechseln, benötigen Sie in der Regel auch eine neuere Xcode-Version. Neuere Versionen von Xcode laufen möglicherweise nicht auf älteren Betriebssystemen, was wiederum eine Aktualisierung des Betriebssystems erforderlich machen kann. Falls Sie auch ältere iOS-Versionen testen wollen kann es sinnvoll sein, die entsprechenden Xcode-Versionen parallel zu installieren.&lt;br /&gt;
&lt;br /&gt;
=== Appium ===&lt;br /&gt;
Der Appium-Server kann entweder als Kommandozeilen-Anwendung installiert werden oder über [https://github.com/appium/appium-desktop Appium Desktop] verwendet werden, welcher den Server über ein GUI zur Verfügung stellt. Mittlerweile gibt es auch Appium 2.0, was wir aber bisher noch nicht mit expecco getestet haben und daher nicht empfehlen.&lt;br /&gt;
&lt;br /&gt;
==== Appium Desktop ====&lt;br /&gt;
Laden Sie die neueste Version von [https://github.com/appium/appium-desktop/releases/ Appium Desktop] herunter. Für den Mac nehmen Sie am besten die dmg-Datei und installieren sie in den Anwendungen. Beim Starten der Anwendung &#039;&#039;Appium Server GUI&#039;&#039; erhalten Sie wahrscheinlich eine Fehlermeldung, dass es aus Sicherheitsgründen nicht möglich ist. Öffnen Sie dann das Kontextmenü auf der Anwendungsdatei (Rechtsklick bzw. Strg + Klick) und wählen Sie dort &#039;&#039;Öffnen&#039;&#039; aus. Bestätigen Sie dann, dass Sie die Anwendung wirklich öffnen wollen. Fortan können Sie die Anwendung normal öffnen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:OpenAppiumServerGUI1.png|text-top]] [[Datei:OpenAppiumServerGUI2.png|text-top]]&lt;br /&gt;
&lt;br /&gt;
Ab Xcode 14 gibt es Probleme beim Signieren des WebDriverAgents, den Appium zur Automatisierung auf das Gerät spielt. Dadurch ist mit der Version 1.22.3-4 von Appium Desktop kein Verbindungsaufbau möglich. Das Problem ist in neueren Versionen des WebDriverAgents behoben, es gibt aber aktuell noch keine Version von Appium Desktop, die eine solche Version enthält (Stand November 2022). Sie können aber manuell eine neue Version herunterladen (z.B. 4.10.2)  und die Dateien in Appium ersetzen. Laden Sie dazu von der [https://github.com/appium/WebDriverAgent/releases/ WebDriverAgent Download-Seite] eine der beiden Archivdateien (zip oder tar.gz) mit dem Source Code herunter. Öffnen und entpacken Sie dann diese Datei. Den Inhalt des Ordners WebDriverAgent-4.10.2 müssen Sie nun nach&lt;br /&gt;
&lt;br /&gt;
 /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
kopieren. Wenn Sie über den Finder dorthin navigieren, machen Sie auf die Anwendung &#039;&#039;Appium Server GUI&#039;&#039; einen Kontextklick (Rechtsklick bzw. Strg + Klick) und wählen Sie im Menü &#039;&#039;Paketinhalt anzeigen&#039;&#039;. Ersetzen Sie alle Dateien, die bereits mit gleichem Namen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
==== Appium über npm installieren ====&lt;br /&gt;
Sie können Appium auch über npm (Node Package Manager) installieren. Dazu müsen Sie erst node/npm installieren. Das geht mit [https://github.com/nvm-sh/nvm nvm] (Node Version Manager) was Sie von Github bekommen. Falls die folgende Installationsanleitung bei Ihnen nicht funktionieren sollte, finden Sie dort ausführlichere Informationen im [https://github.com/nvm-sh/nvm#readme Readme].&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie ein Terminal-Fenster. Klonen Sie dann das Github-Repository von nvm&lt;br /&gt;
 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash&lt;br /&gt;
und laden Sie es&lt;br /&gt;
 export NVM_DIR=&amp;quot;$([ -z &amp;quot;${XDG_CONFIG_HOME-}&amp;quot; ] &amp;amp;&amp;amp; printf %s &amp;quot;${HOME}/.nvm&amp;quot; || printf %s &amp;quot;${XDG_CONFIG_HOME}/nvm&amp;quot;)&amp;quot; [ -s &amp;quot;$NVM_DIR/nvm.sh&amp;quot; ] &amp;amp;&amp;amp; \. &amp;quot;$NVM_DIR/nvm.sh&amp;quot; # This loads nvm&lt;br /&gt;
&lt;br /&gt;
Führen Sie danach&lt;br /&gt;
 command -v nvm&lt;br /&gt;
aus, um zu testen, ob es funktioniert hat. Es sollte &#039;&#039;nvm&#039;&#039; ausgegeben werden. Kommt keine Antwort, führen Sie&lt;br /&gt;
 touch ~/.zshrc&lt;br /&gt;
aus, und versuchen Sie es erneut.&lt;br /&gt;
&lt;br /&gt;
Nun können Sie node mit dem folgenden Befehl installieren.&lt;br /&gt;
 nvm install 16.15.1&lt;br /&gt;
Da es mit der aktuellen Version von node Probleme beim Installieren von Appium gibt, empfehlen wir diese Version.&lt;br /&gt;
&lt;br /&gt;
Nachdem node installiert ist, können Sie Appium darüber installieren:&lt;br /&gt;
 npm install -g appium&lt;br /&gt;
&lt;br /&gt;
Den Appium-Server können Sie nun einfach über den Befehl&lt;br /&gt;
 appium&lt;br /&gt;
starten. Die Ausgabe erfolgt dann direkt im Terminal.&lt;br /&gt;
&lt;br /&gt;
Auch bei dieser Version gibt es das Problem bei der Signierung des WebDriverAgents, wie bei [[#Appium_Desktop | Appium Desktop]] beschrieben. Laden Sie also auch in diesem Fall eine neuere Version des WebDriverAgents herunter und ersetzen Sie die alten Dateien. Diese finden Sie unter&lt;br /&gt;
 /Users/&amp;lt;user&amp;gt;/.nvm/versions/16.15.1/lib/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
==== Mobile Testing Supplement ====&lt;br /&gt;
Ältere Appium-Versionen stellen wir Ihnen über das Mobile Testing Supplement für Mac OS zur Verfügung, mit dem Sie es einfach installieren können:&lt;br /&gt;
* &#039;&#039;&#039;expecco 20.2&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-20.2.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement für Mac OS (1.2.2)]&lt;br /&gt;
:Enthält Appium Version 1.18.3 und verwendet node 14.&lt;br /&gt;
&lt;br /&gt;
* expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement für Mac OS (1.2.0)]&lt;br /&gt;
:Nur wenige Änderungen im Vergleich zur vorigen Version.&lt;br /&gt;
&lt;br /&gt;
* expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement_for_MacOS.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.98)]&lt;br /&gt;
:Im Vergleich zur vorigen Version wurde Appium auf die Version 1.16.0-rc.1 aktualisiert und es wird node 12 verwendet. &lt;br /&gt;
&lt;br /&gt;
* expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.96.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.96)]&lt;br /&gt;
:Diese Version enthält Appium 1.12.0. &lt;br /&gt;
&lt;br /&gt;
* expecco 18.1: [http://download.exept.de/transfer/h-expecco-18.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.94.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.94)]&lt;br /&gt;
:Diese Version enthält Appium 1.8.0.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/Mobile_Testing_Supplement_for_Mac_OS_1.0.94.tar.bz2 Mobile Testing Supplement für Mac OS (1.0.94)]&lt;br /&gt;
:Diese Version enthält Appium 1.6.4.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_for_Mac_OS_1.0.tar.bz2 Mobile Testing Supplement für Mac OS]&lt;br /&gt;
:Diese Version entält Appium 1.4.16.&lt;br /&gt;
&lt;br /&gt;
Nachdem Herunterladen des Supplements, können Sie es in ein Verzeichnis Ihrer Wahl (z. B. Ihr Home-Verzeichnis) verschieben und dort entpacken. Ein geeigneter Befehl in einer Shell könnte wie folgt aussehen, passen Sie dabei die Versionsnummer entsprechend an:&lt;br /&gt;
&lt;br /&gt;
 tar -xvpf Mobile_Testing_Supplement_for_Mac_OS_1.1.98.tar.bz2&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Ihre Standard-Xcode-Installation verwenden wollen, können Sie Appium direkt über die Datei im &#039;&#039;bin&#039;&#039;-Verzeichnis mit der entsprechenden Versionsnummer starten:&lt;br /&gt;
&lt;br /&gt;
 Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
Falls Sie ein anderes Xcode als das als Standard konfigurierte verwenden wollen, müssen Sie Appium den entsprechenden Pfad über die Umgebungsvariable &#039;&#039;DEVELOPER_DIR&#039;&#039; angeben. &lt;br /&gt;
Wenn Sie Xcode z. B. in &#039;&#039;/Applications/Xcode-11.3.app&#039;&#039; installiert haben, müssten Sie Appium so starten:&lt;br /&gt;
&lt;br /&gt;
 DEVELOPER_DIR=&amp;quot;/Applications/Xcode-11.3.app/Contents/Developer&amp;quot; Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
Was als Standard-Xcode-Installation gesetzt ist, zeigt der Befehl:&lt;br /&gt;
&lt;br /&gt;
 xcode-select -p&lt;br /&gt;
&lt;br /&gt;
Wenn Appium Ihre Xcode-Installation nicht findet, erscheint beim Verbinden eine Fehlermeldung in der Art:&lt;br /&gt;
&#039;&#039;&amp;lt;blockquote&amp;gt;org.openqa.selenium.SessionNotCreatedException - A new session could not be created. (Original error: Could not find path to Xcode, environment variable DEVELOPER_DIR set to: /Applications/Xcode.app but no Xcode found)&amp;lt;/blockquote&amp;gt;&#039;&#039;&lt;br /&gt;
Starten Sie in diesem Fall Appium erneut, unter Angabe eines gültigen &#039;&#039;DEVELOPER_DIR&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== WebDriverAgent-Signierung ====&lt;br /&gt;
Zur Automatisierung lädt Appium eine App namens WebDriverAgent auf das Gerät und muss sie dafür signieren können. Dazu brauchen Sie einen Apple-Account und ein entsprechendes Zertifikat. Zur Evaluierung können Sie einen kostenlosen Account verwenden. Dieser hat den Nachteil, dass erstellte Profile nur eine Woche gültig sind und danach neu erstellt werden müssen. Seien Sie auch vorsichtig, wenn Sie sich den Account teilen, da es vorkommen kann, dass Zertifikate widerrufen werden oder durch automatische Generierung ungültig werden. Als Folge können bereits signierte Apps nicht mehr verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie bereits ein entsprechendes Zertifikat mit dem zugehörigen privaten Schlüssel in Ihrer [https://support.apple.com/de-de/guide/keychain-access/welcome/mac Schlüsselbundverwaltung] auf dem Mac haben, können Sie den WebDriverAgent automatisch signieren lassen. Ansonsten empfiehlt es sich, die Signierung über Xcode einzustellen und zu verwalten.&lt;br /&gt;
&lt;br /&gt;
Schließen Sie zuerst das Gerät, das Sie verwenden möchten, über USB an den Mac an. Stellen Sie sicher, dass sich der Mac und das Gerät im selben Netzwerk befinden, ansonsten kann es beim Verbindungsaufbau mit Appium zu Problemen kommen. Starten Sie Xcode und öffnen Sie &#039;&#039;Preferences&#039;&#039;. Wechseln Sie zur Seite der Accounts und legen Sie einen Eintrag mit Ihrem Account an. Anschließend können Sie auf &#039;&#039;Manage Certificates...&#039;&#039; klicken, um die Zertifikate zu sehen, die zu diesem Account gehören. Zum Ausführen von Tests benötigen Sie ein iOS-Development-Zertifikat und den dazugehörigen privaten Schlüssel. Wenn Sie noch keines besitzen, erstellen Sie eines. Wenn Sie bereits eines haben, aber es nicht in Ihrem Schlüsselbund vorhanden ist (erkennbar an dem Hinweis &amp;quot;Not in Keychain&amp;quot;), können Sie es importieren. Das können Sie über die [https://support.apple.com/de-de/guide/keychain-access/welcome/mac Schlüsselbundverwaltung] auf dem Mac machen, wenn Sie es zuvor aus dem Schlüsselbund exportiert haben, in dem es sich befindet. Das Zertifikat mit dem zugehörigen Schlüssel sollte sich im Schlüsselbund &#039;&#039;Anmeldung&#039;&#039; befinden. Dort kann es als PKCS#12-Datei (Endung typischerweise .p12) exportiert werden. Um ein Zertifikat in Ihren Schlüsselbund zu importieren, wählen Sie im Menü &#039;&#039;Ablage&#039;&#039; die Option &#039;&#039;Objekte importieren&#039;&#039;. Falls Sie nicht wissen, wo das Zertifikat gespeichert ist, können Sie es in Xcode auch widerrufen und in Ihrem Schlüsselbund neu anlegen. Machen Sie das jedoch nur, wenn Sie wissen, dass das alte Zertifikat nicht mehr in Verwendung ist, da es danach nicht mehr benutzt werden kann. Nun sollte Ihr Schlüsselbund ein iOS-Development-Zertifikat enthalten.&lt;br /&gt;
&amp;lt;!---(Ich habe den folgenden Teil mal rausgenommen. Man braucht das nicht, wenn es in Xcode eingestellt ist.) Wählen Sie im Rechtsklick-Menü den Punkt &#039;&#039;Informationen&#039;&#039; aus. Unter den Details des Zertifikats finden Sie die Team-ID, die hier als Organisationseinheit bezeichnet wird. Tragen Sie diese in den Einstellungen des Plugins im Feld &#039;&#039;Team-ID&#039;&#039; ein, siehe [[#Konfiguration_des_Plugins|Konfiguration des Plugins]].--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie nun das WebDriverAgent-Projekt in Xcode. Wenn Sie das Mobile Testing Supplement installiert haben, finden Sie es in dessen Verzeichnis unter&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
Wenn Sie Appium Desktop installier haben, finden Sie es unter&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;/Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
Sie können einfach im Finder zu der Xcode-Project-Datei navigieren und Sie über einen Doppelklick öffnen. Beachten Sie dabei, dass Sie dabei auf die Anwendung Appium Server GUI einen Kontextklick (Rechtsklick bzw. Strg + Klick) machen und im Menü &#039;&#039;Paketinhalt anzeigen&#039;&#039; auswählen müssen, um in deren Unterverzeichnis zu gelangen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingWebDriverAgentXcode.png]]&lt;br /&gt;
&lt;br /&gt;
Wählen Sie &#039;&#039;WebDriverAgentLib&#039;&#039; und die Seite &#039;&#039;Signing &amp;amp; Capabilities&#039;&#039; aus. Setzen Sie dort im Abschnitt &#039;&#039;Signing&#039;&#039; die Option &#039;&#039;Automatically manage signing&#039;&#039; und wählen Sie dann ein Team aus. Wechseln Sie nun zu &#039;&#039;WebDriverAgentRunner&#039;&#039; und tun Sie dort dasselbe.&lt;br /&gt;
&amp;lt;!--(Das Folgende scheint nicht mehr aktuell zu sein.) Es sollten an dieser Stelle Fehler angezeigt werden, dass kein Provisioning Profile angelegt oder gefunden wurde. Wechseln Sie deshalb zur Seite &#039;&#039;Build Settings&#039;&#039; und suchen Sie hier im Abschnitt &#039;&#039;Packaging&#039;&#039; den Eintrag &#039;&#039;Product Bundle Identifier&#039;&#039;. Ändern Sie diesen von com.facebook.WebDriverAgentRunner zu etwas, das von Xcode akzeptiert wird, indem Sie den Präfix ändern. Xcode kann nun ein passendes Provisioning Profile generieren und die Fehler auf der General-Seite sollten verschwinden. Danach können Sie Xcode beenden. --&amp;gt;&lt;br /&gt;
Durch das Setzen des Teams sollten die Fehler für den WebDriverAgentRunner verschwinden. Sollte Xcode kein passendes Provisioning Profile für die Bundle ID &#039;&#039;com.facebook.WebDriverAgentRunner&#039;&#039; erstellen können, können Sie diese anpassen, dass sie zu Ihrem Zertifikat passt. Danach können Sie Xcode beenden oder auch, wie weiter unten beschrieben, direkt den Build über Xcode starten, damit das Projekt bereits gebaut ist, wenn Appium es verwenden möchte.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie sich nun von expecco eine Verbindung zu Ihrem Gerät aufbauen, wird der WebDriverAgent darauf installiert und gestartet, um anschließend zur zu testenden App zu wechseln. Eventuell muss auf dem Gerät muss der Ausführung des WebDriverAgents vertraut noch werden. Ein Anzeichnen dafür kann sein, dass die App WebDriverAgent zwar auf dem Gerät erscheint und zu starten versucht, danach aber wieder deinstalliert wird. Öffnen Sie dazu während des Verbindungsaufbaus auf dem Gerät in die Einstellungen und dort unter &#039;&#039;Allgemein&#039;&#039; den Eintrag &#039;&#039;Geräteverwaltung&#039;&#039;. Dieser Eintrag ist nur sichtbar, wenn eine Entwickler-App auf dem Gerät installiert ist. Sie müssen daher möglicherweise warten, bis der WebDriverAgent installiert ist, bevor der Eintrag erscheint. Wählen Sie dort den Eintrag Ihres Apple-Accounts und vertrauen Sie ihm. Da der WebDriverAgent wieder deinstalliert wird, wenn der Start nicht funktioniert hat, müssen Sie dies während des Verbindungsaufbaus tun. Falls Ihnen das zu hektisch ist, können Sie auch folgenden Code ausführen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;xcodebuild -project Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
  xcodebuild -project /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&lt;br /&gt;
&lt;br /&gt;
Damit wird der WebDriverAgent auf dem Gerät installiert ohne dass er wieder gelöscht wird.&lt;br /&gt;
&lt;br /&gt;
Wenn es Probleme beim Installieren des WebDriverAgents gibt, können Sie auch versuchen, den Build über Xcode zu starten. Stellen Sie sicher, dass das richtige Target &#039;&#039;WebDriverAgent&#039;&#039; ausgewählt ist. Fehlermeldungen in Xcode zeigen vielleicht einfacher, wo das Problem liegt. Manchmal hilft es auch, es ein zweites Mal zu versuchen, weil es möglicherweise beim ersten Mal zu lange gedauert hat und abgebrochen wurde. Es kann sein, dass Sie während des Builds mehrmals aufgefordert werden, das Passwort für Ihren Schlüsselbund anzugeben.&lt;br /&gt;
&lt;br /&gt;
[[Datei:WebDriverAgentCodesign.png]]&lt;br /&gt;
&lt;br /&gt;
Lesen Sie auch die Dokumentation von Appium zum [https://github.com/appium/appium-xcuitest-driver/blob/master/docs/real-device-config.md Aufsetzen von Tests mit iOS-Geräten]. In der [https://support.apple.com/en-us/HT204460 Dokumentation von Apple] finden Sie nähere Informationen zum Installieren und Vertrauen von Apps.&lt;br /&gt;
&lt;br /&gt;
Ist der WebDriverAgent einmal auf dem Gerät installiert, wird er für spätere Verbindungen wieder verwendet und der Verbindungsaufbau sollte schneller funktionieren. Ebenso liegt dann die signierte Version bereits auf Ihrem Mac und muss nicht erneut gebaut werden, was die Verbindung zu weiteren Geräten ebenfalls beschleunigt. Wenn Sie wissen, dass bei Ihrem Verbindungsaufbau der WebDriverAgent erst noch signiert und gebaut werden muss, ist es ratsam, die Capability &#039;&#039;wdaLaunchTimeout&#039;&#039; zu setzen. Dieser Timeout, wie lange auf den Start der WebDriverAgents auf dem Gerät gewartet werden soll, liegt standardmäßig bei 60000 ms. Der Build dauert aber häufig über eine Minute, sodass der Versuch zum Verbindungsaufbau dann abgebrochen wird. Ein Wert von 120000 hat sich hier als besser erwiesen.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration des Plugins ==&lt;br /&gt;
Bevor Sie loslegen, sollten Sie die Einstellungen des Mobile Testing Plugins überprüfen und ggf. anpassen.&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie im Menü den Punkt &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; und dort unter &amp;quot;&#039;&#039;Erweiterungen&#039;&#039;&amp;quot; den Eintrag &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot; (s. Abb.). Standardmäßig werden diese Pfade automatisch gefunden (1). Um einen Pfad manuell anzupassen, deaktivieren Sie den entsprechenden Haken rechts davon. Sie erhalten in einer Drop-down-Liste einige Pfade zur Auswahl. Ist ein eingetragener Pfad falsch oder kann er nicht gefunden werden, wird das Feld rot markiert und es erscheint ein diesbezüglicher Hinweis. Stellen Sie sicher, dass alle Pfade richtig angegeben sind.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingEinstellungen.png | thumb | 400px | Konfiguration des Plugins]]&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;appium&#039;&#039;&#039;: Geben Sie hier den Pfad zur ausführbaren Datei an mit der Appium in der Kommandozeile gestartet werden kann. Unter Windows wird diese Datei in der Regel &amp;quot;&amp;lt;code&amp;gt;appium.cmd&amp;lt;/code&amp;gt;&amp;quot; heißen. Dieser Pfad wird benutzt, wenn expecco einen Appium-Server startet.&lt;br /&gt;
*&#039;&#039;&#039;node&#039;&#039;&#039;: Geben Sie hier den Pfad zur ausführbaren Datei an, die Node (auch &amp;quot;Node.js&amp;quot;) startet. Dieser Pfad wird beim Starten eines Servers an Appium weitergegeben, damit Appium ihn unabhängig von der PATH-Variablen findet. Unter Windows heißt diese Datei in der Regel &amp;quot;&amp;lt;code&amp;gt;node.exe&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;JAVA_HOME&#039;&#039;&#039;: Geben Sie hier den Pfad zu einem JDK an. Dieser Pfad wird an jeden Appium-Server weitergegeben. Lassen Sie das Feld frei, um den Wert aus der Umgebungsvariablen zu verwenden. Um einzustellen, welches Java von expecco verwendet werden soll, setzen Sie diesen Pfad in den Einstellungen für die Java Bridge.&lt;br /&gt;
*&#039;&#039;&#039;ANDROID_HOME&#039;&#039;&#039;: Geben Sie hier den Pfad zu einem SDK von Android an. Dieser Pfad wird an jeden Appium-Server weitergegeben. Lassen Sie das Feld frei, um den Wert aus der Umgebungsvariablen zu verwenden.&lt;br /&gt;
*&#039;&#039;&#039;adb&#039;&#039;&#039;: Hier steht der Pfad zum adb-Befehl. Unter Windows heißt die Datei adb.exe. Diese wird von expecco beispielsweise verwendet, um die Liste der angeschlossenen Geräte zu erhalten. Diesen Pfad sollten Sie automatisch wählen lassen, da dann der Befehl im ANDROID_HOME-Verzeichnis verwendet wird. Dieser wird auch von Appium verwendet. Falls expecco und Appium jedoch verschiedene Versionen von adb verwenden kann es zu Konflikten kommen.&lt;br /&gt;
*&#039;&#039;&#039;android.bat&#039;&#039;&#039;: Diese Datei wird nur benötigt, um damit den AVD und den SDK Manager zu starten. Automatisch wird hier die Datei im ANDROID_HOME-Verzeichnis gesucht.&lt;br /&gt;
*&#039;&#039;&#039;aapt&#039;&#039;&#039;: Geben Sie hier den Pfad zum aapt-Befehl an. Unter Windows heißt diese Datei &#039;&#039;aapt.exe&#039;&#039;. expecco verwendet aapt nur im Verbindungseditor, um das Paket und die Activities einer apk-Datei zu lesen. Automatisch wird hier die Datei im ANDROID_HOME-Verzeichnis gesucht.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingJavaBridgeEinstellungen.png | thumb | 400px | Konfiguration des JDKs]]&lt;br /&gt;
&lt;br /&gt;
Ab expecco 2.11 gibt es das Feld &#039;&#039;Team-ID&#039;&#039;. Wenn Sie iOS-Tests ausführen, tragen Sie hier die Team-ID Ihres Zertifikats ein. Diese wird für jede iOS-Verbindung verwendet, außer Sie setzen den Wert im Einzelfall in den Verbindungseinstellungen um. Wie Sie die Team-ID erhalten, lesen Sie im Abschnitt zur [[#Signierung|Signierung]] ber der Installation auf Mac OS. Mit expecco 2.10 können Sie die Team-ID nur für jede Verbindungseinstellung extra als Capability eintragen. Dazu müssen Sie jedoch die [[#Erweiterte_Ansicht|erweiterte Ansicht]] verwenden. Geben Sie hier die Capability &#039;&#039;xcodeOrgId&#039;&#039; an und setzen Sie als Wert die Team-ID des Zertifikats.&lt;br /&gt;
&lt;br /&gt;
Die Einstellung zur Serveradresse unten auf der Seite bezieht sich auf das Verhalten des Verbindungseditors. Dieser prüft am Ende, ob die Serveradresse auf &#039;&#039;/wd/hub&#039;&#039; endet, da dies die übliche Form ist. Falls nicht, wird in einem Dialog gefragt, wie darauf reagiert werden soll. Das festgelegte Verhalten kann hier eingesehen und verändert werden.&lt;br /&gt;
&lt;br /&gt;
Wechseln Sie ebenfalls zum Eintrag &#039;&#039;Java Bridge&#039;&#039; (s. Abb.). Hier muss der Pfad zu Ihrer Java-Installation angegeben werden, die von expecco benutzt wird. Tragen Sie hier ein JDK ein. Falls Sie unter Windows das aus dem Mobile Testing Supplement verwenden möchten, lautet der Pfad&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;C:\Program Files (x86)\exept\Mobile Testing Supplement\jdk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Sie können auch die Systemeinstellungen verwenden.&lt;br /&gt;
&lt;br /&gt;
== Android-Gerät vorbereiten ==&lt;br /&gt;
Wenn Sie ein Android-Gerät unter Windows anschließen benötigen Sie möglicherweise noch einen adb-Treiber für das Gerät. Einen passenden Treiber finden Sie üblicherweise auf der jeweiligen Webseite des Herstellers. Haben Sie den Universal-Treiber aus dem Mobile Testing Supplement installiert, sollte für die meisten Geräte bereits alles funktionieren. In einigen Fällen versucht auch Windows automatisch einen Treiber zu installieren, wenn Sie das Gerät zum ersten mal anschließen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===USB-Debugging Einschalten===&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Bevor Sie ein Mobilgerät mit dem Appium-Plugin ansteuern können, müssen Sie für dieses Debugging erlauben!&lt;br /&gt;
&lt;br /&gt;
Für Android-Geräte finden Sie diese Option in den Einstellungen unter &#039;&#039;[https://www.droidwiki.org/wiki/Entwickleroptionen Entwickleroptionen]&#039;&#039; mit dem Namen &#039;&#039;[https://www.droidwiki.org/USB-Debugging USB-Debugging]&#039;&#039;. Falls die Entwickleroptionen nicht angezeigt werden, können Sie diese freischalten, indem Sie unter &amp;quot;&#039;&#039;Über das Telefon&#039;&#039;&amp;quot; siebenmal auf &amp;quot;&#039;&#039;Build-Nummer&#039;&#039;&amp;quot; tippen.&lt;br /&gt;
&lt;br /&gt;
===Wach bleiben Aktivieren===&lt;br /&gt;
Aktivieren Sie auch die Funktion &#039;&#039;Wach bleiben&#039;&#039;, damit das Gerät nicht während der Testerstellung oder -ausführung den Bildschirm abschaltet.&lt;br /&gt;
&lt;br /&gt;
Aus Sicherheitsgründen muss USB-Debugging für jeden Computer einzeln zugelassen werden. Beim Verbinden des Geräts mit dem PC über USB müssen Sie dabei am Gerät der Verbindung zustimmen. Falls Sie dies für Ihren Computer noch nicht getan haben, aber auf dem Gerät kein entsprechender Dialog erscheint, kann es helfen, das Gerät aus- und wieder einzustecken. Das kann insbesondere dann passieren, wenn Sie den ADB-Treiber installiert haben während das Gerät bereits über USB angeschlossen war. Falls auch das nicht hilft, öffnen Sie die Benachrichtigungen, indem Sie sie vom oberen Bildschirmrand herunter ziehen. Dort finden Sie die USB-Verbindung und Sie können die Optionen dazu öffnen. Wählen Sie einen anderen Verbindungstypen aus; in der Regel sollten MTP oder PTP funktionieren.&lt;br /&gt;
&lt;br /&gt;
Sie können auch auf einem Emulator testen. Dieser muss nicht gesondert vorbereitet werden, da er bereits für USB-Debugging ausgelegt ist. Es ist sogar möglich, einen Emulator bei Testbeginn zu starten.&lt;br /&gt;
&lt;br /&gt;
Um zu überprüfen, ob ein Gerät, das Sie an Ihren Rechner angeschlossen haben, verwendet werden kann, öffnen Sie den [[#Verbindungseditor|Verbindungseditor]]. Das Gerät sollte dort angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Verbindung über WLAN ===&lt;br /&gt;
Es ist auch möglich, Android-Geräte über WLAN zu verbinden. Für Geräte mit Android 11 oder neuer ist dies direkt über WLAN möglich, im anderen Fall müssen Sie das Gerät zuerst über USB verbinden. Ab expecco 22.1 können Sie eine WLAN-Verbindung über den [[Mobile Testing Plugin#Verbindungseditor|Verbindungseditor]] aufbauen. Ansonsten ist es auch über die Eingabeaufforderung möglich.&lt;br /&gt;
==== Drahtlos verbinden über die Eingabeaufforderung mit expecco Versionen vor 22.1 (ab Android 11) ====&lt;br /&gt;
Mit expecco ab Version 22.1 funktioniert das einfacher über den Verbindungseditor.&lt;br /&gt;
&lt;br /&gt;
Erlauben Sie in den Entwickleroptionen des Geräts Debugging über WLAN und öffnen Sie dessen Optionen. Sie müssen zuerst das Gerät mit dem  Rechner koppeln. Wählen Sie dazu &amp;quot;&#039;&#039;Gerät mit einem Kopplungscode koppeln&#039;&#039;&amp;quot;, um einen Kopplungscode und eine IP-Adresse mit Port zu erhalten. Öffnen Sie dann auf dem Rechner die Eingabeaufforderung und geben Sie dort ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb pair &amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Kopplungsport&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
wobei Sie &amp;lt;tt&amp;gt;&amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Kopplungsport&amp;gt;&amp;lt;/tt&amp;gt; durch die auf dem Gerät angezeigte IP-Adresse &amp;amp; Port ersetzen. Danach werden Sie aufgefordert, den Kopplungscode einzugeben. Wenn alles geklappt hat, sollte sich das Popup auf dem Gerät schließen und der Rechner als gekoppeltes Gerät angezeigt werden. Geben Sie dann in der Eingabeaufforderung ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Debug-Port&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die IP-Adresse ist hier noch die gleiche wie beim Koppeln, aber der Port ist ein anderer. Beides wird als IP-Adresse &amp;amp; Port auf dem Gerät angezeigt. Damit sollte das Gerät nun über WLAN verbunden sein und kann genauso verwendet werden, wie mit USB-Verbindung. Sie können dies überprüfen, indem Sie entweder &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; eingeben oder in expecco den Verbindungsdialog öffnen. In der Liste taucht das Gerät mit seiner IP-Adresse und dem Port auf. Bedenken Sie, dass die WLAN-Verbindung nicht mehr besteht, wenn der ADB-Server oder das Gerät neu gestartet werden. Häufig wird beim Neustart des Geräts auch die Erlaubnis für das Debugging über WLAN wieder zurückgesetzt und der verwendete Port ändert sich. Die Kopplung bleibt aber bestehen und muss beim nächsten Verbinden nicht noch einmal durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==== WLAN Verbindung über USB starten (Android 10 und früher) ====&lt;br /&gt;
Verbinden Sie zunächst das Gerät über USB mit dem Rechner. Öffnen Sie dann die Eingabeaufforderung und geben Sie dort ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit lauscht das Gerät auf eine TCP/IP-Verbindung an Port 5555. Sollten Sie mehrere Geräte angeschlossen oder Emulatoren laufen haben, müssen Sie genauer angeben, welches Gerät Sie meinen. Geben Sie in diesem Fall ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb devices -l&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Sie erhalten eine Liste aller Geräte, wobei die erste Spalte deren Kennung ist. Schreiben Sie dann stattdessen&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb -s &amp;lt;Gerätekennung&amp;gt; tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
mit der Gerätekennung des gewünschten Geräts. Sie können die USB-Verbindung nun trennen. Jetzt müssen Sie die IP-Adresse Ihres Gerätes in Erfahrung bringen. Sie finden diese üblicherweise irgendwo in den Einstellungen des Geräts, beispielsweise beim Status oder in den WLAN-Einstellungen. Geben Sie dann ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP-Adresse des Geräts&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit sollte das Gerät nun über WLAN verbunden sein und kann genauso verwendet werden, wie mit USB-Verbindung. Sie können dies überprüfen, indem Sie wieder &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; eingeben oder in expecco den Verbindungsdialog öffnen. In der Liste taucht das Gerät mit seiner IP-Adresse und dem Port auf. Bedenken Sie, dass die WLAN-Verbindung nicht mehr besteht, wenn der ADB-Server oder das Gerät neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
=== Verbindung zu einem Emulator ===&lt;br /&gt;
Sie benötigen dazu den Emulator selbst, sowie mindestens ein AVD (Android Virtual Device). Hinweise zu Installation finden Sie in der [https://developer.android.com/studio/run/emulator Android Studio Dokumentation].&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Android Studio bereits mit den Defaulteinstellungen installiert haben &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;, sollte der Emulator bereits mitinstalliert sein. Falls nicht, wählen Sie in Android Studio &amp;quot;&#039;&#039;Configure&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;SDK Manager&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Android SDK&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;SDK Tools&#039;&#039;&amp;quot; - &#039;&#039;Android Emulator&#039;&#039;&amp;quot;, sowie dort die &amp;quot;&#039;&#039;Platform Tools&#039;&#039;&amp;quot;.&lt;br /&gt;
Alternativ geht das auch über die Kommandzeile mit dem &amp;quot;sdkmanager&amp;quot; Kommando.&lt;br /&gt;
&lt;br /&gt;
Als nächstes benötigen Sie mindestens ein AVD; auch dies geht am einfachsten über den Dialog in Android Studio:&lt;br /&gt;
wählen sie &amp;quot;&#039;&#039;Configure&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;AVD Manager&#039;&#039;&amp;quot; und folgen den Anweisungen (Deviceauswahl, Platform und Android Version).  &lt;br /&gt;
&lt;br /&gt;
Auch wenn Sie den Emulator automatisieren benötigen sie Appium; installieren Sie dieses entweder mit dem Mobile Testing Supplement, oder direkt von der Appium homepage (https://github.com/appium/appium-desktop/releases).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;Android Studio selbst wird nicht von expecco benötigt; es bietet aber kompfortable Dialoge zum Installieren von Paketen und AVDs.&lt;br /&gt;
&lt;br /&gt;
== iOS-Gerät und App vorbereiten ==&lt;br /&gt;
Das Ansteuern von iOS-Geräten ist nur über einen Mac möglich. Lesen Sie daher auch den Abschnitt zur [[#Mac_OS|Installation unter Mac OS]].&lt;br /&gt;
&lt;br /&gt;
Bevor Sie ein Mobilgerät mit dem Mobile Testing Plugin ansteuern können, müssen Sie für iOS-Geräte ab iOS 8 Debugging erlauben. Aktivieren Sie dazu die Option &#039;&#039;Enable UI Automation&#039;&#039; unter dem Menüpunkt &#039;&#039;Entwickler&#039;&#039; in den Einstellungen des Geräts. Falls Sie den Eintrag &#039;&#039;Entwickler&#039;&#039; in den Einstellungen nicht finden, gehen Sie wie folgt vor: Schließen Sie das Gerät über USB an den Mac an. Dabei müssen Sie ggf. am Gerät noch der Verbindung zustimmen. Starten Sie Xcode und wählen Sie dann in der Menüleiste am oberen Bildschirmrand im Menü &#039;&#039;Window&#039;&#039; den Eintrag &#039;&#039;Devices&#039;&#039;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wählen Sie dort Ihr Gerät aus. Danach sollte der Eintrag &#039;&#039;Entwickler&#039;&#039; in den Einstellungen auf dem Gerät auftauchen. Dazu müssen Sie möglicherweise die Einstellungen beenden und neu starten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Alert.png | thumb | 270px | Beispiel für einen Alert unter iOS]]&lt;br /&gt;
Ein Verbindungsaufbau zu dem Gerät ist nicht möglich solange es bestimmte Alerts zeigt. Ein solcher Alert kann z.&amp;amp;#x202f;B. erscheinen wenn FaceTime aktiviert ist, indem ein Hinweis auf anfallende SMS-Gebühren angezeigt wird (siehe Screenshot). Achten Sie darauf, das Gerät so zu konfigurieren, dass es im Leerlauf keine solchen Alerts zeigt.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.11 und später ===&lt;br /&gt;
Sie können beliebige Apps testen, die auf dem verwendeten Gerät lauffähig oder bereits installiert sind. Wenn die App als Development-Build vorliegt, muss die UDID des Geräts in der App hinterlegt sein. In jedem Fall muss der WebDriverAgent für das Gerät signiert werden. Lesen Sie dazu den Abschnitt zur [[#Signierung|Signierung]] unter Mac OS.&lt;br /&gt;
&lt;br /&gt;
Falls Sie in einem Test den Home-Button verwenden wollen, müssen Sie auf dem Gerät AssistiveTouch aktivieren. Sie finden diese Option in den Einstellungen unter &#039;&#039;Allgemein&#039;&#039; &amp;gt; &#039;&#039;Bedienungshilfen&#039;&#039; &amp;gt; &#039;&#039;AssistiveTouch&#039;&#039;. Platzieren Sie dann das Menü in der Mitte des oberen Bildschirmrands. Sie können das Drücken des Home-Buttons dann mit dem entsprechenden Menüeintrag im Recorder aufzeichnen oder direkt den Baustein &#039;&#039;Press Home Button&#039;&#039; benutzen.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.10 ===&lt;br /&gt;
Die App, die Sie verwenden wollen, muss als Development-Build vorliegen. Außerdem muss die UDID des Geräts in der App hinterlegt sein.&lt;br /&gt;
&lt;br /&gt;
=== Development-Build signieren ===&lt;br /&gt;
Ein Development-Build einer App ist nur für eine begrenzte Zahl von Geräten zugelassen und kann auf anderen Geräten nicht gestartet werden. Es ist aber möglich, das Zertifikat und die verwendbaren Geräte in einem Development-Build auszutauschen.&lt;br /&gt;
&lt;br /&gt;
* Evaluierung mit Demo-App von eXept:&lt;br /&gt;
:Gerne stellen wir Ihnen eine Demo-App zur Verfügung, die als Development-Build vorliegt und die wir für Ihr Gerät signieren können. Senden Sie dazu bitte Ihrem eXept-Ansprechpartner die UDID Ihres Gerätes zu. Wie Sie die UDID Ihres Gerätes ermitteln können, ist im folgenden Abschnitt beschrieben.&lt;br /&gt;
&lt;br /&gt;
* Eigene App für Ihr Testgerät verwenden:&lt;br /&gt;
:Wenn Sie von den App-Entwicklern einen Development-Build (IPA-Datei) erhalten, der für Ihr Testgerät zugelassen ist, können Sie diesen direkt verwenden. Dazu müssen Sie den Entwicklern die UDID Ihres Geräts mitteilen, damit sie diese eintragen können. &#039;&#039;&#039;Sie können die UDID eines Gerätes mithilfe von Xcode auslesen&#039;&#039;&#039;. Starten Sie dazu Xcode und wählen Sie in der Menüleiste am oberen Bildschirmrand im Menü &#039;&#039;Window&#039;&#039; den Eintrag &#039;&#039;Devices&#039;&#039;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wählen Sie Ihr Gerät aus und suchen Sie in Eigenschaften den Eintrag &#039;&#039;Identifier&#039;&#039;. Die UDID ist eine 40-stellige Hexadezimalzahl.&lt;br /&gt;
&lt;br /&gt;
* Extern entwickelte App für Ihr Testgerät umsignieren:&lt;br /&gt;
:Es können auch Apps umsigniert werden, damit Sie auf anderen Geräten lauffähig sind. Dieser Vorgang ist jedoch kompliziert und setzt insbesondere einen Zugang zu einem Apple-Developer-Account voraus. Eine Dokumentation zur Vorgehensweise ist derzeit in Vorbereitung.&lt;br /&gt;
&lt;br /&gt;
:Für die Evaluierung unterstützen wir Sie gerne beim Umsignieren Ihrer App.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Melden Sie sich beim [https://developer.apple.com/ Apple-Webinterface] an. Navigieren Sie zu &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039;. Erzeugen Sie hier ggf. ein Developer-Zertifikat und ein Provisioning Profile für Ihr Gerät und laden Sie beide herunter. Sollten Sie noch keinen Developer Account haben, erstellen Sie hier einen: https://developer.apple.com/enroll/. Hierzu müssen Sie sich mit einer Apple-ID anmelden.&lt;br /&gt;
&lt;br /&gt;
# Team-ID herausfinden (&#039;&#039;Membership&#039;&#039; -&amp;gt; &#039;&#039;Team ID&#039;&#039;)&lt;br /&gt;
# Unter &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039; Development-Zertifikat auswählen (unter &#039;&#039;+&#039;&#039; anlegen, falls nicht vorhanden) und herunterladen.&lt;br /&gt;
# Unter &#039;&#039;App ID&#039;&#039; Wildcard-App-ID erzeugen, falls nicht vorhanden. App-ID notieren (AppID = Prefix.ID)&lt;br /&gt;
# Gerät hinzufügen, dazu UDID (bzw. &#039;&#039;Identifier&#039;&#039;) des Geräts herausfinden (&#039;&#039;Xcode&#039;&#039; -&amp;gt; &#039;&#039;Window&#039;&#039; (oben in Menüleiste) -&amp;gt; &#039;&#039;Devices&#039;&#039;)&lt;br /&gt;
# Provisionen Profile erstellen: &#039;&#039;iOS App Development&#039;&#039; -&amp;gt; &#039;&#039;AppID&#039;&#039; auswählen -&amp;gt; Zertifikat wählen -&amp;gt; Gerät auswählen -&amp;gt; Profilname anlegen -&amp;gt; Provisioning Profile herunterladen.&lt;br /&gt;
# Das heruntergeladene Zertifikat importieren (&#039;&#039;Downloads&#039;&#039; -&amp;gt; Zertifikat (.cer)&lt;br /&gt;
# SHA1-Fingerabdruck kopieren. Dazu Rechtsklick auf Zertifikat -&amp;gt; &#039;&#039;Information&#039;&#039;, anschließend bis zum Ende der Seite scrollen).&lt;br /&gt;
# Entitlements.plist erstellen (&#039;&#039;Terminal&#039; öffnen -&amp;gt; Downloads/Mobile_Testing_Supplement/bin/gen-entitlements_plist &#039;Team-ID&#039; &#039;App ID&#039; Downloads/Mobile_Testing_Supplement/bin/re-sign-ipa &amp;lt;Pfad zum ipa (z.B. Downloads/expeccoMobileDemo.ipa)&amp;gt; \&lt;br /&gt;
&amp;quot;&amp;lt;Zertifikat (SHA1-Fingerabdruck, z.B. 76 E8 4B E8 78 D5 D7 F9 2E 09 8B D7 E8 FB CE 30 0C F5 D0 EF)&amp;gt;&amp;quot; \&lt;br /&gt;
&amp;lt;Pfad zum Provisionen Profile (z.B. /Users/exept_test/Downloads/dut.mobileprovision)&amp;gt; \&lt;br /&gt;
&amp;lt;Pfad für das Ergebnis-ipa (z.B. Downloads/expeccoMobileDemo_re-signed.ipa)&amp;gt; \&lt;br /&gt;
[Pfad zur entitlements.plist] (z.B. /Users/exept_test/entitlements.plist)&lt;br /&gt;
&lt;br /&gt;
Zum Umsignieren können Sie das entsprechende Skript aus dem Mobile Testing Supplement für Mac OS oder jedes beliebige andere Tool (z.B. isign) verwenden.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zur Verwendung von iOS-Geräten finden Sie auch in der [http://appium.io/slate/en/master/?java#appium-on-real-ios-devices Dokumentation von Appium].&lt;br /&gt;
&lt;br /&gt;
=== Native iOS-Apps ===&lt;br /&gt;
Sie können auch Apps verwenden, die bereits nativ auf dem Gerät vorhanden sind. Dazu müssen Sie deren Bundle-ID kennen und diese dann in die Verbindungseinstellungen eintragen. Hier eine kleine Auswahl gängiger Apps:&lt;br /&gt;
{| style=&amp;quot;text-align:left&amp;quot;&lt;br /&gt;
! App&lt;br /&gt;
!&lt;br /&gt;
! Bundle-ID&lt;br /&gt;
|-&lt;br /&gt;
| App Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.AppStore&lt;br /&gt;
|-&lt;br /&gt;
| Calculator&lt;br /&gt;
| &lt;br /&gt;
| com.apple.calculator&lt;br /&gt;
|-&lt;br /&gt;
| Calendar&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilecal&lt;br /&gt;
|-&lt;br /&gt;
| Camera&lt;br /&gt;
| &lt;br /&gt;
| com.apple.camera&lt;br /&gt;
|-&lt;br /&gt;
| Contacts&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileAddressBook&lt;br /&gt;
|-&lt;br /&gt;
| iTunes Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileStore&lt;br /&gt;
|-&lt;br /&gt;
| Mail&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilemail&lt;br /&gt;
|-&lt;br /&gt;
| Maps&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Maps&lt;br /&gt;
|-&lt;br /&gt;
| Messages&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileSMS&lt;br /&gt;
|-&lt;br /&gt;
| Phone&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilephone&lt;br /&gt;
|-&lt;br /&gt;
| Photos&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobileslideshow&lt;br /&gt;
|-&lt;br /&gt;
| Settings&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Preferences&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Weitere Bundle-IDs finden Sie [https://github.com/joeblau/apple-bundle-identifiers hier].&lt;br /&gt;
&lt;br /&gt;
= Beispiele =&lt;br /&gt;
Bei den Demo-Testsuiten für expecco finden Sie auch Beispiele für Tests mit dem Mobile Testing Plugin. Wählen Sie dazu auf dem Startbildschirm die Option &amp;quot;&#039;&#039;Beispiel aus Datei&#039;&#039;&amp;quot; und öffnen Sie den Ordner &amp;quot;&#039;&#039;mobile&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;TestsuiteMobileTestingDemo&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m01_MobileTestingDemo.ets --&amp;gt;&amp;lt;/span&amp;gt; &#039;&#039;m01_MobileTestingDemo.ets&#039;&#039; ==&lt;br /&gt;
Die Testsuite enthält zwei einfache Testpläne: &amp;quot;&#039;&#039;Simple CalculatorTest&#039;&#039;&amp;quot; und &amp;quot;&#039;&#039;Complex Calculator and Messaging Test&#039;&#039;&amp;quot;. Beide Tests verwenden einen Android-Emulator, den Sie vor Beginn starten müssen. Die Apps, die im Test verwendet werden, gehören zur Grundausstattung des Emulators und müssen daher nicht mehr installiert werden. Da sich die Apps unter jeder Android-Version unterscheiden können, ist es wichtig, dass Ihr Emulator unter Android 6.0 läuft. Außerdem muss die Sprache auf Englisch gestellt sein.&lt;br /&gt;
&lt;br /&gt;
; Simple CalculatorTest&lt;br /&gt;
: Dieser Test verbindet sich mit dem Taschenrechner und gibt die Formel &#039;&#039;2+3&#039;&#039; ein. Das Ergebnis des Rechners wird mit dem erwarteten Wert &#039;&#039;5&#039;&#039; verglichen.&lt;br /&gt;
&lt;br /&gt;
; Complex Calculator and Messaging Test&lt;br /&gt;
: Dieser Test verbindet sich mit dem Taschenrechner und öffnet anschließend den Nachrichtendienst. Dort wartet er auf eine einkommende Nachricht von der Nummer &#039;&#039;15555215556&#039;&#039;, in der eine zu berechnende Formel gesendet wird. Die Nachricht wird zuvor über einen Socket beim Emulator erzeugt. Nach dem Eintreffen der Nachricht wird diese vom Test geöffnet und deren Inhalt gelesen. Danach wird wieder der Taschenrechner geöffnet, die erhaltene Formel eingegeben und das Ergebnis gelesen. Anschließend wechselt der Test wieder zum Nachrichtendienst und sendet das Ergebnis als Antwort.&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;m02_expeccoMobileDemo.ets&#039;&#039; und &#039;&#039;m03_expeccoMobileDemoIOS.ets&#039;&#039; ==&lt;br /&gt;
Diese sind Bestandteil des Tutorials zum Mobile Testing Plugin. Der jeweils enthaltene Testfall ist unvollständig und wird im Zuge des Tutorials ergänzt. Lesen Sie dazu den Abschnitt [[#Tutorial|Tutorial]].&lt;br /&gt;
&lt;br /&gt;
= Tutorial =&lt;br /&gt;
Es gibt ein Tutorial, das das grundsätzliche Vorgehen zur Erstellung von Tests mit dem Mobile Testing Plugin beschreibt. Grundlage dafür ist ein mitgeliefertes Beispiel, bestehend aus einer einfachen App und einer expecco-Testsuite.&lt;br /&gt;
&lt;br /&gt;
Sie finden es auf der Seite [[Mobile_Testing_Tutorial|Mobile Testing Tutorial]] in zwei Versionen für Android und für iOS.&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsAndroid&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m02_expeccoMobileDemo.ets --&amp;gt;&amp;lt;/span&amp;gt;[[Mobile_Testing_Tutorial#Erste_Schritte_mit_Android|Erste Schritte mit Android]]&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsIOS&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m03_expeccoMobileDemoIOS.ets --&amp;gt;&amp;lt;/span&amp;gt;[[Mobile_Testing_Tutorial#Erste_Schritte_mit_iOS|Erste Schritte mit iOS]]&lt;br /&gt;
&lt;br /&gt;
= Dialoge des Mobile Testing Plugins =&lt;br /&gt;
== Verbindungseditor ==&lt;br /&gt;
Mithilfe des Verbindungseditors können Sie schnell Verbindungen definieren, ändern oder aufbauen. Je nach Aufgabe weist der Dialog kleine Unterschiede auf und wird unterschiedlich geöffnet:&lt;br /&gt;
*Um eine Verbindung aufzubauen, klicken Sie im GUI-Browser auf &amp;quot;&#039;&#039;Verbinden&#039;&amp;quot;&#039; klicken und wählen dann &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot;.&lt;br /&gt;
*Um eine bestehende Verbindung im GUI-Browser zu ändern oder zu kopieren, wählen Sie diese aus, machen einen Rechtsklick und wählen im Kontextmenü &amp;quot;&#039;&#039;Verbindung bearbeiten&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;Verbindung kopieren&#039;&#039;&amp;quot; aus.&lt;br /&gt;
*Wollen Sie Verbindungseinstellungen nicht für den GUI-Browser sondern zur Verwendung in einem Test erstellen, wählen Sie im Menü des Mobile Testing Plugins den Punkt &amp;quot;&#039;&#039;Verbindungseinstellungen erstellen...&#039;&#039;&amp;quot;. Darüber können nur die Einstellungen für eine Verbindung erstellt werden, ohne dass eine Verbindung tatsächlich angelegt wird.&lt;br /&gt;
&lt;br /&gt;
Einige der Schaltflächen sind nur beim Erstellen von Verbindungseinstellungen sichtbar:&lt;br /&gt;
[[Datei:MobileTestingVerbindungseditorMenu.png]]&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen löschen&#039;&#039;&amp;quot;: Setzt alle Einträge zurück. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen aus Datei laden&#039;&#039;&amp;quot;: Erlaubt das Öffnen einer gespeicherten Einstellungsdatei (*.csf). Deren Einstellungen werden in den Dialog übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen aus Anhang laden&#039;&#039;&amp;quot;: Erlaubt das Öffnen eines Anhangs mit Verbindungseinstellungen aus einem geöffneten Projekt. Diese Einstellungen werden in den Dialog übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen in Datei speichern&#039;&#039;&amp;quot; sowie&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen in Anhang speichern&#039;&#039;&amp;quot;: Hier können Sie die eingetragenen Einstellungen in eine Datei (*.csf) speichern oder als Anhang in einem geöffneten Projekt anlegen. Beide Optionen besitzen ein verzögertes Menü, in dem Sie auswählen können, nur einen bestimmten Teil der Einstellungen zu speichern. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Erweiterte Ansicht&#039;&#039;&amp;quot;: Damit können Sie in die erweiterte Ansicht wechseln, um zusätzliche Einstellungen vorzunehmen. Lesen Sie dazu mehr am Ende des Kapitels. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Hilfe&#039;&#039;&amp;quot;: An der rechten Seite wird ein Hilfetext zum jeweiligen Schritt ein- oder ausgeblendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Dialog ist in drei Schritte unterteilt. Im ersten Schritt wählen Sie das Gerät, das Sie verwenden möchten, im zweiten Schritt wählen Sie aus, welche App verwendet werden soll und im letzten Schritt erfolgen die Einstellungen zum Appium-Server.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep1&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 1: Gerät auswählen===&lt;br /&gt;
Im oberen Teil erhalten Sie eine Liste aller angeschlossenen Appium-Geräte, die erkannt werden. Mit der Checkbox darunter können Sie die Geräte ausblenden, die zwar erkannt werden, aber nicht bereit sind. Falls Sie ein Gerät eintragen wollen, das nicht angeschlossen ist, können Sie dies mit dem entsprechenden Knopf &amp;quot;&#039;&#039;Android-Gerät eingeben&#039;&#039;&amp;quot; bzw. &amp;quot;&#039;&#039;iOS-Gerät eingeben&#039;&#039;&amp;quot; anlegen. Dazu müssen Sie jedoch die benötigten Eigenschaften Ihres Geräts kennen. Das Gerät wird dann in einer zweiten Geräteliste angelegt und kann dort ausgewählt werden. Wenn keine Liste mit angeschlossenen Elementen angezeigt werden kann, werden stattdessen verschiedene Meldungen angezeigt:&lt;br /&gt;
*Keine Geräte gefunden&lt;br /&gt;
*:expecco konnte kein Android-Geräte finden.&lt;br /&gt;
*:Um eine Verbindung zu einem Gerät automatisch zu konfigurieren, stellen Sie sicher, dass es&lt;br /&gt;
*:*angeschlossen ist&lt;br /&gt;
*:*eingeschaltet ist&lt;br /&gt;
*:*einen passenden adb-Treiber installiert hat&lt;br /&gt;
*:*für Debugging freigeschaltet ist (siehe unten).&lt;br /&gt;
*Keine verfügbaren Geräte gefunden&lt;br /&gt;
*:expecco konnte keine verfügbaren Android-Geräte finden. Es wurden aber nicht verfügbare gefunden, z.B. mit dem Status &amp;quot;unauthorized&amp;quot;.&lt;br /&gt;
*:Um eine Verbindung zu einem Gerät automatisch zu konfigurieren, stellen Sie sicher, dass es&lt;br /&gt;
*:*angeschlossen ist&lt;br /&gt;
*:*eingeschaltet ist&lt;br /&gt;
*:*einen passenden adb-Treiber installiert hat&lt;br /&gt;
*:*für Debugging freigeschaltet ist (siehe unten).&lt;br /&gt;
*:Um nicht verfügbare Geräte anzuzeigen, aktivieren Sie unten diese Option.&lt;br /&gt;
*Verbindung verloren&lt;br /&gt;
*:expecco hat die Verbindung zum adb-Server verloren. Versuchen Sie die Verbindung wieder herzustellen, indem Sie auf den Button klicken.&lt;br /&gt;
*Verbindung fehlgeschlagen&lt;br /&gt;
*:expecco konnte sich nicht mit dem adb-Server verbinden. Möglicherweise läuft er nicht oder der angegebene Pfad stimmt nicht.&lt;br /&gt;
*:Überprüfen Sie die adb-Konfiguration in den Einstellungen und versuchen Sie den adb-Server zu starten und eine Verbindung herzustellen indem Sie auf den Knopf klicken.&lt;br /&gt;
*Verbinden ...&lt;br /&gt;
*:expecco verbindet sich mit dem adb-Server. Dies kann einige Sekunden dauern.&lt;br /&gt;
*adb-Server starten ...&lt;br /&gt;
*:expecco startet den adb-Server. Dies kann einige Sekunden dauern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Bei &amp;quot;&#039;&#039;Automatisierung durch&#039;&#039;&amp;quot; können Sie angeben, welche Automation-Engine verwendet werden soll. Lassen Sie die Einstellung auf &amp;quot;&#039;&#039;(Default)&#039;&#039;&amp;quot; wird die entsprechende Capability gar nicht gesetzt. Ansonsten stehen Appium, Selendroid und ab expecco 2.11 XCUITest zur Verfügung. In der Regel wird Selendroid nur für Android-Geräte vor Version 4.1 gebraucht.--&amp;gt;Mit &amp;quot;&#039;&#039;Weiter&#039;&#039;&amp;quot; gelangen Sie zum nächsten Schritt. Wenn Sie Einstellungen für den GUI-Browser eingeben, ist das erst möglich, wenn ein Gerät ausgewählt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;UnlockingDeveloperOptions&amp;quot;&amp;gt;Anmerkung zum Freischalten&amp;lt;/span&amp;gt;: In jüngeren Android Versionen werden die Entwickleroptionen zunächst nicht mehr in den Einstellungen angeboten. Falls ihr Android Gerät in den Einstellungen keinen Eintrag zu &amp;quot;&#039;&#039;Entwickleroptionen&#039;&#039;&amp;quot; zeigt, wählen Sie zunächst den Eintrag &amp;quot;&#039;&#039;Telefoninfo&#039;&#039;&amp;quot;, dann &amp;quot;&#039;&#039;SoftwareVersionsInfo&#039;&#039;&amp;quot; und klicken darin mehrfach auf den Eintrag &amp;quot;&#039;&#039;BuildVersion&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Chromedriver verwalten ====&lt;br /&gt;
Wenn die App, die Sie bedienen wollen, WebViews mit Chrome benutzt, benötigt Appium Zugriff auf einen passenden Chromedriver. Wenn Sie ein Gerät in der Liste auswählen, können Sie über &amp;quot;&#039;&#039;Chromedriver verwalten&#039;&#039;&amp;quot; sehen, welche Chrome-Versionen auf dem Gerät vorhanden sind und welche Chromedriver-Versionen durch expecco zur Verfügung stehen. Über diesen Dialog können Sie auch benötigte Chromedriver-Versionen herunterladen. Beachten Sie, dass auf dem Gerät verschiedene Chrome-Versionen vorhanden sein können, da die Apps in ihren WebViews nicht die gleiche Chrome-Version verwenden müssen, wie die als Browser installierte. Damit alles funktioniert, sollte der verwendete Chromedriver zur entsprechenden App passen. Sie können den Pfad zum Chromedriver auch am Ende des Verbindungsdialogs in den erstellten Capabilities ändern.&lt;br /&gt;
&lt;br /&gt;
==== WLAN-Android-Geräte verbinden ====&lt;br /&gt;
Sie können sich auch über WLAN zu Android-Geräten verbinden. Dazu muss das Gerät zunächst mit adb verbunden werden, siehe [[Mobile_Testing_Plugin#Verbindung_.C3.BCber_WLAN|Verbindung über WLAN]]. Ab expecco 22.1 bietet der Verbindungseditor hierfür einen Dialog, der Ihnen dabei hilft und den Sie anstatt der Eingabeaufforderung verwenden können. Für Geräte mit Android 11 oder höher können Sie hier das Gerät mit dem Rechner zu koppeln, indem Sie die entsprechenden Parameter angeben und anschließend die Verbindung unter Angabe von IP-Adresse und Port aufbauen. Sie können damit auch für Geräte, die über USB verbunden sind, eine WLAN-Verbindung aufbauen. Wenn Sie das entsprechende Gerät in der Liste auswählen, werden die benötigten Angaben automatisch ausgelesen.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass der Aufbau einer WLAN-Verbindung nicht Teil der Verbindungseinstellungen ist. Wenn Sie mit den erzeugten Einstellungen eine neue Verbindung aufbauen wollen, müssen Sie sicherstellen, dass das Gerät über mit der angegebenen IP-Adresse und dem Port mit adb verbunden ist, damit es gefunden wird. Die ADB-Verbindung geht verloren, wenn der ADB-Server oder das Gerät neu gestartet werden. Die Erlaubnis für das WLAN-Debugging wird beim Neustart des Geräts auch häufig zurückgesetzt und der Debug-Port kann dann wechseln. Daher muss eine WLAN-Verbindung immer manuell hergestellt werden.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep2&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 2: App auswählen===&lt;br /&gt;
Hier können Sie Angaben zur App machen, die getestet werden soll. Dabei können Sie entscheiden, ob Sie eine App verwenden wollen, die bereits auf dem Gerät installiert ist, oder ob für den Test eine App installiert werden soll. Wählen Sie oben den entsprechenden Reiter aus. Je nachdem, ob Sie im vorigen Schritt ein Android- oder ein iOS-Gerät ausgewählt haben, ändert sich die erforderte Eingabe.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Android&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App auf dem Gerät&#039;&#039;&lt;br /&gt;
**:Wenn Sie im ersten Schritt ein angeschlossenes Gerät ausgewählt haben, werden die Pakete aller installierten Apps automatisch abgerufen und Sie können die Auswahl aus den Drop-down-Listen treffen. Die installierten Apps sind in Fremdpakete und Systempakete unterteilt; wählen Sie die entsprechende Paketliste aus. Diese Auswahl gehört nicht zu den Einstellungen, sondern stellt nur die entsprechende Paketliste zur Verfügung. Sie können den Filter benutzen, um die Liste weiter einzuschränken und dann das gewünschte Paket auswählen. Die Activities des ausgwählten Pakets werden ebenfalls automatisch abgerufen und als Drop-down-Liste zur Verfügung gestellt. Wählen Sie die Activity aus, die gestartet werden soll. In der Regel wird automatisch eine Activity aus der Liste eingetragen. Falls Sie kein verbundenes Gerät verwenden, müssen Sie die Eingabe des Pakets und der Activity von Hand vornehmen.&lt;br /&gt;
**&#039;&#039;App installieren&#039;&#039;&lt;br /&gt;
**:Geben Sie bei &amp;quot;&#039;&#039;App&#039;&#039;&amp;quot; den Pfad zu einer App an. Der Pfad muss für den Appium-Server gültig sein, der verwendet wird. Sie können auch eine URL angeben. Benutzen Sie einen lokalen Appium-Server, können Sie den rechten Butten benutzen, um zu der Installationsdatei der App zu navigieren und diesen Pfad einzutragen. Wenn möglich werden dabei auch das entsprechende Paket und die Activity in den Feldern darunter eingetragen. Diese Angabe ist aber nicht notwendig.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;iOS&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App auf dem Gerät&#039;&#039;&lt;br /&gt;
**:Geben Sie die Bundle-ID einer installierten App an. Sie können die IDs der installierten Apps bspw. mithilfe von Xcode erfahren. Starten Sie dazu Xcode und wählen Sie in der Menüleiste am oberen Bildschirmrand im Menü &amp;quot;&#039;&#039;Window&#039;&#039;&amp;quot; den Eintrag &amp;quot;&#039;&#039;Devices&#039;&#039;&amp;quot;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wenn Sie Ihr Gerät auswählen, sehen Sie in der Übersicht eine Auflistung der von Ihnen installierten Apps.&lt;br /&gt;
**&#039;&#039;App installieren&#039;&#039;&lt;br /&gt;
**:Geben Sie bei &amp;quot;&#039;&#039;App&#039;&#039;&amp;quot; den Pfad zu einer App an. Der Pfad muss für den Appium-Server gültig sein, der verwendet wird. Sie können auch eine URL angeben. Zu den Vorraussetzungen an Apps für reale Geräte lesen Sie bitte den Abschnitt [[#iOS-Ger.C3.A4t_und_App_vorbereiten|iOS-Geräte und App vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
Im unteren Teil können Sie festlegen, ob die App beim Verbindungsabbau zurückgesetzt bzw. deinstalliert werden soll, und ob sie initial zurückgesetzt werden soll. Auch hier wird die entsprechende Capability gar nicht gesetzt, wenn Sie &amp;quot;&#039;&#039;(Default)&#039;&#039;&amp;quot; auswählen. Mit &amp;quot;&#039;&#039;Weiter&#039;&#039;&amp;quot; gelangen Sie zum nächsten Schritt.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep3&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 3: Servereinstellungen===&lt;br /&gt;
Im letzten Schritt befindet sich zunächst im oberen Teil eine Liste aller Capabilities, die sich aus Ihren Angaben der vorigen Schritte ergeben. Wenn Sie sich mit Appium auskennen und noch zusätzliche Capabilities setzen möchten, die der Verbindungseditor nicht abdeckt, können Sie durch Klicken auf &amp;quot;&#039;&#039;Bearbeiten&#039;&#039;&amp;quot; in die erweiterte Ansicht gelangen. Lesen Sie dazu den Abschnitt weiter unten.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Einstellungen für den GUI-Browser eingeben, können Sie den &#039;&#039;Verbindungsnamen&#039;&#039; eintragen, mit dem die Verbindung angezeigt wird. Dies ist auch der Name unter dem Bausteine diese Verbindung verwenden können, wenn sie aufgebaut ist. Wenn Sie das Feld frei lassen, wird ein Name generiert. Wenn der Haken für &amp;quot;&#039;&#039;Von expecco gesteuert&#039;&#039;&amp;quot; gesetzt ist, wird expecco einen lokalen Appium-Server an einem freien Port starten, oder einen bereits gestarteten freien Server verwenden. Um einen eigenen Server zu verwenden, schalten Sie diese Funktion ab und geben Sie die entsprechende Adresse ein. Sie erhalten die lokale Standard-Adresse und bereits verwendete Adressen zur Auswahl.&lt;br /&gt;
&lt;br /&gt;
In älteren expecco-Versionen ist der Haken mit &amp;quot;&#039;&#039;Bei Bedarf starten&#039;&#039;&amp;quot; beschriftet. In diesem Fall müssen Sie auch eine Adresse angeben, wenn expecco den Server starten soll. expecco versucht dann beim Verbinden einen Appium-Server an der angegebenen Adresse zu starten, wenn dort noch keiner läuft. Dieser Server wird dann beim Beenden der Verbindung ebenfalls heruntergefahren. Dies funktioniert nur für lokale Adressen. Achten Sie darauf, nur Portnummern zu verwenden, die auch frei sind. Verwenden Sie am besten nur ungerade Portnummern ab dem Standardport 4723. Beim Verbindungsaufbau wird ebenfalls die folgende Portnummer verwendet, wodurch es sonst zu Konflikten kommen könnte. &lt;br /&gt;
&lt;br /&gt;
Je nachdem, wie Sie den Dialog geöffnet haben, gibt es nun verschiedene Schaltflächen um ihn abzuschließen. In jedem Fall haben Sie die Option zu speichern. Dabei öffnet sich ein Dialog, indem Sie entweder ein geöffnet Projekt auswählen können, um die Einstellungen dort als Anhang zu speichern, oder auswählen es in einer Datei zu speichern, die Sie anschließend angeben können. Durch das Speichern wird der Dialog nicht beendet, wodurch Sie anschließend noch eine andere Option auswählen könnten.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie den Editor zum Verbindungsaufbau geöffnet haben, können Sie abschließend auf &amp;quot;&#039;&#039;Verbinden&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;Server starten und verbinden&#039;&#039;&amp;quot; klicken, je nachdem, ob der Haken für den Serverstart gesetzt ist. Für das Ändern oder Kopieren einer Verbindung im GUI-Brower heißt diese Option &amp;quot;&#039;&#039;Übernehmen&#039;&#039;&amp;quot;, da in diesem Fall nur der Verbindungseintrag geändert bzw. neu angelegt wird, der Verbindungsaufbau aber nicht gestartet wird. Das können Sie bei Bedarf anschließend über das Kontextmenü tun. Falls Sie Capabilities einer bestehenden Verbindung geändert haben, fordert Sie anschließend ein Dialog auf zu entscheiden, ob diese Änderungen direkt übernommen werden sollen, indem die Verbindung abgebaut und mit den neuen Verbindungen aufgebaut wird, oder nicht. In diesem Fall werden die Änderungen erst wirksam, nachdem Sie die Verbindung neu aufbauen.&lt;br /&gt;
&lt;br /&gt;
Zur Verwendung des Verbindungseditors lesen Sie auch den entsprechenden Abschnitt im jeweiligen Tutorial in Schritt 1 (Android: [[Mobile_Testing_Tutorial#Schritt_1:_Demo_ausf.C3.BChren|Demo ausführen]], iOS: [[Mobile_Testing_Tutorial#Schritt_1:_Demo_ausf.C3.BChren_.28iOS.29|Demo ausführen (iOS)]]).&lt;br /&gt;
&lt;br /&gt;
===Erweiterte Ansicht===&lt;br /&gt;
Die erweiterte Ansicht des Verbindungseditors erhalten Sie entweder durch Klicken auf &amp;quot;&#039;&#039;Bearbeiten&#039;&#039;&amp;quot; im dritten Schritt oder jederzeit über den entsprechenden Menüeintrag, wenn Sie den Editor über das Plugin-Menü gestartet haben. In dieser Ansicht erhalten Sie eine Liste aller eingestellten Appium-Capabilities. Zu dieser können Sie weitere hinzufügen, Einträge ändern oder entfernen. Um eine Capability hinzuzufügen, wählen Sie diese aus der Drop-down-Liste des Eingabefelds aus. In dieser befinden sich alle bekannten Capabilities sortiert in die Kategorien &#039;&#039;Common&#039;&#039;, &#039;&#039;Android&#039;&#039; und &#039;&#039;iOS&#039;&#039;. Haben Sie eine Capability ausgewählt, wird ein kurzer Informationstext dazu angezeigt. Sie können in das Feld auch von Hand eine Capability eingeben. Klicken Sie dann auf &amp;quot;&#039;&#039;Hinzufügen&#039;&#039;&amp;quot;, um die Capabilitiy in die Liste einzutragen. Dort können Sie in der rechten Spalte den Wert setzen. Um einen Entrag zu löschen, wählen Sie diesen aus und klicken Sie auf &amp;quot;&#039;&#039;Entfernen&#039;&#039;&amp;quot;. Mit &amp;quot;&#039;&#039;Zurück&#039;&#039;&amp;quot; verlassen Sie die erweiterte Ansicht.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingErweiterteAnsicht.png]]&lt;br /&gt;
&lt;br /&gt;
== Laufende Appium-Server ==&lt;br /&gt;
Im Menü des Mobile Testing Plugins finden Sie den Eintrag &amp;quot;&#039;&#039;Appium-Server...&#039;&#039;&amp;quot;. Mit diesem öffnen Sie ein Fenster mit einer Übersicht aller Appium-Server, die von expecco gestartet wurden und auf welchem Port diese laufen. Durch Klicken auf das Icon in der Spalte &amp;quot;&#039;&#039;Log anzeigen&#039;&#039;&amp;quot; können Sie das Logfile des entsprechenden Servers anschauen. Dieses wird beim Beenden des Servers wieder gelöscht. Mit den Icons in der Spalte &amp;quot;&#039;&#039;Beenden&#039;&#039;&amp;quot; kann der entsprechenden Server beendet werden. Allerdings wird dies verhindert, wenn expecco über diesen Server noch eine offene Verbindung hat. Für welche Verbindung ein Server verwendet wird, sehen Sie in der rechten Spalte. Steht dort &#039;&#039;&amp;lt;idle&amp;gt;&#039;&#039; wird er zur Zeit nicht von expecco verwendet.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAppiumServer.png]]&lt;br /&gt;
&lt;br /&gt;
Beim Öffnen des Editors um eine Appium-Verbindung aufzubauen, wird direkt ein Appium-Server gestartet, um den folgenden Verbindungsaufbau zu beschleunigen. Zu diesem Zweck hält sich expecco auch immer einen freien Appium-Server offen. Weitere laufende Server, die nicht mehr verwendet werden, werden jedoch nach einiger Zeit automatisch beendet.&lt;br /&gt;
&lt;br /&gt;
Im Menü des Mobile Testing Plugins finden Sie auch den Eintrag &amp;quot;&#039;&#039;Alle Verbindungen und Server beenden&#039;&#039;&amp;quot;. Dies ist für den Fall gedacht, dass Verbindungen oder Server auf andere Weise nicht beendet werden können. Beenden Sie Verbindungen wenn möglich immer im GUI-Browser oder durch Ausführen eines entsprechenden Bausteins. Server, die Sie in der Server-Übersicht gestartet haben, beenden Sie dort; Server, die mit einer Verbindung gestartet wurden, werden automatisch mit dieser beendet.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass in der Übersicht nur Server aufgelistet sind, die von expecco gestartet und verwaltet werden. Mögliche andere Appium-Server, die auf andere Art gestartet wurden, werden nicht erkannt.&lt;br /&gt;
&lt;br /&gt;
== Recorder ==&lt;br /&gt;
Besteht im GUI-Browser eine Verbindung zu einem Gerät, kann der integrierte Recorder verwendet werden, um mit diesem Gerät einen Testabschnitt aufzunehmen. Sie starten den Recorder, indem Sie im GUI-Browser die entsprechende Verbindung auswählen und dann auf den Aufnahme-Knopf klicken. Für den Recorder öffnet sich ein neues Fenster. Die aufgezeichneten Aktionen werden im Arbeitsbereich des GUI-Browsers angelegt. Daher ist es möglich, das Aufgenommene parallel zu editieren.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingRecorder.png|caption|]]&lt;br /&gt;
&lt;br /&gt;
====Komponenten des Recorderfensters====&lt;br /&gt;
#&#039;&#039;&#039;Aufnahme fortsetzen/pausieren&#039;&#039;&#039;: Über das rechte Symbol können Sie die Aufnahme pausieren. Sie sehen dann ein großes Pause-Symbol in der Anzeige. Alle Aktionen, die Sie währenddessen im Recorder machen werden zwar ausgeführt, es werden aber keine Bausteine aufgezeichnet. Über das linke Symbol können Sie dann wieder in den normalen Aufnahmemodus wechseln.&lt;br /&gt;
#&#039;&#039;&#039;Aufnahme stoppen&#039;&#039;&#039;: Stoppt die Aufnahme und schließt das Recorderfenster.&lt;br /&gt;
#&#039;&#039;&#039;Aktualisieren&#039;&#039;&#039;: Holt das aktuelle Bild und den aktuellen Elementbaum vom Gerät. Dies wird nötig, wenn das Gerät zur Ausführung einer Aktion länger braucht oder sich etwas ohne das Anstoßen durch den Recorder ändert. Seit expecco 21.2 gibt es hier zusätzlich ein Untermenü, mit dem automatisches Aktualisieren angeschaltet werden kann, indem im Hintergrund auf Änderungen geprüft wird (siehe auch &#039;&#039;Automatisches Aktualisieren&#039;&#039; weiter unten).&lt;br /&gt;
#&#039;&#039;&#039;Follow-Mouse&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird im GUI-Browser ausgewählt.&lt;br /&gt;
#&#039;&#039;&#039;Element-Highlighting&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird rot umrandet.&lt;br /&gt;
#&#039;&#039;&#039;Elemente einzeichnen&#039;&#039;&#039;: Die Rahmen aller Elemente der Ansicht werden angezeigt.&lt;br /&gt;
#&#039;&#039;&#039;Werkzeuge&#039;&#039;&#039;: Auswahl, mit welchem Werkzeug aufgenommen werden soll. Die gewählte Aktion wird bei einem Klick auf die Anzeige ausgelöst. Dabei stehen folgende Aktionen zur Verfügung:&lt;br /&gt;
#*Aktionen auf Elemente:&lt;br /&gt;
#**Klicken: Kurzer Klick auf das Element, über dem der Cursor steht. Zur genaueren Bestimmung, welches Element verwendet wird, benutzen Sie die Funktion Follow-Mouse oder Element-Highlighting.&lt;br /&gt;
#**Antippen mit Dauer (Element): Ähnlich zum Klicken, nur dass zusätzlich die Dauer des Klicks aufgezeichnet wird. Dadurch sind auch längere Klicks möglich.&lt;br /&gt;
#**Antippen mit Position (Element): Ähnlich zum Klicken, aber zusätzlich wird die Position innerhalb des Elements aufgenommen. Die Position kann relativ zur Größe des Elements aufgenommen werden oder, wenn Sie dabei Strg gedrückt halten, absolut zur linken oberen Ecke des Elements.&lt;br /&gt;
#**Text setzen: Ermöglicht das Setzen eines Textes in Eingabefelder.&lt;br /&gt;
#**Text löschen: Löscht den Text eines Eingabefelds.&lt;br /&gt;
#*Aktionen auf das Gerät:&lt;br /&gt;
#**Antippen (Bildschirm): Löst einen Klick auf die Bildschirmposition aus.&lt;br /&gt;
#**Antippen mit Dauer (Bildschirm): Löst einen Klick auf die Bildschirmposition aus, bei dem auch die Dauer berücksichtigt wird.&lt;br /&gt;
#**Wischen: Wischen in einer geraden Linie vom Punkt des Drückens des Mausknopfes bis zum Loslassen. Die Dauer wird ebenfalls aufgezeichnet.&lt;br /&gt;
#:Beachten Sie bei diesen Aktionen, dass das Ergebnis sich auf verschiedenen Geräten unterscheiden kann, bspw. bei verschiedenen Bildschirmauflösungen.&lt;br /&gt;
#*Erstellen von Testablauf-Bausteinen&lt;br /&gt;
#**Attribut prüfen: Vergleicht den Wert eines festgelegten Attributs des Elements mit einem vorgegebenen Wert. Das Ergebnis triggert den entsprechenden Ausgang.&lt;br /&gt;
#**Attribut zusichern: Vergleicht den Wert eines festgelegten Attributs des Elements mit einem vorgegebenen Wert. Bei Ungleichheit schlägt der Test fehl.&lt;br /&gt;
#**Attribut holen: Liest den aktuellen Wert eines Attributs aus.&lt;br /&gt;
#*Automatisch&lt;br /&gt;
#:Ist das Auto-Werkzeug ausgewählt, können alle Aktionen durch spezifische Eingabeweise benutzt werden: &#039;&#039;Klicken&#039;&#039;, &#039;&#039;Element antippen&#039;&#039; und &#039;&#039;Wischen&#039;&#039; funktionieren weiterhin durch Klicken, wobei sie anhand der Dauer und der Bewegung des Cursors unterschieden werden. Um ein &#039;&#039;Antippen&#039;&#039; auszulösen, halten Sie beim Klicken Strg gedrückt. Die übrigen Aktionen erhalten Sie durch einen Rechtsklick auf das Element in einem Kontextmenü.&lt;br /&gt;
#&#039;&#039;&#039;Kontext-Aktionen&#039;&#039;&#039;: Hier können Sie Aktionen aufzeichnen, die Kontexte betreffen:&lt;br /&gt;
#*Zu Kontext wechseln: Bietet eine Liste der aktuell verfügbaren Kontexte und Sie können auswählen, zu welchem gewechselt werden soll.&lt;br /&gt;
#*Aktuellen Kontext holen: Holt den Handle des aktuellen Kontexts.&lt;br /&gt;
#*Kontext-Handles holen: Holt eine Liste aller aktuell verfügbaren Kontext-Handles.&lt;br /&gt;
#&#039;&#039;&#039;Softkeys&#039;&#039;&#039;: Nur unter Android. Simuliert das Drücken der Knöpfe Zurück, Home, Fensterliste und Power.&lt;br /&gt;
#&#039;&#039;&#039;Home-Button&#039;&#039;&#039;: Nur unter iOS ab expecco 2.11. Ermöglicht das Drücken des Home-Buttons. Vor expecco 19.2 funktioniert es nur, wenn AssistiveTouch aktiviert ist und sich das Menü in der Mitte des oberen Bildschirmrands befindet. Ab expecco 19.2 verwendet die Funktion kein AssistiveTouch mehr.&lt;br /&gt;
#&#039;&#039;&#039;Hilfe&#039;&#039;&#039;: Öffnet diese Online-Dokumentation auf der allgemeinen Seite zu [[GuiBrowser_Recorder|GUI-Browser Recordern]].&lt;br /&gt;
#&#039;&#039;&#039;Anzeige&#039;&#039;&#039;: Zeigt einen Screenshot des Geräts. Aktionen werden mit der Maus je nach Werkzeug ausgelöst. Wenn eine neue Aktion eingegeben werden kann, hat das Fenster einen grünen Rahmen, sonst ist er rot.&lt;br /&gt;
#&#039;&#039;&#039;Fenster an Bild anpassen&#039;&#039;&#039;: Ändert die Größe des Fensters so, dass der Screenshot vollständig angezeigt werden kann.&lt;br /&gt;
#&#039;&#039;&#039;Bild an Fenster anpassen&#039;&#039;&#039;: Skaliert den Screenshot auf eine Größe, mit der er die volle Größe des Fensters ausnutzt.&lt;br /&gt;
#&#039;&#039;&#039;Ansicht anpassen&#039;&#039;&#039;: Öffnet einen Dialog um die Ansicht anzupassen, falls expecco das Bild nicht richtig darstellt. Sie können die Skalierung anpassen oder das Bild um 90° drehen.&lt;br /&gt;
#&#039;&#039;&#039;Ausrichtung anpassen&#039;&#039;&#039;: Korrigiert das Bild, falls dieses auf dem Kopf stehen sollte. Über den Pfeil rechts daneben kann das Bild auch um 90° gedreht werden, falls dies einmal nötig sein sollte. Ab expecco 19.1 finden Sie diese Funktion in &#039;&#039;Ansicht anpassen&#039;&#039;. Die Ausrichtung des Bildes ist für die Funktion des Recorders unerheblich, dieser arbeitet ausschließlich auf den erhaltenen Elementen.&lt;br /&gt;
#&#039;&#039;&#039;Skalierung&#039;&#039;&#039;: Ändert die Skalierung des Screenshots.&lt;br /&gt;
#&#039;&#039;&#039;Meldungen&#039;&#039;&#039;: Zeigt den Pfad des ausgewählten Elements oder andere Meldungen an. Es gibt ein Kontextmenü, um eine Liste der vorigen Meldungen zu sehen.&lt;br /&gt;
&lt;br /&gt;
====Verwendung====&lt;br /&gt;
Mit jedem Klick im Fenster wird eine Aktion ausgelöst und im Arbeitsbereich des GUI-Browsers aufgezeichnet. Dort können Sie das Aufgenommene abspielen, editieren oder daraus einen neuen Baustein erstellen.&lt;br /&gt;
Aktionen zum Auslösen von Sofkeys finden Sie direkt in der Menüleiste (s.o.). Um Aktionen auf Elemente aufzuzeichen, ändern Sie entweder die Auswahl des Werkzeugs in der Menüleiste (s.o.) und klicken dann auf das Element oder wählen Sie die entsprechende Aktion aus dem Kontextmenü durch einen Rechtsklick auf das entsprechende Element aus. Für Texteingabe ist es zudem möglich, den Cursor über dem Element zu platzieren und den Text einzugeben. Dabei öffnet sich der Eingabedialog für diese Aktion.&lt;br /&gt;
Zur Verwendung des Recorders lesen Sie auch Schritt 2 im Tutorial ([[Mobile_Testing_Tutorial#Schritt_2:_Einen_Baustein_mit_dem_Recorder_erstellen|Android]] bzw. [[Mobile_Testing_Tutorial#Schritt_2:_Einen_Baustein_mit_dem_Recorder_erstellen_.28iOS.29|iOS]]).&lt;br /&gt;
&lt;br /&gt;
====Elemente verbergen====&lt;br /&gt;
Ab expecco 21.2 gibt es im Kontextmenü außerdem die Möglichkeit, das ausgewählte Element im Recorder zu verbergen. Das bedeutet, dass dieses Element fortan nicht mehr ausgewählt werden kann. Diese Funktion eignet sich dazu, Elemente zu ignorieren, die im Vordergrund liegen, um auf Elemente darunter zugreifen zu können. Um diesen Zustand wieder rückgängig zu machen, müssen Sie das entsprechende Element im Baum des GUI-Browsers finden, dort gibt es im Kontextmenü ebenfalls einen solchen Eintrag.&lt;br /&gt;
&lt;br /&gt;
====Automatisches Aktualisieren====&lt;br /&gt;
Der Recorder zeigt kein Livebild des Geräts sondern nur eine Momentaufnahme. Um mit der Anzeige auf dem Gerät übereinzustimmen muss daher nach Änderungen aktualisiert werden. Der Recorder aktualisiert sich automatisch, nachdem er eine Aktion ausgeführt hat. Ab expecco 20.2 sind zudem weitere automatische Updates möglich. Sie können Sie im Menü &#039;&#039;Fenster&#039;&#039; aktivieren.&lt;br /&gt;
&lt;br /&gt;
Zum einen kann kurze Zeit nach dem Ausführen einer Aktion überprüft werden, ob es noch Änderungen nach der ersten Aktualisierung gegeben hat, damit in diesem Fall eine zweite Aktualisierung stattfinden kann. Dies soll das Problem beheben, dass der Recorder nach einer Aktion nicht aktuell ist, weil die Aktualisierung zu früh stattgefunden hat.&lt;br /&gt;
&lt;br /&gt;
Zum anderen kann eine periodische Aktualisierung eingeschaltet werden. Nach einem einstellbaren Interval wird der Recorder automatisch aktualisiert, sollte es Änderungen geben. Dadurch ist die Anzeige im Recorder immer weitgehend aktuell, allerdings entsteht dadurch auch ein Mehraufwand was die Kommunikation mit dem Gerät betrifft.&lt;br /&gt;
&lt;br /&gt;
== AVD Manager und SDK Manager ==&lt;br /&gt;
AVD Manager und SDK Manager sind beides Anwendungen von Android. Im Menü des Mobile Testing Plugins bietet expecco die Möglichkeit, diese zu starten. Ansonsten finden Sie diese Programme bei Ihrer Android-Installation. Mit dem AVD Manager können Sie AVDs, also Konfigurationen für Emulatoren, erstellen, bearbeiten und starten. Mit dem SDK Manager erhalten Sie einen Überblick über Ihre Android-Installation und können diese bei Bedarf erweitern.&lt;br /&gt;
&lt;br /&gt;
= Hybrid-Apps und WebViews =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;!!! WICHTIGER HINWEIS - Wenn Sie Probleme haben, auf den Webview zu wechseln, geben Sie bitte unter den Android Einstellungen - Apps -Standard Apps &amp;quot;Chrome&amp;quot; als &amp;quot;Browser-App&amp;quot; an !!!&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hybrid-Apps enthalten neben den Plattform-nativen Elementen weitere Elemente, die in einen WebView eingebunden sind. Diese Elemente können ebenfalls bedient werden, allerdings muss zuvor in den entsprechenden Kontext gewechselt werden. Mit dem Baustein &amp;quot;&#039;&#039;Get Current Context&#039;&#039;&amp;quot; erhalten Sie den aktuellen Kontext. Zu Beginn ist dies &amp;quot;&#039;&#039;NATIVE_APP&#039;&#039;&amp;quot;, also der Kontext der nativen Elemente. Mit dem Baustein &amp;quot;&#039;&#039;Get Context Handles&#039;&#039;&amp;quot; bekommen Sie eine Collection aller vorhandenen Kontexte. Gibt es einen WebView-Kontext, so heißt dieser &amp;quot;&#039;&#039;WEBVIEW_1&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;WEBVIEW_&amp;lt;package&amp;gt;&#039;&#039;&amp;quot; mit dem Paket des WebViews. Es kann auch mehrere WebView-Kontexte geben. Zu jedem WebView-Kontext gibt es im nativen Kontext ein entsprechendes WebView-Element. Mit dem Baustein &amp;quot;&#039;&#039;Switch to Context&#039;&#039;&amp;quot; können Sie in einen solchen Kontext wechseln und haben fortan nur Zugriff auf die Elemente in diesem Kontext.&lt;br /&gt;
&lt;br /&gt;
Im GUI-Browser werden zum einen oben im Baum die vorhandenen Kontexte angezeigt, zum anderen wird der Baum eines Kontexts unterhalb des entsprechenden WebView-Elements eingefügt.&lt;br /&gt;
&lt;br /&gt;
= XPath anpassen mithilfe des GUI-Browsers =&lt;br /&gt;
Bausteine, die auf einem Gerät fehlerfrei funktionieren, tun dies auf anderen Geräten möglicherweise nicht. Auch können kleine Änderungen der App dazu führen, dass ein Baustein nicht mehr den gewünschten Effekt hat. Man sollte einen Baustein daher so robust formulieren, dass er für eine Vielzahl von Geräten verwendet werden kann und kleine Anpassungen an der App verkraftet. Dazu muss man das grundlegende Funktionsprinzip der Adressierung verstehen. Dies wird im Folgenden am Beispiel der App aus dem Tutorial erläutert.&lt;br /&gt;
&lt;br /&gt;
Die Ansicht der App setzt sich aus einzelnen Elementen zusammen. Dazu gehören die Schaltflächen &amp;quot;&#039;&#039;GTIN-13 (EAN-13)&#039;&#039;&amp;quot; und &amp;quot;&#039;&#039;Verify&#039;&#039;&amp;quot;, das Eingabefeld der Zahl &amp;quot;&#039;&#039;4006381333986&#039;&#039;&amp;quot; und das Ergebnisfeld, in dem OK erscheint, wie auch alle anderen auf der Anzeige sichtbaren Dinge. Diese sichtbaren Elemente sind in unsichtbare Strukturelemente eingebettet. Alle Elemente zusammen sind in einer zusammenhängenden Hierarchie, dem Elementbaum, organisiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingGUIBrowser.png | frame | left | Abb. 1: Funktionen des GUI-Browsers]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
Sie können sich diesen Baum im GUI-Browser ansehen. Wechseln Sie dazu in den GUI-Browser (Abb. 1) und starten Sie eine beliebige Verbindung. Sobald die Verbindung aufgebaut ist, können Sie den gesamten Baum aufklappen (1) (Klick bei gedrückter Strg-Taste). Er enthält alle Elemente der aktuellen Seite der App.&lt;br /&gt;
&lt;br /&gt;
Ein Baustein, der nun ein bestimmtes Element verwendet, muss dieses eindeutig angeben, indem er dessen Position im Elementbaum mit einem Pfad im XPath-Format beschreibt. Dieses Format ist ein verbreiteter Web-Standard für XML-Dokumente und -Datenbanken, eignet sich aber genauso für Pfade im Elementbaum.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie ein Element im Baum auswählen, wird unten der von expecco automatisch generierte XPath (2) für das Element angezeigt, der auch beim Aufzeichnen verwendet wird. Oberhalb davon in der Mitte des Fensters befindet sich eine Liste der Eigenschaften (3) des ausgewählten Elements. Man nennt diese Eigenschaften auch Attribute. Sie beschreiben das Element näher wie beispielsweise seinen Typ, seinen Text oder andere Informationen zu seinem Zustand. Links unten können Sie zur besseren Orientierung im Baum die &#039;&#039;Vorschau&#039;&#039; (4) aktivieren, um sich den Bildausschnitt des Elements anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Der Elementbaum für gleiche Ansicht einer App kann sich je nach Gerät unterscheiden. Es sind diese Unterschiede, die verhindern, eine Aufnahme von einem Gerät unverändert auch auf allen anderen Geräten abzuspielen: Ein XPath, der im einen Elementbaum ein bestimmtes Element identifiziert, beschreibt nicht unbedingt das gleiche Element im Elementbaum auf einem anderen Gerät. Es kann stattdessen passieren, dass der XPath auf kein Element, auf ein falsches Element oder auf mehrere Elemente passt. Dann schlägt der Test fehl oder er verhält sich unerwartet.&lt;br /&gt;
&lt;br /&gt;
Man könnte natürlich für jedes Gerät einen eigenen Testfall schreiben. Das brächte aber unverhältnismäßigen Aufwand bei Testerstellung und -wartung mit sich. Das Problem lässt sich auch anders lösen, da ein jeweiliges Element nicht nur durch genau einen XPath beschrieben wird. Vielmehr erlaubt der Standard mithilfe verschiedener Merkmale unterschiedliche Beschreibungen für ein und dasselbe Element zu formulieren. Das Ziel ist daher, einen Pfad zu finden, der auf allen für den Test verwendeten Geräten funktioniert und überall eindeutig zum richtigen Element führt.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel besteht die Verbindung zur Android-App aus dem Tutorial und der Eintrag des &amp;quot;&#039;&#039;GTIN-13&#039;&#039;&amp;quot;-Buttons ist ausgewählt (5). Dessen automatisch generierter XPath (2) kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[@resource id=&#039;android:id/content&#039;]/android.widget.RelativeLayout/android.widget.Button[@resource-id=&#039;de.exept.expeccomobiledemo:id/gtin_13&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Er ist offensichtlich lang und unübersichtlich. Der sehr viel kürzere Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@text=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
führt zum selben Element.&lt;br /&gt;
&lt;br /&gt;
Für die iOS-App lautet der automatisch generierte XPath für diesen Button beispielsweise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/XCUIElementTypeApplication/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/UIAApplication/UIAWindow[1]/UIAButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und kann kürzer als&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@name=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Sie können den Pfad entsprechend im GUI-Browser ändern und durch &amp;quot;&#039;&#039;Pfad überprüfen&#039;&#039;&amp;quot; (6) feststellen, ob er weiterhin auf das ausgewählte Element zeigt, was expecco mit &amp;quot;&#039;&#039;Verify Path: OK&#039;&#039;&amp;quot; (7) bestätigen sollte. Der erste, sehr viel längere Pfad, beschreibt den gesamten Weg vom obersten Element des Baumes bis hin zum gesuchten Button. Der zweite Pfad hingegen wählt mit &amp;quot;*&amp;quot; zunächst sämtliche Elemente des Baumes und schränkt die Auswahl dann auf genau die Elemente ein, die ein &#039;&#039;text&#039;&#039;- bzw. &#039;&#039;name&#039;&#039;-Attribut mit dem Wert &amp;quot;&#039;&#039;GTIN-13 (EAN-13)&#039;&#039;&amp;quot; besitzen, in unserem Fall also genau der eine Button, den wir suchen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden Android-ähnliche Pfade zur Veranschaulichung verwendet. Die Elemente in iOS-Apps heißen zwar anders, wodurch andere Pfade entstehen; das Prinzip ist jedoch das gleiche.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum1.png | frame | Abb. 2: Elementbaum einer fiktiven App]]&lt;br /&gt;
&lt;br /&gt;
Sie können solche Pfade mit Hilfe weniger Regeln selbst formulieren. Sehen Sie sich den einfachen Baum einer fiktiven Android-App in Abb. 2 an: Die Einrückungen innerhalb des Baumes geben die Hierarchie der Elemente wieder. Ein Element ist ein &#039;&#039;Kind&#039;&#039; eines anderen Elementes, wenn jenes andere Element das nächsthöhere Element mit einem um eins geringeren Einzug ist. Jenes Element ist das &#039;&#039;Elternelement&#039;&#039; des Kindes. Sind mehrere untereinander stehende Elemente gleich eingerückt, so sind sie also alle Kinder desselben Elternelements.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad durch alle Ebenen der Hierarchie zum TextView-Element ist nun:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Elemente sind mit Schrägstrichen voneinander getrennt. Es fällt auf, dass der Name des ersten Elements nicht mit dem im Baum übereinstimmt. Das oberste Element in der Hierarchie heißt immer &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot; (für iOS wäre es &amp;quot;&#039;&#039;AppiumAUT&#039;&#039;&amp;quot;), expecco zeigt im Baum stattdessen den Namen der Verbindung an, damit man mehrere Verbindungen voneinander unterscheiden kann. Die weiteren Elemente tragen jeweils das Präfix &amp;quot;&#039;&#039;android.widget.&#039;&#039;&amp;quot;, das im Baum zur besseren Übersicht nicht angezeigt wird. Bei IOS gibt es kein Präfix, das durch einen Punkt abgetrennt wäre, expecco 2.11 blendet aber entsprechend &amp;quot;&#039;&#039;XCUIElementType&#039;&#039;&amp;quot; am Anfang aus. Mit jedem Schrägstrich führt der Pfad über eine Eltern-Kind-Beziehung in eine tiefere Hierarchie-Ebene, d. h. &amp;quot;&#039;&#039;FrameLayout&#039;&#039;&amp;quot; ist ein Kindelement von &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot;, &amp;quot;&#039;&#039;LinearLayout&#039;&#039;&amp;quot; ist ein Kind von &amp;quot;&#039;&#039;FrameLayout&#039;&#039;&amp;quot; usw. Die in eckigen Klammern geschriebenen Wörter dienen nur als Orientierungshilfe im Baum. Sie gehören nicht zum Typ.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad muss nicht beim Element &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot; beginnen. Man kann den Pfad beginnend mit einem beliebigen Element des Baumes bilden. Man kann also verkürzt auch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
schreiben. Der Pfad führt zum selben &amp;quot;&#039;&#039;TextView&#039;&#039;&amp;quot;-Element, da es nur ein Element dieses Typs gibt. Anders verhält es sich bei dem Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da es zwei Elemente vom Typ &amp;quot;&#039;&#039;Button&#039;&#039;&amp;quot; gibt, passt dieser Pfad auf zwei Elemente, nämlich den Button, der mit &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; markiert ist, und den &#039;&#039;Button&#039;&#039;, der mit &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; markiert ist. Es würde an dieser Stelle aber auch nicht helfen den langen Pfad von &#039;&#039;hierarchy&#039;&#039; aus beginnend anzugeben. Um einen mehrdeutigen Pfad weiter zu differenzieren, kann man explizit ein Element aus einer Menge wählen, indem man den numerischen Index in eckigen Klammern dahinter schreibt. Der Pfad aus dem obigen Beispiel lässt sich damit so anpassen, dass er eindeutig auf den &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; weist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[1].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ihnen fällt sicher auf, dass der Index eine 1 ist obwohl das zweite Element gemeint ist. Das kommt daher, dass die Zählung bei 0 beginnt. Der Button mit der Markierung &amp;quot;An&amp;quot; hat also die Nummer 0 und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Nummer 1.&lt;br /&gt;
&lt;br /&gt;
Dieser Ansatz, einen expliziten Index zu verwenden, hat zwei Nachteile: Zum einen lässt sich an dem Pfad nur schwer ablesen welches Element gemeint ist, zum andern ist der Pfad sehr empfindlich schon gegenüber kleinsten Änderungen, wie zum Beispiel dem Vertauschen der beiden &#039;&#039;Button&#039;&#039;-Elemente oder dem Einfügen eines weiteren &#039;&#039;Button&#039;&#039;-Elements in der App.&lt;br /&gt;
&lt;br /&gt;
Es wäre daher wünschenswert, das gemeinte Element über eine ihm charakteristische Eigenschaft wie einen Attributwert, zu adressieren. Für Android-Apps eignet sich hierfür häufig das Attribut &amp;quot;&#039;&#039;resource-id&#039;&#039;&amp;quot;. Im Idealfall muss bei der Entwicklung der App darauf geachtet werden, dass jedes Element eine eindeutige Id erhält. Die &#039;&#039;resource-id&#039;&#039; hat den großen Vorteil, dass sie unabhängig vom Text des Elements oder der Spracheinstellung des Geräts ist. Für iOS-Apps kann entsprechend das Attribut &amp;quot;&#039;&#039;name&#039;&#039;&amp;quot; verwendet werden, wenn es von der App sinnvoll gesetzt wird. Der XPath-Standard erlaubt solche Auswahlbedingungen zu einem Element anzugeben. Angenommen, der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Eigenschaft &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;off&#039;&#039; und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; hat als &#039;&#039;resource-id&#039;&#039; den Wert &#039;&#039;on&#039;&#039;, dann kann man als eindeutigen Pfad für den &amp;quot;Aus&amp;quot;-&#039;&#039;Button&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[@resource-id=&#039;off&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
formulieren. Wie an dem Beispiel zu sehen werden solche Bedingungen wie ein Index in eckigen Klammern an den Elementtyp angehängt. Der Name eines Attributes wird mit einem &amp;quot;@&amp;quot; eingeleitet und der Wert mit einem &amp;quot;=&amp;quot; in Anführungszeichen angehängt. Ist der Attributwert global eindeutig, kann man den vorausgehenden Pfad sogar durch den globalen Platzhalter * ersetzen, der auf jedes Element passt. Das obige Beispiel mit dem GTIN-13-&#039;&#039;Button&#039;&#039; war ein solcher Fall.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum2.png | frame | Abb. 3: Elementbaum einer fiktiven App mit Erweiterungen]]&lt;br /&gt;
&lt;br /&gt;
Abb. 3 zeigt eine Erweiterung des Beispiels aus Abb. 2. Die App hat nun ein weiteres, nahezu identisches &#039;&#039;LinearLayout&#039;&#039; bekommen. Die &#039;&#039;Buttons&#039;&#039; sind in ihren Attributen jeweils ununterscheidbar. Deshalb funktioniert der vorige Ansatz nicht, einen eindeutigen Pfad nur mithilfe eines Attributwerts zu formulieren. Offensichtlich unterscheiden sich aber ihre benachbarten &#039;&#039;TextViews&#039;&#039;. Es ist möglich die jeweilige &#039;&#039;TextView&#039;&#039; in den Pfad mit aufzunehmen, um einen &#039;&#039;Button&#039;&#039; dennoch eindeutig zu adressieren. Ein Pfad zum &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; unterhalb der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; kann dabei wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView[@resource-id=&#039;push&#039;]/../android.widget.Button[@resource-id=&#039;on&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Teil beschreibt den Pfad zu der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; und der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;push&#039;&#039;. Danach folgt ein Schrägstrich gefolgt von zwei Punkten. Die zwei Punkte sind eine spezielle Elementbezeichnung, die nicht ein Kindelement benennt, sondern zum Elternelement wechselt, in diesem Fall also das &#039;&#039;LinearLayout&#039;&#039;, in dem die &#039;&#039;TextView&#039;&#039; eingebettet ist. Im Kontext dieses &#039;&#039;LinearLayout&#039;&#039; ist der restliche Pfad, nämlich der &#039;&#039;Button&#039;&#039; mit der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;on&#039;&#039;, eindeutig.&lt;br /&gt;
&lt;br /&gt;
Der XPath-Standard bietet noch sehr viel mehr Ausdrucksmittel. Mit der hier knapp vorgestellten Auswahl ist es aber bereits möglich für die meisten praktischen Testfälle gute Pfade zu formulieren. Eine vollständige Einführung in XPath ginge über den Umfang dieser Einführung weit hinaus. Sie finden zahlreiche weiterführende Dokumentationen im Web und in Büchern.&lt;br /&gt;
&lt;br /&gt;
Eine universelle Strategie zum Erstellen guter XPaths gibt es nicht, da sie von den Testanforderungen abhängt. In der Regel ist es sinnvoll, den XPath kurz und dennoch eindeutig zu halten. Häufig lassen sich Elemente über Eigenschaften identifizieren wie beispielsweise ihren Text. Will man aber gerade den Text eines Elements auslesen, kann dieser natürlich nicht im Pfad verwendet werden, da er vorher nicht bekannt ist. Ebenso wird der Text variieren, wenn die App mit verschiedenen Sprachen gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Jeder Baustein, der auf einem Element arbeitet, hat einen Eingangspin für den XPath. Im GUI-Browser finden Sie in der Mitte oben eine Liste von Bausteinen mit Aktionen, die Sie auf das ausgewählte Element anwenden können. Suchen Sie den Baustein &#039;&#039;Click&#039;&#039; (8) im Ordner Elements und wählen Sie ihn aus (Abb. 1). Er wird im rechten Teil unter &amp;quot;&#039;&#039;Test&#039;&#039;&amp;quot; eingefügt, der Pin für den XPath ist mit dem automatisch generierten Pfad des Elements vorbelegt (9). Sie können den Baustein hier auch ausführen. Die Ansicht wechselt dann auf &amp;quot;&#039;&#039;Lauf&#039;&#039;&amp;quot;. Ändert sich durch die Aktion der Zustand Ihrer App, müssen Sie den Baum anschließend aktualisieren (10).&lt;br /&gt;
&lt;br /&gt;
Wenn Sie in der unteren Liste eine Eigenschaft auswählen, wechselt die Anzeige der Bausteine zu &amp;quot;&#039;&#039;Eigenschaften&#039;&#039;&amp;quot;, wo Sie die eigenschaftsbezogenen Bausteine finden. Wie bei den Aktionen können Sie auch hier einen Baustein auswählen, der dann rechts in Test mit dem Pfad des Elements und der ausgewählten Eigenschaft eingetragen wird, sodass Sie ihn direkt ausführen können.&lt;br /&gt;
&lt;br /&gt;
== Weitere Locator-Strategien ==&lt;br /&gt;
Appium bietet neben XPath noch weitere Strategien zur Adressierung von Elementen an. Einige davon stehen Ihnen &#039;&#039;&#039;ab Version 20.1&#039;&#039;&#039; ebenfalls mit expecco zur Verfügung. Diese sind nicht ganz so mächtig wie XPath, dafür aber häufig schneller bei der Auflösung auf dem Gerät. Insbesondere bei der Verwendung mit iPhones, wo die Hierarchie bei jeder XPath-Auflösung erst aufgebaut werden muss, bieten alternative Strategien einen Vorteil für die Laufzeit.&lt;br /&gt;
&lt;br /&gt;
XPath ist weiterhin der Standard, das heißt alle Locator ohne besondere Angabe werden als XPath interpretiert. Um eine der anderen Strategien zu verwenden, schreiben Sie diese mit einem Gleichzeichen vor den gewünschten Locator. Diese Technik können Sie sowohl an den Blöcken verwenden, als auch im GUI-Browser testen.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | AccessibilityId || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Wert des Elements, der dazu dient, die App barrierefrei zu machen. Für iOS ist das das Attribut &#039;&#039;&#039;Accessibility-id&#039;&#039;&#039;, für Android das Attribut &#039;&#039;&#039;content-descr&#039;&#039;&#039;. &#039;&#039;Beispiel: accessibilityId=Löschen&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | className || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Namen der Klasse des Elements. &#039;&#039;Beispiel: className=android.widget.FrameLayout&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | id || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet die Kennung des Elements. Für iOS ist das das Attribut &#039;&#039;&#039;name&#039;&#039;&#039;, für Android das Attribut &#039;&#039;&#039;resource-id&#039;&#039;&#039;. &#039;&#039;Beispiel: id=android:id/text1&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | iOSClassChain&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet die Hierarchie der Elemente ähnlich wie bei XPath. Eine Erklärung zum Aufbau finden Sie [https://github.com/facebookarchive/WebDriverAgent/wiki/Class-Chain-Queries-Construction-Rules hier]. &#039;&#039;Beispiel: iOSClassChain=XCUIElementTypeWindow/XCUIElementTypeButton[`label == &amp;quot;Ok&amp;quot;`]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; padding-right:1em&amp;quot; | iOSNsPredicateString&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet einfache Kriterien, wie Attribute, die auch kombiniert werden können. &#039;&#039;Beispiel: iOSNsPredicateString=type == &#039;XCUIElementTypeButton&#039; AND name == &#039;Weiter&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | name&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Namen des Elements. &#039;&#039;Beispiel: name=Bestätigen&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &#039;&#039;nur für iOS&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Um eine direkte Beschleunigung mit iOS zu erzielen, ohne dass Sie Ihre bisherigen Pfade anpassen müssen, wandelt expecco zudem Pfade, die nur aus einem Element mit Klasse und name-Attribut bestehen, zur Laufzeit automatisch in einen entsprechenden Locator der Strategie iOSNsPredicateString um. Wenn Sie einen Pfad explizit als XPath markieren, wird diese Anpassung nicht vorgenommen.&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span id=&amp;quot;troubleshooting&amp;quot;&amp;gt;&amp;lt;!-- Referenced by error dialog on connection error --&amp;gt;&amp;lt;/span&amp;gt;Probleme und Lösungen=&lt;br /&gt;
== Locator sind versionsabhängig oder variabel ==&lt;br /&gt;
Dann sollten Sie die Locator (xPath) entweder in einer Variablen halten oder ein Locator-Mapping in einem Screenplay Anhang definieren. Es ist auch möglich, lediglich Teile des Locators (z.B. Locator-Pfad eines Elternelements oder Attributwert) in einer Variable zu halten und im Freezevalue des Locator-Pins mit &amp;quot;&#039;&#039;$(varName)&#039;&#039;&amp;quot; einzufügen.&lt;br /&gt;
&lt;br /&gt;
==Unsichtbare UI-Elemente==&lt;br /&gt;
Beachten Sie, dass im [[#Recorder|Recorder]] auch Elemente berücksichtigt werden, die Sie auf dem Bildschirm nicht sehen. Schalten Sie daher das Element-Highlighting an oder nutzen Sie die Follow-Mouse-Funktion und den Elementbaum im GUI-Browser, um festzustellen, ob das richtige Element verwendet wird. Es kann vorkommen, dass unsichtbare Elemente vor anderen Elementen liegen und diese verdecken, so dass die gewünschten Elemente im Recorder nicht ausgewählt werden können. Lesen Sie dazu den Abschnitt [[#Elemente_verbergen|Elemente verbergen]].&lt;br /&gt;
&lt;br /&gt;
==iOS: Kabel nicht zertifiziert==&lt;br /&gt;
In manchen Fällen erscheint beim Verbinden eines iOS-Geräts über USB der Hinweis, das verwendete Kabel sei nicht zertifiziert. In diesem Fall hilft es nur, das entsprechende Kabel auszutauschen.&lt;br /&gt;
==iOS: Alerts beim Verbindungsaufbau==&lt;br /&gt;
Stellen Sie sicher, dass beim Verbindungsaufbau mit einem iOS-Gerät keine Alerts geöffnet sind. Der Aufbau schlägt sonst fehl, da die App nicht in den Vordergrund kommen kann. Siehe auch [[#iOS-Ger.C3.A4t_und_App_vorbereiten|iOS-Gerät und App vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
==iOS: .ipa installieren nicht möglich==&lt;br /&gt;
Beachten Sie, dass auf iOS-Simulatoren keine &#039;&#039;.ipa&#039;&#039;-Dateien sondern nur &#039;&#039;.app&#039;&#039;-Dateien installiert werden können.&lt;br /&gt;
&lt;br /&gt;
==iOS: Erster Verbindungsaufbau funktioniert nicht==&lt;br /&gt;
Wenn auf Ihrem Mac noch kein signierter Build des WebDriverAgents liegt, muss dieser beim ersten Verbindungsaufbau erst erzeugt werden. Das kann in der Regel etwas länger als eine Minute dauern. Standardmäßig verwendet Appium aber einen Timeout von 60000&amp;amp;nbsp;ms um zu warten bis der WebDriverAgent auf dem Gerät startet, so dass der Aufbau in diesen Fällen abgebrochen wird. Sie können den Timeout mit der Capability &#039;&#039;wdaLaunchTimeout&#039;&#039; setzen, z.B. auf &#039;&#039;120000&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Außerdem müssen die Einstellungen für die Signierung passen. Am zuverlässigsten funktioniert das nach unserer Erfahrung, wenn man im Xcode-Projekt des WebDriverAgents auf automatische Signierung stellt und das Team setzt. Siehe dazu die Erklärung im Abschnitt [[#WebDriverAgent-Signierung|WebDriverAgent-Signierung]]. In diesem Fall sollten Sie die Capabilities &#039;&#039;xcodeConfigFile&#039;&#039; bzw. &#039;&#039;xcodeOrgId&#039;&#039; und &#039;&#039;xcodeSigningId&#039;&#039; &#039;&#039;&#039;nicht&#039;&#039;&#039; verwenden, da es sonst zu Konflikten kommen kann. Achtung: Wenn Sie eine Team-ID in den Mobile-Testing-Einstellungen gesetzt haben, setzt expecco diese automatisch als &#039;&#039;xcodeOrgId&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
Achten Sie beim ersten Verbindungsaufbau außerdem auf Ihr Gerät, da Sie dort möglicherweise der Installation per Passwort zustimmen müssen. Auf dem Mac kann die Eingabe des Passworts zur Freigabe des Schlüsselbunds für die Signierung nötig werden, häufig auch mehrmals.&lt;br /&gt;
&lt;br /&gt;
==Android: Gerät nicht im Verbindungsdialog==&lt;br /&gt;
Wenn ein über USB angeschlossenes Android-Gerät nicht im Verbindungsdialog auftaucht, versuchen Sie, den USB-Verbindungstyp zu ändern. In der Regel sollten MTP oder PTP funktionieren. Prüfen Sie nochmal, ob &amp;quot;USB Debugging&amp;quot; in den Entwicklereinstellungen des Geräts aktiviert ist (diese Einstellungen sind bei manchen Geräten zunächst unsichtbar, und müssen durch einen Trick zugänglich gemacht werden). Siehe auch [[#Android-Ger.C3.A4t_vorbereiten|Android-Gerät vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
==Android: Abgeschnittene Elemente unten==&lt;br /&gt;
Bei Android-Geräten, die die Steuerungsleiste bzw. Softkeys automatisch ein- und ausblenden, kann es vorkommen, dass der Recorder im unteren Bereich Elemente abschneidet, die durch die Softkeys verdeckt würden, auch wenn sie zu diesem Zeitpunkt gar nicht angezeigt werden. In diesem Fall hift es, die Softkeys so einzustellen, dass sie in einer permanenten Leiste angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
Bei neueren Android-Versionen gibt es eine solche Einstellung in der Regel nicht. Auch wenn die Steuerelemente permanent eingeblendet sind, liegen sie auf keiner extra Leiste, sondern vor dem Inhalt der App. Es gibt dann im unteren Teil einen Bereich, der nicht bedient werden kann, weil er nicht zum aktiven Bereich der App gezählt wird, weshalb die Elemente von Appium abgeschnitten werden. Dieser Bereich kann auch größer sein als von den Steuerungselementen beansprucht. Bekannt ist dies für Samsung-Geräte mit Android 11. Da die Information über die Größe des App-Bereichs bereits auf Android-Ebene so geliefert wird, können wir hierfür keine Lösung anbieten, sondern können nur hoffen, dass das Problem vom Hersteller behoben wird. Sie können versuchen, ob Sie mit der Einstellung von Gestensteuerung bessere Ergebnisse bekommen, allerdings gibt es hier das gleiche Problem.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;waitForIdleTimeout&amp;quot;&amp;gt;&amp;lt;!-- Referenced by expecco--&amp;gt;&amp;lt;/span&amp;gt; Android: Test hängt beim Suchen eines Elements==&lt;br /&gt;
Der Baustein &#039;&#039;Find Element by XPath&#039;&#039; und alle Element-Bausteine warten bis ein Element zum angegebenen Pfad auftaucht. Den Timeout dafür kann man entweder am Baustein direkt oder in den Umgebungsvariablen ändern. Wenn das Element aber bereits da sein sollte und es dennoch sehr lange dauert, bis der Test weitergeht, kann das am UIAutomator/UIAutomator2 liegen. Dieser wartet, bis die App in den Idle-Zustand geht, bevor er überhaupt nach Elementen sucht. Dies kann länger dauern, wenn die App z.B. im Hintergrund noch Animationen abspielt oder andere Aktionen ausführt. Auch das Holen des Page-Sources z.B. beim Aktualisieren im GUI-Browser oder im Recorder kann dadurch länger dauern. Standardmäßig gibt es hierfür einen Timeout von 10 Sekunden, nach dem nicht weiter auf den Idle-Zustand gewartet wird. Dieser Timeout lässt sich durch eine Einstellung in Appium anpassen (waitForIdleTimeout). Falls Sie einen anderen Wert für diesen Timeout setzen möchten, ist dies ab expecco 21.2 möglich, indem Sie vor dem Test den Smalltalk-Code &amp;lt;code&amp;gt;AppiumTestRunner::TestRunConnection waitForIdleTimeout:2000&amp;lt;/code&amp;gt; ausführen. Der Timeout wird in Millisekunden angegeben, das Beispiel setzt ihn also auf 2 Sekunden.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;startChromedriverTimeout/&amp;gt;Android: Aktualisieren des Trees oder Wechseln zum Webview-Kontext braucht zu lange==&lt;br /&gt;
Speziell mit älteren Geräten kann es vorkommen, dass neuere Chromedriver nicht initialisiert werden können. Das führt dann dazu, dass nicht in den Webview-Kontext gewechselt werden kann. Dies wird von Appium allerdings nur über einen Timeout festgestellt, der standardmäßig bei 4 Minuten liegt. Da expecco auch beim Aufbauen des Trees im GUI-Browser versucht in den Webview-Kontext zu wechseln, kann das zu sehr langen Ladezeiten führen. Da es in Appium keine Möglichkeit gibt, diesen Timeout herunter zu setzen, haben wir die Version, die wir im MobileTestingSupplement bereitstellen, um eine entsprechende Capability erweitert. Ab der Version 1.13.1.0 des [[#Windows|MobileTestingSupplements]] kann mit &#039;&#039;chromedriverStartTimeout&#039;&#039; der Timeout in Millisekunden gesetzt werden. Der Wechsel funktioniert dadurch zwar trotzdem nicht, aber expecco braucht dann nicht mehr so lange beim Aktualisieren des Trees und der Baustein zum Wechseln des Kontextes schlägt schneller fehl. Der Verbindungsdialog fügt diese Capability ab expecco 22.1 automatisch hinzu.&lt;br /&gt;
&lt;br /&gt;
==Keine Aktion bei Klick==&lt;br /&gt;
Der Baustein zum Klicken auf ein Element ist erfolgreich, aber auf dem Gerät wurde keine Aktion ausgeführt.&lt;br /&gt;
:Dies kann vorkommen, wenn das Element von einem anderen Element verdeckt ist und ein Klick auf das Element deshalb nicht möglich ist. In diesem Fall wird von Appium kein Fehler geworfen, sondern es passiert einfach nichts. Wenn Sie dennoch einen Klick an der Position des Elements machen möchten, auch wenn es verdeckt ist, benutzen Sie stattdessen den Baustein &#039;&#039;Tap&#039;&#039; und übergeben Sie diesem die Position des Elements (&#039;&#039;Get Location&#039;&#039;). Wenn Sie stattdessen vor einem Klick prüfen möchten, ob das Element zu diesem Zeitpunkt verdeckt ist, versuchen Sie, ob Ihnen die Eigenschaften &#039;&#039;Is Displayed&#039;&#039; oder &#039;&#039;Is Enabled&#039;&#039; weiterhelfen.&lt;br /&gt;
&lt;br /&gt;
==Kein Update nach Aktion==&lt;br /&gt;
Über den Recorder wurde eine Aktion ausgeführt, für die auch ein Baustein aufgezeichnet wurde, der Recorder zeigt aber immer noch das alte Bild.&lt;br /&gt;
:Der Recorder zeigt kein Livebild des Geräts, sondern immer nur eine Momentaufnahme. Nachdem eine Aktion ausgeführt wurde, aktualisiert sich der Recorder automatisch. Es kann aber vorkommen, dass das Bild schon aktualisiert wurde, bevor die Auswirkungen der Aktion auf dem Gerät vollständig abgeschlossen sind. In diesem Fall sollten Sie den Recorder von Hand aktualisieren über das Symbol mit den blauen Pfeilen. Ab expecco 20.2 können Sie für diesen Fall auch automatisches Aktualisieren einstellen. Siehe auch Beschreibung zum [[#Recorder|Recorder]].&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;clickable&amp;quot; Attribut falsch==&lt;br /&gt;
Ein Element hat im &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; Attribut/Property den Wert &amp;quot;&#039;&#039;false&#039;&#039;&amp;quot;, ist aber dennoch anklickbar.&lt;br /&gt;
:Das &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; Attribute muss explizit vom App-Programmierer gesetzt werden, und hat tatsächlich keine Relevanz für das tatsächliche Verhalten der App. Sie sollten dieses Attribut i.A. in Ihren Tests nicht beachten.&amp;lt;br&amp;gt;Leider existieren viele Apps, bei denen der Programmierer hier &amp;quot;lazy&amp;quot; war.&lt;br /&gt;
&lt;br /&gt;
==Verbindungsaufbau schlägt fehl==&lt;br /&gt;
Schlägt der Verbindungsaufbau mit dem Appium-Server fehl, erhalten Sie in expecco eine Fehlermeldung ähnlicher der unten abgebildeten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingVerbindungsfehler.png]]&lt;br /&gt;
&lt;br /&gt;
Hier sehen Sie die Art des aufgetretenen Fehlers. Klicken Sie auf &amp;quot;&#039;&#039;Details&#039;&#039;&amp;quot; um nähere Informationen zu erhalten. Mögliche Fehler sind:&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.remote.UnreachableBrowserException&#039;&#039;&lt;br /&gt;
:Der angegebene Server läuft nicht oder ist nicht erreichbar. Überprüfen Sie die Serveradresse.&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.WebDriverException&#039;&#039;&lt;br /&gt;
:Lesen Sie in den Details in der ersten Zeile die Meldung hinter &#039;&#039;Original Error&#039;&#039;:&lt;br /&gt;
:*&#039;&#039;Unknown device or simulator UDID&#039;&#039;&lt;br /&gt;
::Entweder ist das Gerät nicht richtig angeschlossen oder die udid stimmt nicht.&lt;br /&gt;
:*&#039;&#039;Unable to launch WebDriverAgent because of xcodebuild failure: xcodebuild failed with code 65&#039;&#039;&lt;br /&gt;
::Dieser Fehler kann verschiedene Ursachen haben. Entweder konnte tatsächlich der WebDriverAgent nicht gebaut werden, weil die Signierungseinstellungen falsch sind oder das passende Provisioning Profile fehlt. Lesen Sie dazu den Abschnitt zur [[#Signierung|Signierung]]. Es kann auch sein, dass der WebDriverAgent auf dem Gerät nicht gestartet werden kann, weil sich beispielsweise ein Alert im Vordergrund befindet oder Sie dem Entwickler nicht vertraut haben.&lt;br /&gt;
:*&#039;&#039;Could not install app: &#039;Command &#039;ios-deploy [...] exited with code 253&#039;&#039;&#039;&lt;br /&gt;
::Die angegebene App kann nicht auf dem iOS-Gerät installiert werden, weil es nicht im Provisioning Profile der App eingetragen ist.&lt;br /&gt;
:*&#039;&#039;Bad app: [...] App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name.&#039;&#039;&#039;&lt;br /&gt;
::Der Pfad zur App ist falsch. Stellen Sie sicher, dass sich die Datei unter dem angegebenen Pfad auf dem Mac befindet.&lt;br /&gt;
:*&#039;&#039;packageAndLaunchActivityFromManifest failed.&#039;&#039;&lt;br /&gt;
::Die angegebene &#039;&#039;apk&#039;&#039;-Datei ist vermutlich kaputt.&lt;br /&gt;
:*&#039;&#039;Could not find app apk at [...]&#039;&#039;&lt;br /&gt;
::Der Pfad zur App ist falsch. Stellen Sie sicher, dass sich die &#039;&#039;apk&#039;&#039;-Datei am angegebenen Pfad befindet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Falls der Fehler nicht durch eine der oben gelisteten Ursachen bedingt ist, kann es sein, dass die auf dem Gerät befindlichen Automation-Anwendungen nicht mehr richtig funktionieren. Hier hilft es, diese vom Mobilgerät zu deinstallieren. Beim nächsten Verbindungsaufbau werden sie dann automatisch neu installiert.&lt;br /&gt;
&lt;br /&gt;
*Für iOS-Geräte ist das der WebDriverAgent, den Sie einfach vom Home-Screen deinstallieren können. Dies behebt in der Regel Probleme durch den Wechsel des verwendeten Macs oder der Xcode-Version.&lt;br /&gt;
&lt;br /&gt;
*Für Android-Geräte ist es der UIAutomator2; hier tritt auf einigen Geräten sporadisch ein Problem auf, die Ursache dafür ist uns z.Z. noch nicht bekannt. Zur Deinstallation navigieren Sie auf dem Gerät zu &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;Anwendungen&#039;&#039;&amp;quot;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; und suchen in der Liste nach folgenden Einträgen:&lt;br /&gt;
    Appium Settings&lt;br /&gt;
    io.appium.uiautomator2.server&lt;br /&gt;
    io.appium.uiautomator2.server.test&lt;br /&gt;
:Klicken Sie auf die jeweilige Anwendung und dann auf &amp;quot;&#039;&#039;Deinstallieren&#039;&#039;&amp;quot;.&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&#039;&#039;Der entsprechende Eintrag heißt auf manchen Geräten möglicherweise etwas anders.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Falls dies nicht hilft, kann eventuell die Ausgabe des Appium-Servers weiterhelfen. Für einen von expecco gestarteten Server finden Sie das Log in der Liste der [[#Laufende_Appium-Server|laufenden Appium-Server]].&lt;br /&gt;
&lt;br /&gt;
==Ich habe keinen Mac==&lt;br /&gt;
Vielleicht hilft Ihnen diese Webseite weiter: [https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10 https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin&amp;diff=29045</id>
		<title>Mobile Testing Plugin</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin&amp;diff=29045"/>
		<updated>2023-11-30T10:32:32Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* WebDriverAgent-Signierung */ wdaLaunchTimeout&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Deutsche Version&#039;&#039;&#039; | [[Mobile_Testing_Plugin/en|English Version]]&lt;br /&gt;
&lt;br /&gt;
= Einleitung =&lt;br /&gt;
Mit dem &#039;&#039;Mobile Testing Plugin&#039;&#039; können Anwendungen auf Android- und iOS-Geräten getestet werden. Dabei ist es egal, ob reale mobile Endgeräte oder emulierte Geräte verwendet werden. Das Plugin kann (und wird üblicherweise) zusammen mit dem [[Expecco_GUI_Tests_Extension_Reference|GUI-Browser]] verwendet werden, der das Erstellen von Tests unterstützt. Zudem ist damit das Aufzeichnen von Testabläufen möglich.&lt;br /&gt;
&lt;br /&gt;
Zur Verbindung mit den Geräten wird [http://appium.io/ Appium] verwendet. Appium ist ein freies Open-Source-Framework zum Testen und Automatisieren von mobilen Anwendungen.&lt;br /&gt;
&lt;br /&gt;
Zur Einarbeitung in das Mobile Plugin empfehlen wir das [[Mobile_Testing_Tutorial|Tutorial]] zu bearbeiten. Dieses führt anhand eines Beispiels Schritt für Schritt durch die Erstellung eines Testfalls und erklärt die nötigen Grundlagen.&lt;br /&gt;
&lt;br /&gt;
= Installation und Aufbau =&lt;br /&gt;
Zur Verwendung des Mobile Testing Plugins müssen Sie expecco inkl. des Plugins Mobile Testing installiert haben und Sie benötigen die entsprechenden Lizenzen. expecco kommuniziert mit den Mobilgeräten über einen Appium-Server, der entweder auf demselben Rechner wie expecco läuft, oder auf einem zweiten Rechner. Dieser muss für expecco erreichbar sein.&lt;br /&gt;
&lt;br /&gt;
==Installationsübersicht==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rechner, auf dem expecco läuft:&#039;&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rechner, an dem Android-Geräte angeschlossen sind:&#039;&#039;&#039;&lt;br /&gt;
* Appium-Server&#039;&#039;, diesen können Sie über das Mobile Testing Supplement installieren (s.u.), von dem wir regelmäßig einen neue Version zur Verfügung stellen&#039;&#039;&lt;br /&gt;
* Android SDK&#039;&#039;, dieses erhalten Sie ebenfalls mit dem Mobile Testing Supplement&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rechner, an dem iOS-Geräte angeschlossen sind&amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
* Appium-Server&#039;&#039;, diesen können Sie über das Mobile Testing Supplement für Mac OS installieren (s.u.), von dem wir regelmäßig einen neue Version zur Verfügung stellen&#039;&#039;&lt;br /&gt;
* Xcode &#039;&#039;in einer Version, die die verwendete iOS-Version unterstützt, erhältlich über den Apple App Store&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
* Apple-Entwickler-Zertifikat mit zugehörigem privaten Schlüssel &#039;&#039;(zum Signieren des WebDriverAgents)&#039;&#039;&lt;br /&gt;
* Provisioning Profile mit den verwendeten Mobilgeräten&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Je nach Aufbau können die oben genannten Rechner auch das selbe Gerät sein. expecco kann sich sowohl über das Netzwerk mit einem entfernten Appium-Server und dort angeschlossenen Mobilgeräten verbinden, als auch lokal selbst einen Appium-Server starten und diesen mit lokalen Mobilgeräten verwenden. Einige Funktionen von expecco, die die Erstellung von Testfällen erleichtern, sind jedoch nur verfügbar, wenn die Mobilgeräte am selben Rechner angeschlossen sind, auf dem auch expecco läuft. Ein möglicher Aufbau kann daher wie in folgender Abbildung aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAufbau.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird die Installation von Appium und anderer nötiger Programme für Windows und Mac OS erklärt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;: Zum Zeitpunkt der Erstellung dieses Dokuments wurden Versionen bis 11 auf Funktion verifiziert. Neuere Versionen sollten - sofern nicht grundlegende Änderungen von Oracle vorgenommen wurden, ebenfalls funktionieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;: Beachten Sie, dass aufgrund der Voraussetzungen (keine Anbindung an nicht-Apple Geräte verfügbar) iOS-Geräte nur von einem Mac aus angesteuert werden können. Sie benötigen also einen Mac als &amp;quot;Vermittler&amp;quot; (siehe auch unten: [[#Ich habe keinen Mac | &amp;quot;Ich habe keinen Mac&amp;quot;]])&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
Am einfachsten installieren Sie alles mit unserem Mobile Testing Supplement&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;. In neueren Versionen ist allerdings aufgrund geänderter Lizenzbedingungen seitens Oracle kein JDK mehr enthalten, sodass sie dieses zusätzlich installieren müssen. Sie können natürlich Appium auch direkt installieren, um die Version zu verwenden, die Sie möchten. Um dann einen Appium-Server mit expecco starten zu können, muss allerdings eine entsprechende Batchdatei vorhanden sein und in den [[Mobile_Testing_Plugin#Konfiguration_des_Plugins|Einstellungen]] angegeben werden. Verbindungen können aber auch zu anderen laufenden Appium-Servern aufgebaut werden.&lt;br /&gt;
*&#039;&#039;&#039;expecco 23.1&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-23.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.1]&lt;br /&gt;
:Gleiche Versionen wie der Vorgänger, aber der Installer erlaubt nun, Appium zum Autostart hinzuzufügen.&lt;br /&gt;
*expecco 22.2 und 22.1: [https://download.exept.de/transfer/h-expecco-22.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.2.0]&lt;br /&gt;
:Appium 1.22.3*&lt;br /&gt;
:Node 14.17.5&lt;br /&gt;
:adb 1.0.41 aus platform-tools 33.0.2&lt;br /&gt;
:&#039;&#039;* Wir haben Appium um die Capability&#039;&#039; startChromedriverTimeout &#039;&#039;erweitert, um schneller einen Timeout zu bekommen, wenn der Chromedriver nicht gestartet werden kann. (siehe [[#startChromedriverTimeout|Probleme und Lösungen]])&#039;&#039;&lt;br /&gt;
*expecco 21.2: [https://download.exept.de/transfer/h-expecco-21.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.12.0.0]&lt;br /&gt;
:Enthält die Appium-Version 1.22.0, Node ist weiterhin in der Version 12.13.1.&lt;br /&gt;
*expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.1.0]&lt;br /&gt;
:Nur kleine Änderungen im Vergleich zur vorigen Version.&lt;br /&gt;
*expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.0.0]&lt;br /&gt;
:Im Vergleich zur vorigen Version wurde Appium auf die Version 1.16.0-rc.1 aktualisiert und node 12 verwendet. &lt;br /&gt;
*expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.8.1.0]&lt;br /&gt;
:Dieses installiert Appium in der Version 1.12.0 und enthält nun zusätzlich build-tools der Version 28.0.3 im android-sdk. Ansonsten ist es gleich wie die vorige Version.&lt;br /&gt;
*expecco 18.2: [http://download.exept.de/transfer/h-expecco-18.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.7.3.0]&lt;br /&gt;
:Dieses installiert Appium in der Version 1.8.1. Außerdem bietet das Supplement auch an, &#039;&#039;Android Debug Bridge&#039;&#039; und &#039;&#039;Google USB Driver&#039;&#039; ([https://gsmusbdrivers.com/download/adb-fastboot-drivers/ adb-setup-1.4.3]) zu installieren. Damit sind Treiber für ein breites Spektrum an Android-Geräten abgedeckt, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen. Ein &#039;&#039;&#039;JDK ist (aufgrund geänderter Lizenzbedingungen seitens Oracle) nicht mehr enthalten&#039;&#039;&#039;, dieses müssen Sie selbst herunterladen, z.B. von [https://www.oracle.com/technetwork/java/javase/downloads/index.html Oracle].&lt;br /&gt;
*expecco 18.1: wie expecco 2.11&lt;br /&gt;
*expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/MobileTestingSupplement_1.6.0.2_Setup.exe Mobile Testing Supplement 1.6.0.2]&lt;br /&gt;
:Dieses installiert ein Java JDK der Version 8, android-sdk und Appium in der Version 1.6.4. Außerdem bietet das Supplement auch einen universellen adb-Treiber ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]) an. Dieser vereint Treiber für ein breites Spektrum an Android-Geräten, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen.&lt;br /&gt;
*expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_1.5.0.0_Setup.exe Mobile Testing Supplement 1.5.0.0]&lt;br /&gt;
:Dieses installiert ein Java JDK der Version 8, android-sdk und Appium in der Version 1.4.16. Während der Installation wird die grafische Oberfläche von Appium gestartet, dieses Fenster können Sie sofort wieder schließen. Außerdem bietet das Supplement auch einen universellen adb-Treiber ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]) an. Dieser vereint Treiber für ein breites Spektrum an Android-Geräten, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen.&lt;br /&gt;
&lt;br /&gt;
Wenn expecco Mobilgeräte verwenden soll, die an einem anderen Rechner angeschlossen sind, müssen Sie dort einen Appium-Server starten. Dies können Sie mit der Datei &amp;lt;code&amp;gt;appium_standalone.cmd&amp;lt;/code&amp;gt; tun. Der Server wird dann mit dem Standard-Port 4723 gestartet. Falls Sie eine andere Portnummer verwenden wollen, starten Sie den Server mit&lt;br /&gt;
&lt;br /&gt;
 appium_standalone.cmd -p &amp;lt;portnummer&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Server ist bereit, sobald die Zeile&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Appium REST http interface listener started on 0.0.0.0:4723&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
angezeigt wird, wobei Sie am Ende die verwendete Portnummer ablesen können.&lt;br /&gt;
&lt;br /&gt;
Beim ersten Starten von Appium – sowohl im Standalone als auch gestartet von expecco – kann es vorkommen, dass die Windows-Firewall den Node-Server blockiert. Lassen Sie den Zugriff zu, sonst kann Appium nicht gestartet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;) Sie können natürlich auch die Command Line Tools (adb, sdkmanager, avdmanager etc.) einer vorhandenen Android Studio Version verwenden, sowie Appium separat installieren.&lt;br /&gt;
Da sich diese Tools regelmäßig ändern, und es in der Vergangenheit zu Inkompatibilitäten und Fehlern nach Releasewechseln kam, empfehlen wir zu Beginn, das mitgelieferte Paket zu verwenden. Dies ist möglicherweise nicht das aktuellste, wurde aber auf Lauffähigkeit getestet.&lt;br /&gt;
&lt;br /&gt;
Falls das Android Mobilgerät an einem entfernen Rechner angeschlossen ist,&lt;br /&gt;
können Sie den aktuellen Bildschirminhalt z.B. mit dem [https://github.com/Genymobile/scrcpy scrcpy] tool live mitverfolgen.&lt;br /&gt;
&lt;br /&gt;
== Mac OS (nicht erforderlich für Android-Tests)==&lt;br /&gt;
Hinweis: Wenn Sie nicht vorhaben, iOS-Geräte (iPhone, iPad, etc.) zu testen, können Sie das Folgende ignorieren. &#039;&#039;&#039;Der Apple-Rechner sowie das Mac-Setup werden für Android-Geräte nicht benötigt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Xcode ===&lt;br /&gt;
Zur Automatisierung mit iOS-Geräten wird [https://developer.apple.com/xcode/ Xcode] benötigt. Sie erhalten dieses über den App Store. Dabei ist darauf zu achten, dass die Version zu den getesteten iOS-Versionen passt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;iOS&#039;&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp;  &lt;br /&gt;
|&#039;&#039;&#039;Xcode&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;macOS&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|10.x&lt;br /&gt;
|8.x&lt;br /&gt;
|10.12 (Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|11.x&lt;br /&gt;
|9.x&lt;br /&gt;
|10.13 (High Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|12.x&lt;br /&gt;
|10.x&lt;br /&gt;
|10.14 (Mojave)&lt;br /&gt;
|-&lt;br /&gt;
|13.x&lt;br /&gt;
|11.x&lt;br /&gt;
|10.15 (Catalina)&lt;br /&gt;
|-&lt;br /&gt;
|14.x&lt;br /&gt;
|12.x&lt;br /&gt;
|11.0 (Big Sur)&lt;br /&gt;
|-&lt;br /&gt;
|15.x&lt;br /&gt;
|13.x&lt;br /&gt;
|12.0 (Monterey)&lt;br /&gt;
|-&lt;br /&gt;
|16.x&lt;br /&gt;
|14.x&lt;br /&gt;
|12.5 (Monterey)&lt;br /&gt;
|}&lt;br /&gt;
Diese Tabelle gibt nur eine vereinfachte Übersicht, lesen Sie besser unter [https://xcodereleases.com/ Xcode Releases] oder [https://en.wikipedia.org/wiki/Xcode#Version_comparison_table Xcode-Versionen] welche Version Sie brauchen. Für neue iOS Minor-Versionen gibt es in der Regel auch ein Update für Xcode, z.B. brauchen Sie für iOS 10.2 mindestens Xcode 8.2, für iOS 10.3 mindestens Xcode 8.3 usw. &lt;br /&gt;
Wenn Sie also auf eine neuere iOS-Version wechseln, benötigen Sie in der Regel auch eine neuere Xcode-Version. Neuere Versionen von Xcode laufen möglicherweise nicht auf älteren Betriebssystemen, was wiederum eine Aktualisierung des Betriebssystems erforderlich machen kann. Falls Sie auch ältere iOS-Versionen testen wollen kann es sinnvoll sein, die entsprechenden Xcode-Versionen parallel zu installieren.&lt;br /&gt;
&lt;br /&gt;
=== Appium ===&lt;br /&gt;
Der Appium-Server kann entweder als Kommandozeilen-Anwendung installiert werden oder über [https://github.com/appium/appium-desktop Appium Desktop] verwendet werden, welcher den Server über ein GUI zur Verfügung stellt. Mittlerweile gibt es auch Appium 2.0, was wir aber bisher noch nicht mit expecco getestet haben und daher nicht empfehlen.&lt;br /&gt;
&lt;br /&gt;
==== Appium Desktop ====&lt;br /&gt;
Laden Sie die neueste Version von [https://github.com/appium/appium-desktop/releases/ Appium Desktop] herunter. Für den Mac nehmen Sie am besten die dmg-Datei und installieren sie in den Anwendungen. Beim Starten der Anwendung &#039;&#039;Appium Server GUI&#039;&#039; erhalten Sie wahrscheinlich eine Fehlermeldung, dass es aus Sicherheitsgründen nicht möglich ist. Öffnen Sie dann das Kontextmenü auf der Anwendungsdatei (Rechtsklick bzw. Strg + Klick) und wählen Sie dort &#039;&#039;Öffnen&#039;&#039; aus. Bestätigen Sie dann, dass Sie die Anwendung wirklich öffnen wollen. Fortan können Sie die Anwendung normal öffnen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:OpenAppiumServerGUI1.png|text-top]] [[Datei:OpenAppiumServerGUI2.png|text-top]]&lt;br /&gt;
&lt;br /&gt;
Ab Xcode 14 gibt es Probleme beim Signieren des WebDriverAgents, den Appium zur Automatisierung auf das Gerät spielt. Dadurch ist mit der Version 1.22.3-4 von Appium Desktop kein Verbindungsaufbau möglich. Das Problem ist in neueren Versionen des WebDriverAgents behoben, es gibt aber aktuell noch keine Version von Appium Desktop, die eine solche Version enthält (Stand November 2022). Sie können aber manuell eine neue Version herunterladen (z.B. 4.10.2)  und die Dateien in Appium ersetzen. Laden Sie dazu von der [https://github.com/appium/WebDriverAgent/releases/ WebDriverAgent Download-Seite] eine der beiden Archivdateien (zip oder tar.gz) mit dem Source Code herunter. Öffnen und entpacken Sie dann diese Datei. Den Inhalt des Ordners WebDriverAgent-4.10.2 müssen Sie nun nach&lt;br /&gt;
&lt;br /&gt;
 /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
kopieren. Wenn Sie über den Finder dorthin navigieren, machen Sie auf die Anwendung &#039;&#039;Appium Server GUI&#039;&#039; einen Kontextklick (Rechtsklick bzw. Strg + Klick) und wählen Sie im Menü &#039;&#039;Paketinhalt anzeigen&#039;&#039;. Ersetzen Sie alle Dateien, die bereits mit gleichem Namen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
==== Appium über npm installieren ====&lt;br /&gt;
Sie können Appium auch über npm (Node Package Manager) installieren. Dazu müsen Sie erst node/npm installieren. Das geht mit [https://github.com/nvm-sh/nvm nvm] (Node Version Manager) was Sie von Github bekommen. Falls die folgende Installationsanleitung bei Ihnen nicht funktionieren sollte, finden Sie dort ausführlichere Informationen im [https://github.com/nvm-sh/nvm#readme Readme].&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie ein Terminal-Fenster. Klonen Sie dann das Github-Repository von nvm&lt;br /&gt;
 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash&lt;br /&gt;
und laden Sie es&lt;br /&gt;
 export NVM_DIR=&amp;quot;$([ -z &amp;quot;${XDG_CONFIG_HOME-}&amp;quot; ] &amp;amp;&amp;amp; printf %s &amp;quot;${HOME}/.nvm&amp;quot; || printf %s &amp;quot;${XDG_CONFIG_HOME}/nvm&amp;quot;)&amp;quot; [ -s &amp;quot;$NVM_DIR/nvm.sh&amp;quot; ] &amp;amp;&amp;amp; \. &amp;quot;$NVM_DIR/nvm.sh&amp;quot; # This loads nvm&lt;br /&gt;
&lt;br /&gt;
Führen Sie danach&lt;br /&gt;
 command -v nvm&lt;br /&gt;
aus, um zu testen, ob es funktioniert hat. Es sollte &#039;&#039;nvm&#039;&#039; ausgegeben werden. Kommt keine Antwort, führen Sie&lt;br /&gt;
 touch ~/.zshrc&lt;br /&gt;
aus, und versuchen Sie es erneut.&lt;br /&gt;
&lt;br /&gt;
Nun können Sie node mit dem folgenden Befehl installieren.&lt;br /&gt;
 nvm install 16.15.1&lt;br /&gt;
Da es mit der aktuellen Version von node Probleme beim Installieren von Appium gibt, empfehlen wir diese Version.&lt;br /&gt;
&lt;br /&gt;
Nachdem node installiert ist, können Sie Appium darüber installieren:&lt;br /&gt;
 npm install -g appium&lt;br /&gt;
&lt;br /&gt;
Den Appium-Server können Sie nun einfach über den Befehl&lt;br /&gt;
 appium&lt;br /&gt;
starten. Die Ausgabe erfolgt dann direkt im Terminal.&lt;br /&gt;
&lt;br /&gt;
Auch bei dieser Version gibt es das Problem bei der Signierung des WebDriverAgents, wie bei [[#Appium_Desktop | Appium Desktop]] beschrieben. Laden Sie also auch in diesem Fall eine neuere Version des WebDriverAgents herunter und ersetzen Sie die alten Dateien. Diese finden Sie unter&lt;br /&gt;
 /Users/&amp;lt;user&amp;gt;/.nvm/versions/16.15.1/lib/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
==== Mobile Testing Supplement ====&lt;br /&gt;
Ältere Appium-Versionen stellen wir Ihnen über das Mobile Testing Supplement für Mac OS zur Verfügung, mit dem Sie es einfach installieren können:&lt;br /&gt;
* &#039;&#039;&#039;expecco 20.2&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-20.2.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement für Mac OS (1.2.2)]&lt;br /&gt;
:Enthält Appium Version 1.18.3 und verwendet node 14.&lt;br /&gt;
&lt;br /&gt;
* expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement für Mac OS (1.2.0)]&lt;br /&gt;
:Nur wenige Änderungen im Vergleich zur vorigen Version.&lt;br /&gt;
&lt;br /&gt;
* expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement_for_MacOS.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.98)]&lt;br /&gt;
:Im Vergleich zur vorigen Version wurde Appium auf die Version 1.16.0-rc.1 aktualisiert und es wird node 12 verwendet. &lt;br /&gt;
&lt;br /&gt;
* expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.96.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.96)]&lt;br /&gt;
:Diese Version enthält Appium 1.12.0. &lt;br /&gt;
&lt;br /&gt;
* expecco 18.1: [http://download.exept.de/transfer/h-expecco-18.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.94.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.94)]&lt;br /&gt;
:Diese Version enthält Appium 1.8.0.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/Mobile_Testing_Supplement_for_Mac_OS_1.0.94.tar.bz2 Mobile Testing Supplement für Mac OS (1.0.94)]&lt;br /&gt;
:Diese Version enthält Appium 1.6.4.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_for_Mac_OS_1.0.tar.bz2 Mobile Testing Supplement für Mac OS]&lt;br /&gt;
:Diese Version entält Appium 1.4.16.&lt;br /&gt;
&lt;br /&gt;
Nachdem Herunterladen des Supplements, können Sie es in ein Verzeichnis Ihrer Wahl (z. B. Ihr Home-Verzeichnis) verschieben und dort entpacken. Ein geeigneter Befehl in einer Shell könnte wie folgt aussehen, passen Sie dabei die Versionsnummer entsprechend an:&lt;br /&gt;
&lt;br /&gt;
 tar -xvpf Mobile_Testing_Supplement_for_Mac_OS_1.1.98.tar.bz2&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Ihre Standard-Xcode-Installation verwenden wollen, können Sie Appium direkt über die Datei im &#039;&#039;bin&#039;&#039;-Verzeichnis mit der entsprechenden Versionsnummer starten:&lt;br /&gt;
&lt;br /&gt;
 Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
Falls Sie ein anderes Xcode als das als Standard konfigurierte verwenden wollen, müssen Sie Appium den entsprechenden Pfad über die Umgebungsvariable &#039;&#039;DEVELOPER_DIR&#039;&#039; angeben. &lt;br /&gt;
Wenn Sie Xcode z. B. in &#039;&#039;/Applications/Xcode-11.3.app&#039;&#039; installiert haben, müssten Sie Appium so starten:&lt;br /&gt;
&lt;br /&gt;
 DEVELOPER_DIR=&amp;quot;/Applications/Xcode-11.3.app/Contents/Developer&amp;quot; Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
Was als Standard-Xcode-Installation gesetzt ist, zeigt der Befehl:&lt;br /&gt;
&lt;br /&gt;
 xcode-select -p&lt;br /&gt;
&lt;br /&gt;
Wenn Appium Ihre Xcode-Installation nicht findet, erscheint beim Verbinden eine Fehlermeldung in der Art:&lt;br /&gt;
&#039;&#039;&amp;lt;blockquote&amp;gt;org.openqa.selenium.SessionNotCreatedException - A new session could not be created. (Original error: Could not find path to Xcode, environment variable DEVELOPER_DIR set to: /Applications/Xcode.app but no Xcode found)&amp;lt;/blockquote&amp;gt;&#039;&#039;&lt;br /&gt;
Starten Sie in diesem Fall Appium erneut, unter Angabe eines gültigen &#039;&#039;DEVELOPER_DIR&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== WebDriverAgent-Signierung ====&lt;br /&gt;
Zur Automatisierung lädt Appium eine App namens WebDriverAgent auf das Gerät und muss sie dafür signieren können. Dazu brauchen Sie einen Apple-Account und ein entsprechendes Zertifikat. Zur Evaluierung können Sie einen kostenlosen Account verwenden. Dieser hat den Nachteil, dass erstellte Profile nur eine Woche gültig sind und danach neu erstellt werden müssen. Seien Sie auch vorsichtig, wenn Sie sich den Account teilen, da es vorkommen kann, dass Zertifikate widerrufen werden oder durch automatische Generierung ungültig werden. Als Folge können bereits signierte Apps nicht mehr verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie bereits ein entsprechendes Zertifikat mit dem zugehörigen privaten Schlüssel in Ihrer [https://support.apple.com/de-de/guide/keychain-access/welcome/mac Schlüsselbundverwaltung] auf dem Mac haben, können Sie den WebDriverAgent automatisch signieren lassen. Ansonsten empfiehlt es sich, die Signierung über Xcode einzustellen und zu verwalten.&lt;br /&gt;
&lt;br /&gt;
Schließen Sie zuerst das Gerät, das Sie verwenden möchten, über USB an den Mac an. Stellen Sie sicher, dass sich der Mac und das Gerät im selben Netzwerk befinden, ansonsten kann es beim Verbindungsaufbau mit Appium zu Problemen kommen. Starten Sie Xcode und öffnen Sie &#039;&#039;Preferences&#039;&#039;. Wechseln Sie zur Seite der Accounts und legen Sie einen Eintrag mit Ihrem Account an. Anschließend können Sie auf &#039;&#039;Manage Certificates...&#039;&#039; klicken, um die Zertifikate zu sehen, die zu diesem Account gehören. Zum Ausführen von Tests benötigen Sie ein iOS-Development-Zertifikat und den dazugehörigen privaten Schlüssel. Wenn Sie noch keines besitzen, erstellen Sie eines. Wenn Sie bereits eines haben, aber es nicht in Ihrem Schlüsselbund vorhanden ist (erkennbar an dem Hinweis &amp;quot;Not in Keychain&amp;quot;), können Sie es importieren. Das können Sie über die [https://support.apple.com/de-de/guide/keychain-access/welcome/mac Schlüsselbundverwaltung] auf dem Mac machen, wenn Sie es zuvor aus dem Schlüsselbund exportiert haben, in dem es sich befindet. Das Zertifikat mit dem zugehörigen Schlüssel sollte sich im Schlüsselbund &#039;&#039;Anmeldung&#039;&#039; befinden. Dort kann es als PKCS#12-Datei (Endung typischerweise .p12) exportiert werden. Um ein Zertifikat in Ihren Schlüsselbund zu importieren, wählen Sie im Menü &#039;&#039;Ablage&#039;&#039; die Option &#039;&#039;Objekte importieren&#039;&#039;. Falls Sie nicht wissen, wo das Zertifikat gespeichert ist, können Sie es in Xcode auch widerrufen und in Ihrem Schlüsselbund neu anlegen. Machen Sie das jedoch nur, wenn Sie wissen, dass das alte Zertifikat nicht mehr in Verwendung ist, da es danach nicht mehr benutzt werden kann. Nun sollte Ihr Schlüsselbund ein iOS-Development-Zertifikat enthalten.&lt;br /&gt;
&amp;lt;!---(Ich habe den folgenden Teil mal rausgenommen. Man braucht das nicht, wenn es in Xcode eingestellt ist.) Wählen Sie im Rechtsklick-Menü den Punkt &#039;&#039;Informationen&#039;&#039; aus. Unter den Details des Zertifikats finden Sie die Team-ID, die hier als Organisationseinheit bezeichnet wird. Tragen Sie diese in den Einstellungen des Plugins im Feld &#039;&#039;Team-ID&#039;&#039; ein, siehe [[#Konfiguration_des_Plugins|Konfiguration des Plugins]].--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie nun das WebDriverAgent-Projekt in Xcode. Wenn Sie das Mobile Testing Supplement installiert haben, finden Sie es in dessen Verzeichnis unter&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
Wenn Sie Appium Desktop installier haben, finden Sie es unter&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;/Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
Sie können einfach im Finder zu der Xcode-Project-Datei navigieren und Sie über einen Doppelklick öffnen. Beachten Sie dabei, dass Sie dabei auf die Anwendung Appium Server GUI einen Kontextklick (Rechtsklick bzw. Strg + Klick) machen und im Menü &#039;&#039;Paketinhalt anzeigen&#039;&#039; auswählen müssen, um in deren Unterverzeichnis zu gelangen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingWebDriverAgentXcode.png]]&lt;br /&gt;
&lt;br /&gt;
Wählen Sie &#039;&#039;WebDriverAgentLib&#039;&#039; und die Seite &#039;&#039;Signing &amp;amp; Capabilities&#039;&#039; aus. Setzen Sie dort im Abschnitt &#039;&#039;Signing&#039;&#039; die Option &#039;&#039;Automatically manage signing&#039;&#039; und wählen Sie dann ein Team aus. Wechseln Sie nun zu &#039;&#039;WebDriverAgentRunner&#039;&#039; und tun Sie dort dasselbe.&lt;br /&gt;
&amp;lt;!--(Das Folgende scheint nicht mehr aktuell zu sein.) Es sollten an dieser Stelle Fehler angezeigt werden, dass kein Provisioning Profile angelegt oder gefunden wurde. Wechseln Sie deshalb zur Seite &#039;&#039;Build Settings&#039;&#039; und suchen Sie hier im Abschnitt &#039;&#039;Packaging&#039;&#039; den Eintrag &#039;&#039;Product Bundle Identifier&#039;&#039;. Ändern Sie diesen von com.facebook.WebDriverAgentRunner zu etwas, das von Xcode akzeptiert wird, indem Sie den Präfix ändern. Xcode kann nun ein passendes Provisioning Profile generieren und die Fehler auf der General-Seite sollten verschwinden. Danach können Sie Xcode beenden. --&amp;gt;&lt;br /&gt;
Durch das Setzen des Teams sollten die Fehler für den WebDriverAgentRunner verschwinden. Sollte Xcode kein passendes Provisioning Profile für die Bundle ID &#039;&#039;com.facebook.WebDriverAgentRunner&#039;&#039; erstellen können, können Sie diese anpassen, dass sie zu Ihrem Zertifikat passt. Danach können Sie Xcode beenden oder auch, wie weiter unten beschrieben, direkt den Build über Xcode starten, damit das Projekt bereits gebaut ist, wenn Appium es verwenden möchte.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie sich nun von expecco eine Verbindung zu Ihrem Gerät aufbauen, wird der WebDriverAgent darauf installiert und gestartet, um anschließend zur zu testenden App zu wechseln. Eventuell muss auf dem Gerät muss der Ausführung des WebDriverAgents vertraut noch werden. Ein Anzeichnen dafür kann sein, dass die App WebDriverAgent zwar auf dem Gerät erscheint und zu starten versucht, danach aber wieder deinstalliert wird. Öffnen Sie dazu während des Verbindungsaufbaus auf dem Gerät in die Einstellungen und dort unter &#039;&#039;Allgemein&#039;&#039; den Eintrag &#039;&#039;Geräteverwaltung&#039;&#039;. Dieser Eintrag ist nur sichtbar, wenn eine Entwickler-App auf dem Gerät installiert ist. Sie müssen daher möglicherweise warten, bis der WebDriverAgent installiert ist, bevor der Eintrag erscheint. Wählen Sie dort den Eintrag Ihres Apple-Accounts und vertrauen Sie ihm. Da der WebDriverAgent wieder deinstalliert wird, wenn der Start nicht funktioniert hat, müssen Sie dies während des Verbindungsaufbaus tun. Falls Ihnen das zu hektisch ist, können Sie auch folgenden Code ausführen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;xcodebuild -project Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
  xcodebuild -project /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&lt;br /&gt;
&lt;br /&gt;
Damit wird der WebDriverAgent auf dem Gerät installiert ohne dass er wieder gelöscht wird.&lt;br /&gt;
&lt;br /&gt;
Wenn es Probleme beim Installieren des WebDriverAgents gibt, können Sie auch versuchen, den Build über Xcode zu starten. Stellen Sie sicher, dass das richtige Target &#039;&#039;WebDriverAgent&#039;&#039; ausgewählt ist. Fehlermeldungen in Xcode zeigen vielleicht einfacher, wo das Problem liegt. Manchmal hilft es auch, es ein zweites Mal zu versuchen, weil es möglicherweise beim ersten Mal zu lange gedauert hat und abgebrochen wurde. Es kann sein, dass Sie während des Builds mehrmals aufgefordert werden, das Passwort für Ihren Schlüsselbund anzugeben.&lt;br /&gt;
&lt;br /&gt;
[[Datei:WebDriverAgentCodesign.png]]&lt;br /&gt;
&lt;br /&gt;
Lesen Sie auch die Dokumentation von Appium zum [https://github.com/appium/appium-xcuitest-driver/blob/master/docs/real-device-config.md Aufsetzen von Tests mit iOS-Geräten]. In der [https://support.apple.com/en-us/HT204460 Dokumentation von Apple] finden Sie nähere Informationen zum Installieren und Vertrauen von Apps.&lt;br /&gt;
&lt;br /&gt;
Ist der WebDriverAgent einmal auf dem Gerät installiert, wird er für spätere Verbindungen wieder verwendet und der Verbindungsaufbau sollte schneller funktionieren. Ebenso liegt dann die signierte Version bereits auf Ihrem Mac und muss nicht erneut gebaut werden, was die Verbindung zu weiteren Geräten ebenfalls beschleunigt. Wenn Sie wissen, dass bei Ihrem Verbindungsaufbau der WebDriverAgent erst noch signiert und gebaut werden muss, ist es ratsam, die Capability &#039;&#039;wdaLaunchTimeout&#039;&#039; zu setzen. Dieser Timeout, wie lange auf den Start der WebDriverAgents auf dem Gerät gewartet werden soll, liegt standardmäßig bei 60000 ms. Der Build dauert aber häufig über eine Minute, sodass der Versuch zum Verbindungsaufbau dann abgebrochen wird. Ein Wert von 120000 hat sich hier als besser erwiesen.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration des Plugins ==&lt;br /&gt;
Bevor Sie loslegen, sollten Sie die Einstellungen des Mobile Testing Plugins überprüfen und ggf. anpassen.&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie im Menü den Punkt &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; und dort unter &amp;quot;&#039;&#039;Erweiterungen&#039;&#039;&amp;quot; den Eintrag &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot; (s. Abb.). Standardmäßig werden diese Pfade automatisch gefunden (1). Um einen Pfad manuell anzupassen, deaktivieren Sie den entsprechenden Haken rechts davon. Sie erhalten in einer Drop-down-Liste einige Pfade zur Auswahl. Ist ein eingetragener Pfad falsch oder kann er nicht gefunden werden, wird das Feld rot markiert und es erscheint ein diesbezüglicher Hinweis. Stellen Sie sicher, dass alle Pfade richtig angegeben sind.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingEinstellungen.png | thumb | 400px | Konfiguration des Plugins]]&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;appium&#039;&#039;&#039;: Geben Sie hier den Pfad zur ausführbaren Datei an mit der Appium in der Kommandozeile gestartet werden kann. Unter Windows wird diese Datei in der Regel &amp;quot;&amp;lt;code&amp;gt;appium.cmd&amp;lt;/code&amp;gt;&amp;quot; heißen. Dieser Pfad wird benutzt, wenn expecco einen Appium-Server startet.&lt;br /&gt;
*&#039;&#039;&#039;node&#039;&#039;&#039;: Geben Sie hier den Pfad zur ausführbaren Datei an, die Node (auch &amp;quot;Node.js&amp;quot;) startet. Dieser Pfad wird beim Starten eines Servers an Appium weitergegeben, damit Appium ihn unabhängig von der PATH-Variablen findet. Unter Windows heißt diese Datei in der Regel &amp;quot;&amp;lt;code&amp;gt;node.exe&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;JAVA_HOME&#039;&#039;&#039;: Geben Sie hier den Pfad zu einem JDK an. Dieser Pfad wird an jeden Appium-Server weitergegeben. Lassen Sie das Feld frei, um den Wert aus der Umgebungsvariablen zu verwenden. Um einzustellen, welches Java von expecco verwendet werden soll, setzen Sie diesen Pfad in den Einstellungen für die Java Bridge.&lt;br /&gt;
*&#039;&#039;&#039;ANDROID_HOME&#039;&#039;&#039;: Geben Sie hier den Pfad zu einem SDK von Android an. Dieser Pfad wird an jeden Appium-Server weitergegeben. Lassen Sie das Feld frei, um den Wert aus der Umgebungsvariablen zu verwenden.&lt;br /&gt;
*&#039;&#039;&#039;adb&#039;&#039;&#039;: Hier steht der Pfad zum adb-Befehl. Unter Windows heißt die Datei adb.exe. Diese wird von expecco beispielsweise verwendet, um die Liste der angeschlossenen Geräte zu erhalten. Diesen Pfad sollten Sie automatisch wählen lassen, da dann der Befehl im ANDROID_HOME-Verzeichnis verwendet wird. Dieser wird auch von Appium verwendet. Falls expecco und Appium jedoch verschiedene Versionen von adb verwenden kann es zu Konflikten kommen.&lt;br /&gt;
*&#039;&#039;&#039;android.bat&#039;&#039;&#039;: Diese Datei wird nur benötigt, um damit den AVD und den SDK Manager zu starten. Automatisch wird hier die Datei im ANDROID_HOME-Verzeichnis gesucht.&lt;br /&gt;
*&#039;&#039;&#039;aapt&#039;&#039;&#039;: Geben Sie hier den Pfad zum aapt-Befehl an. Unter Windows heißt diese Datei &#039;&#039;aapt.exe&#039;&#039;. expecco verwendet aapt nur im Verbindungseditor, um das Paket und die Activities einer apk-Datei zu lesen. Automatisch wird hier die Datei im ANDROID_HOME-Verzeichnis gesucht.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingJavaBridgeEinstellungen.png | thumb | 400px | Konfiguration des JDKs]]&lt;br /&gt;
&lt;br /&gt;
Ab expecco 2.11 gibt es das Feld &#039;&#039;Team-ID&#039;&#039;. Wenn Sie iOS-Tests ausführen, tragen Sie hier die Team-ID Ihres Zertifikats ein. Diese wird für jede iOS-Verbindung verwendet, außer Sie setzen den Wert im Einzelfall in den Verbindungseinstellungen um. Wie Sie die Team-ID erhalten, lesen Sie im Abschnitt zur [[#Signierung|Signierung]] ber der Installation auf Mac OS. Mit expecco 2.10 können Sie die Team-ID nur für jede Verbindungseinstellung extra als Capability eintragen. Dazu müssen Sie jedoch die [[#Erweiterte_Ansicht|erweiterte Ansicht]] verwenden. Geben Sie hier die Capability &#039;&#039;xcodeOrgId&#039;&#039; an und setzen Sie als Wert die Team-ID des Zertifikats.&lt;br /&gt;
&lt;br /&gt;
Die Einstellung zur Serveradresse unten auf der Seite bezieht sich auf das Verhalten des Verbindungseditors. Dieser prüft am Ende, ob die Serveradresse auf &#039;&#039;/wd/hub&#039;&#039; endet, da dies die übliche Form ist. Falls nicht, wird in einem Dialog gefragt, wie darauf reagiert werden soll. Das festgelegte Verhalten kann hier eingesehen und verändert werden.&lt;br /&gt;
&lt;br /&gt;
Wechseln Sie ebenfalls zum Eintrag &#039;&#039;Java Bridge&#039;&#039; (s. Abb.). Hier muss der Pfad zu Ihrer Java-Installation angegeben werden, die von expecco benutzt wird. Tragen Sie hier ein JDK ein. Falls Sie unter Windows das aus dem Mobile Testing Supplement verwenden möchten, lautet der Pfad&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;C:\Program Files (x86)\exept\Mobile Testing Supplement\jdk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Sie können auch die Systemeinstellungen verwenden.&lt;br /&gt;
&lt;br /&gt;
== Android-Gerät vorbereiten ==&lt;br /&gt;
Wenn Sie ein Android-Gerät unter Windows anschließen benötigen Sie möglicherweise noch einen adb-Treiber für das Gerät. Einen passenden Treiber finden Sie üblicherweise auf der jeweiligen Webseite des Herstellers. Haben Sie den Universal-Treiber aus dem Mobile Testing Supplement installiert, sollte für die meisten Geräte bereits alles funktionieren. In einigen Fällen versucht auch Windows automatisch einen Treiber zu installieren, wenn Sie das Gerät zum ersten mal anschließen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===USB-Debugging Einschalten===&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Bevor Sie ein Mobilgerät mit dem Appium-Plugin ansteuern können, müssen Sie für dieses Debugging erlauben!&lt;br /&gt;
&lt;br /&gt;
Für Android-Geräte finden Sie diese Option in den Einstellungen unter &#039;&#039;[https://www.droidwiki.org/wiki/Entwickleroptionen Entwickleroptionen]&#039;&#039; mit dem Namen &#039;&#039;[https://www.droidwiki.org/USB-Debugging USB-Debugging]&#039;&#039;. Falls die Entwickleroptionen nicht angezeigt werden, können Sie diese freischalten, indem Sie unter &amp;quot;&#039;&#039;Über das Telefon&#039;&#039;&amp;quot; siebenmal auf &amp;quot;&#039;&#039;Build-Nummer&#039;&#039;&amp;quot; tippen.&lt;br /&gt;
&lt;br /&gt;
===Wach bleiben Aktivieren===&lt;br /&gt;
Aktivieren Sie auch die Funktion &#039;&#039;Wach bleiben&#039;&#039;, damit das Gerät nicht während der Testerstellung oder -ausführung den Bildschirm abschaltet.&lt;br /&gt;
&lt;br /&gt;
Aus Sicherheitsgründen muss USB-Debugging für jeden Computer einzeln zugelassen werden. Beim Verbinden des Geräts mit dem PC über USB müssen Sie dabei am Gerät der Verbindung zustimmen. Falls Sie dies für Ihren Computer noch nicht getan haben, aber auf dem Gerät kein entsprechender Dialog erscheint, kann es helfen, das Gerät aus- und wieder einzustecken. Das kann insbesondere dann passieren, wenn Sie den ADB-Treiber installiert haben während das Gerät bereits über USB angeschlossen war. Falls auch das nicht hilft, öffnen Sie die Benachrichtigungen, indem Sie sie vom oberen Bildschirmrand herunter ziehen. Dort finden Sie die USB-Verbindung und Sie können die Optionen dazu öffnen. Wählen Sie einen anderen Verbindungstypen aus; in der Regel sollten MTP oder PTP funktionieren.&lt;br /&gt;
&lt;br /&gt;
Sie können auch auf einem Emulator testen. Dieser muss nicht gesondert vorbereitet werden, da er bereits für USB-Debugging ausgelegt ist. Es ist sogar möglich, einen Emulator bei Testbeginn zu starten.&lt;br /&gt;
&lt;br /&gt;
Um zu überprüfen, ob ein Gerät, das Sie an Ihren Rechner angeschlossen haben, verwendet werden kann, öffnen Sie den [[#Verbindungseditor|Verbindungseditor]]. Das Gerät sollte dort angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Verbindung über WLAN ===&lt;br /&gt;
Es ist auch möglich, Android-Geräte über WLAN zu verbinden. Für Geräte mit Android 11 oder neuer ist dies direkt über WLAN möglich, im anderen Fall müssen Sie das Gerät zuerst über USB verbinden. Ab expecco 22.1 können Sie eine WLAN-Verbindung über den [[Mobile Testing Plugin#Verbindungseditor|Verbindungseditor]] aufbauen. Ansonsten ist es auch über die Eingabeaufforderung möglich.&lt;br /&gt;
==== Drahtlos verbinden über die Eingabeaufforderung mit expecco Versionen vor 22.1 (ab Android 11) ====&lt;br /&gt;
Mit expecco ab Version 22.1 funktioniert das einfacher über den Verbindungseditor.&lt;br /&gt;
&lt;br /&gt;
Erlauben Sie in den Entwickleroptionen des Geräts Debugging über WLAN und öffnen Sie dessen Optionen. Sie müssen zuerst das Gerät mit dem  Rechner koppeln. Wählen Sie dazu &amp;quot;&#039;&#039;Gerät mit einem Kopplungscode koppeln&#039;&#039;&amp;quot;, um einen Kopplungscode und eine IP-Adresse mit Port zu erhalten. Öffnen Sie dann auf dem Rechner die Eingabeaufforderung und geben Sie dort ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb pair &amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Kopplungsport&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
wobei Sie &amp;lt;tt&amp;gt;&amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Kopplungsport&amp;gt;&amp;lt;/tt&amp;gt; durch die auf dem Gerät angezeigte IP-Adresse &amp;amp; Port ersetzen. Danach werden Sie aufgefordert, den Kopplungscode einzugeben. Wenn alles geklappt hat, sollte sich das Popup auf dem Gerät schließen und der Rechner als gekoppeltes Gerät angezeigt werden. Geben Sie dann in der Eingabeaufforderung ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Debug-Port&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die IP-Adresse ist hier noch die gleiche wie beim Koppeln, aber der Port ist ein anderer. Beides wird als IP-Adresse &amp;amp; Port auf dem Gerät angezeigt. Damit sollte das Gerät nun über WLAN verbunden sein und kann genauso verwendet werden, wie mit USB-Verbindung. Sie können dies überprüfen, indem Sie entweder &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; eingeben oder in expecco den Verbindungsdialog öffnen. In der Liste taucht das Gerät mit seiner IP-Adresse und dem Port auf. Bedenken Sie, dass die WLAN-Verbindung nicht mehr besteht, wenn der ADB-Server oder das Gerät neu gestartet werden. Häufig wird beim Neustart des Geräts auch die Erlaubnis für das Debugging über WLAN wieder zurückgesetzt und der verwendete Port ändert sich. Die Kopplung bleibt aber bestehen und muss beim nächsten Verbinden nicht noch einmal durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==== WLAN Verbindung über USB starten (Android 10 und früher) ====&lt;br /&gt;
Verbinden Sie zunächst das Gerät über USB mit dem Rechner. Öffnen Sie dann die Eingabeaufforderung und geben Sie dort ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit lauscht das Gerät auf eine TCP/IP-Verbindung an Port 5555. Sollten Sie mehrere Geräte angeschlossen oder Emulatoren laufen haben, müssen Sie genauer angeben, welches Gerät Sie meinen. Geben Sie in diesem Fall ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb devices -l&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Sie erhalten eine Liste aller Geräte, wobei die erste Spalte deren Kennung ist. Schreiben Sie dann stattdessen&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb -s &amp;lt;Gerätekennung&amp;gt; tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
mit der Gerätekennung des gewünschten Geräts. Sie können die USB-Verbindung nun trennen. Jetzt müssen Sie die IP-Adresse Ihres Gerätes in Erfahrung bringen. Sie finden diese üblicherweise irgendwo in den Einstellungen des Geräts, beispielsweise beim Status oder in den WLAN-Einstellungen. Geben Sie dann ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP-Adresse des Geräts&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit sollte das Gerät nun über WLAN verbunden sein und kann genauso verwendet werden, wie mit USB-Verbindung. Sie können dies überprüfen, indem Sie wieder &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; eingeben oder in expecco den Verbindungsdialog öffnen. In der Liste taucht das Gerät mit seiner IP-Adresse und dem Port auf. Bedenken Sie, dass die WLAN-Verbindung nicht mehr besteht, wenn der ADB-Server oder das Gerät neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
=== Verbindung zu einem Emulator ===&lt;br /&gt;
Sie benötigen dazu den Emulator selbst, sowie mindestens ein AVD (Android Virtual Device). Hinweise zu Installation finden Sie in der [https://developer.android.com/studio/run/emulator Android Studio Dokumentation].&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Android Studio bereits mit den Defaulteinstellungen installiert haben &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;, sollte der Emulator bereits mitinstalliert sein. Falls nicht, wählen Sie in Android Studio &amp;quot;&#039;&#039;Configure&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;SDK Manager&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Android SDK&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;SDK Tools&#039;&#039;&amp;quot; - &#039;&#039;Android Emulator&#039;&#039;&amp;quot;, sowie dort die &amp;quot;&#039;&#039;Platform Tools&#039;&#039;&amp;quot;.&lt;br /&gt;
Alternativ geht das auch über die Kommandzeile mit dem &amp;quot;sdkmanager&amp;quot; Kommando.&lt;br /&gt;
&lt;br /&gt;
Als nächstes benötigen Sie mindestens ein AVD; auch dies geht am einfachsten über den Dialog in Android Studio:&lt;br /&gt;
wählen sie &amp;quot;&#039;&#039;Configure&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;AVD Manager&#039;&#039;&amp;quot; und folgen den Anweisungen (Deviceauswahl, Platform und Android Version).  &lt;br /&gt;
&lt;br /&gt;
Auch wenn Sie den Emulator automatisieren benötigen sie Appium; installieren Sie dieses entweder mit dem Mobile Testing Supplement, oder direkt von der Appium homepage (https://github.com/appium/appium-desktop/releases).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;Android Studio selbst wird nicht von expecco benötigt; es bietet aber kompfortable Dialoge zum Installieren von Paketen und AVDs.&lt;br /&gt;
&lt;br /&gt;
== iOS-Gerät und App vorbereiten ==&lt;br /&gt;
Das Ansteuern von iOS-Geräten ist nur über einen Mac möglich. Lesen Sie daher auch den Abschnitt zur [[#Mac_OS|Installation unter Mac OS]].&lt;br /&gt;
&lt;br /&gt;
Bevor Sie ein Mobilgerät mit dem Mobile Testing Plugin ansteuern können, müssen Sie für iOS-Geräte ab iOS 8 Debugging erlauben. Aktivieren Sie dazu die Option &#039;&#039;Enable UI Automation&#039;&#039; unter dem Menüpunkt &#039;&#039;Entwickler&#039;&#039; in den Einstellungen des Geräts. Falls Sie den Eintrag &#039;&#039;Entwickler&#039;&#039; in den Einstellungen nicht finden, gehen Sie wie folgt vor: Schließen Sie das Gerät über USB an den Mac an. Dabei müssen Sie ggf. am Gerät noch der Verbindung zustimmen. Starten Sie Xcode und wählen Sie dann in der Menüleiste am oberen Bildschirmrand im Menü &#039;&#039;Window&#039;&#039; den Eintrag &#039;&#039;Devices&#039;&#039;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wählen Sie dort Ihr Gerät aus. Danach sollte der Eintrag &#039;&#039;Entwickler&#039;&#039; in den Einstellungen auf dem Gerät auftauchen. Dazu müssen Sie möglicherweise die Einstellungen beenden und neu starten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Alert.png | thumb | 270px | Beispiel für einen Alert unter iOS]]&lt;br /&gt;
Ein Verbindungsaufbau zu dem Gerät ist nicht möglich solange es bestimmte Alerts zeigt. Ein solcher Alert kann z.&amp;amp;#x202f;B. erscheinen wenn FaceTime aktiviert ist, indem ein Hinweis auf anfallende SMS-Gebühren angezeigt wird (siehe Screenshot). Achten Sie darauf, das Gerät so zu konfigurieren, dass es im Leerlauf keine solchen Alerts zeigt.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.11 und später ===&lt;br /&gt;
Sie können beliebige Apps testen, die auf dem verwendeten Gerät lauffähig oder bereits installiert sind. Wenn die App als Development-Build vorliegt, muss die UDID des Geräts in der App hinterlegt sein. In jedem Fall muss der WebDriverAgent für das Gerät signiert werden. Lesen Sie dazu den Abschnitt zur [[#Signierung|Signierung]] unter Mac OS.&lt;br /&gt;
&lt;br /&gt;
Falls Sie in einem Test den Home-Button verwenden wollen, müssen Sie auf dem Gerät AssistiveTouch aktivieren. Sie finden diese Option in den Einstellungen unter &#039;&#039;Allgemein&#039;&#039; &amp;gt; &#039;&#039;Bedienungshilfen&#039;&#039; &amp;gt; &#039;&#039;AssistiveTouch&#039;&#039;. Platzieren Sie dann das Menü in der Mitte des oberen Bildschirmrands. Sie können das Drücken des Home-Buttons dann mit dem entsprechenden Menüeintrag im Recorder aufzeichnen oder direkt den Baustein &#039;&#039;Press Home Button&#039;&#039; benutzen.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.10 ===&lt;br /&gt;
Die App, die Sie verwenden wollen, muss als Development-Build vorliegen. Außerdem muss die UDID des Geräts in der App hinterlegt sein.&lt;br /&gt;
&lt;br /&gt;
=== Development-Build signieren ===&lt;br /&gt;
Ein Development-Build einer App ist nur für eine begrenzte Zahl von Geräten zugelassen und kann auf anderen Geräten nicht gestartet werden. Es ist aber möglich, das Zertifikat und die verwendbaren Geräte in einem Development-Build auszutauschen.&lt;br /&gt;
&lt;br /&gt;
* Evaluierung mit Demo-App von eXept:&lt;br /&gt;
:Gerne stellen wir Ihnen eine Demo-App zur Verfügung, die als Development-Build vorliegt und die wir für Ihr Gerät signieren können. Senden Sie dazu bitte Ihrem eXept-Ansprechpartner die UDID Ihres Gerätes zu. Wie Sie die UDID Ihres Gerätes ermitteln können, ist im folgenden Abschnitt beschrieben.&lt;br /&gt;
&lt;br /&gt;
* Eigene App für Ihr Testgerät verwenden:&lt;br /&gt;
:Wenn Sie von den App-Entwicklern einen Development-Build (IPA-Datei) erhalten, der für Ihr Testgerät zugelassen ist, können Sie diesen direkt verwenden. Dazu müssen Sie den Entwicklern die UDID Ihres Geräts mitteilen, damit sie diese eintragen können. &#039;&#039;&#039;Sie können die UDID eines Gerätes mithilfe von Xcode auslesen&#039;&#039;&#039;. Starten Sie dazu Xcode und wählen Sie in der Menüleiste am oberen Bildschirmrand im Menü &#039;&#039;Window&#039;&#039; den Eintrag &#039;&#039;Devices&#039;&#039;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wählen Sie Ihr Gerät aus und suchen Sie in Eigenschaften den Eintrag &#039;&#039;Identifier&#039;&#039;. Die UDID ist eine 40-stellige Hexadezimalzahl.&lt;br /&gt;
&lt;br /&gt;
* Extern entwickelte App für Ihr Testgerät umsignieren:&lt;br /&gt;
:Es können auch Apps umsigniert werden, damit Sie auf anderen Geräten lauffähig sind. Dieser Vorgang ist jedoch kompliziert und setzt insbesondere einen Zugang zu einem Apple-Developer-Account voraus. Eine Dokumentation zur Vorgehensweise ist derzeit in Vorbereitung.&lt;br /&gt;
&lt;br /&gt;
:Für die Evaluierung unterstützen wir Sie gerne beim Umsignieren Ihrer App.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Melden Sie sich beim [https://developer.apple.com/ Apple-Webinterface] an. Navigieren Sie zu &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039;. Erzeugen Sie hier ggf. ein Developer-Zertifikat und ein Provisioning Profile für Ihr Gerät und laden Sie beide herunter. Sollten Sie noch keinen Developer Account haben, erstellen Sie hier einen: https://developer.apple.com/enroll/. Hierzu müssen Sie sich mit einer Apple-ID anmelden.&lt;br /&gt;
&lt;br /&gt;
# Team-ID herausfinden (&#039;&#039;Membership&#039;&#039; -&amp;gt; &#039;&#039;Team ID&#039;&#039;)&lt;br /&gt;
# Unter &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039; Development-Zertifikat auswählen (unter &#039;&#039;+&#039;&#039; anlegen, falls nicht vorhanden) und herunterladen.&lt;br /&gt;
# Unter &#039;&#039;App ID&#039;&#039; Wildcard-App-ID erzeugen, falls nicht vorhanden. App-ID notieren (AppID = Prefix.ID)&lt;br /&gt;
# Gerät hinzufügen, dazu UDID (bzw. &#039;&#039;Identifier&#039;&#039;) des Geräts herausfinden (&#039;&#039;Xcode&#039;&#039; -&amp;gt; &#039;&#039;Window&#039;&#039; (oben in Menüleiste) -&amp;gt; &#039;&#039;Devices&#039;&#039;)&lt;br /&gt;
# Provisionen Profile erstellen: &#039;&#039;iOS App Development&#039;&#039; -&amp;gt; &#039;&#039;AppID&#039;&#039; auswählen -&amp;gt; Zertifikat wählen -&amp;gt; Gerät auswählen -&amp;gt; Profilname anlegen -&amp;gt; Provisioning Profile herunterladen.&lt;br /&gt;
# Das heruntergeladene Zertifikat importieren (&#039;&#039;Downloads&#039;&#039; -&amp;gt; Zertifikat (.cer)&lt;br /&gt;
# SHA1-Fingerabdruck kopieren. Dazu Rechtsklick auf Zertifikat -&amp;gt; &#039;&#039;Information&#039;&#039;, anschließend bis zum Ende der Seite scrollen).&lt;br /&gt;
# Entitlements.plist erstellen (&#039;&#039;Terminal&#039; öffnen -&amp;gt; Downloads/Mobile_Testing_Supplement/bin/gen-entitlements_plist &#039;Team-ID&#039; &#039;App ID&#039; Downloads/Mobile_Testing_Supplement/bin/re-sign-ipa &amp;lt;Pfad zum ipa (z.B. Downloads/expeccoMobileDemo.ipa)&amp;gt; \&lt;br /&gt;
&amp;quot;&amp;lt;Zertifikat (SHA1-Fingerabdruck, z.B. 76 E8 4B E8 78 D5 D7 F9 2E 09 8B D7 E8 FB CE 30 0C F5 D0 EF)&amp;gt;&amp;quot; \&lt;br /&gt;
&amp;lt;Pfad zum Provisionen Profile (z.B. /Users/exept_test/Downloads/dut.mobileprovision)&amp;gt; \&lt;br /&gt;
&amp;lt;Pfad für das Ergebnis-ipa (z.B. Downloads/expeccoMobileDemo_re-signed.ipa)&amp;gt; \&lt;br /&gt;
[Pfad zur entitlements.plist] (z.B. /Users/exept_test/entitlements.plist)&lt;br /&gt;
&lt;br /&gt;
Zum Umsignieren können Sie das entsprechende Skript aus dem Mobile Testing Supplement für Mac OS oder jedes beliebige andere Tool (z.B. isign) verwenden.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zur Verwendung von iOS-Geräten finden Sie auch in der [http://appium.io/slate/en/master/?java#appium-on-real-ios-devices Dokumentation von Appium].&lt;br /&gt;
&lt;br /&gt;
=== Native iOS-Apps ===&lt;br /&gt;
Sie können auch Apps verwenden, die bereits nativ auf dem Gerät vorhanden sind. Dazu müssen Sie deren Bundle-ID kennen und diese dann in die Verbindungseinstellungen eintragen. Hier eine kleine Auswahl gängiger Apps:&lt;br /&gt;
{| style=&amp;quot;text-align:left&amp;quot;&lt;br /&gt;
! App&lt;br /&gt;
!&lt;br /&gt;
! Bundle-ID&lt;br /&gt;
|-&lt;br /&gt;
| App Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.AppStore&lt;br /&gt;
|-&lt;br /&gt;
| Calculator&lt;br /&gt;
| &lt;br /&gt;
| com.apple.calculator&lt;br /&gt;
|-&lt;br /&gt;
| Calendar&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilecal&lt;br /&gt;
|-&lt;br /&gt;
| Camera&lt;br /&gt;
| &lt;br /&gt;
| com.apple.camera&lt;br /&gt;
|-&lt;br /&gt;
| Contacts&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileAddressBook&lt;br /&gt;
|-&lt;br /&gt;
| iTunes Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileStore&lt;br /&gt;
|-&lt;br /&gt;
| Mail&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilemail&lt;br /&gt;
|-&lt;br /&gt;
| Maps&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Maps&lt;br /&gt;
|-&lt;br /&gt;
| Messages&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileSMS&lt;br /&gt;
|-&lt;br /&gt;
| Phone&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilephone&lt;br /&gt;
|-&lt;br /&gt;
| Photos&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobileslideshow&lt;br /&gt;
|-&lt;br /&gt;
| Settings&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Preferences&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Weitere Bundle-IDs finden Sie [https://github.com/joeblau/apple-bundle-identifiers hier].&lt;br /&gt;
&lt;br /&gt;
= Beispiele =&lt;br /&gt;
Bei den Demo-Testsuiten für expecco finden Sie auch Beispiele für Tests mit dem Mobile Testing Plugin. Wählen Sie dazu auf dem Startbildschirm die Option &amp;quot;&#039;&#039;Beispiel aus Datei&#039;&#039;&amp;quot; und öffnen Sie den Ordner &amp;quot;&#039;&#039;mobile&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;TestsuiteMobileTestingDemo&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m01_MobileTestingDemo.ets --&amp;gt;&amp;lt;/span&amp;gt; &#039;&#039;m01_MobileTestingDemo.ets&#039;&#039; ==&lt;br /&gt;
Die Testsuite enthält zwei einfache Testpläne: &amp;quot;&#039;&#039;Simple CalculatorTest&#039;&#039;&amp;quot; und &amp;quot;&#039;&#039;Complex Calculator and Messaging Test&#039;&#039;&amp;quot;. Beide Tests verwenden einen Android-Emulator, den Sie vor Beginn starten müssen. Die Apps, die im Test verwendet werden, gehören zur Grundausstattung des Emulators und müssen daher nicht mehr installiert werden. Da sich die Apps unter jeder Android-Version unterscheiden können, ist es wichtig, dass Ihr Emulator unter Android 6.0 läuft. Außerdem muss die Sprache auf Englisch gestellt sein.&lt;br /&gt;
&lt;br /&gt;
; Simple CalculatorTest&lt;br /&gt;
: Dieser Test verbindet sich mit dem Taschenrechner und gibt die Formel &#039;&#039;2+3&#039;&#039; ein. Das Ergebnis des Rechners wird mit dem erwarteten Wert &#039;&#039;5&#039;&#039; verglichen.&lt;br /&gt;
&lt;br /&gt;
; Complex Calculator and Messaging Test&lt;br /&gt;
: Dieser Test verbindet sich mit dem Taschenrechner und öffnet anschließend den Nachrichtendienst. Dort wartet er auf eine einkommende Nachricht von der Nummer &#039;&#039;15555215556&#039;&#039;, in der eine zu berechnende Formel gesendet wird. Die Nachricht wird zuvor über einen Socket beim Emulator erzeugt. Nach dem Eintreffen der Nachricht wird diese vom Test geöffnet und deren Inhalt gelesen. Danach wird wieder der Taschenrechner geöffnet, die erhaltene Formel eingegeben und das Ergebnis gelesen. Anschließend wechselt der Test wieder zum Nachrichtendienst und sendet das Ergebnis als Antwort.&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;m02_expeccoMobileDemo.ets&#039;&#039; und &#039;&#039;m03_expeccoMobileDemoIOS.ets&#039;&#039; ==&lt;br /&gt;
Diese sind Bestandteil des Tutorials zum Mobile Testing Plugin. Der jeweils enthaltene Testfall ist unvollständig und wird im Zuge des Tutorials ergänzt. Lesen Sie dazu den Abschnitt [[#Tutorial|Tutorial]].&lt;br /&gt;
&lt;br /&gt;
= Tutorial =&lt;br /&gt;
Es gibt ein Tutorial, das das grundsätzliche Vorgehen zur Erstellung von Tests mit dem Mobile Testing Plugin beschreibt. Grundlage dafür ist ein mitgeliefertes Beispiel, bestehend aus einer einfachen App und einer expecco-Testsuite.&lt;br /&gt;
&lt;br /&gt;
Sie finden es auf der Seite [[Mobile_Testing_Tutorial|Mobile Testing Tutorial]] in zwei Versionen für Android und für iOS.&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsAndroid&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m02_expeccoMobileDemo.ets --&amp;gt;&amp;lt;/span&amp;gt;[[Mobile_Testing_Tutorial#Erste_Schritte_mit_Android|Erste Schritte mit Android]]&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsIOS&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m03_expeccoMobileDemoIOS.ets --&amp;gt;&amp;lt;/span&amp;gt;[[Mobile_Testing_Tutorial#Erste_Schritte_mit_iOS|Erste Schritte mit iOS]]&lt;br /&gt;
&lt;br /&gt;
= Dialoge des Mobile Testing Plugins =&lt;br /&gt;
== Verbindungseditor ==&lt;br /&gt;
Mithilfe des Verbindungseditors können Sie schnell Verbindungen definieren, ändern oder aufbauen. Je nach Aufgabe weist der Dialog kleine Unterschiede auf und wird unterschiedlich geöffnet:&lt;br /&gt;
*Um eine Verbindung aufzubauen, klicken Sie im GUI-Browser auf &amp;quot;&#039;&#039;Verbinden&#039;&amp;quot;&#039; klicken und wählen dann &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot;.&lt;br /&gt;
*Um eine bestehende Verbindung im GUI-Browser zu ändern oder zu kopieren, wählen Sie diese aus, machen einen Rechtsklick und wählen im Kontextmenü &amp;quot;&#039;&#039;Verbindung bearbeiten&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;Verbindung kopieren&#039;&#039;&amp;quot; aus.&lt;br /&gt;
*Wollen Sie Verbindungseinstellungen nicht für den GUI-Browser sondern zur Verwendung in einem Test erstellen, wählen Sie im Menü des Mobile Testing Plugins den Punkt &amp;quot;&#039;&#039;Verbindungseinstellungen erstellen...&#039;&#039;&amp;quot;. Darüber können nur die Einstellungen für eine Verbindung erstellt werden, ohne dass eine Verbindung tatsächlich angelegt wird.&lt;br /&gt;
&lt;br /&gt;
Einige der Schaltflächen sind nur beim Erstellen von Verbindungseinstellungen sichtbar:&lt;br /&gt;
[[Datei:MobileTestingVerbindungseditorMenu.png]]&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen löschen&#039;&#039;&amp;quot;: Setzt alle Einträge zurück. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen aus Datei laden&#039;&#039;&amp;quot;: Erlaubt das Öffnen einer gespeicherten Einstellungsdatei (*.csf). Deren Einstellungen werden in den Dialog übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen aus Anhang laden&#039;&#039;&amp;quot;: Erlaubt das Öffnen eines Anhangs mit Verbindungseinstellungen aus einem geöffneten Projekt. Diese Einstellungen werden in den Dialog übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen in Datei speichern&#039;&#039;&amp;quot; sowie&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen in Anhang speichern&#039;&#039;&amp;quot;: Hier können Sie die eingetragenen Einstellungen in eine Datei (*.csf) speichern oder als Anhang in einem geöffneten Projekt anlegen. Beide Optionen besitzen ein verzögertes Menü, in dem Sie auswählen können, nur einen bestimmten Teil der Einstellungen zu speichern. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Erweiterte Ansicht&#039;&#039;&amp;quot;: Damit können Sie in die erweiterte Ansicht wechseln, um zusätzliche Einstellungen vorzunehmen. Lesen Sie dazu mehr am Ende des Kapitels. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Hilfe&#039;&#039;&amp;quot;: An der rechten Seite wird ein Hilfetext zum jeweiligen Schritt ein- oder ausgeblendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Dialog ist in drei Schritte unterteilt. Im ersten Schritt wählen Sie das Gerät, das Sie verwenden möchten, im zweiten Schritt wählen Sie aus, welche App verwendet werden soll und im letzten Schritt erfolgen die Einstellungen zum Appium-Server.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep1&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 1: Gerät auswählen===&lt;br /&gt;
Im oberen Teil erhalten Sie eine Liste aller angeschlossenen Appium-Geräte, die erkannt werden. Mit der Checkbox darunter können Sie die Geräte ausblenden, die zwar erkannt werden, aber nicht bereit sind. Falls Sie ein Gerät eintragen wollen, das nicht angeschlossen ist, können Sie dies mit dem entsprechenden Knopf &amp;quot;&#039;&#039;Android-Gerät eingeben&#039;&#039;&amp;quot; bzw. &amp;quot;&#039;&#039;iOS-Gerät eingeben&#039;&#039;&amp;quot; anlegen. Dazu müssen Sie jedoch die benötigten Eigenschaften Ihres Geräts kennen. Das Gerät wird dann in einer zweiten Geräteliste angelegt und kann dort ausgewählt werden. Wenn keine Liste mit angeschlossenen Elementen angezeigt werden kann, werden stattdessen verschiedene Meldungen angezeigt:&lt;br /&gt;
*Keine Geräte gefunden&lt;br /&gt;
*:expecco konnte kein Android-Geräte finden.&lt;br /&gt;
*:Um eine Verbindung zu einem Gerät automatisch zu konfigurieren, stellen Sie sicher, dass es&lt;br /&gt;
*:*angeschlossen ist&lt;br /&gt;
*:*eingeschaltet ist&lt;br /&gt;
*:*einen passenden adb-Treiber installiert hat&lt;br /&gt;
*:*für Debugging freigeschaltet ist (siehe unten).&lt;br /&gt;
*Keine verfügbaren Geräte gefunden&lt;br /&gt;
*:expecco konnte keine verfügbaren Android-Geräte finden. Es wurden aber nicht verfügbare gefunden, z.B. mit dem Status &amp;quot;unauthorized&amp;quot;.&lt;br /&gt;
*:Um eine Verbindung zu einem Gerät automatisch zu konfigurieren, stellen Sie sicher, dass es&lt;br /&gt;
*:*angeschlossen ist&lt;br /&gt;
*:*eingeschaltet ist&lt;br /&gt;
*:*einen passenden adb-Treiber installiert hat&lt;br /&gt;
*:*für Debugging freigeschaltet ist (siehe unten).&lt;br /&gt;
*:Um nicht verfügbare Geräte anzuzeigen, aktivieren Sie unten diese Option.&lt;br /&gt;
*Verbindung verloren&lt;br /&gt;
*:expecco hat die Verbindung zum adb-Server verloren. Versuchen Sie die Verbindung wieder herzustellen, indem Sie auf den Button klicken.&lt;br /&gt;
*Verbindung fehlgeschlagen&lt;br /&gt;
*:expecco konnte sich nicht mit dem adb-Server verbinden. Möglicherweise läuft er nicht oder der angegebene Pfad stimmt nicht.&lt;br /&gt;
*:Überprüfen Sie die adb-Konfiguration in den Einstellungen und versuchen Sie den adb-Server zu starten und eine Verbindung herzustellen indem Sie auf den Knopf klicken.&lt;br /&gt;
*Verbinden ...&lt;br /&gt;
*:expecco verbindet sich mit dem adb-Server. Dies kann einige Sekunden dauern.&lt;br /&gt;
*adb-Server starten ...&lt;br /&gt;
*:expecco startet den adb-Server. Dies kann einige Sekunden dauern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Bei &amp;quot;&#039;&#039;Automatisierung durch&#039;&#039;&amp;quot; können Sie angeben, welche Automation-Engine verwendet werden soll. Lassen Sie die Einstellung auf &amp;quot;&#039;&#039;(Default)&#039;&#039;&amp;quot; wird die entsprechende Capability gar nicht gesetzt. Ansonsten stehen Appium, Selendroid und ab expecco 2.11 XCUITest zur Verfügung. In der Regel wird Selendroid nur für Android-Geräte vor Version 4.1 gebraucht.--&amp;gt;Mit &amp;quot;&#039;&#039;Weiter&#039;&#039;&amp;quot; gelangen Sie zum nächsten Schritt. Wenn Sie Einstellungen für den GUI-Browser eingeben, ist das erst möglich, wenn ein Gerät ausgewählt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;UnlockingDeveloperOptions&amp;quot;&amp;gt;Anmerkung zum Freischalten&amp;lt;/span&amp;gt;: In jüngeren Android Versionen werden die Entwickleroptionen zunächst nicht mehr in den Einstellungen angeboten. Falls ihr Android Gerät in den Einstellungen keinen Eintrag zu &amp;quot;&#039;&#039;Entwickleroptionen&#039;&#039;&amp;quot; zeigt, wählen Sie zunächst den Eintrag &amp;quot;&#039;&#039;Telefoninfo&#039;&#039;&amp;quot;, dann &amp;quot;&#039;&#039;SoftwareVersionsInfo&#039;&#039;&amp;quot; und klicken darin mehrfach auf den Eintrag &amp;quot;&#039;&#039;BuildVersion&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Chromedriver verwalten ====&lt;br /&gt;
Wenn die App, die Sie bedienen wollen, WebViews mit Chrome benutzt, benötigt Appium Zugriff auf einen passenden Chromedriver. Wenn Sie ein Gerät in der Liste auswählen, können Sie über &amp;quot;&#039;&#039;Chromedriver verwalten&#039;&#039;&amp;quot; sehen, welche Chrome-Versionen auf dem Gerät vorhanden sind und welche Chromedriver-Versionen durch expecco zur Verfügung stehen. Über diesen Dialog können Sie auch benötigte Chromedriver-Versionen herunterladen. Beachten Sie, dass auf dem Gerät verschiedene Chrome-Versionen vorhanden sein können, da die Apps in ihren WebViews nicht die gleiche Chrome-Version verwenden müssen, wie die als Browser installierte. Damit alles funktioniert, sollte der verwendete Chromedriver zur entsprechenden App passen. Sie können den Pfad zum Chromedriver auch am Ende des Verbindungsdialogs in den erstellten Capabilities ändern.&lt;br /&gt;
&lt;br /&gt;
==== WLAN-Android-Geräte verbinden ====&lt;br /&gt;
Sie können sich auch über WLAN zu Android-Geräten verbinden. Dazu muss das Gerät zunächst mit adb verbunden werden, siehe [[Mobile_Testing_Plugin#Verbindung_.C3.BCber_WLAN|Verbindung über WLAN]]. Ab expecco 22.1 bietet der Verbindungseditor hierfür einen Dialog, der Ihnen dabei hilft und den Sie anstatt der Eingabeaufforderung verwenden können. Für Geräte mit Android 11 oder höher können Sie hier das Gerät mit dem Rechner zu koppeln, indem Sie die entsprechenden Parameter angeben und anschließend die Verbindung unter Angabe von IP-Adresse und Port aufbauen. Sie können damit auch für Geräte, die über USB verbunden sind, eine WLAN-Verbindung aufbauen. Wenn Sie das entsprechende Gerät in der Liste auswählen, werden die benötigten Angaben automatisch ausgelesen.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass der Aufbau einer WLAN-Verbindung nicht Teil der Verbindungseinstellungen ist. Wenn Sie mit den erzeugten Einstellungen eine neue Verbindung aufbauen wollen, müssen Sie sicherstellen, dass das Gerät über mit der angegebenen IP-Adresse und dem Port mit adb verbunden ist, damit es gefunden wird. Die ADB-Verbindung geht verloren, wenn der ADB-Server oder das Gerät neu gestartet werden. Die Erlaubnis für das WLAN-Debugging wird beim Neustart des Geräts auch häufig zurückgesetzt und der Debug-Port kann dann wechseln. Daher muss eine WLAN-Verbindung immer manuell hergestellt werden.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep2&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 2: App auswählen===&lt;br /&gt;
Hier können Sie Angaben zur App machen, die getestet werden soll. Dabei können Sie entscheiden, ob Sie eine App verwenden wollen, die bereits auf dem Gerät installiert ist, oder ob für den Test eine App installiert werden soll. Wählen Sie oben den entsprechenden Reiter aus. Je nachdem, ob Sie im vorigen Schritt ein Android- oder ein iOS-Gerät ausgewählt haben, ändert sich die erforderte Eingabe.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Android&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App auf dem Gerät&#039;&#039;&lt;br /&gt;
**:Wenn Sie im ersten Schritt ein angeschlossenes Gerät ausgewählt haben, werden die Pakete aller installierten Apps automatisch abgerufen und Sie können die Auswahl aus den Drop-down-Listen treffen. Die installierten Apps sind in Fremdpakete und Systempakete unterteilt; wählen Sie die entsprechende Paketliste aus. Diese Auswahl gehört nicht zu den Einstellungen, sondern stellt nur die entsprechende Paketliste zur Verfügung. Sie können den Filter benutzen, um die Liste weiter einzuschränken und dann das gewünschte Paket auswählen. Die Activities des ausgwählten Pakets werden ebenfalls automatisch abgerufen und als Drop-down-Liste zur Verfügung gestellt. Wählen Sie die Activity aus, die gestartet werden soll. In der Regel wird automatisch eine Activity aus der Liste eingetragen. Falls Sie kein verbundenes Gerät verwenden, müssen Sie die Eingabe des Pakets und der Activity von Hand vornehmen.&lt;br /&gt;
**&#039;&#039;App installieren&#039;&#039;&lt;br /&gt;
**:Geben Sie bei &amp;quot;&#039;&#039;App&#039;&#039;&amp;quot; den Pfad zu einer App an. Der Pfad muss für den Appium-Server gültig sein, der verwendet wird. Sie können auch eine URL angeben. Benutzen Sie einen lokalen Appium-Server, können Sie den rechten Butten benutzen, um zu der Installationsdatei der App zu navigieren und diesen Pfad einzutragen. Wenn möglich werden dabei auch das entsprechende Paket und die Activity in den Feldern darunter eingetragen. Diese Angabe ist aber nicht notwendig.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;iOS&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App auf dem Gerät&#039;&#039;&lt;br /&gt;
**:Geben Sie die Bundle-ID einer installierten App an. Sie können die IDs der installierten Apps bspw. mithilfe von Xcode erfahren. Starten Sie dazu Xcode und wählen Sie in der Menüleiste am oberen Bildschirmrand im Menü &amp;quot;&#039;&#039;Window&#039;&#039;&amp;quot; den Eintrag &amp;quot;&#039;&#039;Devices&#039;&#039;&amp;quot;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wenn Sie Ihr Gerät auswählen, sehen Sie in der Übersicht eine Auflistung der von Ihnen installierten Apps.&lt;br /&gt;
**&#039;&#039;App installieren&#039;&#039;&lt;br /&gt;
**:Geben Sie bei &amp;quot;&#039;&#039;App&#039;&#039;&amp;quot; den Pfad zu einer App an. Der Pfad muss für den Appium-Server gültig sein, der verwendet wird. Sie können auch eine URL angeben. Zu den Vorraussetzungen an Apps für reale Geräte lesen Sie bitte den Abschnitt [[#iOS-Ger.C3.A4t_und_App_vorbereiten|iOS-Geräte und App vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
Im unteren Teil können Sie festlegen, ob die App beim Verbindungsabbau zurückgesetzt bzw. deinstalliert werden soll, und ob sie initial zurückgesetzt werden soll. Auch hier wird die entsprechende Capability gar nicht gesetzt, wenn Sie &amp;quot;&#039;&#039;(Default)&#039;&#039;&amp;quot; auswählen. Mit &amp;quot;&#039;&#039;Weiter&#039;&#039;&amp;quot; gelangen Sie zum nächsten Schritt.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep3&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 3: Servereinstellungen===&lt;br /&gt;
Im letzten Schritt befindet sich zunächst im oberen Teil eine Liste aller Capabilities, die sich aus Ihren Angaben der vorigen Schritte ergeben. Wenn Sie sich mit Appium auskennen und noch zusätzliche Capabilities setzen möchten, die der Verbindungseditor nicht abdeckt, können Sie durch Klicken auf &amp;quot;&#039;&#039;Bearbeiten&#039;&#039;&amp;quot; in die erweiterte Ansicht gelangen. Lesen Sie dazu den Abschnitt weiter unten.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Einstellungen für den GUI-Browser eingeben, können Sie den &#039;&#039;Verbindungsnamen&#039;&#039; eintragen, mit dem die Verbindung angezeigt wird. Dies ist auch der Name unter dem Bausteine diese Verbindung verwenden können, wenn sie aufgebaut ist. Wenn Sie das Feld frei lassen, wird ein Name generiert. Wenn der Haken für &amp;quot;&#039;&#039;Von expecco gesteuert&#039;&#039;&amp;quot; gesetzt ist, wird expecco einen lokalen Appium-Server an einem freien Port starten, oder einen bereits gestarteten freien Server verwenden. Um einen eigenen Server zu verwenden, schalten Sie diese Funktion ab und geben Sie die entsprechende Adresse ein. Sie erhalten die lokale Standard-Adresse und bereits verwendete Adressen zur Auswahl.&lt;br /&gt;
&lt;br /&gt;
In älteren expecco-Versionen ist der Haken mit &amp;quot;&#039;&#039;Bei Bedarf starten&#039;&#039;&amp;quot; beschriftet. In diesem Fall müssen Sie auch eine Adresse angeben, wenn expecco den Server starten soll. expecco versucht dann beim Verbinden einen Appium-Server an der angegebenen Adresse zu starten, wenn dort noch keiner läuft. Dieser Server wird dann beim Beenden der Verbindung ebenfalls heruntergefahren. Dies funktioniert nur für lokale Adressen. Achten Sie darauf, nur Portnummern zu verwenden, die auch frei sind. Verwenden Sie am besten nur ungerade Portnummern ab dem Standardport 4723. Beim Verbindungsaufbau wird ebenfalls die folgende Portnummer verwendet, wodurch es sonst zu Konflikten kommen könnte. &lt;br /&gt;
&lt;br /&gt;
Je nachdem, wie Sie den Dialog geöffnet haben, gibt es nun verschiedene Schaltflächen um ihn abzuschließen. In jedem Fall haben Sie die Option zu speichern. Dabei öffnet sich ein Dialog, indem Sie entweder ein geöffnet Projekt auswählen können, um die Einstellungen dort als Anhang zu speichern, oder auswählen es in einer Datei zu speichern, die Sie anschließend angeben können. Durch das Speichern wird der Dialog nicht beendet, wodurch Sie anschließend noch eine andere Option auswählen könnten.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie den Editor zum Verbindungsaufbau geöffnet haben, können Sie abschließend auf &amp;quot;&#039;&#039;Verbinden&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;Server starten und verbinden&#039;&#039;&amp;quot; klicken, je nachdem, ob der Haken für den Serverstart gesetzt ist. Für das Ändern oder Kopieren einer Verbindung im GUI-Brower heißt diese Option &amp;quot;&#039;&#039;Übernehmen&#039;&#039;&amp;quot;, da in diesem Fall nur der Verbindungseintrag geändert bzw. neu angelegt wird, der Verbindungsaufbau aber nicht gestartet wird. Das können Sie bei Bedarf anschließend über das Kontextmenü tun. Falls Sie Capabilities einer bestehenden Verbindung geändert haben, fordert Sie anschließend ein Dialog auf zu entscheiden, ob diese Änderungen direkt übernommen werden sollen, indem die Verbindung abgebaut und mit den neuen Verbindungen aufgebaut wird, oder nicht. In diesem Fall werden die Änderungen erst wirksam, nachdem Sie die Verbindung neu aufbauen.&lt;br /&gt;
&lt;br /&gt;
Zur Verwendung des Verbindungseditors lesen Sie auch den entsprechenden Abschnitt im jeweiligen Tutorial in Schritt 1 (Android: [[Mobile_Testing_Tutorial#Schritt_1:_Demo_ausf.C3.BChren|Demo ausführen]], iOS: [[Mobile_Testing_Tutorial#Schritt_1:_Demo_ausf.C3.BChren_.28iOS.29|Demo ausführen (iOS)]]).&lt;br /&gt;
&lt;br /&gt;
===Erweiterte Ansicht===&lt;br /&gt;
Die erweiterte Ansicht des Verbindungseditors erhalten Sie entweder durch Klicken auf &amp;quot;&#039;&#039;Bearbeiten&#039;&#039;&amp;quot; im dritten Schritt oder jederzeit über den entsprechenden Menüeintrag, wenn Sie den Editor über das Plugin-Menü gestartet haben. In dieser Ansicht erhalten Sie eine Liste aller eingestellten Appium-Capabilities. Zu dieser können Sie weitere hinzufügen, Einträge ändern oder entfernen. Um eine Capability hinzuzufügen, wählen Sie diese aus der Drop-down-Liste des Eingabefelds aus. In dieser befinden sich alle bekannten Capabilities sortiert in die Kategorien &#039;&#039;Common&#039;&#039;, &#039;&#039;Android&#039;&#039; und &#039;&#039;iOS&#039;&#039;. Haben Sie eine Capability ausgewählt, wird ein kurzer Informationstext dazu angezeigt. Sie können in das Feld auch von Hand eine Capability eingeben. Klicken Sie dann auf &amp;quot;&#039;&#039;Hinzufügen&#039;&#039;&amp;quot;, um die Capabilitiy in die Liste einzutragen. Dort können Sie in der rechten Spalte den Wert setzen. Um einen Entrag zu löschen, wählen Sie diesen aus und klicken Sie auf &amp;quot;&#039;&#039;Entfernen&#039;&#039;&amp;quot;. Mit &amp;quot;&#039;&#039;Zurück&#039;&#039;&amp;quot; verlassen Sie die erweiterte Ansicht.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingErweiterteAnsicht.png]]&lt;br /&gt;
&lt;br /&gt;
== Laufende Appium-Server ==&lt;br /&gt;
Im Menü des Mobile Testing Plugins finden Sie den Eintrag &amp;quot;&#039;&#039;Appium-Server...&#039;&#039;&amp;quot;. Mit diesem öffnen Sie ein Fenster mit einer Übersicht aller Appium-Server, die von expecco gestartet wurden und auf welchem Port diese laufen. Durch Klicken auf das Icon in der Spalte &amp;quot;&#039;&#039;Log anzeigen&#039;&#039;&amp;quot; können Sie das Logfile des entsprechenden Servers anschauen. Dieses wird beim Beenden des Servers wieder gelöscht. Mit den Icons in der Spalte &amp;quot;&#039;&#039;Beenden&#039;&#039;&amp;quot; kann der entsprechenden Server beendet werden. Allerdings wird dies verhindert, wenn expecco über diesen Server noch eine offene Verbindung hat. Für welche Verbindung ein Server verwendet wird, sehen Sie in der rechten Spalte. Steht dort &#039;&#039;&amp;lt;idle&amp;gt;&#039;&#039; wird er zur Zeit nicht von expecco verwendet.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAppiumServer.png]]&lt;br /&gt;
&lt;br /&gt;
Beim Öffnen des Editors um eine Appium-Verbindung aufzubauen, wird direkt ein Appium-Server gestartet, um den folgenden Verbindungsaufbau zu beschleunigen. Zu diesem Zweck hält sich expecco auch immer einen freien Appium-Server offen. Weitere laufende Server, die nicht mehr verwendet werden, werden jedoch nach einiger Zeit automatisch beendet.&lt;br /&gt;
&lt;br /&gt;
Im Menü des Mobile Testing Plugins finden Sie auch den Eintrag &amp;quot;&#039;&#039;Alle Verbindungen und Server beenden&#039;&#039;&amp;quot;. Dies ist für den Fall gedacht, dass Verbindungen oder Server auf andere Weise nicht beendet werden können. Beenden Sie Verbindungen wenn möglich immer im GUI-Browser oder durch Ausführen eines entsprechenden Bausteins. Server, die Sie in der Server-Übersicht gestartet haben, beenden Sie dort; Server, die mit einer Verbindung gestartet wurden, werden automatisch mit dieser beendet.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass in der Übersicht nur Server aufgelistet sind, die von expecco gestartet und verwaltet werden. Mögliche andere Appium-Server, die auf andere Art gestartet wurden, werden nicht erkannt.&lt;br /&gt;
&lt;br /&gt;
== Recorder ==&lt;br /&gt;
Besteht im GUI-Browser eine Verbindung zu einem Gerät, kann der integrierte Recorder verwendet werden, um mit diesem Gerät einen Testabschnitt aufzunehmen. Sie starten den Recorder, indem Sie im GUI-Browser die entsprechende Verbindung auswählen und dann auf den Aufnahme-Knopf klicken. Für den Recorder öffnet sich ein neues Fenster. Die aufgezeichneten Aktionen werden im Arbeitsbereich des GUI-Browsers angelegt. Daher ist es möglich, das Aufgenommene parallel zu editieren.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingRecorder.png|caption|]]&lt;br /&gt;
&lt;br /&gt;
====Komponenten des Recorderfensters====&lt;br /&gt;
#&#039;&#039;&#039;Aufnahme fortsetzen/pausieren&#039;&#039;&#039;: Über das rechte Symbol können Sie die Aufnahme pausieren. Sie sehen dann ein großes Pause-Symbol in der Anzeige. Alle Aktionen, die Sie währenddessen im Recorder machen werden zwar ausgeführt, es werden aber keine Bausteine aufgezeichnet. Über das linke Symbol können Sie dann wieder in den normalen Aufnahmemodus wechseln.&lt;br /&gt;
#&#039;&#039;&#039;Aufnahme stoppen&#039;&#039;&#039;: Stoppt die Aufnahme und schließt das Recorderfenster.&lt;br /&gt;
#&#039;&#039;&#039;Aktualisieren&#039;&#039;&#039;: Holt das aktuelle Bild und den aktuellen Elementbaum vom Gerät. Dies wird nötig, wenn das Gerät zur Ausführung einer Aktion länger braucht oder sich etwas ohne das Anstoßen durch den Recorder ändert. Seit expecco 21.2 gibt es hier zusätzlich ein Untermenü, mit dem automatisches Aktualisieren angeschaltet werden kann, indem im Hintergrund auf Änderungen geprüft wird (siehe auch &#039;&#039;Automatisches Aktualisieren&#039;&#039; weiter unten).&lt;br /&gt;
#&#039;&#039;&#039;Follow-Mouse&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird im GUI-Browser ausgewählt.&lt;br /&gt;
#&#039;&#039;&#039;Element-Highlighting&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird rot umrandet.&lt;br /&gt;
#&#039;&#039;&#039;Elemente einzeichnen&#039;&#039;&#039;: Die Rahmen aller Elemente der Ansicht werden angezeigt.&lt;br /&gt;
#&#039;&#039;&#039;Werkzeuge&#039;&#039;&#039;: Auswahl, mit welchem Werkzeug aufgenommen werden soll. Die gewählte Aktion wird bei einem Klick auf die Anzeige ausgelöst. Dabei stehen folgende Aktionen zur Verfügung:&lt;br /&gt;
#*Aktionen auf Elemente:&lt;br /&gt;
#**Klicken: Kurzer Klick auf das Element, über dem der Cursor steht. Zur genaueren Bestimmung, welches Element verwendet wird, benutzen Sie die Funktion Follow-Mouse oder Element-Highlighting.&lt;br /&gt;
#**Antippen mit Dauer (Element): Ähnlich zum Klicken, nur dass zusätzlich die Dauer des Klicks aufgezeichnet wird. Dadurch sind auch längere Klicks möglich.&lt;br /&gt;
#**Antippen mit Position (Element): Ähnlich zum Klicken, aber zusätzlich wird die Position innerhalb des Elements aufgenommen. Die Position kann relativ zur Größe des Elements aufgenommen werden oder, wenn Sie dabei Strg gedrückt halten, absolut zur linken oberen Ecke des Elements.&lt;br /&gt;
#**Text setzen: Ermöglicht das Setzen eines Textes in Eingabefelder.&lt;br /&gt;
#**Text löschen: Löscht den Text eines Eingabefelds.&lt;br /&gt;
#*Aktionen auf das Gerät:&lt;br /&gt;
#**Antippen (Bildschirm): Löst einen Klick auf die Bildschirmposition aus.&lt;br /&gt;
#**Antippen mit Dauer (Bildschirm): Löst einen Klick auf die Bildschirmposition aus, bei dem auch die Dauer berücksichtigt wird.&lt;br /&gt;
#**Wischen: Wischen in einer geraden Linie vom Punkt des Drückens des Mausknopfes bis zum Loslassen. Die Dauer wird ebenfalls aufgezeichnet.&lt;br /&gt;
#:Beachten Sie bei diesen Aktionen, dass das Ergebnis sich auf verschiedenen Geräten unterscheiden kann, bspw. bei verschiedenen Bildschirmauflösungen.&lt;br /&gt;
#*Erstellen von Testablauf-Bausteinen&lt;br /&gt;
#**Attribut prüfen: Vergleicht den Wert eines festgelegten Attributs des Elements mit einem vorgegebenen Wert. Das Ergebnis triggert den entsprechenden Ausgang.&lt;br /&gt;
#**Attribut zusichern: Vergleicht den Wert eines festgelegten Attributs des Elements mit einem vorgegebenen Wert. Bei Ungleichheit schlägt der Test fehl.&lt;br /&gt;
#**Attribut holen: Liest den aktuellen Wert eines Attributs aus.&lt;br /&gt;
#*Automatisch&lt;br /&gt;
#:Ist das Auto-Werkzeug ausgewählt, können alle Aktionen durch spezifische Eingabeweise benutzt werden: &#039;&#039;Klicken&#039;&#039;, &#039;&#039;Element antippen&#039;&#039; und &#039;&#039;Wischen&#039;&#039; funktionieren weiterhin durch Klicken, wobei sie anhand der Dauer und der Bewegung des Cursors unterschieden werden. Um ein &#039;&#039;Antippen&#039;&#039; auszulösen, halten Sie beim Klicken Strg gedrückt. Die übrigen Aktionen erhalten Sie durch einen Rechtsklick auf das Element in einem Kontextmenü.&lt;br /&gt;
#&#039;&#039;&#039;Kontext-Aktionen&#039;&#039;&#039;: Hier können Sie Aktionen aufzeichnen, die Kontexte betreffen:&lt;br /&gt;
#*Zu Kontext wechseln: Bietet eine Liste der aktuell verfügbaren Kontexte und Sie können auswählen, zu welchem gewechselt werden soll.&lt;br /&gt;
#*Aktuellen Kontext holen: Holt den Handle des aktuellen Kontexts.&lt;br /&gt;
#*Kontext-Handles holen: Holt eine Liste aller aktuell verfügbaren Kontext-Handles.&lt;br /&gt;
#&#039;&#039;&#039;Softkeys&#039;&#039;&#039;: Nur unter Android. Simuliert das Drücken der Knöpfe Zurück, Home, Fensterliste und Power.&lt;br /&gt;
#&#039;&#039;&#039;Home-Button&#039;&#039;&#039;: Nur unter iOS ab expecco 2.11. Ermöglicht das Drücken des Home-Buttons. Vor expecco 19.2 funktioniert es nur, wenn AssistiveTouch aktiviert ist und sich das Menü in der Mitte des oberen Bildschirmrands befindet. Ab expecco 19.2 verwendet die Funktion kein AssistiveTouch mehr.&lt;br /&gt;
#&#039;&#039;&#039;Hilfe&#039;&#039;&#039;: Öffnet diese Online-Dokumentation auf der allgemeinen Seite zu [[GuiBrowser_Recorder|GUI-Browser Recordern]].&lt;br /&gt;
#&#039;&#039;&#039;Anzeige&#039;&#039;&#039;: Zeigt einen Screenshot des Geräts. Aktionen werden mit der Maus je nach Werkzeug ausgelöst. Wenn eine neue Aktion eingegeben werden kann, hat das Fenster einen grünen Rahmen, sonst ist er rot.&lt;br /&gt;
#&#039;&#039;&#039;Fenster an Bild anpassen&#039;&#039;&#039;: Ändert die Größe des Fensters so, dass der Screenshot vollständig angezeigt werden kann.&lt;br /&gt;
#&#039;&#039;&#039;Bild an Fenster anpassen&#039;&#039;&#039;: Skaliert den Screenshot auf eine Größe, mit der er die volle Größe des Fensters ausnutzt.&lt;br /&gt;
#&#039;&#039;&#039;Ansicht anpassen&#039;&#039;&#039;: Öffnet einen Dialog um die Ansicht anzupassen, falls expecco das Bild nicht richtig darstellt. Sie können die Skalierung anpassen oder das Bild um 90° drehen.&lt;br /&gt;
#&#039;&#039;&#039;Ausrichtung anpassen&#039;&#039;&#039;: Korrigiert das Bild, falls dieses auf dem Kopf stehen sollte. Über den Pfeil rechts daneben kann das Bild auch um 90° gedreht werden, falls dies einmal nötig sein sollte. Ab expecco 19.1 finden Sie diese Funktion in &#039;&#039;Ansicht anpassen&#039;&#039;. Die Ausrichtung des Bildes ist für die Funktion des Recorders unerheblich, dieser arbeitet ausschließlich auf den erhaltenen Elementen.&lt;br /&gt;
#&#039;&#039;&#039;Skalierung&#039;&#039;&#039;: Ändert die Skalierung des Screenshots.&lt;br /&gt;
#&#039;&#039;&#039;Meldungen&#039;&#039;&#039;: Zeigt den Pfad des ausgewählten Elements oder andere Meldungen an. Es gibt ein Kontextmenü, um eine Liste der vorigen Meldungen zu sehen.&lt;br /&gt;
&lt;br /&gt;
====Verwendung====&lt;br /&gt;
Mit jedem Klick im Fenster wird eine Aktion ausgelöst und im Arbeitsbereich des GUI-Browsers aufgezeichnet. Dort können Sie das Aufgenommene abspielen, editieren oder daraus einen neuen Baustein erstellen.&lt;br /&gt;
Aktionen zum Auslösen von Sofkeys finden Sie direkt in der Menüleiste (s.o.). Um Aktionen auf Elemente aufzuzeichen, ändern Sie entweder die Auswahl des Werkzeugs in der Menüleiste (s.o.) und klicken dann auf das Element oder wählen Sie die entsprechende Aktion aus dem Kontextmenü durch einen Rechtsklick auf das entsprechende Element aus. Für Texteingabe ist es zudem möglich, den Cursor über dem Element zu platzieren und den Text einzugeben. Dabei öffnet sich der Eingabedialog für diese Aktion.&lt;br /&gt;
Zur Verwendung des Recorders lesen Sie auch Schritt 2 im Tutorial ([[Mobile_Testing_Tutorial#Schritt_2:_Einen_Baustein_mit_dem_Recorder_erstellen|Android]] bzw. [[Mobile_Testing_Tutorial#Schritt_2:_Einen_Baustein_mit_dem_Recorder_erstellen_.28iOS.29|iOS]]).&lt;br /&gt;
&lt;br /&gt;
====Elemente verbergen====&lt;br /&gt;
Ab expecco 21.2 gibt es im Kontextmenü außerdem die Möglichkeit, das ausgewählte Element im Recorder zu verbergen. Das bedeutet, dass dieses Element fortan nicht mehr ausgewählt werden kann. Diese Funktion eignet sich dazu, Elemente zu ignorieren, die im Vordergrund liegen, um auf Elemente darunter zugreifen zu können. Um diesen Zustand wieder rückgängig zu machen, müssen Sie das entsprechende Element im Baum des GUI-Browsers finden, dort gibt es im Kontextmenü ebenfalls einen solchen Eintrag.&lt;br /&gt;
&lt;br /&gt;
====Automatisches Aktualisieren====&lt;br /&gt;
Der Recorder zeigt kein Livebild des Geräts sondern nur eine Momentaufnahme. Um mit der Anzeige auf dem Gerät übereinzustimmen muss daher nach Änderungen aktualisiert werden. Der Recorder aktualisiert sich automatisch, nachdem er eine Aktion ausgeführt hat. Ab expecco 20.2 sind zudem weitere automatische Updates möglich. Sie können Sie im Menü &#039;&#039;Fenster&#039;&#039; aktivieren.&lt;br /&gt;
&lt;br /&gt;
Zum einen kann kurze Zeit nach dem Ausführen einer Aktion überprüft werden, ob es noch Änderungen nach der ersten Aktualisierung gegeben hat, damit in diesem Fall eine zweite Aktualisierung stattfinden kann. Dies soll das Problem beheben, dass der Recorder nach einer Aktion nicht aktuell ist, weil die Aktualisierung zu früh stattgefunden hat.&lt;br /&gt;
&lt;br /&gt;
Zum anderen kann eine periodische Aktualisierung eingeschaltet werden. Nach einem einstellbaren Interval wird der Recorder automatisch aktualisiert, sollte es Änderungen geben. Dadurch ist die Anzeige im Recorder immer weitgehend aktuell, allerdings entsteht dadurch auch ein Mehraufwand was die Kommunikation mit dem Gerät betrifft.&lt;br /&gt;
&lt;br /&gt;
== AVD Manager und SDK Manager ==&lt;br /&gt;
AVD Manager und SDK Manager sind beides Anwendungen von Android. Im Menü des Mobile Testing Plugins bietet expecco die Möglichkeit, diese zu starten. Ansonsten finden Sie diese Programme bei Ihrer Android-Installation. Mit dem AVD Manager können Sie AVDs, also Konfigurationen für Emulatoren, erstellen, bearbeiten und starten. Mit dem SDK Manager erhalten Sie einen Überblick über Ihre Android-Installation und können diese bei Bedarf erweitern.&lt;br /&gt;
&lt;br /&gt;
= Hybrid-Apps und WebViews =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;!!! WICHTIGER HINWEIS - Wenn Sie Probleme haben, auf den Webview zu wechseln, geben Sie bitte unter den Android Einstellungen - Apps -Standard Apps &amp;quot;Chrome&amp;quot; als &amp;quot;Browser-App&amp;quot; an !!!&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hybrid-Apps enthalten neben den Plattform-nativen Elementen weitere Elemente, die in einen WebView eingebunden sind. Diese Elemente können ebenfalls bedient werden, allerdings muss zuvor in den entsprechenden Kontext gewechselt werden. Mit dem Baustein &amp;quot;&#039;&#039;Get Current Context&#039;&#039;&amp;quot; erhalten Sie den aktuellen Kontext. Zu Beginn ist dies &amp;quot;&#039;&#039;NATIVE_APP&#039;&#039;&amp;quot;, also der Kontext der nativen Elemente. Mit dem Baustein &amp;quot;&#039;&#039;Get Context Handles&#039;&#039;&amp;quot; bekommen Sie eine Collection aller vorhandenen Kontexte. Gibt es einen WebView-Kontext, so heißt dieser &amp;quot;&#039;&#039;WEBVIEW_1&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;WEBVIEW_&amp;lt;package&amp;gt;&#039;&#039;&amp;quot; mit dem Paket des WebViews. Es kann auch mehrere WebView-Kontexte geben. Zu jedem WebView-Kontext gibt es im nativen Kontext ein entsprechendes WebView-Element. Mit dem Baustein &amp;quot;&#039;&#039;Switch to Context&#039;&#039;&amp;quot; können Sie in einen solchen Kontext wechseln und haben fortan nur Zugriff auf die Elemente in diesem Kontext.&lt;br /&gt;
&lt;br /&gt;
Im GUI-Browser werden zum einen oben im Baum die vorhandenen Kontexte angezeigt, zum anderen wird der Baum eines Kontexts unterhalb des entsprechenden WebView-Elements eingefügt.&lt;br /&gt;
&lt;br /&gt;
= XPath anpassen mithilfe des GUI-Browsers =&lt;br /&gt;
Bausteine, die auf einem Gerät fehlerfrei funktionieren, tun dies auf anderen Geräten möglicherweise nicht. Auch können kleine Änderungen der App dazu führen, dass ein Baustein nicht mehr den gewünschten Effekt hat. Man sollte einen Baustein daher so robust formulieren, dass er für eine Vielzahl von Geräten verwendet werden kann und kleine Anpassungen an der App verkraftet. Dazu muss man das grundlegende Funktionsprinzip der Adressierung verstehen. Dies wird im Folgenden am Beispiel der App aus dem Tutorial erläutert.&lt;br /&gt;
&lt;br /&gt;
Die Ansicht der App setzt sich aus einzelnen Elementen zusammen. Dazu gehören die Schaltflächen &amp;quot;&#039;&#039;GTIN-13 (EAN-13)&#039;&#039;&amp;quot; und &amp;quot;&#039;&#039;Verify&#039;&#039;&amp;quot;, das Eingabefeld der Zahl &amp;quot;&#039;&#039;4006381333986&#039;&#039;&amp;quot; und das Ergebnisfeld, in dem OK erscheint, wie auch alle anderen auf der Anzeige sichtbaren Dinge. Diese sichtbaren Elemente sind in unsichtbare Strukturelemente eingebettet. Alle Elemente zusammen sind in einer zusammenhängenden Hierarchie, dem Elementbaum, organisiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingGUIBrowser.png | frame | left | Abb. 1: Funktionen des GUI-Browsers]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
Sie können sich diesen Baum im GUI-Browser ansehen. Wechseln Sie dazu in den GUI-Browser (Abb. 1) und starten Sie eine beliebige Verbindung. Sobald die Verbindung aufgebaut ist, können Sie den gesamten Baum aufklappen (1) (Klick bei gedrückter Strg-Taste). Er enthält alle Elemente der aktuellen Seite der App.&lt;br /&gt;
&lt;br /&gt;
Ein Baustein, der nun ein bestimmtes Element verwendet, muss dieses eindeutig angeben, indem er dessen Position im Elementbaum mit einem Pfad im XPath-Format beschreibt. Dieses Format ist ein verbreiteter Web-Standard für XML-Dokumente und -Datenbanken, eignet sich aber genauso für Pfade im Elementbaum.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie ein Element im Baum auswählen, wird unten der von expecco automatisch generierte XPath (2) für das Element angezeigt, der auch beim Aufzeichnen verwendet wird. Oberhalb davon in der Mitte des Fensters befindet sich eine Liste der Eigenschaften (3) des ausgewählten Elements. Man nennt diese Eigenschaften auch Attribute. Sie beschreiben das Element näher wie beispielsweise seinen Typ, seinen Text oder andere Informationen zu seinem Zustand. Links unten können Sie zur besseren Orientierung im Baum die &#039;&#039;Vorschau&#039;&#039; (4) aktivieren, um sich den Bildausschnitt des Elements anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Der Elementbaum für gleiche Ansicht einer App kann sich je nach Gerät unterscheiden. Es sind diese Unterschiede, die verhindern, eine Aufnahme von einem Gerät unverändert auch auf allen anderen Geräten abzuspielen: Ein XPath, der im einen Elementbaum ein bestimmtes Element identifiziert, beschreibt nicht unbedingt das gleiche Element im Elementbaum auf einem anderen Gerät. Es kann stattdessen passieren, dass der XPath auf kein Element, auf ein falsches Element oder auf mehrere Elemente passt. Dann schlägt der Test fehl oder er verhält sich unerwartet.&lt;br /&gt;
&lt;br /&gt;
Man könnte natürlich für jedes Gerät einen eigenen Testfall schreiben. Das brächte aber unverhältnismäßigen Aufwand bei Testerstellung und -wartung mit sich. Das Problem lässt sich auch anders lösen, da ein jeweiliges Element nicht nur durch genau einen XPath beschrieben wird. Vielmehr erlaubt der Standard mithilfe verschiedener Merkmale unterschiedliche Beschreibungen für ein und dasselbe Element zu formulieren. Das Ziel ist daher, einen Pfad zu finden, der auf allen für den Test verwendeten Geräten funktioniert und überall eindeutig zum richtigen Element führt.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel besteht die Verbindung zur Android-App aus dem Tutorial und der Eintrag des &amp;quot;&#039;&#039;GTIN-13&#039;&#039;&amp;quot;-Buttons ist ausgewählt (5). Dessen automatisch generierter XPath (2) kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[@resource id=&#039;android:id/content&#039;]/android.widget.RelativeLayout/android.widget.Button[@resource-id=&#039;de.exept.expeccomobiledemo:id/gtin_13&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Er ist offensichtlich lang und unübersichtlich. Der sehr viel kürzere Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@text=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
führt zum selben Element.&lt;br /&gt;
&lt;br /&gt;
Für die iOS-App lautet der automatisch generierte XPath für diesen Button beispielsweise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/XCUIElementTypeApplication/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/UIAApplication/UIAWindow[1]/UIAButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und kann kürzer als&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@name=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Sie können den Pfad entsprechend im GUI-Browser ändern und durch &amp;quot;&#039;&#039;Pfad überprüfen&#039;&#039;&amp;quot; (6) feststellen, ob er weiterhin auf das ausgewählte Element zeigt, was expecco mit &amp;quot;&#039;&#039;Verify Path: OK&#039;&#039;&amp;quot; (7) bestätigen sollte. Der erste, sehr viel längere Pfad, beschreibt den gesamten Weg vom obersten Element des Baumes bis hin zum gesuchten Button. Der zweite Pfad hingegen wählt mit &amp;quot;*&amp;quot; zunächst sämtliche Elemente des Baumes und schränkt die Auswahl dann auf genau die Elemente ein, die ein &#039;&#039;text&#039;&#039;- bzw. &#039;&#039;name&#039;&#039;-Attribut mit dem Wert &amp;quot;&#039;&#039;GTIN-13 (EAN-13)&#039;&#039;&amp;quot; besitzen, in unserem Fall also genau der eine Button, den wir suchen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden Android-ähnliche Pfade zur Veranschaulichung verwendet. Die Elemente in iOS-Apps heißen zwar anders, wodurch andere Pfade entstehen; das Prinzip ist jedoch das gleiche.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum1.png | frame | Abb. 2: Elementbaum einer fiktiven App]]&lt;br /&gt;
&lt;br /&gt;
Sie können solche Pfade mit Hilfe weniger Regeln selbst formulieren. Sehen Sie sich den einfachen Baum einer fiktiven Android-App in Abb. 2 an: Die Einrückungen innerhalb des Baumes geben die Hierarchie der Elemente wieder. Ein Element ist ein &#039;&#039;Kind&#039;&#039; eines anderen Elementes, wenn jenes andere Element das nächsthöhere Element mit einem um eins geringeren Einzug ist. Jenes Element ist das &#039;&#039;Elternelement&#039;&#039; des Kindes. Sind mehrere untereinander stehende Elemente gleich eingerückt, so sind sie also alle Kinder desselben Elternelements.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad durch alle Ebenen der Hierarchie zum TextView-Element ist nun:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Elemente sind mit Schrägstrichen voneinander getrennt. Es fällt auf, dass der Name des ersten Elements nicht mit dem im Baum übereinstimmt. Das oberste Element in der Hierarchie heißt immer &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot; (für iOS wäre es &amp;quot;&#039;&#039;AppiumAUT&#039;&#039;&amp;quot;), expecco zeigt im Baum stattdessen den Namen der Verbindung an, damit man mehrere Verbindungen voneinander unterscheiden kann. Die weiteren Elemente tragen jeweils das Präfix &amp;quot;&#039;&#039;android.widget.&#039;&#039;&amp;quot;, das im Baum zur besseren Übersicht nicht angezeigt wird. Bei IOS gibt es kein Präfix, das durch einen Punkt abgetrennt wäre, expecco 2.11 blendet aber entsprechend &amp;quot;&#039;&#039;XCUIElementType&#039;&#039;&amp;quot; am Anfang aus. Mit jedem Schrägstrich führt der Pfad über eine Eltern-Kind-Beziehung in eine tiefere Hierarchie-Ebene, d. h. &amp;quot;&#039;&#039;FrameLayout&#039;&#039;&amp;quot; ist ein Kindelement von &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot;, &amp;quot;&#039;&#039;LinearLayout&#039;&#039;&amp;quot; ist ein Kind von &amp;quot;&#039;&#039;FrameLayout&#039;&#039;&amp;quot; usw. Die in eckigen Klammern geschriebenen Wörter dienen nur als Orientierungshilfe im Baum. Sie gehören nicht zum Typ.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad muss nicht beim Element &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot; beginnen. Man kann den Pfad beginnend mit einem beliebigen Element des Baumes bilden. Man kann also verkürzt auch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
schreiben. Der Pfad führt zum selben &amp;quot;&#039;&#039;TextView&#039;&#039;&amp;quot;-Element, da es nur ein Element dieses Typs gibt. Anders verhält es sich bei dem Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da es zwei Elemente vom Typ &amp;quot;&#039;&#039;Button&#039;&#039;&amp;quot; gibt, passt dieser Pfad auf zwei Elemente, nämlich den Button, der mit &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; markiert ist, und den &#039;&#039;Button&#039;&#039;, der mit &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; markiert ist. Es würde an dieser Stelle aber auch nicht helfen den langen Pfad von &#039;&#039;hierarchy&#039;&#039; aus beginnend anzugeben. Um einen mehrdeutigen Pfad weiter zu differenzieren, kann man explizit ein Element aus einer Menge wählen, indem man den numerischen Index in eckigen Klammern dahinter schreibt. Der Pfad aus dem obigen Beispiel lässt sich damit so anpassen, dass er eindeutig auf den &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; weist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[1].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ihnen fällt sicher auf, dass der Index eine 1 ist obwohl das zweite Element gemeint ist. Das kommt daher, dass die Zählung bei 0 beginnt. Der Button mit der Markierung &amp;quot;An&amp;quot; hat also die Nummer 0 und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Nummer 1.&lt;br /&gt;
&lt;br /&gt;
Dieser Ansatz, einen expliziten Index zu verwenden, hat zwei Nachteile: Zum einen lässt sich an dem Pfad nur schwer ablesen welches Element gemeint ist, zum andern ist der Pfad sehr empfindlich schon gegenüber kleinsten Änderungen, wie zum Beispiel dem Vertauschen der beiden &#039;&#039;Button&#039;&#039;-Elemente oder dem Einfügen eines weiteren &#039;&#039;Button&#039;&#039;-Elements in der App.&lt;br /&gt;
&lt;br /&gt;
Es wäre daher wünschenswert, das gemeinte Element über eine ihm charakteristische Eigenschaft wie einen Attributwert, zu adressieren. Für Android-Apps eignet sich hierfür häufig das Attribut &amp;quot;&#039;&#039;resource-id&#039;&#039;&amp;quot;. Im Idealfall muss bei der Entwicklung der App darauf geachtet werden, dass jedes Element eine eindeutige Id erhält. Die &#039;&#039;resource-id&#039;&#039; hat den großen Vorteil, dass sie unabhängig vom Text des Elements oder der Spracheinstellung des Geräts ist. Für iOS-Apps kann entsprechend das Attribut &amp;quot;&#039;&#039;name&#039;&#039;&amp;quot; verwendet werden, wenn es von der App sinnvoll gesetzt wird. Der XPath-Standard erlaubt solche Auswahlbedingungen zu einem Element anzugeben. Angenommen, der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Eigenschaft &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;off&#039;&#039; und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; hat als &#039;&#039;resource-id&#039;&#039; den Wert &#039;&#039;on&#039;&#039;, dann kann man als eindeutigen Pfad für den &amp;quot;Aus&amp;quot;-&#039;&#039;Button&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[@resource-id=&#039;off&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
formulieren. Wie an dem Beispiel zu sehen werden solche Bedingungen wie ein Index in eckigen Klammern an den Elementtyp angehängt. Der Name eines Attributes wird mit einem &amp;quot;@&amp;quot; eingeleitet und der Wert mit einem &amp;quot;=&amp;quot; in Anführungszeichen angehängt. Ist der Attributwert global eindeutig, kann man den vorausgehenden Pfad sogar durch den globalen Platzhalter * ersetzen, der auf jedes Element passt. Das obige Beispiel mit dem GTIN-13-&#039;&#039;Button&#039;&#039; war ein solcher Fall.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum2.png | frame | Abb. 3: Elementbaum einer fiktiven App mit Erweiterungen]]&lt;br /&gt;
&lt;br /&gt;
Abb. 3 zeigt eine Erweiterung des Beispiels aus Abb. 2. Die App hat nun ein weiteres, nahezu identisches &#039;&#039;LinearLayout&#039;&#039; bekommen. Die &#039;&#039;Buttons&#039;&#039; sind in ihren Attributen jeweils ununterscheidbar. Deshalb funktioniert der vorige Ansatz nicht, einen eindeutigen Pfad nur mithilfe eines Attributwerts zu formulieren. Offensichtlich unterscheiden sich aber ihre benachbarten &#039;&#039;TextViews&#039;&#039;. Es ist möglich die jeweilige &#039;&#039;TextView&#039;&#039; in den Pfad mit aufzunehmen, um einen &#039;&#039;Button&#039;&#039; dennoch eindeutig zu adressieren. Ein Pfad zum &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; unterhalb der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; kann dabei wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView[@resource-id=&#039;push&#039;]/../android.widget.Button[@resource-id=&#039;on&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Teil beschreibt den Pfad zu der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; und der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;push&#039;&#039;. Danach folgt ein Schrägstrich gefolgt von zwei Punkten. Die zwei Punkte sind eine spezielle Elementbezeichnung, die nicht ein Kindelement benennt, sondern zum Elternelement wechselt, in diesem Fall also das &#039;&#039;LinearLayout&#039;&#039;, in dem die &#039;&#039;TextView&#039;&#039; eingebettet ist. Im Kontext dieses &#039;&#039;LinearLayout&#039;&#039; ist der restliche Pfad, nämlich der &#039;&#039;Button&#039;&#039; mit der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;on&#039;&#039;, eindeutig.&lt;br /&gt;
&lt;br /&gt;
Der XPath-Standard bietet noch sehr viel mehr Ausdrucksmittel. Mit der hier knapp vorgestellten Auswahl ist es aber bereits möglich für die meisten praktischen Testfälle gute Pfade zu formulieren. Eine vollständige Einführung in XPath ginge über den Umfang dieser Einführung weit hinaus. Sie finden zahlreiche weiterführende Dokumentationen im Web und in Büchern.&lt;br /&gt;
&lt;br /&gt;
Eine universelle Strategie zum Erstellen guter XPaths gibt es nicht, da sie von den Testanforderungen abhängt. In der Regel ist es sinnvoll, den XPath kurz und dennoch eindeutig zu halten. Häufig lassen sich Elemente über Eigenschaften identifizieren wie beispielsweise ihren Text. Will man aber gerade den Text eines Elements auslesen, kann dieser natürlich nicht im Pfad verwendet werden, da er vorher nicht bekannt ist. Ebenso wird der Text variieren, wenn die App mit verschiedenen Sprachen gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Jeder Baustein, der auf einem Element arbeitet, hat einen Eingangspin für den XPath. Im GUI-Browser finden Sie in der Mitte oben eine Liste von Bausteinen mit Aktionen, die Sie auf das ausgewählte Element anwenden können. Suchen Sie den Baustein &#039;&#039;Click&#039;&#039; (8) im Ordner Elements und wählen Sie ihn aus (Abb. 1). Er wird im rechten Teil unter &amp;quot;&#039;&#039;Test&#039;&#039;&amp;quot; eingefügt, der Pin für den XPath ist mit dem automatisch generierten Pfad des Elements vorbelegt (9). Sie können den Baustein hier auch ausführen. Die Ansicht wechselt dann auf &amp;quot;&#039;&#039;Lauf&#039;&#039;&amp;quot;. Ändert sich durch die Aktion der Zustand Ihrer App, müssen Sie den Baum anschließend aktualisieren (10).&lt;br /&gt;
&lt;br /&gt;
Wenn Sie in der unteren Liste eine Eigenschaft auswählen, wechselt die Anzeige der Bausteine zu &amp;quot;&#039;&#039;Eigenschaften&#039;&#039;&amp;quot;, wo Sie die eigenschaftsbezogenen Bausteine finden. Wie bei den Aktionen können Sie auch hier einen Baustein auswählen, der dann rechts in Test mit dem Pfad des Elements und der ausgewählten Eigenschaft eingetragen wird, sodass Sie ihn direkt ausführen können.&lt;br /&gt;
&lt;br /&gt;
== Weitere Locator-Strategien ==&lt;br /&gt;
Appium bietet neben XPath noch weitere Strategien zur Adressierung von Elementen an. Einige davon stehen Ihnen &#039;&#039;&#039;ab Version 20.1&#039;&#039;&#039; ebenfalls mit expecco zur Verfügung. Diese sind nicht ganz so mächtig wie XPath, dafür aber häufig schneller bei der Auflösung auf dem Gerät. Insbesondere bei der Verwendung mit iPhones, wo die Hierarchie bei jeder XPath-Auflösung erst aufgebaut werden muss, bieten alternative Strategien einen Vorteil für die Laufzeit.&lt;br /&gt;
&lt;br /&gt;
XPath ist weiterhin der Standard, das heißt alle Locator ohne besondere Angabe werden als XPath interpretiert. Um eine der anderen Strategien zu verwenden, schreiben Sie diese mit einem Gleichzeichen vor den gewünschten Locator. Diese Technik können Sie sowohl an den Blöcken verwenden, als auch im GUI-Browser testen.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | AccessibilityId || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Wert des Elements, der dazu dient, die App barrierefrei zu machen. Für iOS ist das das Attribut &#039;&#039;&#039;Accessibility-id&#039;&#039;&#039;, für Android das Attribut &#039;&#039;&#039;content-descr&#039;&#039;&#039;. &#039;&#039;Beispiel: accessibilityId=Löschen&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | className || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Namen der Klasse des Elements. &#039;&#039;Beispiel: className=android.widget.FrameLayout&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | id || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet die Kennung des Elements. Für iOS ist das das Attribut &#039;&#039;&#039;name&#039;&#039;&#039;, für Android das Attribut &#039;&#039;&#039;resource-id&#039;&#039;&#039;. &#039;&#039;Beispiel: id=android:id/text1&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | iOSClassChain&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet die Hierarchie der Elemente ähnlich wie bei XPath. Eine Erklärung zum Aufbau finden Sie [https://github.com/facebookarchive/WebDriverAgent/wiki/Class-Chain-Queries-Construction-Rules hier]. &#039;&#039;Beispiel: iOSClassChain=XCUIElementTypeWindow/XCUIElementTypeButton[`label == &amp;quot;Ok&amp;quot;`]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; padding-right:1em&amp;quot; | iOSNsPredicateString&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet einfache Kriterien, wie Attribute, die auch kombiniert werden können. &#039;&#039;Beispiel: iOSNsPredicateString=type == &#039;XCUIElementTypeButton&#039; AND name == &#039;Weiter&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | name&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Namen des Elements. &#039;&#039;Beispiel: name=Bestätigen&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &#039;&#039;nur für iOS&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Um eine direkte Beschleunigung mit iOS zu erzielen, ohne dass Sie Ihre bisherigen Pfade anpassen müssen, wandelt expecco zudem Pfade, die nur aus einem Element mit Klasse und name-Attribut bestehen, zur Laufzeit automatisch in einen entsprechenden Locator der Strategie iOSNsPredicateString um. Wenn Sie einen Pfad explizit als XPath markieren, wird diese Anpassung nicht vorgenommen.&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span id=&amp;quot;troubleshooting&amp;quot;&amp;gt;&amp;lt;!-- Referenced by error dialog on connection error --&amp;gt;&amp;lt;/span&amp;gt;Probleme und Lösungen=&lt;br /&gt;
== Locator sind versionsabhängig oder variabel ==&lt;br /&gt;
Dann sollten Sie die Locator (xPath) entweder in einer Variablen halten oder ein Locator-Mapping in einem Screenplay Anhang definieren. Es ist auch möglich, lediglich Teile des Locators (z.B. Locator-Pfad eines Elternelements oder Attributwert) in einer Variable zu halten und im Freezevalue des Locator-Pins mit &amp;quot;&#039;&#039;$(varName)&#039;&#039;&amp;quot; einzufügen.&lt;br /&gt;
&lt;br /&gt;
==Unsichtbare UI-Elemente==&lt;br /&gt;
Beachten Sie, dass im [[#Recorder|Recorder]] auch Elemente berücksichtigt werden, die Sie auf dem Bildschirm nicht sehen. Schalten Sie daher das Element-Highlighting an oder nutzen Sie die Follow-Mouse-Funktion und den Elementbaum im GUI-Browser, um festzustellen, ob das richtige Element verwendet wird. Es kann vorkommen, dass unsichtbare Elemente vor anderen Elementen liegen und diese verdecken, so dass die gewünschten Elemente im Recorder nicht ausgewählt werden können. Lesen Sie dazu den Abschnitt [[#Elemente_verbergen|Elemente verbergen]].&lt;br /&gt;
&lt;br /&gt;
==iOS: Kabel nicht zertifiziert==&lt;br /&gt;
In manchen Fällen erscheint beim Verbinden eines iOS-Geräts über USB der Hinweis, das verwendete Kabel sei nicht zertifiziert. In diesem Fall hilft es nur, das entsprechende Kabel auszutauschen.&lt;br /&gt;
==iOS: Alerts beim Verbindungsaufbau==&lt;br /&gt;
Stellen Sie sicher, dass beim Verbindungsaufbau mit einem iOS-Gerät keine Alerts geöffnet sind. Der Aufbau schlägt sonst fehl, da die App nicht in den Vordergrund kommen kann. Siehe auch [[#iOS-Ger.C3.A4t_und_App_vorbereiten|iOS-Gerät und App vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
==iOS: .ipa installieren nicht möglich==&lt;br /&gt;
Beachten Sie, dass auf iOS-Simulatoren keine &#039;&#039;.ipa&#039;&#039;-Dateien sondern nur &#039;&#039;.app&#039;&#039;-Dateien installiert werden können.&lt;br /&gt;
==Android: Gerät nicht im Verbindungsdialog==&lt;br /&gt;
Wenn ein über USB angeschlossenes Android-Gerät nicht im Verbindungsdialog auftaucht, versuchen Sie, den USB-Verbindungstyp zu ändern. In der Regel sollten MTP oder PTP funktionieren. Prüfen Sie nochmal, ob &amp;quot;USB Debugging&amp;quot; in den Entwicklereinstellungen des Geräts aktiviert ist (diese Einstellungen sind bei manchen Geräten zunächst unsichtbar, und müssen durch einen Trick zugänglich gemacht werden). Siehe auch [[#Android-Ger.C3.A4t_vorbereiten|Android-Gerät vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
==Android: Abgeschnittene Elemente unten==&lt;br /&gt;
Bei Android-Geräten, die die Steuerungsleiste bzw. Softkeys automatisch ein- und ausblenden, kann es vorkommen, dass der Recorder im unteren Bereich Elemente abschneidet, die durch die Softkeys verdeckt würden, auch wenn sie zu diesem Zeitpunkt gar nicht angezeigt werden. In diesem Fall hift es, die Softkeys so einzustellen, dass sie in einer permanenten Leiste angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
Bei neueren Android-Versionen gibt es eine solche Einstellung in der Regel nicht. Auch wenn die Steuerelemente permanent eingeblendet sind, liegen sie auf keiner extra Leiste, sondern vor dem Inhalt der App. Es gibt dann im unteren Teil einen Bereich, der nicht bedient werden kann, weil er nicht zum aktiven Bereich der App gezählt wird, weshalb die Elemente von Appium abgeschnitten werden. Dieser Bereich kann auch größer sein als von den Steuerungselementen beansprucht. Bekannt ist dies für Samsung-Geräte mit Android 11. Da die Information über die Größe des App-Bereichs bereits auf Android-Ebene so geliefert wird, können wir hierfür keine Lösung anbieten, sondern können nur hoffen, dass das Problem vom Hersteller behoben wird. Sie können versuchen, ob Sie mit der Einstellung von Gestensteuerung bessere Ergebnisse bekommen, allerdings gibt es hier das gleiche Problem.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;waitForIdleTimeout&amp;quot;&amp;gt;&amp;lt;!-- Referenced by expecco--&amp;gt;&amp;lt;/span&amp;gt; Android: Test hängt beim Suchen eines Elements==&lt;br /&gt;
Der Baustein &#039;&#039;Find Element by XPath&#039;&#039; und alle Element-Bausteine warten bis ein Element zum angegebenen Pfad auftaucht. Den Timeout dafür kann man entweder am Baustein direkt oder in den Umgebungsvariablen ändern. Wenn das Element aber bereits da sein sollte und es dennoch sehr lange dauert, bis der Test weitergeht, kann das am UIAutomator/UIAutomator2 liegen. Dieser wartet, bis die App in den Idle-Zustand geht, bevor er überhaupt nach Elementen sucht. Dies kann länger dauern, wenn die App z.B. im Hintergrund noch Animationen abspielt oder andere Aktionen ausführt. Auch das Holen des Page-Sources z.B. beim Aktualisieren im GUI-Browser oder im Recorder kann dadurch länger dauern. Standardmäßig gibt es hierfür einen Timeout von 10 Sekunden, nach dem nicht weiter auf den Idle-Zustand gewartet wird. Dieser Timeout lässt sich durch eine Einstellung in Appium anpassen (waitForIdleTimeout). Falls Sie einen anderen Wert für diesen Timeout setzen möchten, ist dies ab expecco 21.2 möglich, indem Sie vor dem Test den Smalltalk-Code &amp;lt;code&amp;gt;AppiumTestRunner::TestRunConnection waitForIdleTimeout:2000&amp;lt;/code&amp;gt; ausführen. Der Timeout wird in Millisekunden angegeben, das Beispiel setzt ihn also auf 2 Sekunden.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;startChromedriverTimeout/&amp;gt;Android: Aktualisieren des Trees oder Wechseln zum Webview-Kontext braucht zu lange==&lt;br /&gt;
Speziell mit älteren Geräten kann es vorkommen, dass neuere Chromedriver nicht initialisiert werden können. Das führt dann dazu, dass nicht in den Webview-Kontext gewechselt werden kann. Dies wird von Appium allerdings nur über einen Timeout festgestellt, der standardmäßig bei 4 Minuten liegt. Da expecco auch beim Aufbauen des Trees im GUI-Browser versucht in den Webview-Kontext zu wechseln, kann das zu sehr langen Ladezeiten führen. Da es in Appium keine Möglichkeit gibt, diesen Timeout herunter zu setzen, haben wir die Version, die wir im MobileTestingSupplement bereitstellen, um eine entsprechende Capability erweitert. Ab der Version 1.13.1.0 des [[#Windows|MobileTestingSupplements]] kann mit &#039;&#039;chromedriverStartTimeout&#039;&#039; der Timeout in Millisekunden gesetzt werden. Der Wechsel funktioniert dadurch zwar trotzdem nicht, aber expecco braucht dann nicht mehr so lange beim Aktualisieren des Trees und der Baustein zum Wechseln des Kontextes schlägt schneller fehl. Der Verbindungsdialog fügt diese Capability ab expecco 22.1 automatisch hinzu.&lt;br /&gt;
&lt;br /&gt;
==Keine Aktion bei Klick==&lt;br /&gt;
Der Baustein zum Klicken auf ein Element ist erfolgreich, aber auf dem Gerät wurde keine Aktion ausgeführt.&lt;br /&gt;
:Dies kann vorkommen, wenn das Element von einem anderen Element verdeckt ist und ein Klick auf das Element deshalb nicht möglich ist. In diesem Fall wird von Appium kein Fehler geworfen, sondern es passiert einfach nichts. Wenn Sie dennoch einen Klick an der Position des Elements machen möchten, auch wenn es verdeckt ist, benutzen Sie stattdessen den Baustein &#039;&#039;Tap&#039;&#039; und übergeben Sie diesem die Position des Elements (&#039;&#039;Get Location&#039;&#039;). Wenn Sie stattdessen vor einem Klick prüfen möchten, ob das Element zu diesem Zeitpunkt verdeckt ist, versuchen Sie, ob Ihnen die Eigenschaften &#039;&#039;Is Displayed&#039;&#039; oder &#039;&#039;Is Enabled&#039;&#039; weiterhelfen.&lt;br /&gt;
&lt;br /&gt;
==Kein Update nach Aktion==&lt;br /&gt;
Über den Recorder wurde eine Aktion ausgeführt, für die auch ein Baustein aufgezeichnet wurde, der Recorder zeigt aber immer noch das alte Bild.&lt;br /&gt;
:Der Recorder zeigt kein Livebild des Geräts, sondern immer nur eine Momentaufnahme. Nachdem eine Aktion ausgeführt wurde, aktualisiert sich der Recorder automatisch. Es kann aber vorkommen, dass das Bild schon aktualisiert wurde, bevor die Auswirkungen der Aktion auf dem Gerät vollständig abgeschlossen sind. In diesem Fall sollten Sie den Recorder von Hand aktualisieren über das Symbol mit den blauen Pfeilen. Ab expecco 20.2 können Sie für diesen Fall auch automatisches Aktualisieren einstellen. Siehe auch Beschreibung zum [[#Recorder|Recorder]].&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;clickable&amp;quot; Attribut falsch==&lt;br /&gt;
Ein Element hat im &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; Attribut/Property den Wert &amp;quot;&#039;&#039;false&#039;&#039;&amp;quot;, ist aber dennoch anklickbar.&lt;br /&gt;
:Das &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; Attribute muss explizit vom App-Programmierer gesetzt werden, und hat tatsächlich keine Relevanz für das tatsächliche Verhalten der App. Sie sollten dieses Attribut i.A. in Ihren Tests nicht beachten.&amp;lt;br&amp;gt;Leider existieren viele Apps, bei denen der Programmierer hier &amp;quot;lazy&amp;quot; war.&lt;br /&gt;
&lt;br /&gt;
==Verbindungsaufbau schlägt fehl==&lt;br /&gt;
Schlägt der Verbindungsaufbau mit dem Appium-Server fehl, erhalten Sie in expecco eine Fehlermeldung ähnlicher der unten abgebildeten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingVerbindungsfehler.png]]&lt;br /&gt;
&lt;br /&gt;
Hier sehen Sie die Art des aufgetretenen Fehlers. Klicken Sie auf &amp;quot;&#039;&#039;Details&#039;&#039;&amp;quot; um nähere Informationen zu erhalten. Mögliche Fehler sind:&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.remote.UnreachableBrowserException&#039;&#039;&lt;br /&gt;
:Der angegebene Server läuft nicht oder ist nicht erreichbar. Überprüfen Sie die Serveradresse.&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.WebDriverException&#039;&#039;&lt;br /&gt;
:Lesen Sie in den Details in der ersten Zeile die Meldung hinter &#039;&#039;Original Error&#039;&#039;:&lt;br /&gt;
:*&#039;&#039;Unknown device or simulator UDID&#039;&#039;&lt;br /&gt;
::Entweder ist das Gerät nicht richtig angeschlossen oder die udid stimmt nicht.&lt;br /&gt;
:*&#039;&#039;Unable to launch WebDriverAgent because of xcodebuild failure: xcodebuild failed with code 65&#039;&#039;&lt;br /&gt;
::Dieser Fehler kann verschiedene Ursachen haben. Entweder konnte tatsächlich der WebDriverAgent nicht gebaut werden, weil die Signierungseinstellungen falsch sind oder das passende Provisioning Profile fehlt. Lesen Sie dazu den Abschnitt zur [[#Signierung|Signierung]]. Es kann auch sein, dass der WebDriverAgent auf dem Gerät nicht gestartet werden kann, weil sich beispielsweise ein Alert im Vordergrund befindet oder Sie dem Entwickler nicht vertraut haben.&lt;br /&gt;
:*&#039;&#039;Could not install app: &#039;Command &#039;ios-deploy [...] exited with code 253&#039;&#039;&#039;&lt;br /&gt;
::Die angegebene App kann nicht auf dem iOS-Gerät installiert werden, weil es nicht im Provisioning Profile der App eingetragen ist.&lt;br /&gt;
:*&#039;&#039;Bad app: [...] App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name.&#039;&#039;&#039;&lt;br /&gt;
::Der Pfad zur App ist falsch. Stellen Sie sicher, dass sich die Datei unter dem angegebenen Pfad auf dem Mac befindet.&lt;br /&gt;
:*&#039;&#039;packageAndLaunchActivityFromManifest failed.&#039;&#039;&lt;br /&gt;
::Die angegebene &#039;&#039;apk&#039;&#039;-Datei ist vermutlich kaputt.&lt;br /&gt;
:*&#039;&#039;Could not find app apk at [...]&#039;&#039;&lt;br /&gt;
::Der Pfad zur App ist falsch. Stellen Sie sicher, dass sich die &#039;&#039;apk&#039;&#039;-Datei am angegebenen Pfad befindet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Falls der Fehler nicht durch eine der oben gelisteten Ursachen bedingt ist, kann es sein, dass die auf dem Gerät befindlichen Automation-Anwendungen nicht mehr richtig funktionieren. Hier hilft es, diese vom Mobilgerät zu deinstallieren. Beim nächsten Verbindungsaufbau werden sie dann automatisch neu installiert.&lt;br /&gt;
&lt;br /&gt;
*Für iOS-Geräte ist das der WebDriverAgent, den Sie einfach vom Home-Screen deinstallieren können. Dies behebt in der Regel Probleme durch den Wechsel des verwendeten Macs oder der Xcode-Version.&lt;br /&gt;
&lt;br /&gt;
*Für Android-Geräte ist es der UIAutomator2; hier tritt auf einigen Geräten sporadisch ein Problem auf, die Ursache dafür ist uns z.Z. noch nicht bekannt. Zur Deinstallation navigieren Sie auf dem Gerät zu &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;Anwendungen&#039;&#039;&amp;quot;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; und suchen in der Liste nach folgenden Einträgen:&lt;br /&gt;
    Appium Settings&lt;br /&gt;
    io.appium.uiautomator2.server&lt;br /&gt;
    io.appium.uiautomator2.server.test&lt;br /&gt;
:Klicken Sie auf die jeweilige Anwendung und dann auf &amp;quot;&#039;&#039;Deinstallieren&#039;&#039;&amp;quot;.&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&#039;&#039;Der entsprechende Eintrag heißt auf manchen Geräten möglicherweise etwas anders.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Falls dies nicht hilft, kann eventuell die Ausgabe des Appium-Servers weiterhelfen. Für einen von expecco gestarteten Server finden Sie das Log in der Liste der [[#Laufende_Appium-Server|laufenden Appium-Server]].&lt;br /&gt;
&lt;br /&gt;
==Ich habe keinen Mac==&lt;br /&gt;
Vielleicht hilft Ihnen diese Webseite weiter: [https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10 https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin&amp;diff=29042</id>
		<title>Mobile Testing Plugin</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Mobile_Testing_Plugin&amp;diff=29042"/>
		<updated>2023-11-23T12:10:35Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Android: Aktualisieren des Trees oder Wechseln zum Webview-Kontext braucht zu lange */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Deutsche Version&#039;&#039;&#039; | [[Mobile_Testing_Plugin/en|English Version]]&lt;br /&gt;
&lt;br /&gt;
= Einleitung =&lt;br /&gt;
Mit dem &#039;&#039;Mobile Testing Plugin&#039;&#039; können Anwendungen auf Android- und iOS-Geräten getestet werden. Dabei ist es egal, ob reale mobile Endgeräte oder emulierte Geräte verwendet werden. Das Plugin kann (und wird üblicherweise) zusammen mit dem [[Expecco_GUI_Tests_Extension_Reference|GUI-Browser]] verwendet werden, der das Erstellen von Tests unterstützt. Zudem ist damit das Aufzeichnen von Testabläufen möglich.&lt;br /&gt;
&lt;br /&gt;
Zur Verbindung mit den Geräten wird [http://appium.io/ Appium] verwendet. Appium ist ein freies Open-Source-Framework zum Testen und Automatisieren von mobilen Anwendungen.&lt;br /&gt;
&lt;br /&gt;
Zur Einarbeitung in das Mobile Plugin empfehlen wir das [[Mobile_Testing_Tutorial|Tutorial]] zu bearbeiten. Dieses führt anhand eines Beispiels Schritt für Schritt durch die Erstellung eines Testfalls und erklärt die nötigen Grundlagen.&lt;br /&gt;
&lt;br /&gt;
= Installation und Aufbau =&lt;br /&gt;
Zur Verwendung des Mobile Testing Plugins müssen Sie expecco inkl. des Plugins Mobile Testing installiert haben und Sie benötigen die entsprechenden Lizenzen. expecco kommuniziert mit den Mobilgeräten über einen Appium-Server, der entweder auf demselben Rechner wie expecco läuft, oder auf einem zweiten Rechner. Dieser muss für expecco erreichbar sein.&lt;br /&gt;
&lt;br /&gt;
==Installationsübersicht==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rechner, auf dem expecco läuft:&#039;&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rechner, an dem Android-Geräte angeschlossen sind:&#039;&#039;&#039;&lt;br /&gt;
* Appium-Server&#039;&#039;, diesen können Sie über das Mobile Testing Supplement installieren (s.u.), von dem wir regelmäßig einen neue Version zur Verfügung stellen&#039;&#039;&lt;br /&gt;
* Android SDK&#039;&#039;, dieses erhalten Sie ebenfalls mit dem Mobile Testing Supplement&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rechner, an dem iOS-Geräte angeschlossen sind&amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
* Appium-Server&#039;&#039;, diesen können Sie über das Mobile Testing Supplement für Mac OS installieren (s.u.), von dem wir regelmäßig einen neue Version zur Verfügung stellen&#039;&#039;&lt;br /&gt;
* Xcode &#039;&#039;in einer Version, die die verwendete iOS-Version unterstützt, erhältlich über den Apple App Store&#039;&#039;&lt;br /&gt;
* Java JDK Version 8, 9, 10, 11 oder neuer &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
* Apple-Entwickler-Zertifikat mit zugehörigem privaten Schlüssel &#039;&#039;(zum Signieren des WebDriverAgents)&#039;&#039;&lt;br /&gt;
* Provisioning Profile mit den verwendeten Mobilgeräten&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Je nach Aufbau können die oben genannten Rechner auch das selbe Gerät sein. expecco kann sich sowohl über das Netzwerk mit einem entfernten Appium-Server und dort angeschlossenen Mobilgeräten verbinden, als auch lokal selbst einen Appium-Server starten und diesen mit lokalen Mobilgeräten verwenden. Einige Funktionen von expecco, die die Erstellung von Testfällen erleichtern, sind jedoch nur verfügbar, wenn die Mobilgeräte am selben Rechner angeschlossen sind, auf dem auch expecco läuft. Ein möglicher Aufbau kann daher wie in folgender Abbildung aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAufbau.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird die Installation von Appium und anderer nötiger Programme für Windows und Mac OS erklärt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;: Zum Zeitpunkt der Erstellung dieses Dokuments wurden Versionen bis 11 auf Funktion verifiziert. Neuere Versionen sollten - sofern nicht grundlegende Änderungen von Oracle vorgenommen wurden, ebenfalls funktionieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2)&amp;lt;/sup&amp;gt;: Beachten Sie, dass aufgrund der Voraussetzungen (keine Anbindung an nicht-Apple Geräte verfügbar) iOS-Geräte nur von einem Mac aus angesteuert werden können. Sie benötigen also einen Mac als &amp;quot;Vermittler&amp;quot; (siehe auch unten: [[#Ich habe keinen Mac | &amp;quot;Ich habe keinen Mac&amp;quot;]])&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
Am einfachsten installieren Sie alles mit unserem Mobile Testing Supplement&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;. In neueren Versionen ist allerdings aufgrund geänderter Lizenzbedingungen seitens Oracle kein JDK mehr enthalten, sodass sie dieses zusätzlich installieren müssen. Sie können natürlich Appium auch direkt installieren, um die Version zu verwenden, die Sie möchten. Um dann einen Appium-Server mit expecco starten zu können, muss allerdings eine entsprechende Batchdatei vorhanden sein und in den [[Mobile_Testing_Plugin#Konfiguration_des_Plugins|Einstellungen]] angegeben werden. Verbindungen können aber auch zu anderen laufenden Appium-Servern aufgebaut werden.&lt;br /&gt;
*&#039;&#039;&#039;expecco 23.1&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-23.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.3.1]&lt;br /&gt;
:Gleiche Versionen wie der Vorgänger, aber der Installer erlaubt nun, Appium zum Autostart hinzuzufügen.&lt;br /&gt;
*expecco 22.2 und 22.1: [https://download.exept.de/transfer/h-expecco-22.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.13.2.0]&lt;br /&gt;
:Appium 1.22.3*&lt;br /&gt;
:Node 14.17.5&lt;br /&gt;
:adb 1.0.41 aus platform-tools 33.0.2&lt;br /&gt;
:&#039;&#039;* Wir haben Appium um die Capability&#039;&#039; startChromedriverTimeout &#039;&#039;erweitert, um schneller einen Timeout zu bekommen, wenn der Chromedriver nicht gestartet werden kann. (siehe [[#startChromedriverTimeout|Probleme und Lösungen]])&#039;&#039;&lt;br /&gt;
*expecco 21.2: [https://download.exept.de/transfer/h-expecco-21.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.12.0.0]&lt;br /&gt;
:Enthält die Appium-Version 1.22.0, Node ist weiterhin in der Version 12.13.1.&lt;br /&gt;
*expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.1.0]&lt;br /&gt;
:Nur kleine Änderungen im Vergleich zur vorigen Version.&lt;br /&gt;
*expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.10.0.0]&lt;br /&gt;
:Im Vergleich zur vorigen Version wurde Appium auf die Version 1.16.0-rc.1 aktualisiert und node 12 verwendet. &lt;br /&gt;
*expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.8.1.0]&lt;br /&gt;
:Dieses installiert Appium in der Version 1.12.0 und enthält nun zusätzlich build-tools der Version 28.0.3 im android-sdk. Ansonsten ist es gleich wie die vorige Version.&lt;br /&gt;
*expecco 18.2: [http://download.exept.de/transfer/h-expecco-18.2.0/MobileTestingSupplement.exe Mobile Testing Supplement 1.7.3.0]&lt;br /&gt;
:Dieses installiert Appium in der Version 1.8.1. Außerdem bietet das Supplement auch an, &#039;&#039;Android Debug Bridge&#039;&#039; und &#039;&#039;Google USB Driver&#039;&#039; ([https://gsmusbdrivers.com/download/adb-fastboot-drivers/ adb-setup-1.4.3]) zu installieren. Damit sind Treiber für ein breites Spektrum an Android-Geräten abgedeckt, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen. Ein &#039;&#039;&#039;JDK ist (aufgrund geänderter Lizenzbedingungen seitens Oracle) nicht mehr enthalten&#039;&#039;&#039;, dieses müssen Sie selbst herunterladen, z.B. von [https://www.oracle.com/technetwork/java/javase/downloads/index.html Oracle].&lt;br /&gt;
*expecco 18.1: wie expecco 2.11&lt;br /&gt;
*expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/MobileTestingSupplement_1.6.0.2_Setup.exe Mobile Testing Supplement 1.6.0.2]&lt;br /&gt;
:Dieses installiert ein Java JDK der Version 8, android-sdk und Appium in der Version 1.6.4. Außerdem bietet das Supplement auch einen universellen adb-Treiber ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]) an. Dieser vereint Treiber für ein breites Spektrum an Android-Geräten, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen.&lt;br /&gt;
*expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_1.5.0.0_Setup.exe Mobile Testing Supplement 1.5.0.0]&lt;br /&gt;
:Dieses installiert ein Java JDK der Version 8, android-sdk und Appium in der Version 1.4.16. Während der Installation wird die grafische Oberfläche von Appium gestartet, dieses Fenster können Sie sofort wieder schließen. Außerdem bietet das Supplement auch einen universellen adb-Treiber ([http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi ClockworkMod]) an. Dieser vereint Treiber für ein breites Spektrum an Android-Geräten, sodass Sie nicht für jedes Gerät einen eigenen Treiber suchen und installieren müssen.&lt;br /&gt;
&lt;br /&gt;
Wenn expecco Mobilgeräte verwenden soll, die an einem anderen Rechner angeschlossen sind, müssen Sie dort einen Appium-Server starten. Dies können Sie mit der Datei &amp;lt;code&amp;gt;appium_standalone.cmd&amp;lt;/code&amp;gt; tun. Der Server wird dann mit dem Standard-Port 4723 gestartet. Falls Sie eine andere Portnummer verwenden wollen, starten Sie den Server mit&lt;br /&gt;
&lt;br /&gt;
 appium_standalone.cmd -p &amp;lt;portnummer&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Server ist bereit, sobald die Zeile&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Appium REST http interface listener started on 0.0.0.0:4723&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
angezeigt wird, wobei Sie am Ende die verwendete Portnummer ablesen können.&lt;br /&gt;
&lt;br /&gt;
Beim ersten Starten von Appium – sowohl im Standalone als auch gestartet von expecco – kann es vorkommen, dass die Windows-Firewall den Node-Server blockiert. Lassen Sie den Zugriff zu, sonst kann Appium nicht gestartet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;) Sie können natürlich auch die Command Line Tools (adb, sdkmanager, avdmanager etc.) einer vorhandenen Android Studio Version verwenden, sowie Appium separat installieren.&lt;br /&gt;
Da sich diese Tools regelmäßig ändern, und es in der Vergangenheit zu Inkompatibilitäten und Fehlern nach Releasewechseln kam, empfehlen wir zu Beginn, das mitgelieferte Paket zu verwenden. Dies ist möglicherweise nicht das aktuellste, wurde aber auf Lauffähigkeit getestet.&lt;br /&gt;
&lt;br /&gt;
Falls das Android Mobilgerät an einem entfernen Rechner angeschlossen ist,&lt;br /&gt;
können Sie den aktuellen Bildschirminhalt z.B. mit dem [https://github.com/Genymobile/scrcpy scrcpy] tool live mitverfolgen.&lt;br /&gt;
&lt;br /&gt;
== Mac OS (nicht erforderlich für Android-Tests)==&lt;br /&gt;
Hinweis: Wenn Sie nicht vorhaben, iOS-Geräte (iPhone, iPad, etc.) zu testen, können Sie das Folgende ignorieren. &#039;&#039;&#039;Der Apple-Rechner sowie das Mac-Setup werden für Android-Geräte nicht benötigt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Xcode ===&lt;br /&gt;
Zur Automatisierung mit iOS-Geräten wird [https://developer.apple.com/xcode/ Xcode] benötigt. Sie erhalten dieses über den App Store. Dabei ist darauf zu achten, dass die Version zu den getesteten iOS-Versionen passt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;iOS&#039;&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp;  &lt;br /&gt;
|&#039;&#039;&#039;Xcode&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;macOS&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|10.x&lt;br /&gt;
|8.x&lt;br /&gt;
|10.12 (Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|11.x&lt;br /&gt;
|9.x&lt;br /&gt;
|10.13 (High Sierra)&lt;br /&gt;
|-&lt;br /&gt;
|12.x&lt;br /&gt;
|10.x&lt;br /&gt;
|10.14 (Mojave)&lt;br /&gt;
|-&lt;br /&gt;
|13.x&lt;br /&gt;
|11.x&lt;br /&gt;
|10.15 (Catalina)&lt;br /&gt;
|-&lt;br /&gt;
|14.x&lt;br /&gt;
|12.x&lt;br /&gt;
|11.0 (Big Sur)&lt;br /&gt;
|-&lt;br /&gt;
|15.x&lt;br /&gt;
|13.x&lt;br /&gt;
|12.0 (Monterey)&lt;br /&gt;
|-&lt;br /&gt;
|16.x&lt;br /&gt;
|14.x&lt;br /&gt;
|12.5 (Monterey)&lt;br /&gt;
|}&lt;br /&gt;
Diese Tabelle gibt nur eine vereinfachte Übersicht, lesen Sie besser unter [https://xcodereleases.com/ Xcode Releases] oder [https://en.wikipedia.org/wiki/Xcode#Version_comparison_table Xcode-Versionen] welche Version Sie brauchen. Für neue iOS Minor-Versionen gibt es in der Regel auch ein Update für Xcode, z.B. brauchen Sie für iOS 10.2 mindestens Xcode 8.2, für iOS 10.3 mindestens Xcode 8.3 usw. &lt;br /&gt;
Wenn Sie also auf eine neuere iOS-Version wechseln, benötigen Sie in der Regel auch eine neuere Xcode-Version. Neuere Versionen von Xcode laufen möglicherweise nicht auf älteren Betriebssystemen, was wiederum eine Aktualisierung des Betriebssystems erforderlich machen kann. Falls Sie auch ältere iOS-Versionen testen wollen kann es sinnvoll sein, die entsprechenden Xcode-Versionen parallel zu installieren.&lt;br /&gt;
&lt;br /&gt;
=== Appium ===&lt;br /&gt;
Der Appium-Server kann entweder als Kommandozeilen-Anwendung installiert werden oder über [https://github.com/appium/appium-desktop Appium Desktop] verwendet werden, welcher den Server über ein GUI zur Verfügung stellt. Mittlerweile gibt es auch Appium 2.0, was wir aber bisher noch nicht mit expecco getestet haben und daher nicht empfehlen.&lt;br /&gt;
&lt;br /&gt;
==== Appium Desktop ====&lt;br /&gt;
Laden Sie die neueste Version von [https://github.com/appium/appium-desktop/releases/ Appium Desktop] herunter. Für den Mac nehmen Sie am besten die dmg-Datei und installieren sie in den Anwendungen. Beim Starten der Anwendung &#039;&#039;Appium Server GUI&#039;&#039; erhalten Sie wahrscheinlich eine Fehlermeldung, dass es aus Sicherheitsgründen nicht möglich ist. Öffnen Sie dann das Kontextmenü auf der Anwendungsdatei (Rechtsklick bzw. Strg + Klick) und wählen Sie dort &#039;&#039;Öffnen&#039;&#039; aus. Bestätigen Sie dann, dass Sie die Anwendung wirklich öffnen wollen. Fortan können Sie die Anwendung normal öffnen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:OpenAppiumServerGUI1.png|text-top]] [[Datei:OpenAppiumServerGUI2.png|text-top]]&lt;br /&gt;
&lt;br /&gt;
Ab Xcode 14 gibt es Probleme beim Signieren des WebDriverAgents, den Appium zur Automatisierung auf das Gerät spielt. Dadurch ist mit der Version 1.22.3-4 von Appium Desktop kein Verbindungsaufbau möglich. Das Problem ist in neueren Versionen des WebDriverAgents behoben, es gibt aber aktuell noch keine Version von Appium Desktop, die eine solche Version enthält (Stand November 2022). Sie können aber manuell eine neue Version herunterladen (z.B. 4.10.2)  und die Dateien in Appium ersetzen. Laden Sie dazu von der [https://github.com/appium/WebDriverAgent/releases/ WebDriverAgent Download-Seite] eine der beiden Archivdateien (zip oder tar.gz) mit dem Source Code herunter. Öffnen und entpacken Sie dann diese Datei. Den Inhalt des Ordners WebDriverAgent-4.10.2 müssen Sie nun nach&lt;br /&gt;
&lt;br /&gt;
 /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
kopieren. Wenn Sie über den Finder dorthin navigieren, machen Sie auf die Anwendung &#039;&#039;Appium Server GUI&#039;&#039; einen Kontextklick (Rechtsklick bzw. Strg + Klick) und wählen Sie im Menü &#039;&#039;Paketinhalt anzeigen&#039;&#039;. Ersetzen Sie alle Dateien, die bereits mit gleichem Namen enthalten sind.&lt;br /&gt;
&lt;br /&gt;
==== Appium über npm installieren ====&lt;br /&gt;
Sie können Appium auch über npm (Node Package Manager) installieren. Dazu müsen Sie erst node/npm installieren. Das geht mit [https://github.com/nvm-sh/nvm nvm] (Node Version Manager) was Sie von Github bekommen. Falls die folgende Installationsanleitung bei Ihnen nicht funktionieren sollte, finden Sie dort ausführlichere Informationen im [https://github.com/nvm-sh/nvm#readme Readme].&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie ein Terminal-Fenster. Klonen Sie dann das Github-Repository von nvm&lt;br /&gt;
 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash&lt;br /&gt;
und laden Sie es&lt;br /&gt;
 export NVM_DIR=&amp;quot;$([ -z &amp;quot;${XDG_CONFIG_HOME-}&amp;quot; ] &amp;amp;&amp;amp; printf %s &amp;quot;${HOME}/.nvm&amp;quot; || printf %s &amp;quot;${XDG_CONFIG_HOME}/nvm&amp;quot;)&amp;quot; [ -s &amp;quot;$NVM_DIR/nvm.sh&amp;quot; ] &amp;amp;&amp;amp; \. &amp;quot;$NVM_DIR/nvm.sh&amp;quot; # This loads nvm&lt;br /&gt;
&lt;br /&gt;
Führen Sie danach&lt;br /&gt;
 command -v nvm&lt;br /&gt;
aus, um zu testen, ob es funktioniert hat. Es sollte &#039;&#039;nvm&#039;&#039; ausgegeben werden. Kommt keine Antwort, führen Sie&lt;br /&gt;
 touch ~/.zshrc&lt;br /&gt;
aus, und versuchen Sie es erneut.&lt;br /&gt;
&lt;br /&gt;
Nun können Sie node mit dem folgenden Befehl installieren.&lt;br /&gt;
 nvm install 16.15.1&lt;br /&gt;
Da es mit der aktuellen Version von node Probleme beim Installieren von Appium gibt, empfehlen wir diese Version.&lt;br /&gt;
&lt;br /&gt;
Nachdem node installiert ist, können Sie Appium darüber installieren:&lt;br /&gt;
 npm install -g appium&lt;br /&gt;
&lt;br /&gt;
Den Appium-Server können Sie nun einfach über den Befehl&lt;br /&gt;
 appium&lt;br /&gt;
starten. Die Ausgabe erfolgt dann direkt im Terminal.&lt;br /&gt;
&lt;br /&gt;
Auch bei dieser Version gibt es das Problem bei der Signierung des WebDriverAgents, wie bei [[#Appium_Desktop | Appium Desktop]] beschrieben. Laden Sie also auch in diesem Fall eine neuere Version des WebDriverAgents herunter und ersetzen Sie die alten Dateien. Diese finden Sie unter&lt;br /&gt;
 /Users/&amp;lt;user&amp;gt;/.nvm/versions/16.15.1/lib/appium/node_modules/appium-webdriveragent/&lt;br /&gt;
&lt;br /&gt;
==== Mobile Testing Supplement ====&lt;br /&gt;
Ältere Appium-Versionen stellen wir Ihnen über das Mobile Testing Supplement für Mac OS zur Verfügung, mit dem Sie es einfach installieren können:&lt;br /&gt;
* &#039;&#039;&#039;expecco 20.2&#039;&#039;&#039;: [https://download.exept.de/transfer/h-expecco-20.2.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement für Mac OS (1.2.2)]&lt;br /&gt;
:Enthält Appium Version 1.18.3 und verwendet node 14.&lt;br /&gt;
&lt;br /&gt;
* expecco 20.1: [https://download.exept.de/transfer/h-expecco-20.1.0/Mobile_Testing_Supplement_for_Mac_OS.tar.bz2 Mobile Testing Supplement für Mac OS (1.2.0)]&lt;br /&gt;
:Nur wenige Änderungen im Vergleich zur vorigen Version.&lt;br /&gt;
&lt;br /&gt;
* expecco 19.2: [http://download.exept.de/transfer/h-expecco-19.2.0/MobileTestingSupplement_for_MacOS.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.98)]&lt;br /&gt;
:Im Vergleich zur vorigen Version wurde Appium auf die Version 1.16.0-rc.1 aktualisiert und es wird node 12 verwendet. &lt;br /&gt;
&lt;br /&gt;
* expecco 19.1: [http://download.exept.de/transfer/h-expecco-19.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.96.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.96)]&lt;br /&gt;
:Diese Version enthält Appium 1.12.0. &lt;br /&gt;
&lt;br /&gt;
* expecco 18.1: [http://download.exept.de/transfer/h-expecco-18.1.0/Mobile_Testing_Supplement_for_Mac_OS_1.1.94.tar.bz2 Mobile Testing Supplement für Mac OS (1.1.94)]&lt;br /&gt;
:Diese Version enthält Appium 1.8.0.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.11: [http://download.exept.de/transfer/h-expecco-2.11.1/Mobile_Testing_Supplement_for_Mac_OS_1.0.94.tar.bz2 Mobile Testing Supplement für Mac OS (1.0.94)]&lt;br /&gt;
:Diese Version enthält Appium 1.6.4.&lt;br /&gt;
&lt;br /&gt;
* expecco 2.10: [http://download.exept.de/transfer/h-expecco-2.10.0/Mobile_Testing_Supplement_for_Mac_OS_1.0.tar.bz2 Mobile Testing Supplement für Mac OS]&lt;br /&gt;
:Diese Version entält Appium 1.4.16.&lt;br /&gt;
&lt;br /&gt;
Nachdem Herunterladen des Supplements, können Sie es in ein Verzeichnis Ihrer Wahl (z. B. Ihr Home-Verzeichnis) verschieben und dort entpacken. Ein geeigneter Befehl in einer Shell könnte wie folgt aussehen, passen Sie dabei die Versionsnummer entsprechend an:&lt;br /&gt;
&lt;br /&gt;
 tar -xvpf Mobile_Testing_Supplement_for_Mac_OS_1.1.98.tar.bz2&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Ihre Standard-Xcode-Installation verwenden wollen, können Sie Appium direkt über die Datei im &#039;&#039;bin&#039;&#039;-Verzeichnis mit der entsprechenden Versionsnummer starten:&lt;br /&gt;
&lt;br /&gt;
 Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
Falls Sie ein anderes Xcode als das als Standard konfigurierte verwenden wollen, müssen Sie Appium den entsprechenden Pfad über die Umgebungsvariable &#039;&#039;DEVELOPER_DIR&#039;&#039; angeben. &lt;br /&gt;
Wenn Sie Xcode z. B. in &#039;&#039;/Applications/Xcode-11.3.app&#039;&#039; installiert haben, müssten Sie Appium so starten:&lt;br /&gt;
&lt;br /&gt;
 DEVELOPER_DIR=&amp;quot;/Applications/Xcode-11.3.app/Contents/Developer&amp;quot; Mobile_Testing_Supplement/bin/start-appium-1.16.0-rc.1&lt;br /&gt;
&lt;br /&gt;
Was als Standard-Xcode-Installation gesetzt ist, zeigt der Befehl:&lt;br /&gt;
&lt;br /&gt;
 xcode-select -p&lt;br /&gt;
&lt;br /&gt;
Wenn Appium Ihre Xcode-Installation nicht findet, erscheint beim Verbinden eine Fehlermeldung in der Art:&lt;br /&gt;
&#039;&#039;&amp;lt;blockquote&amp;gt;org.openqa.selenium.SessionNotCreatedException - A new session could not be created. (Original error: Could not find path to Xcode, environment variable DEVELOPER_DIR set to: /Applications/Xcode.app but no Xcode found)&amp;lt;/blockquote&amp;gt;&#039;&#039;&lt;br /&gt;
Starten Sie in diesem Fall Appium erneut, unter Angabe eines gültigen &#039;&#039;DEVELOPER_DIR&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== WebDriverAgent-Signierung ====&lt;br /&gt;
Zur Automatisierung lädt Appium eine App namens WebDriverAgent auf das Gerät und muss sie dafür signieren können. Dazu brauchen Sie einen Apple-Account und ein entsprechendes Zertifikat. Zur Evaluierung können Sie einen kostenlosen Account verwenden. Dieser hat den Nachteil, dass erstellte Profile nur eine Woche gültig sind und danach neu erstellt werden müssen. Seien Sie auch vorsichtig, wenn Sie sich den Account teilen, da es vorkommen kann, dass Zertifikate widerrufen werden oder durch automatische Generierung ungültig werden. Als Folge können bereits signierte Apps nicht mehr verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie bereits ein entsprechendes Zertifikat mit dem zugehörigen privaten Schlüssel in Ihrer [https://support.apple.com/de-de/guide/keychain-access/welcome/mac Schlüsselbundverwaltung] auf dem Mac haben, können Sie den WebDriverAgent automatisch signieren lassen. Ansonsten empfiehlt es sich, die Signierung über Xcode einzustellen und zu verwalten.&lt;br /&gt;
&lt;br /&gt;
Schließen Sie zuerst das Gerät, das Sie verwenden möchten, über USB an den Mac an. Stellen Sie sicher, dass sich der Mac und das Gerät im selben Netzwerk befinden, ansonsten kann es beim Verbindungsaufbau mit Appium zu Problemen kommen. Starten Sie Xcode und öffnen Sie &#039;&#039;Preferences&#039;&#039;. Wechseln Sie zur Seite der Accounts und legen Sie einen Eintrag mit Ihrem Account an. Anschließend können Sie auf &#039;&#039;Manage Certificates...&#039;&#039; klicken, um die Zertifikate zu sehen, die zu diesem Account gehören. Zum Ausführen von Tests benötigen Sie ein iOS-Development-Zertifikat und den dazugehörigen privaten Schlüssel. Wenn Sie noch keines besitzen, erstellen Sie eines. Wenn Sie bereits eines haben, aber es nicht in Ihrem Schlüsselbund vorhanden ist (erkennbar an dem Hinweis &amp;quot;Not in Keychain&amp;quot;), können Sie es importieren. Das können Sie über die [https://support.apple.com/de-de/guide/keychain-access/welcome/mac Schlüsselbundverwaltung] auf dem Mac machen, wenn Sie es zuvor aus dem Schlüsselbund exportiert haben, in dem es sich befindet. Das Zertifikat mit dem zugehörigen Schlüssel sollte sich im Schlüsselbund &#039;&#039;Anmeldung&#039;&#039; befinden. Dort kann es als PKCS#12-Datei (Endung typischerweise .p12) exportiert werden. Um ein Zertifikat in Ihren Schlüsselbund zu importieren, wählen Sie im Menü &#039;&#039;Ablage&#039;&#039; die Option &#039;&#039;Objekte importieren&#039;&#039;. Falls Sie nicht wissen, wo das Zertifikat gespeichert ist, können Sie es in Xcode auch widerrufen und in Ihrem Schlüsselbund neu anlegen. Machen Sie das jedoch nur, wenn Sie wissen, dass das alte Zertifikat nicht mehr in Verwendung ist, da es danach nicht mehr benutzt werden kann. Nun sollte Ihr Schlüsselbund ein iOS-Development-Zertifikat enthalten.&lt;br /&gt;
&amp;lt;!---(Ich habe den folgenden Teil mal rausgenommen. Man braucht das nicht, wenn es in Xcode eingestellt ist.) Wählen Sie im Rechtsklick-Menü den Punkt &#039;&#039;Informationen&#039;&#039; aus. Unter den Details des Zertifikats finden Sie die Team-ID, die hier als Organisationseinheit bezeichnet wird. Tragen Sie diese in den Einstellungen des Plugins im Feld &#039;&#039;Team-ID&#039;&#039; ein, siehe [[#Konfiguration_des_Plugins|Konfiguration des Plugins]].--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie nun das WebDriverAgent-Projekt in Xcode. Wenn Sie das Mobile Testing Supplement installiert haben, finden Sie es in dessen Verzeichnis unter&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
Wenn Sie Appium Desktop installier haben, finden Sie es unter&lt;br /&gt;
 &#039;&#039;&amp;lt;nowiki&amp;gt;/Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
Sie können einfach im Finder zu der Xcode-Project-Datei navigieren und Sie über einen Doppelklick öffnen. Beachten Sie dabei, dass Sie dabei auf die Anwendung Appium Server GUI einen Kontextklick (Rechtsklick bzw. Strg + Klick) machen und im Menü &#039;&#039;Paketinhalt anzeigen&#039;&#039; auswählen müssen, um in deren Unterverzeichnis zu gelangen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingWebDriverAgentXcode.png]]&lt;br /&gt;
&lt;br /&gt;
Wählen Sie &#039;&#039;WebDriverAgentLib&#039;&#039; und die Seite &#039;&#039;Signing &amp;amp; Capabilities&#039;&#039; aus. Setzen Sie dort im Abschnitt &#039;&#039;Signing&#039;&#039; die Option &#039;&#039;Automatically manage signing&#039;&#039; und wählen Sie dann ein Team aus. Wechseln Sie nun zu &#039;&#039;WebDriverAgentRunner&#039;&#039; und tun Sie dort dasselbe.&lt;br /&gt;
&amp;lt;!--(Das Folgende scheint nicht mehr aktuell zu sein.) Es sollten an dieser Stelle Fehler angezeigt werden, dass kein Provisioning Profile angelegt oder gefunden wurde. Wechseln Sie deshalb zur Seite &#039;&#039;Build Settings&#039;&#039; und suchen Sie hier im Abschnitt &#039;&#039;Packaging&#039;&#039; den Eintrag &#039;&#039;Product Bundle Identifier&#039;&#039;. Ändern Sie diesen von com.facebook.WebDriverAgentRunner zu etwas, das von Xcode akzeptiert wird, indem Sie den Präfix ändern. Xcode kann nun ein passendes Provisioning Profile generieren und die Fehler auf der General-Seite sollten verschwinden. Danach können Sie Xcode beenden. --&amp;gt;&lt;br /&gt;
Durch das Setzen des Teams sollten die Fehler für den WebDriverAgentRunner verschwinden. Sollte Xcode kein passendes Provisioning Profile für die Bundle ID &#039;&#039;com.facebook.WebDriverAgentRunner&#039;&#039; erstellen können, können Sie diese anpassen, dass sie zu Ihrem Zertifikat passt. Danach können Sie Xcode beenden oder auch, wie weiter unten beschrieben, direkt den Build über Xcode starten, damit das Projekt bereits gebaut ist, wenn Appium es verwenden möchte.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie sich nun von expecco eine Verbindung zu Ihrem Gerät aufbauen, wird der WebDriverAgent darauf installiert und gestartet, um anschließend zur zu testenden App zu wechseln. Eventuell muss auf dem Gerät muss der Ausführung des WebDriverAgents vertraut noch werden. Ein Anzeichnen dafür kann sein, dass die App WebDriverAgent zwar auf dem Gerät erscheint und zu starten versucht, danach aber wieder deinstalliert wird. Öffnen Sie dazu während des Verbindungsaufbaus auf dem Gerät in die Einstellungen und dort unter &#039;&#039;Allgemein&#039;&#039; den Eintrag &#039;&#039;Geräteverwaltung&#039;&#039;. Dieser Eintrag ist nur sichtbar, wenn eine Entwickler-App auf dem Gerät installiert ist. Sie müssen daher möglicherweise warten, bis der WebDriverAgent installiert ist, bevor der Eintrag erscheint. Wählen Sie dort den Eintrag Ihres Apple-Accounts und vertrauen Sie ihm. Da der WebDriverAgent wieder deinstalliert wird, wenn der Start nicht funktioniert hat, müssen Sie dies während des Verbindungsaufbaus tun. Falls Ihnen das zu hektisch ist, können Sie auch folgenden Code ausführen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;xcodebuild -project Mobile_Testing_Supplement/lib/node_modules/appium-1.16.0-rc.1/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
  xcodebuild -project /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination &#039;id=&amp;lt;udid&amp;gt;&#039; test&lt;br /&gt;
&lt;br /&gt;
Damit wird der WebDriverAgent auf dem Gerät installiert ohne dass er wieder gelöscht wird.&lt;br /&gt;
&lt;br /&gt;
Wenn es Probleme beim Installieren des WebDriverAgents gibt, können Sie auch versuchen, den Build über Xcode zu starten. Stellen Sie sicher, dass das richtige Target &#039;&#039;WebDriverAgent&#039;&#039; ausgewählt ist. Fehlermeldungen in Xcode zeigen vielleicht einfacher, wo das Problem liegt. Manchmal hilft es auch, es ein zweites Mal zu versuchen, weil es möglicherweise beim ersten Mal zu lange gedauert hat und abgebrochen wurde. Es kann sein, dass Sie während des Builds mehrmals aufgefordert werden, das Passwort für Ihren Schlüsselbund anzugeben.&lt;br /&gt;
&lt;br /&gt;
[[Datei:WebDriverAgentCodesign.png]]&lt;br /&gt;
&lt;br /&gt;
Lesen Sie auch die Dokumentation von Appium zum [https://github.com/appium/appium-xcuitest-driver/blob/master/docs/real-device-config.md Aufsetzen von Tests mit iOS-Geräten]. In der [https://support.apple.com/en-us/HT204460 Dokumentation von Apple] finden Sie nähere Informationen zum Installieren und Vertrauen von Apps.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration des Plugins ==&lt;br /&gt;
Bevor Sie loslegen, sollten Sie die Einstellungen des Mobile Testing Plugins überprüfen und ggf. anpassen.&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie im Menü den Punkt &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot;  &amp;amp;#8594; &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; und dort unter &amp;quot;&#039;&#039;Erweiterungen&#039;&#039;&amp;quot; den Eintrag &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot; (s. Abb.). Standardmäßig werden diese Pfade automatisch gefunden (1). Um einen Pfad manuell anzupassen, deaktivieren Sie den entsprechenden Haken rechts davon. Sie erhalten in einer Drop-down-Liste einige Pfade zur Auswahl. Ist ein eingetragener Pfad falsch oder kann er nicht gefunden werden, wird das Feld rot markiert und es erscheint ein diesbezüglicher Hinweis. Stellen Sie sicher, dass alle Pfade richtig angegeben sind.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingEinstellungen.png | thumb | 400px | Konfiguration des Plugins]]&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;appium&#039;&#039;&#039;: Geben Sie hier den Pfad zur ausführbaren Datei an mit der Appium in der Kommandozeile gestartet werden kann. Unter Windows wird diese Datei in der Regel &amp;quot;&amp;lt;code&amp;gt;appium.cmd&amp;lt;/code&amp;gt;&amp;quot; heißen. Dieser Pfad wird benutzt, wenn expecco einen Appium-Server startet.&lt;br /&gt;
*&#039;&#039;&#039;node&#039;&#039;&#039;: Geben Sie hier den Pfad zur ausführbaren Datei an, die Node (auch &amp;quot;Node.js&amp;quot;) startet. Dieser Pfad wird beim Starten eines Servers an Appium weitergegeben, damit Appium ihn unabhängig von der PATH-Variablen findet. Unter Windows heißt diese Datei in der Regel &amp;quot;&amp;lt;code&amp;gt;node.exe&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;JAVA_HOME&#039;&#039;&#039;: Geben Sie hier den Pfad zu einem JDK an. Dieser Pfad wird an jeden Appium-Server weitergegeben. Lassen Sie das Feld frei, um den Wert aus der Umgebungsvariablen zu verwenden. Um einzustellen, welches Java von expecco verwendet werden soll, setzen Sie diesen Pfad in den Einstellungen für die Java Bridge.&lt;br /&gt;
*&#039;&#039;&#039;ANDROID_HOME&#039;&#039;&#039;: Geben Sie hier den Pfad zu einem SDK von Android an. Dieser Pfad wird an jeden Appium-Server weitergegeben. Lassen Sie das Feld frei, um den Wert aus der Umgebungsvariablen zu verwenden.&lt;br /&gt;
*&#039;&#039;&#039;adb&#039;&#039;&#039;: Hier steht der Pfad zum adb-Befehl. Unter Windows heißt die Datei adb.exe. Diese wird von expecco beispielsweise verwendet, um die Liste der angeschlossenen Geräte zu erhalten. Diesen Pfad sollten Sie automatisch wählen lassen, da dann der Befehl im ANDROID_HOME-Verzeichnis verwendet wird. Dieser wird auch von Appium verwendet. Falls expecco und Appium jedoch verschiedene Versionen von adb verwenden kann es zu Konflikten kommen.&lt;br /&gt;
*&#039;&#039;&#039;android.bat&#039;&#039;&#039;: Diese Datei wird nur benötigt, um damit den AVD und den SDK Manager zu starten. Automatisch wird hier die Datei im ANDROID_HOME-Verzeichnis gesucht.&lt;br /&gt;
*&#039;&#039;&#039;aapt&#039;&#039;&#039;: Geben Sie hier den Pfad zum aapt-Befehl an. Unter Windows heißt diese Datei &#039;&#039;aapt.exe&#039;&#039;. expecco verwendet aapt nur im Verbindungseditor, um das Paket und die Activities einer apk-Datei zu lesen. Automatisch wird hier die Datei im ANDROID_HOME-Verzeichnis gesucht.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingJavaBridgeEinstellungen.png | thumb | 400px | Konfiguration des JDKs]]&lt;br /&gt;
&lt;br /&gt;
Ab expecco 2.11 gibt es das Feld &#039;&#039;Team-ID&#039;&#039;. Wenn Sie iOS-Tests ausführen, tragen Sie hier die Team-ID Ihres Zertifikats ein. Diese wird für jede iOS-Verbindung verwendet, außer Sie setzen den Wert im Einzelfall in den Verbindungseinstellungen um. Wie Sie die Team-ID erhalten, lesen Sie im Abschnitt zur [[#Signierung|Signierung]] ber der Installation auf Mac OS. Mit expecco 2.10 können Sie die Team-ID nur für jede Verbindungseinstellung extra als Capability eintragen. Dazu müssen Sie jedoch die [[#Erweiterte_Ansicht|erweiterte Ansicht]] verwenden. Geben Sie hier die Capability &#039;&#039;xcodeOrgId&#039;&#039; an und setzen Sie als Wert die Team-ID des Zertifikats.&lt;br /&gt;
&lt;br /&gt;
Die Einstellung zur Serveradresse unten auf der Seite bezieht sich auf das Verhalten des Verbindungseditors. Dieser prüft am Ende, ob die Serveradresse auf &#039;&#039;/wd/hub&#039;&#039; endet, da dies die übliche Form ist. Falls nicht, wird in einem Dialog gefragt, wie darauf reagiert werden soll. Das festgelegte Verhalten kann hier eingesehen und verändert werden.&lt;br /&gt;
&lt;br /&gt;
Wechseln Sie ebenfalls zum Eintrag &#039;&#039;Java Bridge&#039;&#039; (s. Abb.). Hier muss der Pfad zu Ihrer Java-Installation angegeben werden, die von expecco benutzt wird. Tragen Sie hier ein JDK ein. Falls Sie unter Windows das aus dem Mobile Testing Supplement verwenden möchten, lautet der Pfad&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;C:\Program Files (x86)\exept\Mobile Testing Supplement\jdk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Sie können auch die Systemeinstellungen verwenden.&lt;br /&gt;
&lt;br /&gt;
== Android-Gerät vorbereiten ==&lt;br /&gt;
Wenn Sie ein Android-Gerät unter Windows anschließen benötigen Sie möglicherweise noch einen adb-Treiber für das Gerät. Einen passenden Treiber finden Sie üblicherweise auf der jeweiligen Webseite des Herstellers. Haben Sie den Universal-Treiber aus dem Mobile Testing Supplement installiert, sollte für die meisten Geräte bereits alles funktionieren. In einigen Fällen versucht auch Windows automatisch einen Treiber zu installieren, wenn Sie das Gerät zum ersten mal anschließen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===USB-Debugging Einschalten===&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
Bevor Sie ein Mobilgerät mit dem Appium-Plugin ansteuern können, müssen Sie für dieses Debugging erlauben!&lt;br /&gt;
&lt;br /&gt;
Für Android-Geräte finden Sie diese Option in den Einstellungen unter &#039;&#039;[https://www.droidwiki.org/wiki/Entwickleroptionen Entwickleroptionen]&#039;&#039; mit dem Namen &#039;&#039;[https://www.droidwiki.org/USB-Debugging USB-Debugging]&#039;&#039;. Falls die Entwickleroptionen nicht angezeigt werden, können Sie diese freischalten, indem Sie unter &amp;quot;&#039;&#039;Über das Telefon&#039;&#039;&amp;quot; siebenmal auf &amp;quot;&#039;&#039;Build-Nummer&#039;&#039;&amp;quot; tippen.&lt;br /&gt;
&lt;br /&gt;
===Wach bleiben Aktivieren===&lt;br /&gt;
Aktivieren Sie auch die Funktion &#039;&#039;Wach bleiben&#039;&#039;, damit das Gerät nicht während der Testerstellung oder -ausführung den Bildschirm abschaltet.&lt;br /&gt;
&lt;br /&gt;
Aus Sicherheitsgründen muss USB-Debugging für jeden Computer einzeln zugelassen werden. Beim Verbinden des Geräts mit dem PC über USB müssen Sie dabei am Gerät der Verbindung zustimmen. Falls Sie dies für Ihren Computer noch nicht getan haben, aber auf dem Gerät kein entsprechender Dialog erscheint, kann es helfen, das Gerät aus- und wieder einzustecken. Das kann insbesondere dann passieren, wenn Sie den ADB-Treiber installiert haben während das Gerät bereits über USB angeschlossen war. Falls auch das nicht hilft, öffnen Sie die Benachrichtigungen, indem Sie sie vom oberen Bildschirmrand herunter ziehen. Dort finden Sie die USB-Verbindung und Sie können die Optionen dazu öffnen. Wählen Sie einen anderen Verbindungstypen aus; in der Regel sollten MTP oder PTP funktionieren.&lt;br /&gt;
&lt;br /&gt;
Sie können auch auf einem Emulator testen. Dieser muss nicht gesondert vorbereitet werden, da er bereits für USB-Debugging ausgelegt ist. Es ist sogar möglich, einen Emulator bei Testbeginn zu starten.&lt;br /&gt;
&lt;br /&gt;
Um zu überprüfen, ob ein Gerät, das Sie an Ihren Rechner angeschlossen haben, verwendet werden kann, öffnen Sie den [[#Verbindungseditor|Verbindungseditor]]. Das Gerät sollte dort angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Verbindung über WLAN ===&lt;br /&gt;
Es ist auch möglich, Android-Geräte über WLAN zu verbinden. Für Geräte mit Android 11 oder neuer ist dies direkt über WLAN möglich, im anderen Fall müssen Sie das Gerät zuerst über USB verbinden. Ab expecco 22.1 können Sie eine WLAN-Verbindung über den [[Mobile Testing Plugin#Verbindungseditor|Verbindungseditor]] aufbauen. Ansonsten ist es auch über die Eingabeaufforderung möglich.&lt;br /&gt;
==== Drahtlos verbinden über die Eingabeaufforderung mit expecco Versionen vor 22.1 (ab Android 11) ====&lt;br /&gt;
Mit expecco ab Version 22.1 funktioniert das einfacher über den Verbindungseditor.&lt;br /&gt;
&lt;br /&gt;
Erlauben Sie in den Entwickleroptionen des Geräts Debugging über WLAN und öffnen Sie dessen Optionen. Sie müssen zuerst das Gerät mit dem  Rechner koppeln. Wählen Sie dazu &amp;quot;&#039;&#039;Gerät mit einem Kopplungscode koppeln&#039;&#039;&amp;quot;, um einen Kopplungscode und eine IP-Adresse mit Port zu erhalten. Öffnen Sie dann auf dem Rechner die Eingabeaufforderung und geben Sie dort ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb pair &amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Kopplungsport&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
wobei Sie &amp;lt;tt&amp;gt;&amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Kopplungsport&amp;gt;&amp;lt;/tt&amp;gt; durch die auf dem Gerät angezeigte IP-Adresse &amp;amp; Port ersetzen. Danach werden Sie aufgefordert, den Kopplungscode einzugeben. Wenn alles geklappt hat, sollte sich das Popup auf dem Gerät schließen und der Rechner als gekoppeltes Gerät angezeigt werden. Geben Sie dann in der Eingabeaufforderung ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP-Adresse des Geräts&amp;gt;:&amp;lt;Debug-Port&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die IP-Adresse ist hier noch die gleiche wie beim Koppeln, aber der Port ist ein anderer. Beides wird als IP-Adresse &amp;amp; Port auf dem Gerät angezeigt. Damit sollte das Gerät nun über WLAN verbunden sein und kann genauso verwendet werden, wie mit USB-Verbindung. Sie können dies überprüfen, indem Sie entweder &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; eingeben oder in expecco den Verbindungsdialog öffnen. In der Liste taucht das Gerät mit seiner IP-Adresse und dem Port auf. Bedenken Sie, dass die WLAN-Verbindung nicht mehr besteht, wenn der ADB-Server oder das Gerät neu gestartet werden. Häufig wird beim Neustart des Geräts auch die Erlaubnis für das Debugging über WLAN wieder zurückgesetzt und der verwendete Port ändert sich. Die Kopplung bleibt aber bestehen und muss beim nächsten Verbinden nicht noch einmal durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==== WLAN Verbindung über USB starten (Android 10 und früher) ====&lt;br /&gt;
Verbinden Sie zunächst das Gerät über USB mit dem Rechner. Öffnen Sie dann die Eingabeaufforderung und geben Sie dort ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit lauscht das Gerät auf eine TCP/IP-Verbindung an Port 5555. Sollten Sie mehrere Geräte angeschlossen oder Emulatoren laufen haben, müssen Sie genauer angeben, welches Gerät Sie meinen. Geben Sie in diesem Fall ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb devices -l&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Sie erhalten eine Liste aller Geräte, wobei die erste Spalte deren Kennung ist. Schreiben Sie dann stattdessen&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb -s &amp;lt;Gerätekennung&amp;gt; tcpip 5555&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
mit der Gerätekennung des gewünschten Geräts. Sie können die USB-Verbindung nun trennen. Jetzt müssen Sie die IP-Adresse Ihres Gerätes in Erfahrung bringen. Sie finden diese üblicherweise irgendwo in den Einstellungen des Geräts, beispielsweise beim Status oder in den WLAN-Einstellungen. Geben Sie dann ein:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;adb connect &amp;lt;IP-Adresse des Geräts&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit sollte das Gerät nun über WLAN verbunden sein und kann genauso verwendet werden, wie mit USB-Verbindung. Sie können dies überprüfen, indem Sie wieder &amp;lt;tt&amp;gt;adb devices -l&amp;lt;/tt&amp;gt; eingeben oder in expecco den Verbindungsdialog öffnen. In der Liste taucht das Gerät mit seiner IP-Adresse und dem Port auf. Bedenken Sie, dass die WLAN-Verbindung nicht mehr besteht, wenn der ADB-Server oder das Gerät neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
=== Verbindung zu einem Emulator ===&lt;br /&gt;
Sie benötigen dazu den Emulator selbst, sowie mindestens ein AVD (Android Virtual Device). Hinweise zu Installation finden Sie in der [https://developer.android.com/studio/run/emulator Android Studio Dokumentation].&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Android Studio bereits mit den Defaulteinstellungen installiert haben &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;, sollte der Emulator bereits mitinstalliert sein. Falls nicht, wählen Sie in Android Studio &amp;quot;&#039;&#039;Configure&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;SDK Manager&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Android SDK&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;SDK Tools&#039;&#039;&amp;quot; - &#039;&#039;Android Emulator&#039;&#039;&amp;quot;, sowie dort die &amp;quot;&#039;&#039;Platform Tools&#039;&#039;&amp;quot;.&lt;br /&gt;
Alternativ geht das auch über die Kommandzeile mit dem &amp;quot;sdkmanager&amp;quot; Kommando.&lt;br /&gt;
&lt;br /&gt;
Als nächstes benötigen Sie mindestens ein AVD; auch dies geht am einfachsten über den Dialog in Android Studio:&lt;br /&gt;
wählen sie &amp;quot;&#039;&#039;Configure&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;AVD Manager&#039;&#039;&amp;quot; und folgen den Anweisungen (Deviceauswahl, Platform und Android Version).  &lt;br /&gt;
&lt;br /&gt;
Auch wenn Sie den Emulator automatisieren benötigen sie Appium; installieren Sie dieses entweder mit dem Mobile Testing Supplement, oder direkt von der Appium homepage (https://github.com/appium/appium-desktop/releases).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;Android Studio selbst wird nicht von expecco benötigt; es bietet aber kompfortable Dialoge zum Installieren von Paketen und AVDs.&lt;br /&gt;
&lt;br /&gt;
== iOS-Gerät und App vorbereiten ==&lt;br /&gt;
Das Ansteuern von iOS-Geräten ist nur über einen Mac möglich. Lesen Sie daher auch den Abschnitt zur [[#Mac_OS|Installation unter Mac OS]].&lt;br /&gt;
&lt;br /&gt;
Bevor Sie ein Mobilgerät mit dem Mobile Testing Plugin ansteuern können, müssen Sie für iOS-Geräte ab iOS 8 Debugging erlauben. Aktivieren Sie dazu die Option &#039;&#039;Enable UI Automation&#039;&#039; unter dem Menüpunkt &#039;&#039;Entwickler&#039;&#039; in den Einstellungen des Geräts. Falls Sie den Eintrag &#039;&#039;Entwickler&#039;&#039; in den Einstellungen nicht finden, gehen Sie wie folgt vor: Schließen Sie das Gerät über USB an den Mac an. Dabei müssen Sie ggf. am Gerät noch der Verbindung zustimmen. Starten Sie Xcode und wählen Sie dann in der Menüleiste am oberen Bildschirmrand im Menü &#039;&#039;Window&#039;&#039; den Eintrag &#039;&#039;Devices&#039;&#039;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wählen Sie dort Ihr Gerät aus. Danach sollte der Eintrag &#039;&#039;Entwickler&#039;&#039; in den Einstellungen auf dem Gerät auftauchen. Dazu müssen Sie möglicherweise die Einstellungen beenden und neu starten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Alert.png | thumb | 270px | Beispiel für einen Alert unter iOS]]&lt;br /&gt;
Ein Verbindungsaufbau zu dem Gerät ist nicht möglich solange es bestimmte Alerts zeigt. Ein solcher Alert kann z.&amp;amp;#x202f;B. erscheinen wenn FaceTime aktiviert ist, indem ein Hinweis auf anfallende SMS-Gebühren angezeigt wird (siehe Screenshot). Achten Sie darauf, das Gerät so zu konfigurieren, dass es im Leerlauf keine solchen Alerts zeigt.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.11 und später ===&lt;br /&gt;
Sie können beliebige Apps testen, die auf dem verwendeten Gerät lauffähig oder bereits installiert sind. Wenn die App als Development-Build vorliegt, muss die UDID des Geräts in der App hinterlegt sein. In jedem Fall muss der WebDriverAgent für das Gerät signiert werden. Lesen Sie dazu den Abschnitt zur [[#Signierung|Signierung]] unter Mac OS.&lt;br /&gt;
&lt;br /&gt;
Falls Sie in einem Test den Home-Button verwenden wollen, müssen Sie auf dem Gerät AssistiveTouch aktivieren. Sie finden diese Option in den Einstellungen unter &#039;&#039;Allgemein&#039;&#039; &amp;gt; &#039;&#039;Bedienungshilfen&#039;&#039; &amp;gt; &#039;&#039;AssistiveTouch&#039;&#039;. Platzieren Sie dann das Menü in der Mitte des oberen Bildschirmrands. Sie können das Drücken des Home-Buttons dann mit dem entsprechenden Menüeintrag im Recorder aufzeichnen oder direkt den Baustein &#039;&#039;Press Home Button&#039;&#039; benutzen.&lt;br /&gt;
&lt;br /&gt;
=== expecco 2.10 ===&lt;br /&gt;
Die App, die Sie verwenden wollen, muss als Development-Build vorliegen. Außerdem muss die UDID des Geräts in der App hinterlegt sein.&lt;br /&gt;
&lt;br /&gt;
=== Development-Build signieren ===&lt;br /&gt;
Ein Development-Build einer App ist nur für eine begrenzte Zahl von Geräten zugelassen und kann auf anderen Geräten nicht gestartet werden. Es ist aber möglich, das Zertifikat und die verwendbaren Geräte in einem Development-Build auszutauschen.&lt;br /&gt;
&lt;br /&gt;
* Evaluierung mit Demo-App von eXept:&lt;br /&gt;
:Gerne stellen wir Ihnen eine Demo-App zur Verfügung, die als Development-Build vorliegt und die wir für Ihr Gerät signieren können. Senden Sie dazu bitte Ihrem eXept-Ansprechpartner die UDID Ihres Gerätes zu. Wie Sie die UDID Ihres Gerätes ermitteln können, ist im folgenden Abschnitt beschrieben.&lt;br /&gt;
&lt;br /&gt;
* Eigene App für Ihr Testgerät verwenden:&lt;br /&gt;
:Wenn Sie von den App-Entwicklern einen Development-Build (IPA-Datei) erhalten, der für Ihr Testgerät zugelassen ist, können Sie diesen direkt verwenden. Dazu müssen Sie den Entwicklern die UDID Ihres Geräts mitteilen, damit sie diese eintragen können. &#039;&#039;&#039;Sie können die UDID eines Gerätes mithilfe von Xcode auslesen&#039;&#039;&#039;. Starten Sie dazu Xcode und wählen Sie in der Menüleiste am oberen Bildschirmrand im Menü &#039;&#039;Window&#039;&#039; den Eintrag &#039;&#039;Devices&#039;&#039;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wählen Sie Ihr Gerät aus und suchen Sie in Eigenschaften den Eintrag &#039;&#039;Identifier&#039;&#039;. Die UDID ist eine 40-stellige Hexadezimalzahl.&lt;br /&gt;
&lt;br /&gt;
* Extern entwickelte App für Ihr Testgerät umsignieren:&lt;br /&gt;
:Es können auch Apps umsigniert werden, damit Sie auf anderen Geräten lauffähig sind. Dieser Vorgang ist jedoch kompliziert und setzt insbesondere einen Zugang zu einem Apple-Developer-Account voraus. Eine Dokumentation zur Vorgehensweise ist derzeit in Vorbereitung.&lt;br /&gt;
&lt;br /&gt;
:Für die Evaluierung unterstützen wir Sie gerne beim Umsignieren Ihrer App.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Melden Sie sich beim [https://developer.apple.com/ Apple-Webinterface] an. Navigieren Sie zu &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039;. Erzeugen Sie hier ggf. ein Developer-Zertifikat und ein Provisioning Profile für Ihr Gerät und laden Sie beide herunter. Sollten Sie noch keinen Developer Account haben, erstellen Sie hier einen: https://developer.apple.com/enroll/. Hierzu müssen Sie sich mit einer Apple-ID anmelden.&lt;br /&gt;
&lt;br /&gt;
# Team-ID herausfinden (&#039;&#039;Membership&#039;&#039; -&amp;gt; &#039;&#039;Team ID&#039;&#039;)&lt;br /&gt;
# Unter &#039;&#039;Certificates, IDs &amp;amp; Profiles&#039;&#039; Development-Zertifikat auswählen (unter &#039;&#039;+&#039;&#039; anlegen, falls nicht vorhanden) und herunterladen.&lt;br /&gt;
# Unter &#039;&#039;App ID&#039;&#039; Wildcard-App-ID erzeugen, falls nicht vorhanden. App-ID notieren (AppID = Prefix.ID)&lt;br /&gt;
# Gerät hinzufügen, dazu UDID (bzw. &#039;&#039;Identifier&#039;&#039;) des Geräts herausfinden (&#039;&#039;Xcode&#039;&#039; -&amp;gt; &#039;&#039;Window&#039;&#039; (oben in Menüleiste) -&amp;gt; &#039;&#039;Devices&#039;&#039;)&lt;br /&gt;
# Provisionen Profile erstellen: &#039;&#039;iOS App Development&#039;&#039; -&amp;gt; &#039;&#039;AppID&#039;&#039; auswählen -&amp;gt; Zertifikat wählen -&amp;gt; Gerät auswählen -&amp;gt; Profilname anlegen -&amp;gt; Provisioning Profile herunterladen.&lt;br /&gt;
# Das heruntergeladene Zertifikat importieren (&#039;&#039;Downloads&#039;&#039; -&amp;gt; Zertifikat (.cer)&lt;br /&gt;
# SHA1-Fingerabdruck kopieren. Dazu Rechtsklick auf Zertifikat -&amp;gt; &#039;&#039;Information&#039;&#039;, anschließend bis zum Ende der Seite scrollen).&lt;br /&gt;
# Entitlements.plist erstellen (&#039;&#039;Terminal&#039; öffnen -&amp;gt; Downloads/Mobile_Testing_Supplement/bin/gen-entitlements_plist &#039;Team-ID&#039; &#039;App ID&#039; Downloads/Mobile_Testing_Supplement/bin/re-sign-ipa &amp;lt;Pfad zum ipa (z.B. Downloads/expeccoMobileDemo.ipa)&amp;gt; \&lt;br /&gt;
&amp;quot;&amp;lt;Zertifikat (SHA1-Fingerabdruck, z.B. 76 E8 4B E8 78 D5 D7 F9 2E 09 8B D7 E8 FB CE 30 0C F5 D0 EF)&amp;gt;&amp;quot; \&lt;br /&gt;
&amp;lt;Pfad zum Provisionen Profile (z.B. /Users/exept_test/Downloads/dut.mobileprovision)&amp;gt; \&lt;br /&gt;
&amp;lt;Pfad für das Ergebnis-ipa (z.B. Downloads/expeccoMobileDemo_re-signed.ipa)&amp;gt; \&lt;br /&gt;
[Pfad zur entitlements.plist] (z.B. /Users/exept_test/entitlements.plist)&lt;br /&gt;
&lt;br /&gt;
Zum Umsignieren können Sie das entsprechende Skript aus dem Mobile Testing Supplement für Mac OS oder jedes beliebige andere Tool (z.B. isign) verwenden.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zur Verwendung von iOS-Geräten finden Sie auch in der [http://appium.io/slate/en/master/?java#appium-on-real-ios-devices Dokumentation von Appium].&lt;br /&gt;
&lt;br /&gt;
=== Native iOS-Apps ===&lt;br /&gt;
Sie können auch Apps verwenden, die bereits nativ auf dem Gerät vorhanden sind. Dazu müssen Sie deren Bundle-ID kennen und diese dann in die Verbindungseinstellungen eintragen. Hier eine kleine Auswahl gängiger Apps:&lt;br /&gt;
{| style=&amp;quot;text-align:left&amp;quot;&lt;br /&gt;
! App&lt;br /&gt;
!&lt;br /&gt;
! Bundle-ID&lt;br /&gt;
|-&lt;br /&gt;
| App Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.AppStore&lt;br /&gt;
|-&lt;br /&gt;
| Calculator&lt;br /&gt;
| &lt;br /&gt;
| com.apple.calculator&lt;br /&gt;
|-&lt;br /&gt;
| Calendar&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilecal&lt;br /&gt;
|-&lt;br /&gt;
| Camera&lt;br /&gt;
| &lt;br /&gt;
| com.apple.camera&lt;br /&gt;
|-&lt;br /&gt;
| Contacts&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileAddressBook&lt;br /&gt;
|-&lt;br /&gt;
| iTunes Store&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileStore&lt;br /&gt;
|-&lt;br /&gt;
| Mail&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilemail&lt;br /&gt;
|-&lt;br /&gt;
| Maps&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Maps&lt;br /&gt;
|-&lt;br /&gt;
| Messages&lt;br /&gt;
| &lt;br /&gt;
| com.apple.MobileSMS&lt;br /&gt;
|-&lt;br /&gt;
| Phone&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobilephone&lt;br /&gt;
|-&lt;br /&gt;
| Photos&lt;br /&gt;
| &lt;br /&gt;
| com.apple.mobileslideshow&lt;br /&gt;
|-&lt;br /&gt;
| Settings&lt;br /&gt;
| &lt;br /&gt;
| com.apple.Preferences&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Weitere Bundle-IDs finden Sie [https://github.com/joeblau/apple-bundle-identifiers hier].&lt;br /&gt;
&lt;br /&gt;
= Beispiele =&lt;br /&gt;
Bei den Demo-Testsuiten für expecco finden Sie auch Beispiele für Tests mit dem Mobile Testing Plugin. Wählen Sie dazu auf dem Startbildschirm die Option &amp;quot;&#039;&#039;Beispiel aus Datei&#039;&#039;&amp;quot; und öffnen Sie den Ordner &amp;quot;&#039;&#039;mobile&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;TestsuiteMobileTestingDemo&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m01_MobileTestingDemo.ets --&amp;gt;&amp;lt;/span&amp;gt; &#039;&#039;m01_MobileTestingDemo.ets&#039;&#039; ==&lt;br /&gt;
Die Testsuite enthält zwei einfache Testpläne: &amp;quot;&#039;&#039;Simple CalculatorTest&#039;&#039;&amp;quot; und &amp;quot;&#039;&#039;Complex Calculator and Messaging Test&#039;&#039;&amp;quot;. Beide Tests verwenden einen Android-Emulator, den Sie vor Beginn starten müssen. Die Apps, die im Test verwendet werden, gehören zur Grundausstattung des Emulators und müssen daher nicht mehr installiert werden. Da sich die Apps unter jeder Android-Version unterscheiden können, ist es wichtig, dass Ihr Emulator unter Android 6.0 läuft. Außerdem muss die Sprache auf Englisch gestellt sein.&lt;br /&gt;
&lt;br /&gt;
; Simple CalculatorTest&lt;br /&gt;
: Dieser Test verbindet sich mit dem Taschenrechner und gibt die Formel &#039;&#039;2+3&#039;&#039; ein. Das Ergebnis des Rechners wird mit dem erwarteten Wert &#039;&#039;5&#039;&#039; verglichen.&lt;br /&gt;
&lt;br /&gt;
; Complex Calculator and Messaging Test&lt;br /&gt;
: Dieser Test verbindet sich mit dem Taschenrechner und öffnet anschließend den Nachrichtendienst. Dort wartet er auf eine einkommende Nachricht von der Nummer &#039;&#039;15555215556&#039;&#039;, in der eine zu berechnende Formel gesendet wird. Die Nachricht wird zuvor über einen Socket beim Emulator erzeugt. Nach dem Eintreffen der Nachricht wird diese vom Test geöffnet und deren Inhalt gelesen. Danach wird wieder der Taschenrechner geöffnet, die erhaltene Formel eingegeben und das Ergebnis gelesen. Anschließend wechselt der Test wieder zum Nachrichtendienst und sendet das Ergebnis als Antwort.&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;m02_expeccoMobileDemo.ets&#039;&#039; und &#039;&#039;m03_expeccoMobileDemoIOS.ets&#039;&#039; ==&lt;br /&gt;
Diese sind Bestandteil des Tutorials zum Mobile Testing Plugin. Der jeweils enthaltene Testfall ist unvollständig und wird im Zuge des Tutorials ergänzt. Lesen Sie dazu den Abschnitt [[#Tutorial|Tutorial]].&lt;br /&gt;
&lt;br /&gt;
= Tutorial =&lt;br /&gt;
Es gibt ein Tutorial, das das grundsätzliche Vorgehen zur Erstellung von Tests mit dem Mobile Testing Plugin beschreibt. Grundlage dafür ist ein mitgeliefertes Beispiel, bestehend aus einer einfachen App und einer expecco-Testsuite.&lt;br /&gt;
&lt;br /&gt;
Sie finden es auf der Seite [[Mobile_Testing_Tutorial|Mobile Testing Tutorial]] in zwei Versionen für Android und für iOS.&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsAndroid&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m02_expeccoMobileDemo.ets --&amp;gt;&amp;lt;/span&amp;gt;[[Mobile_Testing_Tutorial#Erste_Schritte_mit_Android|Erste Schritte mit Android]]&lt;br /&gt;
* &amp;lt;span id=&amp;quot;FirstStepsIOS&amp;quot;&amp;gt;&amp;lt;!-- Referenced by m03_expeccoMobileDemoIOS.ets --&amp;gt;&amp;lt;/span&amp;gt;[[Mobile_Testing_Tutorial#Erste_Schritte_mit_iOS|Erste Schritte mit iOS]]&lt;br /&gt;
&lt;br /&gt;
= Dialoge des Mobile Testing Plugins =&lt;br /&gt;
== Verbindungseditor ==&lt;br /&gt;
Mithilfe des Verbindungseditors können Sie schnell Verbindungen definieren, ändern oder aufbauen. Je nach Aufgabe weist der Dialog kleine Unterschiede auf und wird unterschiedlich geöffnet:&lt;br /&gt;
*Um eine Verbindung aufzubauen, klicken Sie im GUI-Browser auf &amp;quot;&#039;&#039;Verbinden&#039;&amp;quot;&#039; klicken und wählen dann &amp;quot;&#039;&#039;Mobile Testing&#039;&#039;&amp;quot;.&lt;br /&gt;
*Um eine bestehende Verbindung im GUI-Browser zu ändern oder zu kopieren, wählen Sie diese aus, machen einen Rechtsklick und wählen im Kontextmenü &amp;quot;&#039;&#039;Verbindung bearbeiten&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;Verbindung kopieren&#039;&#039;&amp;quot; aus.&lt;br /&gt;
*Wollen Sie Verbindungseinstellungen nicht für den GUI-Browser sondern zur Verwendung in einem Test erstellen, wählen Sie im Menü des Mobile Testing Plugins den Punkt &amp;quot;&#039;&#039;Verbindungseinstellungen erstellen...&#039;&#039;&amp;quot;. Darüber können nur die Einstellungen für eine Verbindung erstellt werden, ohne dass eine Verbindung tatsächlich angelegt wird.&lt;br /&gt;
&lt;br /&gt;
Einige der Schaltflächen sind nur beim Erstellen von Verbindungseinstellungen sichtbar:&lt;br /&gt;
[[Datei:MobileTestingVerbindungseditorMenu.png]]&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen löschen&#039;&#039;&amp;quot;: Setzt alle Einträge zurück. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen aus Datei laden&#039;&#039;&amp;quot;: Erlaubt das Öffnen einer gespeicherten Einstellungsdatei (*.csf). Deren Einstellungen werden in den Dialog übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen aus Anhang laden&#039;&#039;&amp;quot;: Erlaubt das Öffnen eines Anhangs mit Verbindungseinstellungen aus einem geöffneten Projekt. Diese Einstellungen werden in den Dialog übernommen. Bereits getätigte Eingaben ohne Konflikt bleiben dabei erhalten.&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen in Datei speichern&#039;&#039;&amp;quot; sowie&lt;br /&gt;
#&amp;quot;&#039;&#039;Einstellungen in Anhang speichern&#039;&#039;&amp;quot;: Hier können Sie die eingetragenen Einstellungen in eine Datei (*.csf) speichern oder als Anhang in einem geöffneten Projekt anlegen. Beide Optionen besitzen ein verzögertes Menü, in dem Sie auswählen können, nur einen bestimmten Teil der Einstellungen zu speichern. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Erweiterte Ansicht&#039;&#039;&amp;quot;: Damit können Sie in die erweiterte Ansicht wechseln, um zusätzliche Einstellungen vorzunehmen. Lesen Sie dazu mehr am Ende des Kapitels. (Nur beim Erstellen von Einstellungen sichtbar.)&lt;br /&gt;
#&amp;quot;&#039;&#039;Hilfe&#039;&#039;&amp;quot;: An der rechten Seite wird ein Hilfetext zum jeweiligen Schritt ein- oder ausgeblendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Dialog ist in drei Schritte unterteilt. Im ersten Schritt wählen Sie das Gerät, das Sie verwenden möchten, im zweiten Schritt wählen Sie aus, welche App verwendet werden soll und im letzten Schritt erfolgen die Einstellungen zum Appium-Server.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep1&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 1: Gerät auswählen===&lt;br /&gt;
Im oberen Teil erhalten Sie eine Liste aller angeschlossenen Appium-Geräte, die erkannt werden. Mit der Checkbox darunter können Sie die Geräte ausblenden, die zwar erkannt werden, aber nicht bereit sind. Falls Sie ein Gerät eintragen wollen, das nicht angeschlossen ist, können Sie dies mit dem entsprechenden Knopf &amp;quot;&#039;&#039;Android-Gerät eingeben&#039;&#039;&amp;quot; bzw. &amp;quot;&#039;&#039;iOS-Gerät eingeben&#039;&#039;&amp;quot; anlegen. Dazu müssen Sie jedoch die benötigten Eigenschaften Ihres Geräts kennen. Das Gerät wird dann in einer zweiten Geräteliste angelegt und kann dort ausgewählt werden. Wenn keine Liste mit angeschlossenen Elementen angezeigt werden kann, werden stattdessen verschiedene Meldungen angezeigt:&lt;br /&gt;
*Keine Geräte gefunden&lt;br /&gt;
*:expecco konnte kein Android-Geräte finden.&lt;br /&gt;
*:Um eine Verbindung zu einem Gerät automatisch zu konfigurieren, stellen Sie sicher, dass es&lt;br /&gt;
*:*angeschlossen ist&lt;br /&gt;
*:*eingeschaltet ist&lt;br /&gt;
*:*einen passenden adb-Treiber installiert hat&lt;br /&gt;
*:*für Debugging freigeschaltet ist (siehe unten).&lt;br /&gt;
*Keine verfügbaren Geräte gefunden&lt;br /&gt;
*:expecco konnte keine verfügbaren Android-Geräte finden. Es wurden aber nicht verfügbare gefunden, z.B. mit dem Status &amp;quot;unauthorized&amp;quot;.&lt;br /&gt;
*:Um eine Verbindung zu einem Gerät automatisch zu konfigurieren, stellen Sie sicher, dass es&lt;br /&gt;
*:*angeschlossen ist&lt;br /&gt;
*:*eingeschaltet ist&lt;br /&gt;
*:*einen passenden adb-Treiber installiert hat&lt;br /&gt;
*:*für Debugging freigeschaltet ist (siehe unten).&lt;br /&gt;
*:Um nicht verfügbare Geräte anzuzeigen, aktivieren Sie unten diese Option.&lt;br /&gt;
*Verbindung verloren&lt;br /&gt;
*:expecco hat die Verbindung zum adb-Server verloren. Versuchen Sie die Verbindung wieder herzustellen, indem Sie auf den Button klicken.&lt;br /&gt;
*Verbindung fehlgeschlagen&lt;br /&gt;
*:expecco konnte sich nicht mit dem adb-Server verbinden. Möglicherweise läuft er nicht oder der angegebene Pfad stimmt nicht.&lt;br /&gt;
*:Überprüfen Sie die adb-Konfiguration in den Einstellungen und versuchen Sie den adb-Server zu starten und eine Verbindung herzustellen indem Sie auf den Knopf klicken.&lt;br /&gt;
*Verbinden ...&lt;br /&gt;
*:expecco verbindet sich mit dem adb-Server. Dies kann einige Sekunden dauern.&lt;br /&gt;
*adb-Server starten ...&lt;br /&gt;
*:expecco startet den adb-Server. Dies kann einige Sekunden dauern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Bei &amp;quot;&#039;&#039;Automatisierung durch&#039;&#039;&amp;quot; können Sie angeben, welche Automation-Engine verwendet werden soll. Lassen Sie die Einstellung auf &amp;quot;&#039;&#039;(Default)&#039;&#039;&amp;quot; wird die entsprechende Capability gar nicht gesetzt. Ansonsten stehen Appium, Selendroid und ab expecco 2.11 XCUITest zur Verfügung. In der Regel wird Selendroid nur für Android-Geräte vor Version 4.1 gebraucht.--&amp;gt;Mit &amp;quot;&#039;&#039;Weiter&#039;&#039;&amp;quot; gelangen Sie zum nächsten Schritt. Wenn Sie Einstellungen für den GUI-Browser eingeben, ist das erst möglich, wenn ein Gerät ausgewählt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;UnlockingDeveloperOptions&amp;quot;&amp;gt;Anmerkung zum Freischalten&amp;lt;/span&amp;gt;: In jüngeren Android Versionen werden die Entwickleroptionen zunächst nicht mehr in den Einstellungen angeboten. Falls ihr Android Gerät in den Einstellungen keinen Eintrag zu &amp;quot;&#039;&#039;Entwickleroptionen&#039;&#039;&amp;quot; zeigt, wählen Sie zunächst den Eintrag &amp;quot;&#039;&#039;Telefoninfo&#039;&#039;&amp;quot;, dann &amp;quot;&#039;&#039;SoftwareVersionsInfo&#039;&#039;&amp;quot; und klicken darin mehrfach auf den Eintrag &amp;quot;&#039;&#039;BuildVersion&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Chromedriver verwalten ====&lt;br /&gt;
Wenn die App, die Sie bedienen wollen, WebViews mit Chrome benutzt, benötigt Appium Zugriff auf einen passenden Chromedriver. Wenn Sie ein Gerät in der Liste auswählen, können Sie über &amp;quot;&#039;&#039;Chromedriver verwalten&#039;&#039;&amp;quot; sehen, welche Chrome-Versionen auf dem Gerät vorhanden sind und welche Chromedriver-Versionen durch expecco zur Verfügung stehen. Über diesen Dialog können Sie auch benötigte Chromedriver-Versionen herunterladen. Beachten Sie, dass auf dem Gerät verschiedene Chrome-Versionen vorhanden sein können, da die Apps in ihren WebViews nicht die gleiche Chrome-Version verwenden müssen, wie die als Browser installierte. Damit alles funktioniert, sollte der verwendete Chromedriver zur entsprechenden App passen. Sie können den Pfad zum Chromedriver auch am Ende des Verbindungsdialogs in den erstellten Capabilities ändern.&lt;br /&gt;
&lt;br /&gt;
==== WLAN-Android-Geräte verbinden ====&lt;br /&gt;
Sie können sich auch über WLAN zu Android-Geräten verbinden. Dazu muss das Gerät zunächst mit adb verbunden werden, siehe [[Mobile_Testing_Plugin#Verbindung_.C3.BCber_WLAN|Verbindung über WLAN]]. Ab expecco 22.1 bietet der Verbindungseditor hierfür einen Dialog, der Ihnen dabei hilft und den Sie anstatt der Eingabeaufforderung verwenden können. Für Geräte mit Android 11 oder höher können Sie hier das Gerät mit dem Rechner zu koppeln, indem Sie die entsprechenden Parameter angeben und anschließend die Verbindung unter Angabe von IP-Adresse und Port aufbauen. Sie können damit auch für Geräte, die über USB verbunden sind, eine WLAN-Verbindung aufbauen. Wenn Sie das entsprechende Gerät in der Liste auswählen, werden die benötigten Angaben automatisch ausgelesen.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass der Aufbau einer WLAN-Verbindung nicht Teil der Verbindungseinstellungen ist. Wenn Sie mit den erzeugten Einstellungen eine neue Verbindung aufbauen wollen, müssen Sie sicherstellen, dass das Gerät über mit der angegebenen IP-Adresse und dem Port mit adb verbunden ist, damit es gefunden wird. Die ADB-Verbindung geht verloren, wenn der ADB-Server oder das Gerät neu gestartet werden. Die Erlaubnis für das WLAN-Debugging wird beim Neustart des Geräts auch häufig zurückgesetzt und der Debug-Port kann dann wechseln. Daher muss eine WLAN-Verbindung immer manuell hergestellt werden.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep2&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 2: App auswählen===&lt;br /&gt;
Hier können Sie Angaben zur App machen, die getestet werden soll. Dabei können Sie entscheiden, ob Sie eine App verwenden wollen, die bereits auf dem Gerät installiert ist, oder ob für den Test eine App installiert werden soll. Wählen Sie oben den entsprechenden Reiter aus. Je nachdem, ob Sie im vorigen Schritt ein Android- oder ein iOS-Gerät ausgewählt haben, ändert sich die erforderte Eingabe.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Android&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App auf dem Gerät&#039;&#039;&lt;br /&gt;
**:Wenn Sie im ersten Schritt ein angeschlossenes Gerät ausgewählt haben, werden die Pakete aller installierten Apps automatisch abgerufen und Sie können die Auswahl aus den Drop-down-Listen treffen. Die installierten Apps sind in Fremdpakete und Systempakete unterteilt; wählen Sie die entsprechende Paketliste aus. Diese Auswahl gehört nicht zu den Einstellungen, sondern stellt nur die entsprechende Paketliste zur Verfügung. Sie können den Filter benutzen, um die Liste weiter einzuschränken und dann das gewünschte Paket auswählen. Die Activities des ausgwählten Pakets werden ebenfalls automatisch abgerufen und als Drop-down-Liste zur Verfügung gestellt. Wählen Sie die Activity aus, die gestartet werden soll. In der Regel wird automatisch eine Activity aus der Liste eingetragen. Falls Sie kein verbundenes Gerät verwenden, müssen Sie die Eingabe des Pakets und der Activity von Hand vornehmen.&lt;br /&gt;
**&#039;&#039;App installieren&#039;&#039;&lt;br /&gt;
**:Geben Sie bei &amp;quot;&#039;&#039;App&#039;&#039;&amp;quot; den Pfad zu einer App an. Der Pfad muss für den Appium-Server gültig sein, der verwendet wird. Sie können auch eine URL angeben. Benutzen Sie einen lokalen Appium-Server, können Sie den rechten Butten benutzen, um zu der Installationsdatei der App zu navigieren und diesen Pfad einzutragen. Wenn möglich werden dabei auch das entsprechende Paket und die Activity in den Feldern darunter eingetragen. Diese Angabe ist aber nicht notwendig.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;iOS&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;App auf dem Gerät&#039;&#039;&lt;br /&gt;
**:Geben Sie die Bundle-ID einer installierten App an. Sie können die IDs der installierten Apps bspw. mithilfe von Xcode erfahren. Starten Sie dazu Xcode und wählen Sie in der Menüleiste am oberen Bildschirmrand im Menü &amp;quot;&#039;&#039;Window&#039;&#039;&amp;quot; den Eintrag &amp;quot;&#039;&#039;Devices&#039;&#039;&amp;quot;. Es öffnet sich ein Fenster, in dem eine Liste der angeschlossenen Geräte angezeigt wird. Wenn Sie Ihr Gerät auswählen, sehen Sie in der Übersicht eine Auflistung der von Ihnen installierten Apps.&lt;br /&gt;
**&#039;&#039;App installieren&#039;&#039;&lt;br /&gt;
**:Geben Sie bei &amp;quot;&#039;&#039;App&#039;&#039;&amp;quot; den Pfad zu einer App an. Der Pfad muss für den Appium-Server gültig sein, der verwendet wird. Sie können auch eine URL angeben. Zu den Vorraussetzungen an Apps für reale Geräte lesen Sie bitte den Abschnitt [[#iOS-Ger.C3.A4t_und_App_vorbereiten|iOS-Geräte und App vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
Im unteren Teil können Sie festlegen, ob die App beim Verbindungsabbau zurückgesetzt bzw. deinstalliert werden soll, und ob sie initial zurückgesetzt werden soll. Auch hier wird die entsprechende Capability gar nicht gesetzt, wenn Sie &amp;quot;&#039;&#039;(Default)&#039;&#039;&amp;quot; auswählen. Mit &amp;quot;&#039;&#039;Weiter&#039;&#039;&amp;quot; gelangen Sie zum nächsten Schritt.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span id=&amp;quot;AppiumConnectionEditorStep3&amp;quot;&amp;gt;&amp;lt;!-- Referenced by AppiumConnectionEditor in Mobile Testing Plugin --&amp;gt;&amp;lt;/span&amp;gt;Schritt 3: Servereinstellungen===&lt;br /&gt;
Im letzten Schritt befindet sich zunächst im oberen Teil eine Liste aller Capabilities, die sich aus Ihren Angaben der vorigen Schritte ergeben. Wenn Sie sich mit Appium auskennen und noch zusätzliche Capabilities setzen möchten, die der Verbindungseditor nicht abdeckt, können Sie durch Klicken auf &amp;quot;&#039;&#039;Bearbeiten&#039;&#039;&amp;quot; in die erweiterte Ansicht gelangen. Lesen Sie dazu den Abschnitt weiter unten.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Einstellungen für den GUI-Browser eingeben, können Sie den &#039;&#039;Verbindungsnamen&#039;&#039; eintragen, mit dem die Verbindung angezeigt wird. Dies ist auch der Name unter dem Bausteine diese Verbindung verwenden können, wenn sie aufgebaut ist. Wenn Sie das Feld frei lassen, wird ein Name generiert. Wenn der Haken für &amp;quot;&#039;&#039;Von expecco gesteuert&#039;&#039;&amp;quot; gesetzt ist, wird expecco einen lokalen Appium-Server an einem freien Port starten, oder einen bereits gestarteten freien Server verwenden. Um einen eigenen Server zu verwenden, schalten Sie diese Funktion ab und geben Sie die entsprechende Adresse ein. Sie erhalten die lokale Standard-Adresse und bereits verwendete Adressen zur Auswahl.&lt;br /&gt;
&lt;br /&gt;
In älteren expecco-Versionen ist der Haken mit &amp;quot;&#039;&#039;Bei Bedarf starten&#039;&#039;&amp;quot; beschriftet. In diesem Fall müssen Sie auch eine Adresse angeben, wenn expecco den Server starten soll. expecco versucht dann beim Verbinden einen Appium-Server an der angegebenen Adresse zu starten, wenn dort noch keiner läuft. Dieser Server wird dann beim Beenden der Verbindung ebenfalls heruntergefahren. Dies funktioniert nur für lokale Adressen. Achten Sie darauf, nur Portnummern zu verwenden, die auch frei sind. Verwenden Sie am besten nur ungerade Portnummern ab dem Standardport 4723. Beim Verbindungsaufbau wird ebenfalls die folgende Portnummer verwendet, wodurch es sonst zu Konflikten kommen könnte. &lt;br /&gt;
&lt;br /&gt;
Je nachdem, wie Sie den Dialog geöffnet haben, gibt es nun verschiedene Schaltflächen um ihn abzuschließen. In jedem Fall haben Sie die Option zu speichern. Dabei öffnet sich ein Dialog, indem Sie entweder ein geöffnet Projekt auswählen können, um die Einstellungen dort als Anhang zu speichern, oder auswählen es in einer Datei zu speichern, die Sie anschließend angeben können. Durch das Speichern wird der Dialog nicht beendet, wodurch Sie anschließend noch eine andere Option auswählen könnten.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie den Editor zum Verbindungsaufbau geöffnet haben, können Sie abschließend auf &amp;quot;&#039;&#039;Verbinden&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;Server starten und verbinden&#039;&#039;&amp;quot; klicken, je nachdem, ob der Haken für den Serverstart gesetzt ist. Für das Ändern oder Kopieren einer Verbindung im GUI-Brower heißt diese Option &amp;quot;&#039;&#039;Übernehmen&#039;&#039;&amp;quot;, da in diesem Fall nur der Verbindungseintrag geändert bzw. neu angelegt wird, der Verbindungsaufbau aber nicht gestartet wird. Das können Sie bei Bedarf anschließend über das Kontextmenü tun. Falls Sie Capabilities einer bestehenden Verbindung geändert haben, fordert Sie anschließend ein Dialog auf zu entscheiden, ob diese Änderungen direkt übernommen werden sollen, indem die Verbindung abgebaut und mit den neuen Verbindungen aufgebaut wird, oder nicht. In diesem Fall werden die Änderungen erst wirksam, nachdem Sie die Verbindung neu aufbauen.&lt;br /&gt;
&lt;br /&gt;
Zur Verwendung des Verbindungseditors lesen Sie auch den entsprechenden Abschnitt im jeweiligen Tutorial in Schritt 1 (Android: [[Mobile_Testing_Tutorial#Schritt_1:_Demo_ausf.C3.BChren|Demo ausführen]], iOS: [[Mobile_Testing_Tutorial#Schritt_1:_Demo_ausf.C3.BChren_.28iOS.29|Demo ausführen (iOS)]]).&lt;br /&gt;
&lt;br /&gt;
===Erweiterte Ansicht===&lt;br /&gt;
Die erweiterte Ansicht des Verbindungseditors erhalten Sie entweder durch Klicken auf &amp;quot;&#039;&#039;Bearbeiten&#039;&#039;&amp;quot; im dritten Schritt oder jederzeit über den entsprechenden Menüeintrag, wenn Sie den Editor über das Plugin-Menü gestartet haben. In dieser Ansicht erhalten Sie eine Liste aller eingestellten Appium-Capabilities. Zu dieser können Sie weitere hinzufügen, Einträge ändern oder entfernen. Um eine Capability hinzuzufügen, wählen Sie diese aus der Drop-down-Liste des Eingabefelds aus. In dieser befinden sich alle bekannten Capabilities sortiert in die Kategorien &#039;&#039;Common&#039;&#039;, &#039;&#039;Android&#039;&#039; und &#039;&#039;iOS&#039;&#039;. Haben Sie eine Capability ausgewählt, wird ein kurzer Informationstext dazu angezeigt. Sie können in das Feld auch von Hand eine Capability eingeben. Klicken Sie dann auf &amp;quot;&#039;&#039;Hinzufügen&#039;&#039;&amp;quot;, um die Capabilitiy in die Liste einzutragen. Dort können Sie in der rechten Spalte den Wert setzen. Um einen Entrag zu löschen, wählen Sie diesen aus und klicken Sie auf &amp;quot;&#039;&#039;Entfernen&#039;&#039;&amp;quot;. Mit &amp;quot;&#039;&#039;Zurück&#039;&#039;&amp;quot; verlassen Sie die erweiterte Ansicht.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingErweiterteAnsicht.png]]&lt;br /&gt;
&lt;br /&gt;
== Laufende Appium-Server ==&lt;br /&gt;
Im Menü des Mobile Testing Plugins finden Sie den Eintrag &amp;quot;&#039;&#039;Appium-Server...&#039;&#039;&amp;quot;. Mit diesem öffnen Sie ein Fenster mit einer Übersicht aller Appium-Server, die von expecco gestartet wurden und auf welchem Port diese laufen. Durch Klicken auf das Icon in der Spalte &amp;quot;&#039;&#039;Log anzeigen&#039;&#039;&amp;quot; können Sie das Logfile des entsprechenden Servers anschauen. Dieses wird beim Beenden des Servers wieder gelöscht. Mit den Icons in der Spalte &amp;quot;&#039;&#039;Beenden&#039;&#039;&amp;quot; kann der entsprechenden Server beendet werden. Allerdings wird dies verhindert, wenn expecco über diesen Server noch eine offene Verbindung hat. Für welche Verbindung ein Server verwendet wird, sehen Sie in der rechten Spalte. Steht dort &#039;&#039;&amp;lt;idle&amp;gt;&#039;&#039; wird er zur Zeit nicht von expecco verwendet.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingAppiumServer.png]]&lt;br /&gt;
&lt;br /&gt;
Beim Öffnen des Editors um eine Appium-Verbindung aufzubauen, wird direkt ein Appium-Server gestartet, um den folgenden Verbindungsaufbau zu beschleunigen. Zu diesem Zweck hält sich expecco auch immer einen freien Appium-Server offen. Weitere laufende Server, die nicht mehr verwendet werden, werden jedoch nach einiger Zeit automatisch beendet.&lt;br /&gt;
&lt;br /&gt;
Im Menü des Mobile Testing Plugins finden Sie auch den Eintrag &amp;quot;&#039;&#039;Alle Verbindungen und Server beenden&#039;&#039;&amp;quot;. Dies ist für den Fall gedacht, dass Verbindungen oder Server auf andere Weise nicht beendet werden können. Beenden Sie Verbindungen wenn möglich immer im GUI-Browser oder durch Ausführen eines entsprechenden Bausteins. Server, die Sie in der Server-Übersicht gestartet haben, beenden Sie dort; Server, die mit einer Verbindung gestartet wurden, werden automatisch mit dieser beendet.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass in der Übersicht nur Server aufgelistet sind, die von expecco gestartet und verwaltet werden. Mögliche andere Appium-Server, die auf andere Art gestartet wurden, werden nicht erkannt.&lt;br /&gt;
&lt;br /&gt;
== Recorder ==&lt;br /&gt;
Besteht im GUI-Browser eine Verbindung zu einem Gerät, kann der integrierte Recorder verwendet werden, um mit diesem Gerät einen Testabschnitt aufzunehmen. Sie starten den Recorder, indem Sie im GUI-Browser die entsprechende Verbindung auswählen und dann auf den Aufnahme-Knopf klicken. Für den Recorder öffnet sich ein neues Fenster. Die aufgezeichneten Aktionen werden im Arbeitsbereich des GUI-Browsers angelegt. Daher ist es möglich, das Aufgenommene parallel zu editieren.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingRecorder.png|caption|]]&lt;br /&gt;
&lt;br /&gt;
====Komponenten des Recorderfensters====&lt;br /&gt;
#&#039;&#039;&#039;Aufnahme fortsetzen/pausieren&#039;&#039;&#039;: Über das rechte Symbol können Sie die Aufnahme pausieren. Sie sehen dann ein großes Pause-Symbol in der Anzeige. Alle Aktionen, die Sie währenddessen im Recorder machen werden zwar ausgeführt, es werden aber keine Bausteine aufgezeichnet. Über das linke Symbol können Sie dann wieder in den normalen Aufnahmemodus wechseln.&lt;br /&gt;
#&#039;&#039;&#039;Aufnahme stoppen&#039;&#039;&#039;: Stoppt die Aufnahme und schließt das Recorderfenster.&lt;br /&gt;
#&#039;&#039;&#039;Aktualisieren&#039;&#039;&#039;: Holt das aktuelle Bild und den aktuellen Elementbaum vom Gerät. Dies wird nötig, wenn das Gerät zur Ausführung einer Aktion länger braucht oder sich etwas ohne das Anstoßen durch den Recorder ändert. Seit expecco 21.2 gibt es hier zusätzlich ein Untermenü, mit dem automatisches Aktualisieren angeschaltet werden kann, indem im Hintergrund auf Änderungen geprüft wird (siehe auch &#039;&#039;Automatisches Aktualisieren&#039;&#039; weiter unten).&lt;br /&gt;
#&#039;&#039;&#039;Follow-Mouse&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird im GUI-Browser ausgewählt.&lt;br /&gt;
#&#039;&#039;&#039;Element-Highlighting&#039;&#039;&#039;: Das Element unter dem Mauszeiger wird rot umrandet.&lt;br /&gt;
#&#039;&#039;&#039;Elemente einzeichnen&#039;&#039;&#039;: Die Rahmen aller Elemente der Ansicht werden angezeigt.&lt;br /&gt;
#&#039;&#039;&#039;Werkzeuge&#039;&#039;&#039;: Auswahl, mit welchem Werkzeug aufgenommen werden soll. Die gewählte Aktion wird bei einem Klick auf die Anzeige ausgelöst. Dabei stehen folgende Aktionen zur Verfügung:&lt;br /&gt;
#*Aktionen auf Elemente:&lt;br /&gt;
#**Klicken: Kurzer Klick auf das Element, über dem der Cursor steht. Zur genaueren Bestimmung, welches Element verwendet wird, benutzen Sie die Funktion Follow-Mouse oder Element-Highlighting.&lt;br /&gt;
#**Antippen mit Dauer (Element): Ähnlich zum Klicken, nur dass zusätzlich die Dauer des Klicks aufgezeichnet wird. Dadurch sind auch längere Klicks möglich.&lt;br /&gt;
#**Antippen mit Position (Element): Ähnlich zum Klicken, aber zusätzlich wird die Position innerhalb des Elements aufgenommen. Die Position kann relativ zur Größe des Elements aufgenommen werden oder, wenn Sie dabei Strg gedrückt halten, absolut zur linken oberen Ecke des Elements.&lt;br /&gt;
#**Text setzen: Ermöglicht das Setzen eines Textes in Eingabefelder.&lt;br /&gt;
#**Text löschen: Löscht den Text eines Eingabefelds.&lt;br /&gt;
#*Aktionen auf das Gerät:&lt;br /&gt;
#**Antippen (Bildschirm): Löst einen Klick auf die Bildschirmposition aus.&lt;br /&gt;
#**Antippen mit Dauer (Bildschirm): Löst einen Klick auf die Bildschirmposition aus, bei dem auch die Dauer berücksichtigt wird.&lt;br /&gt;
#**Wischen: Wischen in einer geraden Linie vom Punkt des Drückens des Mausknopfes bis zum Loslassen. Die Dauer wird ebenfalls aufgezeichnet.&lt;br /&gt;
#:Beachten Sie bei diesen Aktionen, dass das Ergebnis sich auf verschiedenen Geräten unterscheiden kann, bspw. bei verschiedenen Bildschirmauflösungen.&lt;br /&gt;
#*Erstellen von Testablauf-Bausteinen&lt;br /&gt;
#**Attribut prüfen: Vergleicht den Wert eines festgelegten Attributs des Elements mit einem vorgegebenen Wert. Das Ergebnis triggert den entsprechenden Ausgang.&lt;br /&gt;
#**Attribut zusichern: Vergleicht den Wert eines festgelegten Attributs des Elements mit einem vorgegebenen Wert. Bei Ungleichheit schlägt der Test fehl.&lt;br /&gt;
#**Attribut holen: Liest den aktuellen Wert eines Attributs aus.&lt;br /&gt;
#*Automatisch&lt;br /&gt;
#:Ist das Auto-Werkzeug ausgewählt, können alle Aktionen durch spezifische Eingabeweise benutzt werden: &#039;&#039;Klicken&#039;&#039;, &#039;&#039;Element antippen&#039;&#039; und &#039;&#039;Wischen&#039;&#039; funktionieren weiterhin durch Klicken, wobei sie anhand der Dauer und der Bewegung des Cursors unterschieden werden. Um ein &#039;&#039;Antippen&#039;&#039; auszulösen, halten Sie beim Klicken Strg gedrückt. Die übrigen Aktionen erhalten Sie durch einen Rechtsklick auf das Element in einem Kontextmenü.&lt;br /&gt;
#&#039;&#039;&#039;Kontext-Aktionen&#039;&#039;&#039;: Hier können Sie Aktionen aufzeichnen, die Kontexte betreffen:&lt;br /&gt;
#*Zu Kontext wechseln: Bietet eine Liste der aktuell verfügbaren Kontexte und Sie können auswählen, zu welchem gewechselt werden soll.&lt;br /&gt;
#*Aktuellen Kontext holen: Holt den Handle des aktuellen Kontexts.&lt;br /&gt;
#*Kontext-Handles holen: Holt eine Liste aller aktuell verfügbaren Kontext-Handles.&lt;br /&gt;
#&#039;&#039;&#039;Softkeys&#039;&#039;&#039;: Nur unter Android. Simuliert das Drücken der Knöpfe Zurück, Home, Fensterliste und Power.&lt;br /&gt;
#&#039;&#039;&#039;Home-Button&#039;&#039;&#039;: Nur unter iOS ab expecco 2.11. Ermöglicht das Drücken des Home-Buttons. Vor expecco 19.2 funktioniert es nur, wenn AssistiveTouch aktiviert ist und sich das Menü in der Mitte des oberen Bildschirmrands befindet. Ab expecco 19.2 verwendet die Funktion kein AssistiveTouch mehr.&lt;br /&gt;
#&#039;&#039;&#039;Hilfe&#039;&#039;&#039;: Öffnet diese Online-Dokumentation auf der allgemeinen Seite zu [[GuiBrowser_Recorder|GUI-Browser Recordern]].&lt;br /&gt;
#&#039;&#039;&#039;Anzeige&#039;&#039;&#039;: Zeigt einen Screenshot des Geräts. Aktionen werden mit der Maus je nach Werkzeug ausgelöst. Wenn eine neue Aktion eingegeben werden kann, hat das Fenster einen grünen Rahmen, sonst ist er rot.&lt;br /&gt;
#&#039;&#039;&#039;Fenster an Bild anpassen&#039;&#039;&#039;: Ändert die Größe des Fensters so, dass der Screenshot vollständig angezeigt werden kann.&lt;br /&gt;
#&#039;&#039;&#039;Bild an Fenster anpassen&#039;&#039;&#039;: Skaliert den Screenshot auf eine Größe, mit der er die volle Größe des Fensters ausnutzt.&lt;br /&gt;
#&#039;&#039;&#039;Ansicht anpassen&#039;&#039;&#039;: Öffnet einen Dialog um die Ansicht anzupassen, falls expecco das Bild nicht richtig darstellt. Sie können die Skalierung anpassen oder das Bild um 90° drehen.&lt;br /&gt;
#&#039;&#039;&#039;Ausrichtung anpassen&#039;&#039;&#039;: Korrigiert das Bild, falls dieses auf dem Kopf stehen sollte. Über den Pfeil rechts daneben kann das Bild auch um 90° gedreht werden, falls dies einmal nötig sein sollte. Ab expecco 19.1 finden Sie diese Funktion in &#039;&#039;Ansicht anpassen&#039;&#039;. Die Ausrichtung des Bildes ist für die Funktion des Recorders unerheblich, dieser arbeitet ausschließlich auf den erhaltenen Elementen.&lt;br /&gt;
#&#039;&#039;&#039;Skalierung&#039;&#039;&#039;: Ändert die Skalierung des Screenshots.&lt;br /&gt;
#&#039;&#039;&#039;Meldungen&#039;&#039;&#039;: Zeigt den Pfad des ausgewählten Elements oder andere Meldungen an. Es gibt ein Kontextmenü, um eine Liste der vorigen Meldungen zu sehen.&lt;br /&gt;
&lt;br /&gt;
====Verwendung====&lt;br /&gt;
Mit jedem Klick im Fenster wird eine Aktion ausgelöst und im Arbeitsbereich des GUI-Browsers aufgezeichnet. Dort können Sie das Aufgenommene abspielen, editieren oder daraus einen neuen Baustein erstellen.&lt;br /&gt;
Aktionen zum Auslösen von Sofkeys finden Sie direkt in der Menüleiste (s.o.). Um Aktionen auf Elemente aufzuzeichen, ändern Sie entweder die Auswahl des Werkzeugs in der Menüleiste (s.o.) und klicken dann auf das Element oder wählen Sie die entsprechende Aktion aus dem Kontextmenü durch einen Rechtsklick auf das entsprechende Element aus. Für Texteingabe ist es zudem möglich, den Cursor über dem Element zu platzieren und den Text einzugeben. Dabei öffnet sich der Eingabedialog für diese Aktion.&lt;br /&gt;
Zur Verwendung des Recorders lesen Sie auch Schritt 2 im Tutorial ([[Mobile_Testing_Tutorial#Schritt_2:_Einen_Baustein_mit_dem_Recorder_erstellen|Android]] bzw. [[Mobile_Testing_Tutorial#Schritt_2:_Einen_Baustein_mit_dem_Recorder_erstellen_.28iOS.29|iOS]]).&lt;br /&gt;
&lt;br /&gt;
====Elemente verbergen====&lt;br /&gt;
Ab expecco 21.2 gibt es im Kontextmenü außerdem die Möglichkeit, das ausgewählte Element im Recorder zu verbergen. Das bedeutet, dass dieses Element fortan nicht mehr ausgewählt werden kann. Diese Funktion eignet sich dazu, Elemente zu ignorieren, die im Vordergrund liegen, um auf Elemente darunter zugreifen zu können. Um diesen Zustand wieder rückgängig zu machen, müssen Sie das entsprechende Element im Baum des GUI-Browsers finden, dort gibt es im Kontextmenü ebenfalls einen solchen Eintrag.&lt;br /&gt;
&lt;br /&gt;
====Automatisches Aktualisieren====&lt;br /&gt;
Der Recorder zeigt kein Livebild des Geräts sondern nur eine Momentaufnahme. Um mit der Anzeige auf dem Gerät übereinzustimmen muss daher nach Änderungen aktualisiert werden. Der Recorder aktualisiert sich automatisch, nachdem er eine Aktion ausgeführt hat. Ab expecco 20.2 sind zudem weitere automatische Updates möglich. Sie können Sie im Menü &#039;&#039;Fenster&#039;&#039; aktivieren.&lt;br /&gt;
&lt;br /&gt;
Zum einen kann kurze Zeit nach dem Ausführen einer Aktion überprüft werden, ob es noch Änderungen nach der ersten Aktualisierung gegeben hat, damit in diesem Fall eine zweite Aktualisierung stattfinden kann. Dies soll das Problem beheben, dass der Recorder nach einer Aktion nicht aktuell ist, weil die Aktualisierung zu früh stattgefunden hat.&lt;br /&gt;
&lt;br /&gt;
Zum anderen kann eine periodische Aktualisierung eingeschaltet werden. Nach einem einstellbaren Interval wird der Recorder automatisch aktualisiert, sollte es Änderungen geben. Dadurch ist die Anzeige im Recorder immer weitgehend aktuell, allerdings entsteht dadurch auch ein Mehraufwand was die Kommunikation mit dem Gerät betrifft.&lt;br /&gt;
&lt;br /&gt;
== AVD Manager und SDK Manager ==&lt;br /&gt;
AVD Manager und SDK Manager sind beides Anwendungen von Android. Im Menü des Mobile Testing Plugins bietet expecco die Möglichkeit, diese zu starten. Ansonsten finden Sie diese Programme bei Ihrer Android-Installation. Mit dem AVD Manager können Sie AVDs, also Konfigurationen für Emulatoren, erstellen, bearbeiten und starten. Mit dem SDK Manager erhalten Sie einen Überblick über Ihre Android-Installation und können diese bei Bedarf erweitern.&lt;br /&gt;
&lt;br /&gt;
= Hybrid-Apps und WebViews =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;!!! WICHTIGER HINWEIS - Wenn Sie Probleme haben, auf den Webview zu wechseln, geben Sie bitte unter den Android Einstellungen - Apps -Standard Apps &amp;quot;Chrome&amp;quot; als &amp;quot;Browser-App&amp;quot; an !!!&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hybrid-Apps enthalten neben den Plattform-nativen Elementen weitere Elemente, die in einen WebView eingebunden sind. Diese Elemente können ebenfalls bedient werden, allerdings muss zuvor in den entsprechenden Kontext gewechselt werden. Mit dem Baustein &amp;quot;&#039;&#039;Get Current Context&#039;&#039;&amp;quot; erhalten Sie den aktuellen Kontext. Zu Beginn ist dies &amp;quot;&#039;&#039;NATIVE_APP&#039;&#039;&amp;quot;, also der Kontext der nativen Elemente. Mit dem Baustein &amp;quot;&#039;&#039;Get Context Handles&#039;&#039;&amp;quot; bekommen Sie eine Collection aller vorhandenen Kontexte. Gibt es einen WebView-Kontext, so heißt dieser &amp;quot;&#039;&#039;WEBVIEW_1&#039;&#039;&amp;quot; oder &amp;quot;&#039;&#039;WEBVIEW_&amp;lt;package&amp;gt;&#039;&#039;&amp;quot; mit dem Paket des WebViews. Es kann auch mehrere WebView-Kontexte geben. Zu jedem WebView-Kontext gibt es im nativen Kontext ein entsprechendes WebView-Element. Mit dem Baustein &amp;quot;&#039;&#039;Switch to Context&#039;&#039;&amp;quot; können Sie in einen solchen Kontext wechseln und haben fortan nur Zugriff auf die Elemente in diesem Kontext.&lt;br /&gt;
&lt;br /&gt;
Im GUI-Browser werden zum einen oben im Baum die vorhandenen Kontexte angezeigt, zum anderen wird der Baum eines Kontexts unterhalb des entsprechenden WebView-Elements eingefügt.&lt;br /&gt;
&lt;br /&gt;
= XPath anpassen mithilfe des GUI-Browsers =&lt;br /&gt;
Bausteine, die auf einem Gerät fehlerfrei funktionieren, tun dies auf anderen Geräten möglicherweise nicht. Auch können kleine Änderungen der App dazu führen, dass ein Baustein nicht mehr den gewünschten Effekt hat. Man sollte einen Baustein daher so robust formulieren, dass er für eine Vielzahl von Geräten verwendet werden kann und kleine Anpassungen an der App verkraftet. Dazu muss man das grundlegende Funktionsprinzip der Adressierung verstehen. Dies wird im Folgenden am Beispiel der App aus dem Tutorial erläutert.&lt;br /&gt;
&lt;br /&gt;
Die Ansicht der App setzt sich aus einzelnen Elementen zusammen. Dazu gehören die Schaltflächen &amp;quot;&#039;&#039;GTIN-13 (EAN-13)&#039;&#039;&amp;quot; und &amp;quot;&#039;&#039;Verify&#039;&#039;&amp;quot;, das Eingabefeld der Zahl &amp;quot;&#039;&#039;4006381333986&#039;&#039;&amp;quot; und das Ergebnisfeld, in dem OK erscheint, wie auch alle anderen auf der Anzeige sichtbaren Dinge. Diese sichtbaren Elemente sind in unsichtbare Strukturelemente eingebettet. Alle Elemente zusammen sind in einer zusammenhängenden Hierarchie, dem Elementbaum, organisiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingGUIBrowser.png | frame | left | Abb. 1: Funktionen des GUI-Browsers]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
Sie können sich diesen Baum im GUI-Browser ansehen. Wechseln Sie dazu in den GUI-Browser (Abb. 1) und starten Sie eine beliebige Verbindung. Sobald die Verbindung aufgebaut ist, können Sie den gesamten Baum aufklappen (1) (Klick bei gedrückter Strg-Taste). Er enthält alle Elemente der aktuellen Seite der App.&lt;br /&gt;
&lt;br /&gt;
Ein Baustein, der nun ein bestimmtes Element verwendet, muss dieses eindeutig angeben, indem er dessen Position im Elementbaum mit einem Pfad im XPath-Format beschreibt. Dieses Format ist ein verbreiteter Web-Standard für XML-Dokumente und -Datenbanken, eignet sich aber genauso für Pfade im Elementbaum.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie ein Element im Baum auswählen, wird unten der von expecco automatisch generierte XPath (2) für das Element angezeigt, der auch beim Aufzeichnen verwendet wird. Oberhalb davon in der Mitte des Fensters befindet sich eine Liste der Eigenschaften (3) des ausgewählten Elements. Man nennt diese Eigenschaften auch Attribute. Sie beschreiben das Element näher wie beispielsweise seinen Typ, seinen Text oder andere Informationen zu seinem Zustand. Links unten können Sie zur besseren Orientierung im Baum die &#039;&#039;Vorschau&#039;&#039; (4) aktivieren, um sich den Bildausschnitt des Elements anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Der Elementbaum für gleiche Ansicht einer App kann sich je nach Gerät unterscheiden. Es sind diese Unterschiede, die verhindern, eine Aufnahme von einem Gerät unverändert auch auf allen anderen Geräten abzuspielen: Ein XPath, der im einen Elementbaum ein bestimmtes Element identifiziert, beschreibt nicht unbedingt das gleiche Element im Elementbaum auf einem anderen Gerät. Es kann stattdessen passieren, dass der XPath auf kein Element, auf ein falsches Element oder auf mehrere Elemente passt. Dann schlägt der Test fehl oder er verhält sich unerwartet.&lt;br /&gt;
&lt;br /&gt;
Man könnte natürlich für jedes Gerät einen eigenen Testfall schreiben. Das brächte aber unverhältnismäßigen Aufwand bei Testerstellung und -wartung mit sich. Das Problem lässt sich auch anders lösen, da ein jeweiliges Element nicht nur durch genau einen XPath beschrieben wird. Vielmehr erlaubt der Standard mithilfe verschiedener Merkmale unterschiedliche Beschreibungen für ein und dasselbe Element zu formulieren. Das Ziel ist daher, einen Pfad zu finden, der auf allen für den Test verwendeten Geräten funktioniert und überall eindeutig zum richtigen Element führt.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel besteht die Verbindung zur Android-App aus dem Tutorial und der Eintrag des &amp;quot;&#039;&#039;GTIN-13&#039;&#039;&amp;quot;-Buttons ist ausgewählt (5). Dessen automatisch generierter XPath (2) kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[@resource id=&#039;android:id/content&#039;]/android.widget.RelativeLayout/android.widget.Button[@resource-id=&#039;de.exept.expeccomobiledemo:id/gtin_13&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Er ist offensichtlich lang und unübersichtlich. Der sehr viel kürzere Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@text=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
führt zum selben Element.&lt;br /&gt;
&lt;br /&gt;
Für die iOS-App lautet der automatisch generierte XPath für diesen Button beispielsweise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/XCUIElementTypeApplication/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//AppiumAUT/UIAApplication/UIAWindow[1]/UIAButton[2]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und kann kürzer als&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//*[@name=&#039;GTIN-13 (EAN-13)&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Sie können den Pfad entsprechend im GUI-Browser ändern und durch &amp;quot;&#039;&#039;Pfad überprüfen&#039;&#039;&amp;quot; (6) feststellen, ob er weiterhin auf das ausgewählte Element zeigt, was expecco mit &amp;quot;&#039;&#039;Verify Path: OK&#039;&#039;&amp;quot; (7) bestätigen sollte. Der erste, sehr viel längere Pfad, beschreibt den gesamten Weg vom obersten Element des Baumes bis hin zum gesuchten Button. Der zweite Pfad hingegen wählt mit &amp;quot;*&amp;quot; zunächst sämtliche Elemente des Baumes und schränkt die Auswahl dann auf genau die Elemente ein, die ein &#039;&#039;text&#039;&#039;- bzw. &#039;&#039;name&#039;&#039;-Attribut mit dem Wert &amp;quot;&#039;&#039;GTIN-13 (EAN-13)&#039;&#039;&amp;quot; besitzen, in unserem Fall also genau der eine Button, den wir suchen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden Android-ähnliche Pfade zur Veranschaulichung verwendet. Die Elemente in iOS-Apps heißen zwar anders, wodurch andere Pfade entstehen; das Prinzip ist jedoch das gleiche.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum1.png | frame | Abb. 2: Elementbaum einer fiktiven App]]&lt;br /&gt;
&lt;br /&gt;
Sie können solche Pfade mit Hilfe weniger Regeln selbst formulieren. Sehen Sie sich den einfachen Baum einer fiktiven Android-App in Abb. 2 an: Die Einrückungen innerhalb des Baumes geben die Hierarchie der Elemente wieder. Ein Element ist ein &#039;&#039;Kind&#039;&#039; eines anderen Elementes, wenn jenes andere Element das nächsthöhere Element mit einem um eins geringeren Einzug ist. Jenes Element ist das &#039;&#039;Elternelement&#039;&#039; des Kindes. Sind mehrere untereinander stehende Elemente gleich eingerückt, so sind sie also alle Kinder desselben Elternelements.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad durch alle Ebenen der Hierarchie zum TextView-Element ist nun:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Elemente sind mit Schrägstrichen voneinander getrennt. Es fällt auf, dass der Name des ersten Elements nicht mit dem im Baum übereinstimmt. Das oberste Element in der Hierarchie heißt immer &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot; (für iOS wäre es &amp;quot;&#039;&#039;AppiumAUT&#039;&#039;&amp;quot;), expecco zeigt im Baum stattdessen den Namen der Verbindung an, damit man mehrere Verbindungen voneinander unterscheiden kann. Die weiteren Elemente tragen jeweils das Präfix &amp;quot;&#039;&#039;android.widget.&#039;&#039;&amp;quot;, das im Baum zur besseren Übersicht nicht angezeigt wird. Bei IOS gibt es kein Präfix, das durch einen Punkt abgetrennt wäre, expecco 2.11 blendet aber entsprechend &amp;quot;&#039;&#039;XCUIElementType&#039;&#039;&amp;quot; am Anfang aus. Mit jedem Schrägstrich führt der Pfad über eine Eltern-Kind-Beziehung in eine tiefere Hierarchie-Ebene, d. h. &amp;quot;&#039;&#039;FrameLayout&#039;&#039;&amp;quot; ist ein Kindelement von &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot;, &amp;quot;&#039;&#039;LinearLayout&#039;&#039;&amp;quot; ist ein Kind von &amp;quot;&#039;&#039;FrameLayout&#039;&#039;&amp;quot; usw. Die in eckigen Klammern geschriebenen Wörter dienen nur als Orientierungshilfe im Baum. Sie gehören nicht zum Typ.&lt;br /&gt;
&lt;br /&gt;
Ein Pfad muss nicht beim Element &amp;quot;&#039;&#039;hierarchy&#039;&#039;&amp;quot; beginnen. Man kann den Pfad beginnend mit einem beliebigen Element des Baumes bilden. Man kann also verkürzt auch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
schreiben. Der Pfad führt zum selben &amp;quot;&#039;&#039;TextView&#039;&#039;&amp;quot;-Element, da es nur ein Element dieses Typs gibt. Anders verhält es sich bei dem Pfad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da es zwei Elemente vom Typ &amp;quot;&#039;&#039;Button&#039;&#039;&amp;quot; gibt, passt dieser Pfad auf zwei Elemente, nämlich den Button, der mit &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; markiert ist, und den &#039;&#039;Button&#039;&#039;, der mit &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; markiert ist. Es würde an dieser Stelle aber auch nicht helfen den langen Pfad von &#039;&#039;hierarchy&#039;&#039; aus beginnend anzugeben. Um einen mehrdeutigen Pfad weiter zu differenzieren, kann man explizit ein Element aus einer Menge wählen, indem man den numerischen Index in eckigen Klammern dahinter schreibt. Der Pfad aus dem obigen Beispiel lässt sich damit so anpassen, dass er eindeutig auf den &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; weist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[1].&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ihnen fällt sicher auf, dass der Index eine 1 ist obwohl das zweite Element gemeint ist. Das kommt daher, dass die Zählung bei 0 beginnt. Der Button mit der Markierung &amp;quot;An&amp;quot; hat also die Nummer 0 und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Nummer 1.&lt;br /&gt;
&lt;br /&gt;
Dieser Ansatz, einen expliziten Index zu verwenden, hat zwei Nachteile: Zum einen lässt sich an dem Pfad nur schwer ablesen welches Element gemeint ist, zum andern ist der Pfad sehr empfindlich schon gegenüber kleinsten Änderungen, wie zum Beispiel dem Vertauschen der beiden &#039;&#039;Button&#039;&#039;-Elemente oder dem Einfügen eines weiteren &#039;&#039;Button&#039;&#039;-Elements in der App.&lt;br /&gt;
&lt;br /&gt;
Es wäre daher wünschenswert, das gemeinte Element über eine ihm charakteristische Eigenschaft wie einen Attributwert, zu adressieren. Für Android-Apps eignet sich hierfür häufig das Attribut &amp;quot;&#039;&#039;resource-id&#039;&#039;&amp;quot;. Im Idealfall muss bei der Entwicklung der App darauf geachtet werden, dass jedes Element eine eindeutige Id erhält. Die &#039;&#039;resource-id&#039;&#039; hat den großen Vorteil, dass sie unabhängig vom Text des Elements oder der Spracheinstellung des Geräts ist. Für iOS-Apps kann entsprechend das Attribut &amp;quot;&#039;&#039;name&#039;&#039;&amp;quot; verwendet werden, wenn es von der App sinnvoll gesetzt wird. Der XPath-Standard erlaubt solche Auswahlbedingungen zu einem Element anzugeben. Angenommen, der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Aus&#039;&#039;&amp;quot; hat die Eigenschaft &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;off&#039;&#039; und der &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; hat als &#039;&#039;resource-id&#039;&#039; den Wert &#039;&#039;on&#039;&#039;, dann kann man als eindeutigen Pfad für den &amp;quot;Aus&amp;quot;-&#039;&#039;Button&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.Button[@resource-id=&#039;off&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
formulieren. Wie an dem Beispiel zu sehen werden solche Bedingungen wie ein Index in eckigen Klammern an den Elementtyp angehängt. Der Name eines Attributes wird mit einem &amp;quot;@&amp;quot; eingeleitet und der Wert mit einem &amp;quot;=&amp;quot; in Anführungszeichen angehängt. Ist der Attributwert global eindeutig, kann man den vorausgehenden Pfad sogar durch den globalen Platzhalter * ersetzen, der auf jedes Element passt. Das obige Beispiel mit dem GTIN-13-&#039;&#039;Button&#039;&#039; war ein solcher Fall.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingBaum2.png | frame | Abb. 3: Elementbaum einer fiktiven App mit Erweiterungen]]&lt;br /&gt;
&lt;br /&gt;
Abb. 3 zeigt eine Erweiterung des Beispiels aus Abb. 2. Die App hat nun ein weiteres, nahezu identisches &#039;&#039;LinearLayout&#039;&#039; bekommen. Die &#039;&#039;Buttons&#039;&#039; sind in ihren Attributen jeweils ununterscheidbar. Deshalb funktioniert der vorige Ansatz nicht, einen eindeutigen Pfad nur mithilfe eines Attributwerts zu formulieren. Offensichtlich unterscheiden sich aber ihre benachbarten &#039;&#039;TextViews&#039;&#039;. Es ist möglich die jeweilige &#039;&#039;TextView&#039;&#039; in den Pfad mit aufzunehmen, um einen &#039;&#039;Button&#039;&#039; dennoch eindeutig zu adressieren. Ein Pfad zum &#039;&#039;Button&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;An&#039;&#039;&amp;quot; unterhalb der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; kann dabei wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;//android.widget.TextView[@resource-id=&#039;push&#039;]/../android.widget.Button[@resource-id=&#039;on&#039;]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Teil beschreibt den Pfad zu der &#039;&#039;TextView&#039;&#039; mit der Markierung &amp;quot;&#039;&#039;Druckschalter&#039;&#039;&amp;quot; und der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;push&#039;&#039;. Danach folgt ein Schrägstrich gefolgt von zwei Punkten. Die zwei Punkte sind eine spezielle Elementbezeichnung, die nicht ein Kindelement benennt, sondern zum Elternelement wechselt, in diesem Fall also das &#039;&#039;LinearLayout&#039;&#039;, in dem die &#039;&#039;TextView&#039;&#039; eingebettet ist. Im Kontext dieses &#039;&#039;LinearLayout&#039;&#039; ist der restliche Pfad, nämlich der &#039;&#039;Button&#039;&#039; mit der &#039;&#039;resource-id&#039;&#039; mit dem Wert &#039;&#039;on&#039;&#039;, eindeutig.&lt;br /&gt;
&lt;br /&gt;
Der XPath-Standard bietet noch sehr viel mehr Ausdrucksmittel. Mit der hier knapp vorgestellten Auswahl ist es aber bereits möglich für die meisten praktischen Testfälle gute Pfade zu formulieren. Eine vollständige Einführung in XPath ginge über den Umfang dieser Einführung weit hinaus. Sie finden zahlreiche weiterführende Dokumentationen im Web und in Büchern.&lt;br /&gt;
&lt;br /&gt;
Eine universelle Strategie zum Erstellen guter XPaths gibt es nicht, da sie von den Testanforderungen abhängt. In der Regel ist es sinnvoll, den XPath kurz und dennoch eindeutig zu halten. Häufig lassen sich Elemente über Eigenschaften identifizieren wie beispielsweise ihren Text. Will man aber gerade den Text eines Elements auslesen, kann dieser natürlich nicht im Pfad verwendet werden, da er vorher nicht bekannt ist. Ebenso wird der Text variieren, wenn die App mit verschiedenen Sprachen gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Jeder Baustein, der auf einem Element arbeitet, hat einen Eingangspin für den XPath. Im GUI-Browser finden Sie in der Mitte oben eine Liste von Bausteinen mit Aktionen, die Sie auf das ausgewählte Element anwenden können. Suchen Sie den Baustein &#039;&#039;Click&#039;&#039; (8) im Ordner Elements und wählen Sie ihn aus (Abb. 1). Er wird im rechten Teil unter &amp;quot;&#039;&#039;Test&#039;&#039;&amp;quot; eingefügt, der Pin für den XPath ist mit dem automatisch generierten Pfad des Elements vorbelegt (9). Sie können den Baustein hier auch ausführen. Die Ansicht wechselt dann auf &amp;quot;&#039;&#039;Lauf&#039;&#039;&amp;quot;. Ändert sich durch die Aktion der Zustand Ihrer App, müssen Sie den Baum anschließend aktualisieren (10).&lt;br /&gt;
&lt;br /&gt;
Wenn Sie in der unteren Liste eine Eigenschaft auswählen, wechselt die Anzeige der Bausteine zu &amp;quot;&#039;&#039;Eigenschaften&#039;&#039;&amp;quot;, wo Sie die eigenschaftsbezogenen Bausteine finden. Wie bei den Aktionen können Sie auch hier einen Baustein auswählen, der dann rechts in Test mit dem Pfad des Elements und der ausgewählten Eigenschaft eingetragen wird, sodass Sie ihn direkt ausführen können.&lt;br /&gt;
&lt;br /&gt;
== Weitere Locator-Strategien ==&lt;br /&gt;
Appium bietet neben XPath noch weitere Strategien zur Adressierung von Elementen an. Einige davon stehen Ihnen &#039;&#039;&#039;ab Version 20.1&#039;&#039;&#039; ebenfalls mit expecco zur Verfügung. Diese sind nicht ganz so mächtig wie XPath, dafür aber häufig schneller bei der Auflösung auf dem Gerät. Insbesondere bei der Verwendung mit iPhones, wo die Hierarchie bei jeder XPath-Auflösung erst aufgebaut werden muss, bieten alternative Strategien einen Vorteil für die Laufzeit.&lt;br /&gt;
&lt;br /&gt;
XPath ist weiterhin der Standard, das heißt alle Locator ohne besondere Angabe werden als XPath interpretiert. Um eine der anderen Strategien zu verwenden, schreiben Sie diese mit einem Gleichzeichen vor den gewünschten Locator. Diese Technik können Sie sowohl an den Blöcken verwenden, als auch im GUI-Browser testen.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | AccessibilityId || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Wert des Elements, der dazu dient, die App barrierefrei zu machen. Für iOS ist das das Attribut &#039;&#039;&#039;Accessibility-id&#039;&#039;&#039;, für Android das Attribut &#039;&#039;&#039;content-descr&#039;&#039;&#039;. &#039;&#039;Beispiel: accessibilityId=Löschen&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | className || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Namen der Klasse des Elements. &#039;&#039;Beispiel: className=android.widget.FrameLayout&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | id || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet die Kennung des Elements. Für iOS ist das das Attribut &#039;&#039;&#039;name&#039;&#039;&#039;, für Android das Attribut &#039;&#039;&#039;resource-id&#039;&#039;&#039;. &#039;&#039;Beispiel: id=android:id/text1&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | iOSClassChain&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet die Hierarchie der Elemente ähnlich wie bei XPath. Eine Erklärung zum Aufbau finden Sie [https://github.com/facebookarchive/WebDriverAgent/wiki/Class-Chain-Queries-Construction-Rules hier]. &#039;&#039;Beispiel: iOSClassChain=XCUIElementTypeWindow/XCUIElementTypeButton[`label == &amp;quot;Ok&amp;quot;`]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; padding-right:1em&amp;quot; | iOSNsPredicateString&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet einfache Kriterien, wie Attribute, die auch kombiniert werden können. &#039;&#039;Beispiel: iOSNsPredicateString=type == &#039;XCUIElementTypeButton&#039; AND name == &#039;Weiter&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | name&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; || style=&amp;quot;padding-bottom:0.5em&amp;quot; | Verwendet den Namen des Elements. &#039;&#039;Beispiel: name=Bestätigen&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; &#039;&#039;nur für iOS&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Um eine direkte Beschleunigung mit iOS zu erzielen, ohne dass Sie Ihre bisherigen Pfade anpassen müssen, wandelt expecco zudem Pfade, die nur aus einem Element mit Klasse und name-Attribut bestehen, zur Laufzeit automatisch in einen entsprechenden Locator der Strategie iOSNsPredicateString um. Wenn Sie einen Pfad explizit als XPath markieren, wird diese Anpassung nicht vorgenommen.&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span id=&amp;quot;troubleshooting&amp;quot;&amp;gt;&amp;lt;!-- Referenced by error dialog on connection error --&amp;gt;&amp;lt;/span&amp;gt;Probleme und Lösungen=&lt;br /&gt;
== Locator sind versionsabhängig oder variabel ==&lt;br /&gt;
Dann sollten Sie die Locator (xPath) entweder in einer Variablen halten oder ein Locator-Mapping in einem Screenplay Anhang definieren. Es ist auch möglich, lediglich Teile des Locators (z.B. Locator-Pfad eines Elternelements oder Attributwert) in einer Variable zu halten und im Freezevalue des Locator-Pins mit &amp;quot;&#039;&#039;$(varName)&#039;&#039;&amp;quot; einzufügen.&lt;br /&gt;
&lt;br /&gt;
==Unsichtbare UI-Elemente==&lt;br /&gt;
Beachten Sie, dass im [[#Recorder|Recorder]] auch Elemente berücksichtigt werden, die Sie auf dem Bildschirm nicht sehen. Schalten Sie daher das Element-Highlighting an oder nutzen Sie die Follow-Mouse-Funktion und den Elementbaum im GUI-Browser, um festzustellen, ob das richtige Element verwendet wird. Es kann vorkommen, dass unsichtbare Elemente vor anderen Elementen liegen und diese verdecken, so dass die gewünschten Elemente im Recorder nicht ausgewählt werden können. Lesen Sie dazu den Abschnitt [[#Elemente_verbergen|Elemente verbergen]].&lt;br /&gt;
&lt;br /&gt;
==iOS: Kabel nicht zertifiziert==&lt;br /&gt;
In manchen Fällen erscheint beim Verbinden eines iOS-Geräts über USB der Hinweis, das verwendete Kabel sei nicht zertifiziert. In diesem Fall hilft es nur, das entsprechende Kabel auszutauschen.&lt;br /&gt;
==iOS: Alerts beim Verbindungsaufbau==&lt;br /&gt;
Stellen Sie sicher, dass beim Verbindungsaufbau mit einem iOS-Gerät keine Alerts geöffnet sind. Der Aufbau schlägt sonst fehl, da die App nicht in den Vordergrund kommen kann. Siehe auch [[#iOS-Ger.C3.A4t_und_App_vorbereiten|iOS-Gerät und App vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
==iOS: .ipa installieren nicht möglich==&lt;br /&gt;
Beachten Sie, dass auf iOS-Simulatoren keine &#039;&#039;.ipa&#039;&#039;-Dateien sondern nur &#039;&#039;.app&#039;&#039;-Dateien installiert werden können.&lt;br /&gt;
==Android: Gerät nicht im Verbindungsdialog==&lt;br /&gt;
Wenn ein über USB angeschlossenes Android-Gerät nicht im Verbindungsdialog auftaucht, versuchen Sie, den USB-Verbindungstyp zu ändern. In der Regel sollten MTP oder PTP funktionieren. Prüfen Sie nochmal, ob &amp;quot;USB Debugging&amp;quot; in den Entwicklereinstellungen des Geräts aktiviert ist (diese Einstellungen sind bei manchen Geräten zunächst unsichtbar, und müssen durch einen Trick zugänglich gemacht werden). Siehe auch [[#Android-Ger.C3.A4t_vorbereiten|Android-Gerät vorbereiten]].&lt;br /&gt;
&lt;br /&gt;
==Android: Abgeschnittene Elemente unten==&lt;br /&gt;
Bei Android-Geräten, die die Steuerungsleiste bzw. Softkeys automatisch ein- und ausblenden, kann es vorkommen, dass der Recorder im unteren Bereich Elemente abschneidet, die durch die Softkeys verdeckt würden, auch wenn sie zu diesem Zeitpunkt gar nicht angezeigt werden. In diesem Fall hift es, die Softkeys so einzustellen, dass sie in einer permanenten Leiste angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
Bei neueren Android-Versionen gibt es eine solche Einstellung in der Regel nicht. Auch wenn die Steuerelemente permanent eingeblendet sind, liegen sie auf keiner extra Leiste, sondern vor dem Inhalt der App. Es gibt dann im unteren Teil einen Bereich, der nicht bedient werden kann, weil er nicht zum aktiven Bereich der App gezählt wird, weshalb die Elemente von Appium abgeschnitten werden. Dieser Bereich kann auch größer sein als von den Steuerungselementen beansprucht. Bekannt ist dies für Samsung-Geräte mit Android 11. Da die Information über die Größe des App-Bereichs bereits auf Android-Ebene so geliefert wird, können wir hierfür keine Lösung anbieten, sondern können nur hoffen, dass das Problem vom Hersteller behoben wird. Sie können versuchen, ob Sie mit der Einstellung von Gestensteuerung bessere Ergebnisse bekommen, allerdings gibt es hier das gleiche Problem.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;waitForIdleTimeout&amp;quot;&amp;gt;&amp;lt;!-- Referenced by expecco--&amp;gt;&amp;lt;/span&amp;gt; Android: Test hängt beim Suchen eines Elements==&lt;br /&gt;
Der Baustein &#039;&#039;Find Element by XPath&#039;&#039; und alle Element-Bausteine warten bis ein Element zum angegebenen Pfad auftaucht. Den Timeout dafür kann man entweder am Baustein direkt oder in den Umgebungsvariablen ändern. Wenn das Element aber bereits da sein sollte und es dennoch sehr lange dauert, bis der Test weitergeht, kann das am UIAutomator/UIAutomator2 liegen. Dieser wartet, bis die App in den Idle-Zustand geht, bevor er überhaupt nach Elementen sucht. Dies kann länger dauern, wenn die App z.B. im Hintergrund noch Animationen abspielt oder andere Aktionen ausführt. Auch das Holen des Page-Sources z.B. beim Aktualisieren im GUI-Browser oder im Recorder kann dadurch länger dauern. Standardmäßig gibt es hierfür einen Timeout von 10 Sekunden, nach dem nicht weiter auf den Idle-Zustand gewartet wird. Dieser Timeout lässt sich durch eine Einstellung in Appium anpassen (waitForIdleTimeout). Falls Sie einen anderen Wert für diesen Timeout setzen möchten, ist dies ab expecco 21.2 möglich, indem Sie vor dem Test den Smalltalk-Code &amp;lt;code&amp;gt;AppiumTestRunner::TestRunConnection waitForIdleTimeout:2000&amp;lt;/code&amp;gt; ausführen. Der Timeout wird in Millisekunden angegeben, das Beispiel setzt ihn also auf 2 Sekunden.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;startChromedriverTimeout/&amp;gt;Android: Aktualisieren des Trees oder Wechseln zum Webview-Kontext braucht zu lange==&lt;br /&gt;
Speziell mit älteren Geräten kann es vorkommen, dass neuere Chromedriver nicht initialisiert werden können. Das führt dann dazu, dass nicht in den Webview-Kontext gewechselt werden kann. Dies wird von Appium allerdings nur über einen Timeout festgestellt, der standardmäßig bei 4 Minuten liegt. Da expecco auch beim Aufbauen des Trees im GUI-Browser versucht in den Webview-Kontext zu wechseln, kann das zu sehr langen Ladezeiten führen. Da es in Appium keine Möglichkeit gibt, diesen Timeout herunter zu setzen, haben wir die Version, die wir im MobileTestingSupplement bereitstellen, um eine entsprechende Capability erweitert. Ab der Version 1.13.1.0 des [[#Windows|MobileTestingSupplements]] kann mit &#039;&#039;chromedriverStartTimeout&#039;&#039; der Timeout in Millisekunden gesetzt werden. Der Wechsel funktioniert dadurch zwar trotzdem nicht, aber expecco braucht dann nicht mehr so lange beim Aktualisieren des Trees und der Baustein zum Wechseln des Kontextes schlägt schneller fehl. Der Verbindungsdialog fügt diese Capability ab expecco 22.1 automatisch hinzu.&lt;br /&gt;
&lt;br /&gt;
==Keine Aktion bei Klick==&lt;br /&gt;
Der Baustein zum Klicken auf ein Element ist erfolgreich, aber auf dem Gerät wurde keine Aktion ausgeführt.&lt;br /&gt;
:Dies kann vorkommen, wenn das Element von einem anderen Element verdeckt ist und ein Klick auf das Element deshalb nicht möglich ist. In diesem Fall wird von Appium kein Fehler geworfen, sondern es passiert einfach nichts. Wenn Sie dennoch einen Klick an der Position des Elements machen möchten, auch wenn es verdeckt ist, benutzen Sie stattdessen den Baustein &#039;&#039;Tap&#039;&#039; und übergeben Sie diesem die Position des Elements (&#039;&#039;Get Location&#039;&#039;). Wenn Sie stattdessen vor einem Klick prüfen möchten, ob das Element zu diesem Zeitpunkt verdeckt ist, versuchen Sie, ob Ihnen die Eigenschaften &#039;&#039;Is Displayed&#039;&#039; oder &#039;&#039;Is Enabled&#039;&#039; weiterhelfen.&lt;br /&gt;
&lt;br /&gt;
==Kein Update nach Aktion==&lt;br /&gt;
Über den Recorder wurde eine Aktion ausgeführt, für die auch ein Baustein aufgezeichnet wurde, der Recorder zeigt aber immer noch das alte Bild.&lt;br /&gt;
:Der Recorder zeigt kein Livebild des Geräts, sondern immer nur eine Momentaufnahme. Nachdem eine Aktion ausgeführt wurde, aktualisiert sich der Recorder automatisch. Es kann aber vorkommen, dass das Bild schon aktualisiert wurde, bevor die Auswirkungen der Aktion auf dem Gerät vollständig abgeschlossen sind. In diesem Fall sollten Sie den Recorder von Hand aktualisieren über das Symbol mit den blauen Pfeilen. Ab expecco 20.2 können Sie für diesen Fall auch automatisches Aktualisieren einstellen. Siehe auch Beschreibung zum [[#Recorder|Recorder]].&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;clickable&amp;quot; Attribut falsch==&lt;br /&gt;
Ein Element hat im &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; Attribut/Property den Wert &amp;quot;&#039;&#039;false&#039;&#039;&amp;quot;, ist aber dennoch anklickbar.&lt;br /&gt;
:Das &amp;quot;&#039;&#039;clickable&#039;&#039;&amp;quot; Attribute muss explizit vom App-Programmierer gesetzt werden, und hat tatsächlich keine Relevanz für das tatsächliche Verhalten der App. Sie sollten dieses Attribut i.A. in Ihren Tests nicht beachten.&amp;lt;br&amp;gt;Leider existieren viele Apps, bei denen der Programmierer hier &amp;quot;lazy&amp;quot; war.&lt;br /&gt;
&lt;br /&gt;
==Verbindungsaufbau schlägt fehl==&lt;br /&gt;
Schlägt der Verbindungsaufbau mit dem Appium-Server fehl, erhalten Sie in expecco eine Fehlermeldung ähnlicher der unten abgebildeten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:MobileTestingVerbindungsfehler.png]]&lt;br /&gt;
&lt;br /&gt;
Hier sehen Sie die Art des aufgetretenen Fehlers. Klicken Sie auf &amp;quot;&#039;&#039;Details&#039;&#039;&amp;quot; um nähere Informationen zu erhalten. Mögliche Fehler sind:&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.remote.UnreachableBrowserException&#039;&#039;&lt;br /&gt;
:Der angegebene Server läuft nicht oder ist nicht erreichbar. Überprüfen Sie die Serveradresse.&lt;br /&gt;
*&#039;&#039;org.openqa.selenium.WebDriverException&#039;&#039;&lt;br /&gt;
:Lesen Sie in den Details in der ersten Zeile die Meldung hinter &#039;&#039;Original Error&#039;&#039;:&lt;br /&gt;
:*&#039;&#039;Unknown device or simulator UDID&#039;&#039;&lt;br /&gt;
::Entweder ist das Gerät nicht richtig angeschlossen oder die udid stimmt nicht.&lt;br /&gt;
:*&#039;&#039;Unable to launch WebDriverAgent because of xcodebuild failure: xcodebuild failed with code 65&#039;&#039;&lt;br /&gt;
::Dieser Fehler kann verschiedene Ursachen haben. Entweder konnte tatsächlich der WebDriverAgent nicht gebaut werden, weil die Signierungseinstellungen falsch sind oder das passende Provisioning Profile fehlt. Lesen Sie dazu den Abschnitt zur [[#Signierung|Signierung]]. Es kann auch sein, dass der WebDriverAgent auf dem Gerät nicht gestartet werden kann, weil sich beispielsweise ein Alert im Vordergrund befindet oder Sie dem Entwickler nicht vertraut haben.&lt;br /&gt;
:*&#039;&#039;Could not install app: &#039;Command &#039;ios-deploy [...] exited with code 253&#039;&#039;&#039;&lt;br /&gt;
::Die angegebene App kann nicht auf dem iOS-Gerät installiert werden, weil es nicht im Provisioning Profile der App eingetragen ist.&lt;br /&gt;
:*&#039;&#039;Bad app: [...] App paths need to be absolute, or relative to the appium server install dir, or a URL to compressed file, or a special app name.&#039;&#039;&#039;&lt;br /&gt;
::Der Pfad zur App ist falsch. Stellen Sie sicher, dass sich die Datei unter dem angegebenen Pfad auf dem Mac befindet.&lt;br /&gt;
:*&#039;&#039;packageAndLaunchActivityFromManifest failed.&#039;&#039;&lt;br /&gt;
::Die angegebene &#039;&#039;apk&#039;&#039;-Datei ist vermutlich kaputt.&lt;br /&gt;
:*&#039;&#039;Could not find app apk at [...]&#039;&#039;&lt;br /&gt;
::Der Pfad zur App ist falsch. Stellen Sie sicher, dass sich die &#039;&#039;apk&#039;&#039;-Datei am angegebenen Pfad befindet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Falls der Fehler nicht durch eine der oben gelisteten Ursachen bedingt ist, kann es sein, dass die auf dem Gerät befindlichen Automation-Anwendungen nicht mehr richtig funktionieren. Hier hilft es, diese vom Mobilgerät zu deinstallieren. Beim nächsten Verbindungsaufbau werden sie dann automatisch neu installiert.&lt;br /&gt;
&lt;br /&gt;
*Für iOS-Geräte ist das der WebDriverAgent, den Sie einfach vom Home-Screen deinstallieren können. Dies behebt in der Regel Probleme durch den Wechsel des verwendeten Macs oder der Xcode-Version.&lt;br /&gt;
&lt;br /&gt;
*Für Android-Geräte ist es der UIAutomator2; hier tritt auf einigen Geräten sporadisch ein Problem auf, die Ursache dafür ist uns z.Z. noch nicht bekannt. Zur Deinstallation navigieren Sie auf dem Gerät zu &amp;quot;&#039;&#039;Einstellungen&#039;&#039;&amp;quot; &amp;gt; &amp;quot;&#039;&#039;Anwendungen&#039;&#039;&amp;quot;&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; und suchen in der Liste nach folgenden Einträgen:&lt;br /&gt;
    Appium Settings&lt;br /&gt;
    io.appium.uiautomator2.server&lt;br /&gt;
    io.appium.uiautomator2.server.test&lt;br /&gt;
:Klicken Sie auf die jeweilige Anwendung und dann auf &amp;quot;&#039;&#039;Deinstallieren&#039;&#039;&amp;quot;.&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&#039;&#039;Der entsprechende Eintrag heißt auf manchen Geräten möglicherweise etwas anders.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Falls dies nicht hilft, kann eventuell die Ausgabe des Appium-Servers weiterhelfen. Für einen von expecco gestarteten Server finden Sie das Log in der Liste der [[#Laufende_Appium-Server|laufenden Appium-Server]].&lt;br /&gt;
&lt;br /&gt;
==Ich habe keinen Mac==&lt;br /&gt;
Vielleicht hilft Ihnen diese Webseite weiter: [https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10 https://www.howtogeek.com/289594/how-to-install-macos-sierra-in-virtualbox-on-windows-10]&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Timeline&amp;diff=29023</id>
		<title>Timeline</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Timeline&amp;diff=29023"/>
		<updated>2023-11-15T16:24:21Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Mauseingabe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Einleitung =&lt;br /&gt;
[[Datei:Timeline.png|800px|thumb|Der Reiter &amp;quot;Zeitleiste&amp;quot;]]&lt;br /&gt;
Die Zeitleiste (Timeline) kann ein hilfreiches Werkzeug sein, um die zeitliche Abfolge Ihrer Testsequenzen zu verstehen, insbesondere, wenn Aktionen parallel laufen. Sie finden sie in der &#039;&#039;Lauf&#039;&#039; Anzeige entweder eines Testplans oder eines Aktionsblocks. Sie verwendet die gesammelten [[Glossary/en#Activity_Log|Logdaten]] um anzuzeigen wann und wie lange eine Aktion ausgeführt wurde.&lt;br /&gt;
&lt;br /&gt;
= Darstellung =&lt;br /&gt;
Die Zeitleiste zeigt die Unterblöcke des ausgewählten Blocks als Balken in der Farbe ihres Ausführungsstatus, wobei deren Länge und horizontale Position die Dauer und Startzeit der Ausführung widerspiegeln. Die Zeitskala oben passt sich der dargestellten Zeit an. Das aktuelle Zeitformat können Sie in der oberen rechten Ecke ablesen; z.B. bedeutet &#039;&#039;m:s&#039;&#039; eine Darstellung in Minuten und Sekunden, wobei die Sekunden noch Dezimalstellen aufweisen können, um die Millisekunden anzuzeigen.&lt;br /&gt;
&lt;br /&gt;
Anfangs wird nur die oberste Ebene der Unterblöcke des ausgewählten Blocks angezeigt. Wenn Blöcke parallel ausgeführt werden, landen sie in verschiedenen Zeilen; nacheinander ausgeführte Blocke stehen in einer Zeile. Allerdings bedeutet es für zwei Blöcke, die hintereinander stehen NICHT generell, dass der zweiten vom ersten gestartet wurde.&lt;br /&gt;
&lt;br /&gt;
Sie können Blöcke ausklappen, um deren Unterblöcke zu sehen. Ist ein Block breit genug, wird dies durch ein entsprechendes kleines Icon in der oberen linken Ecke angezeigt. Sie können Blöcke auf- und zuklappen, indem Sie auf dieses Icon klicken. Alternativ können Sie auf einen Block mit der rechten Maustaste klicken und erhalten im Kontextmenü die Möglichkeit, ihn auf- oder zuzuklappen. Die Unterblöcke werden unterhalb ihrer Eltern angezeigt, wobei sich etwaige parallele Blöcke weiter nach unten verschieben. Der Rahmen eines Blocks umfasst seine Unterblöcke um die Verschachtelung zu verdeutlichen. Sie können auch Strg gedrückt halten, um alle Kinder auszuklappen. Da die Zeitleiste nur die Informationen aus den Logdaten darstellt, werden auch nur Blöcke angezeigt, die einen Logeintrag haben. Blöcke, die im Log übersprungen wurden, werden nicht angezeigt.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie einen Block in der Zeitleiste anklicken, wird er ausgewählt, was durch einen roten Rahmen dargestellt wird. Die Hauptinformationen dieses Blocks werden zum Meldungsfenster in der unteren linken Ecke des expecco-Fensters hinzugefügt. Außerdem werden Sie als Tooltip angezeigt, wenn Sie mit der Maus über den Block fahren.&lt;br /&gt;
&lt;br /&gt;
= Navigation =&lt;br /&gt;
Standardmäßig wird die gesamte Dauer des Laufs im Fenster angezeigt. Sie können aber heranzoomen, um bestimmte Abschnitte besser zu analysieren. Sie können die Menübuttons und die Maus verwenden, um sich auf der Zeitleiste zu bewegen.&lt;br /&gt;
&lt;br /&gt;
== Menüzeile ==&lt;br /&gt;
[[Datei:Timeline_Menubar.png]]&lt;br /&gt;
# Höhe der Zeilen verringern&lt;br /&gt;
# Höhe der Zeilen vergrößern&lt;br /&gt;
# Zeitleiste auf verfügbaren Breite strecken&amp;lt;br&amp;gt;Ein Umschaltknopf: wenn er aktiviert ist, wird die gesamte Laufdauer auf die Breite des Reiters gestreckt.&lt;br /&gt;
# Herauszoomen&amp;lt;br&amp;gt;Die Breite der Zeitleiste verkleinern, sodass mehr Zeit auf weniger Platz dargestellt wird&lt;br /&gt;
# Hineinzoomen&amp;lt;br&amp;gt;Die Breite der Zeitleiste vergrößern, sodass weniger Zeit auf mehr Platz dargestellt wird und besser analysiert werden kann&lt;br /&gt;
# Springe zum Start der ausgewählten Aktion&lt;br /&gt;
# Springe zum Ende der ausgewählten Aktion&lt;br /&gt;
# Relative Ausführungszeiten&amp;lt;br&amp;gt;Die Block-Informationen bspw. im Tooltip zeigen die Startzeit relativ zum Beginn des dargestellten Blocks und die Dauer falls aktiviert, ansonsten absolute Start- und Endzeiten&lt;br /&gt;
&lt;br /&gt;
== Mauseingabe ==&lt;br /&gt;
Normales Scrollen verschiebt das Diagram vertikal, bei gedrückter Shift-Taste horizontal. Durch Scrollen bei gedrückter Strg-Taste können Sie an der Cursorposition zoomen. Falls das Strecken der Zeitleiste deaktiviert ist, können Sie an einem Punkt in der Zeitskala klicken und zu einem anderen ziehen, um einen Zeitabschnitt auszuwählen. Dieser wird dabei gelb markiert. Wenn Sie die Maustaste loslassen, wird die Zeitleiste auf diesen Abschnitt herangezoomt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Timeline_Select_Time.png]]&lt;br /&gt;
&lt;br /&gt;
= Auswählen =&lt;br /&gt;
Wie bereits erwähnt, können Sie einen Block durch Klicken auswählen. Wenn Sie doppelklicken, wird der Block im Baum ausgewählt und die Zeitleiste wechselt zur Darstellung seiner Unterblöcke.&lt;br /&gt;
&lt;br /&gt;
Sie können die Zeitleiste (und gleichzeitig das Netzwerk, die Logdaten und die Ein/Ausgänge) auch auf den ausgewählten Block fixieren, indem Sie den Toggle-Button [[Datei:Timeline_Lock_Button.png]] im Menü des Baums aktivieren. Dies wird durch ein kleines Schloss-Symbol neben dem Eintrag des fixierten Blocks im Baum angezeigt. Wenn Sie nun einen anderen Block im Baum auswählen, wird er in der Zeitleiste des fixierten Blocks ausgewählt. Genauso können Sie auf einen Block in der Zeitleiste doppelklicken und sein Eintrag wird im Baum ausgewählt ohne die angezeigte Zeitleiste zu ändern.&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Timeline/en&amp;diff=29022</id>
		<title>Timeline/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Timeline/en&amp;diff=29022"/>
		<updated>2023-11-15T16:22:23Z</updated>

		<summary type="html">&lt;p&gt;Matilk: /* Mouse Input */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
[[Datei:Timeline.png|800px|thumb|Timeline Tab]]&lt;br /&gt;
The Timeline can be a useful tool, when you want to understand the chronology of your test sequence, especially when actions are running in parallel. It can be found in the &#039;&#039;Run&#039;&#039; section of either a testplan or an action block. It uses the information collected in the [[Glossary/en#Activity_Log|Activity Log]] to show when and for how long an action was executed.&lt;br /&gt;
&lt;br /&gt;
= Representation =&lt;br /&gt;
The timeline shows the subblocks of the selected block as bars in the color of their execution state, where their length and horizontal position represents the duration and start time of their execution. The timescale at the top adapts to the presented time. You see the current time format in the top right corner, e.g. &#039;&#039;m:s&#039;&#039; means minutes and seconds separated by a colon, where the seconds may have digits after the decimal point to show the milliseconds.&lt;br /&gt;
&lt;br /&gt;
Initially only the top blocks of the selected blocks are shown. If blocks are executed in parallel, they go in different lines, consecutive blocks are in one line. However, if two blocks are one after the other in the same line, that does NOT indicate, that the first block triggered the second.&lt;br /&gt;
&lt;br /&gt;
You can expand blocks, to see its subblocks. If a block is wide enough, it shows a little expand icon in its left corner. You can expand or collapse the block by clicking on this icon. Alternatively, you can right click on a block and select expand or collapse from its context menu. The subblocks are displayed below their parent block, pushing any parallel block further down in the diagram. The frame of a block includes its subblocks, visualizing the nesting. If you hold Ctrl when expanding a block, it will expand all of its children. As the timeline only displays the information from the Activity Log, you can only see the blocks, that have an log entry. You cannot see blocks, that are skipped in the log.&lt;br /&gt;
&lt;br /&gt;
If you click on a block in the timeline it gets selected, which is indicated by a red frame. The main information of that block is added to the messages in the lower left corner of the expecco window. You also get this information as tooltip when hovering over a block.&lt;br /&gt;
&lt;br /&gt;
= Navigation =&lt;br /&gt;
As default the whole duration is displayed in the panel, but you can zoom in, to better see a certain section. You can use the buttons of the menu bar to navigate through the timeline and use the mouse.&lt;br /&gt;
&lt;br /&gt;
== Menu bar ==&lt;br /&gt;
[[Datei:Timeline_Menubar.png]]&lt;br /&gt;
# Decrease the height of lines&lt;br /&gt;
# Increase the height of lines&lt;br /&gt;
# Stretch the timeline to the available width&amp;lt;br&amp;gt;This is a toggle, if it is on, the whole run time is stretched to the width of the panel.&lt;br /&gt;
# Zoom out&amp;lt;br&amp;gt;Decrease the width of the timeline, so that more time is shown in less space.&lt;br /&gt;
# Zoom in&amp;lt;br&amp;gt;Increase the width of the timeline, so that less time is shown in more space and can be analyzed better.&lt;br /&gt;
# Jump to the start of the selected action&lt;br /&gt;
# Jump to the end of the selected action&lt;br /&gt;
# Relative execution times&amp;lt;br&amp;gt;The block information e.g. in the tooltip shows the start time relative to the start time of the displayed block and the duration if on, or the absolute start and end time if off.&lt;br /&gt;
&lt;br /&gt;
== Mouse Input ==&lt;br /&gt;
Normal scrolling moves the diagram vertically, scrolling with the Shift key held down moves it horizontally. You can zoom in and out on the cursor position by scrolling while holding down the Ctrl key. If stretch is disabled, you can click at a point in the timescale and drag to another to select a time period, which is highlighted in yellow. When you release the mouse button, the timeline zooms to that period.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Timeline_Select_Time.png]]&lt;br /&gt;
&lt;br /&gt;
= Selecting =&lt;br /&gt;
As earlier already mentioned, you can select a block by clicking on it. When double clicking on it, it gets selected in the tree and so the timeline will switch to only display the subblocks of this block.&lt;br /&gt;
&lt;br /&gt;
You can also lock the timeline (and as well the network, log and pin entries) to the block selected in the tree, by activating the toggle [[Datei:Timeline_Lock_Button.png]] in the menu of the tree. This will be indicated by a little lock icon next to the tree icon of the locked block. If you now select another block in the tree, it gets selected in the timeline of the locked block. Similar you can double click on a block in the timeline and its entry in the tree will be selected without changing the displayed timeline.&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Timeline&amp;diff=28996</id>
		<title>Timeline</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Timeline&amp;diff=28996"/>
		<updated>2023-11-08T18:12:35Z</updated>

		<summary type="html">&lt;p&gt;Matilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Einleitung =&lt;br /&gt;
[[Datei:Timeline.png|800px|thumb|Der Reiter &amp;quot;Zeitleiste&amp;quot;]]&lt;br /&gt;
Die Zeitleiste (Timeline) kann ein hilfreiches Werkzeug sein, um die zeitliche Abfolge Ihrer Testsequenzen zu verstehen, insbesondere, wenn Aktionen parallel laufen. Sie finden sie in der &#039;&#039;Lauf&#039;&#039; Anzeige entweder eines Testplans oder eines Aktionsblocks. Sie verwendet die gesammelten [[Glossary/en#Activity_Log|Logdaten]] um anzuzeigen wann und wie lange eine Aktion ausgeführt wurde.&lt;br /&gt;
&lt;br /&gt;
= Darstellung =&lt;br /&gt;
Die Zeitleiste zeigt die Unterblöcke des ausgewählten Blocks als Balken in der Farbe ihres Ausführungsstatus, wobei deren Länge und horizontale Position die Dauer und Startzeit der Ausführung widerspiegeln. Die Zeitskala oben passt sich der dargestellten Zeit an. Das aktuelle Zeitformat können Sie in der oberen rechten Ecke ablesen; z.B. bedeutet &#039;&#039;m:s&#039;&#039; eine Darstellung in Minuten und Sekunden, wobei die Sekunden noch Dezimalstellen aufweisen können, um die Millisekunden anzuzeigen.&lt;br /&gt;
&lt;br /&gt;
Anfangs wird nur die oberste Ebene der Unterblöcke des ausgewählten Blocks angezeigt. Wenn Blöcke parallel ausgeführt werden, landen sie in verschiedenen Zeilen; nacheinander ausgeführte Blocke stehen in einer Zeile. Allerdings bedeutet es für zwei Blöcke, die hintereinander stehen NICHT generell, dass der zweiten vom ersten gestartet wurde.&lt;br /&gt;
&lt;br /&gt;
Sie können Blöcke ausklappen, um deren Unterblöcke zu sehen. Ist ein Block breit genug, wird dies durch ein entsprechendes kleines Icon in der oberen linken Ecke angezeigt. Sie können Blöcke auf- und zuklappen, indem Sie auf dieses Icon klicken. Alternativ können Sie auf einen Block mit der rechten Maustaste klicken und erhalten im Kontextmenü die Möglichkeit, ihn auf- oder zuzuklappen. Die Unterblöcke werden unterhalb ihrer Eltern angezeigt, wobei sich etwaige parallele Blöcke weiter nach unten verschieben. Der Rahmen eines Blocks umfasst seine Unterblöcke um die Verschachtelung zu verdeutlichen. Sie können auch Strg gedrückt halten, um alle Kinder auszuklappen. Da die Zeitleiste nur die Informationen aus den Logdaten darstellt, werden auch nur Blöcke angezeigt, die einen Logeintrag haben. Blöcke, die im Log übersprungen wurden, werden nicht angezeigt.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie einen Block in der Zeitleiste anklicken, wird er ausgewählt, was durch einen roten Rahmen dargestellt wird. Die Hauptinformationen dieses Blocks werden zum Meldungsfenster in der unteren linken Ecke des expecco-Fensters hinzugefügt. Außerdem werden Sie als Tooltip angezeigt, wenn Sie mit der Maus über den Block fahren.&lt;br /&gt;
&lt;br /&gt;
= Navigation =&lt;br /&gt;
Standardmäßig wird die gesamte Dauer des Laufs im Fenster angezeigt. Sie können aber heranzoomen, um bestimmte Abschnitte besser zu analysieren. Sie können die Menübuttons und die Maus verwenden, um sich auf der Zeitleiste zu bewegen.&lt;br /&gt;
&lt;br /&gt;
== Menüzeile ==&lt;br /&gt;
[[Datei:Timeline_Menubar.png]]&lt;br /&gt;
# Höhe der Zeilen verringern&lt;br /&gt;
# Höhe der Zeilen vergrößern&lt;br /&gt;
# Zeitleiste auf verfügbaren Breite strecken&amp;lt;br&amp;gt;Ein Umschaltknopf: wenn er aktiviert ist, wird die gesamte Laufdauer auf die Breite des Reiters gestreckt.&lt;br /&gt;
# Herauszoomen&amp;lt;br&amp;gt;Die Breite der Zeitleiste verkleinern, sodass mehr Zeit auf weniger Platz dargestellt wird&lt;br /&gt;
# Hineinzoomen&amp;lt;br&amp;gt;Die Breite der Zeitleiste vergrößern, sodass weniger Zeit auf mehr Platz dargestellt wird und besser analysiert werden kann&lt;br /&gt;
# Springe zum Start der ausgewählten Aktion&lt;br /&gt;
# Springe zum Ende der ausgewählten Aktion&lt;br /&gt;
# Relative Ausführungszeiten&amp;lt;br&amp;gt;Die Block-Informationen bspw. im Tooltip zeigen die Startzeit relativ zum Beginn des dargestellten Blocks und die Dauer falls aktiviert, ansonsten absolute Start- und Endzeiten&lt;br /&gt;
&lt;br /&gt;
== Mauseingabe ==&lt;br /&gt;
Durch Scrollen bei gedrückter Strg-Taste können Sie zoomen. Normales Scrollen verschiebt das Diagram vertikal, bei gedrückter Shift-Taste horizontal. Falls das Strecken der Zeitleiste deaktiviert ist, können Sie an einem Punkt in der Zeitskala klicken und zu einem anderen ziehen, um einen Zeitabschnitt auszuwählen. Wenn Sie die Maustaste loslassen, wird die Zeitleiste auf diesen Abschnitt herangezoomt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Timeline_Select_Time.png]]&lt;br /&gt;
&lt;br /&gt;
= Auswählen =&lt;br /&gt;
Wie bereits erwähnt, können Sie einen Block durch Klicken auswählen. Wenn Sie doppelklicken, wird der Block im Baum ausgewählt und die Zeitleiste wechselt zur Darstellung seiner Unterblöcke.&lt;br /&gt;
&lt;br /&gt;
Sie können die Zeitleiste (und gleichzeitig das Netzwerk, die Logdaten und die Ein/Ausgänge) auch auf den ausgewählten Block fixieren, indem Sie den Toggle-Button [[Datei:Timeline_Lock_Button.png]] im Menü des Baums aktivieren. Dies wird durch ein kleines Schloss-Symbol neben dem Eintrag des fixierten Blocks im Baum angezeigt. Wenn Sie nun einen anderen Block im Baum auswählen, wird er in der Zeitleiste des fixierten Blocks ausgewählt. Genauso können Sie auf einen Block in der Zeitleiste doppelklicken und sein Eintrag wird im Baum ausgewählt ohne die angezeigte Zeitleiste zu ändern.&lt;/div&gt;</summary>
		<author><name>Matilk</name></author>
	</entry>
</feed>