<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>QF-Test</title><link href="https://www.qftest.com/en/" rel="alternate"/><link href="https://www.qftest.com/all.atom.xml" rel="self"/><id>https://www.qftest.com/en/</id><updated>2026-04-01T00:00:00+02:00</updated><entry><title>Using GitHub Copilot CLI via Remote SSH from QF-Test</title><link href="https://www.qftest.com/en/blog/article/llm-copilot-ssh-remote.html" rel="alternate"/><published>2026-04-01T00:00:00+02:00</published><updated>2026-04-01T00:00:00+02:00</updated><author><name>Irfan Yigit, ASC Technologies</name></author><id>tag:www.qftest.com,2026-04-01:/en/blog/article/llm-copilot-ssh-remote.html</id><summary type="html">&lt;p&gt;This quick guide explains how to use the &lt;strong&gt;GitHub Copilot CLI&lt;/strong&gt; via a remote SSH connection directly from &lt;strong&gt;QF-Test&lt;/strong&gt; — including SSH key setup and troubleshooting.&lt;/p&gt;</summary><content type="html">&lt;p&gt;With QF-Test 10, it is possible to &lt;a href="/en/blog/article/llm-copilot.html"&gt;integrate third-party AI models such as GitHub Copilot into QF-Test.&lt;/a&gt; In the case of Copilot, it is usually necessary to have the Copilot CLI installed on the same system as QF-Test.&lt;/p&gt;
&lt;p&gt;However, there are situations where you cannot install the Copilot CLI on your test machines for technical or security reasons, or if you want to run multiple parallel QF-Test instances via &lt;a href="www.qftest.com/doc/manual/en/tech_daemon_api.html"&gt;Daemon mode&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For such cases, this guest article by long-time QF-Test user Irfan Yigit shows you how to set up Copilot on a single central machine and establish an SSH network connection to your test machines. You can then use your GitHub Copilot AI models with QF-Test via SSH.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/resources/llm-copilot-ssh-remote.svg" /&gt;&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;To set this up on a Windows system, &lt;a href="https://www.openssh.org/"&gt;OpenSSH&lt;/a&gt; is required. OpenSSH must be installed on both the client VM and the target VM.&lt;/p&gt;
&lt;p&gt;The client VM additionally needs &lt;a href="https://services.qftest.com/en/download/"&gt;QF-Test (10.0 or newer)&lt;/a&gt; installed. The target VM must have a current &lt;a href="https://github.com/features/copilot/cli/"&gt;GitHub Copilot CLI&lt;/a&gt; installation, and the GitHub login (&lt;code&gt;/login&lt;/code&gt;) must have been completed within the SSH environment.&lt;/p&gt;
&lt;p&gt;To use GitHub Copilot CLI via remote SSH reliably, an &lt;strong&gt;SSH key is required&lt;/strong&gt;, because OpenSSH cannot handle SSH password prompts during automated remote calls (such as those triggered from QF-Test). SSH key authentication is needed solely to establish a passwordless, stable SSH connection.&lt;/p&gt;
&lt;h2&gt;Step-by-Step Guide&lt;/h2&gt;
&lt;h3&gt;Preparation on the Client VM&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. Create the &lt;code&gt;.ssh&lt;/code&gt; directory&lt;/strong&gt; (if it doesn&amp;#8217;t exist, e.g. &lt;code&gt;C:\Users\Administrator\.ssh&lt;/code&gt;)&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;New-Item&lt;/span&gt; &lt;span class="n"&gt;-ItemType&lt;/span&gt; &lt;span class="n"&gt;Directory&lt;/span&gt; &lt;span class="n"&gt;-Path&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;$env:USERPROFILE\.ssh&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;-Force&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Out-Null&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;2. Generate an SSH key (ed25519) on the client VM (without a passphrase)&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;ssh-keygen&lt;/span&gt; &lt;span class="n"&gt;-t&lt;/span&gt; &lt;span class="n"&gt;ed25519&lt;/span&gt; &lt;span class="n"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;qftest-remote&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;$env:USERPROFILE\.ssh\id_ed25519&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Simply leave the passphrase empty (press Enter twice).&lt;/li&gt;
&lt;li&gt;The generated public key (&lt;code&gt;…/.ssh/id_ed25519.pub&lt;/code&gt;) will be needed on the target VM later.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Preparation on the Target VM&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. Set Access Control Lists (ACLs) correctly&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Windows OpenSSH only accepts keys if the file is in the right location &lt;strong&gt;and&lt;/strong&gt; the permissions are set with the correct ACLs. The file &lt;code&gt;C:\ProgramData\ssh\administrators_authorized_keys&lt;/code&gt; is created and secured as follows:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;icacls&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:\&lt;/span&gt;&lt;span class="n"&gt;ProgramData&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;administrators_authorized_keys&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;inheritance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;r&lt;/span&gt;
&lt;span class="n"&gt;icacls&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:\&lt;/span&gt;&lt;span class="n"&gt;ProgramData&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;administrators_authorized_keys&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;grant&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Administrators:F&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;icacls&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:\&lt;/span&gt;&lt;span class="n"&gt;ProgramData&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;administrators_authorized_keys&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;grant&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;SYSTEM:F&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;Restart-Service&lt;/span&gt; &lt;span class="n"&gt;sshd&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;2. Add the public key&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Paste the contents of &lt;code&gt;id_ed25519.pub&lt;/code&gt; from the client VM into the &lt;code&gt;administrators_authorized_keys&lt;/code&gt; file on the target VM and save it (one key per line).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Log in to Copilot CLI in the SSH environment on the target VM (once)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Copilot stores its login credentials locally in the respective user profile. The login &lt;strong&gt;must&lt;/strong&gt; be completed beforehand — either directly on the target VM or via SSH, depending on whether different Windows users are involved.&lt;/p&gt;
&lt;p&gt;Once the Copilot login is saved in the SSH environment, Copilot can be fully scripted via remote SSH from QF-Test.&lt;/p&gt;
&lt;p&gt;Run the following in PowerShell if all client VMs should interact with the same user and SSH environment:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;SSH directly to the target VM: &lt;code&gt;ssh -i ~/.ssh/id_ed25519 Administrator@&amp;lt;target-IP&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Start Copilot: &lt;code&gt;copilot&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Start login: &lt;code&gt;/login&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Confirm the device code in the browser.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Functional Test (Client VM → Target VM, headless)&lt;/h3&gt;
&lt;p&gt;Run the following command on the client VM in PowerShell:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;ssh&lt;/span&gt; &lt;span class="n"&gt;-i&lt;/span&gt; &lt;span class="p"&gt;~/.&lt;/span&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;id_ed25519&lt;/span&gt; &lt;span class="n"&gt;Administrator&lt;/span&gt;&lt;span class="p"&gt;@&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;target-IP&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;copilot -p &amp;#39;Say hello&amp;#39; --stream on&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Troubleshooting&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Test SSH key login from the client VM&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Verify that SSH works without a password using the SSH key (prerequisite for QF-Test):&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;ssh&lt;/span&gt; &lt;span class="n"&gt;-i&lt;/span&gt; &lt;span class="nv"&gt;$env:USERPROFILE&lt;/span&gt;&lt;span class="p"&gt;\.&lt;/span&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;id_ed25519&lt;/span&gt; &lt;span class="n"&gt;Administrator&lt;/span&gt;&lt;span class="p"&gt;@&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;target-IP&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;echo OK&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;If &lt;code&gt;OK&lt;/code&gt; appears → key authentication is working.&lt;/li&gt;
&lt;li&gt;If there is an error: check the SSH keys or ACLs on the target VM.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Connect Copilot CLI to QF-Test via SSH&lt;/h3&gt;
&lt;p&gt;Once everything works, follow these instructions from step 2:&lt;/p&gt;
&lt;div class="anchor-wrapper"&gt;
    &lt;a href="https://www.qftest.com/en/blog/article/llm-copilot.html" class="container card scroll-animated width-normal clear imgfill   image-right"&gt;&lt;img class="container-image" src="/blog/resources/github-copilot-cli.webp" alt=""&gt;&lt;div class="container-content"&gt;&lt;div class="container-title"&gt;&lt;div class="container-title-text"&gt;Tutorial: Using GitHub Copilot with the QF-Test AI Integration&lt;/div&gt;&lt;/div&gt;

&lt;div class="entry-content"&gt;  &lt;p&gt;Since QF-Test 10, AI-driven capabilities are integrated directly into your testing workflow. This post shows how to connect &lt;strong&gt;GitHub Copilot&lt;/strong&gt; to QF-Test using a simple custom model and the &lt;strong&gt;Copilot CLI&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;

&lt;div class="container width-normal align-start justify-center row    " &gt;&lt;div class="container-content" &gt;&lt;address class="vcard author"&gt;
&lt;strong class="flex-row-dynamic gap-small"&gt;
                &lt;img src="/images/staff/max.jpg" height="60" width="60" class="author-profile-pic" alt="Max Melzer"&gt;
            Max Melzer
            &lt;/strong&gt;&lt;/address&gt;
&lt;div class="flex-column"&gt;&lt;div&gt;&lt;time class="published" datetime="2026-02-09T00:00:00+01:00"&gt;
        09/02/2026
&lt;/time&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;    &lt;/div&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Make the following adjustments to the &lt;code&gt;ai.addCustomModel&lt;/code&gt; script (insert the correct user, path and IP for your setup):&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;ai&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addCustomModel&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;GitHub Copilot&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remoteUser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Administrator&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remoteHost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;192.168.0.2&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// IP of target VM&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remoteCmd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cmd /c \&amp;quot;C:/Users/Administrator/AppData/Local/GitHubCopilotCLI/copilot.exe --silent --stream off --model claude-sonnet-4.6 --prompt \\\&amp;quot;${msg}\\\&amp;quot;\&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ssh&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-o&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;StrictHostKeyChecking=no&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;${remoteUser}@${remoteHost}&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;remoteCmd&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;proc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;proc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;outputStream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;proc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;waitFor&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;proc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;● &amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr /&gt;
&lt;p&gt;Learn more about the AI integrations in QF-Test 10:&lt;/p&gt;
&lt;div class="anchor-wrapper"&gt;
    &lt;a href="https://www.qftest.com/en/solutions/test-automation-basics/ai-testautomation.html" class="container card scroll-animated width-normal   image-left  "&gt;&lt;img class="container-image" src="/images/qftest-ai.png" alt=""&gt;&lt;div class="container-content"&gt;&lt;div class="container-title"&gt;&lt;div class="container-title-text"&gt;AI-driven test automation with QF-Test&lt;/div&gt;&lt;/div&gt;&lt;div class="element-text"&gt;AI-driven testing and intelligent test automation for efficient software quality assurance&lt;/div&gt;    &lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</content><category term="blog"/><category term="how-to"/><category term="ai"/></entry><entry><title>QF-Test 10.0.3 available</title><link href="https://www.qftest.com/en/company/news/qf-test-10-0-3-available.html" rel="alternate"/><published>2026-03-11T00:00:00+01:00</published><updated>2026-03-11T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2026-03-11:/en/company/news/qf-test-10-0-3-available.html</id><content type="html">&lt;p&gt;This maintenance release adds support for Eclipse/SWT 4.39 alias &amp;#8220;2026-03&amp;#8221;, updates several libraries and fixes a number of bugs.&lt;/p&gt;</content><category term="news"/></entry><entry><title>How to use the QF-Test AI integration with a free local model using Ollama</title><link href="https://www.qftest.com/en/blog/article/llm-local-ollama.html" rel="alternate"/><published>2026-03-09T00:00:00+01:00</published><updated>2026-03-09T00:00:00+01:00</updated><author><name>Max Melzer</name></author><id>tag:www.qftest.com,2026-03-09:/en/blog/article/llm-local-ollama.html</id><summary type="html">&lt;p&gt;QF-Test has always been about reliable, maintainable test automation for web, desktop, Java-based, and mobile applications. With the new &lt;strong&gt;AI integration&lt;/strong&gt; in QF-Test 10, you can enhance your tests with AI-driven insights — and the best part is, you don’t need to rely on cloud services. In this post, we …&lt;/p&gt;</summary><content type="html">&lt;p&gt;QF-Test has always been about reliable, maintainable test automation for web, desktop, Java-based, and mobile applications. With the new &lt;strong&gt;AI integration&lt;/strong&gt; in QF-Test 10, you can enhance your tests with AI-driven insights — and the best part is, you don’t need to rely on cloud services. In this post, we’ll show you how to connect QF-Test to a &lt;strong&gt;locally running, free AI model&lt;/strong&gt; using &lt;a href="https://ollama.com/"&gt;Ollama&lt;/a&gt;, so you can start experimenting with AI-enhanced testing right on your own machine.&lt;/p&gt;
&lt;h2&gt;Step 1: Set up Ollama&lt;/h2&gt;
&lt;p&gt;To get started, you’ll need to install &lt;strong&gt;Ollama&lt;/strong&gt; on the machine where your tests run. Ollama provides free, locally hosted AI models that powerful enough for the more basic parts of QF-Test’s AI integration.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download and install Ollama from the official website: &lt;a href="https://ollama.com/"&gt;https://ollama.com/&lt;/a&gt; (You don&amp;#8217;t need any account).&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start the Ollama server by opening a terminal and running:  &lt;/p&gt;
&lt;p&gt;&lt;code&gt;bash
ollama serve&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In another terminal, download a model, which typically is a couple of gigabytes:  &lt;/p&gt;
&lt;p&gt;&lt;code&gt;bash
ollama pull llama3.2&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;By default, Ollama will host the model at &lt;code&gt;http://localhost:11434&lt;/code&gt; as long as &lt;code&gt;ollama serve&lt;/code&gt; is running. You can now use this endpoint in QF-Test to send AI requests locally — no internet connection required.&lt;/p&gt;
&lt;h2&gt;Step 2: Configure QF-Test to Use the Local AI&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Large Language Model integration options dialog in QF-Test" src="/blog/resources/qftest-ai-options-ollama.png" /&gt;&lt;/p&gt;
&lt;p&gt;You can connect the Ollama server to QF-Test convieniently via the QF-Test &lt;strong&gt;Options dialog&lt;/strong&gt;, accessible via &lt;strong&gt;QF-Test → Options → AI Integration&lt;/strong&gt;. Click the &amp;#8220;plus&amp;#8221; icon to add a new row to the &amp;#8220;AI Configurations&amp;#8221; table and enter the model details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Type:&lt;/strong&gt; &amp;#8220;Ollama&amp;#8221;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; &amp;#8220;Local AI&amp;#8221; (or whatever you like) &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;URL:&lt;/strong&gt; &amp;#8220;http://localhost:11434&amp;#8221;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API key:&lt;/strong&gt; &amp;#8220;&amp;#8221; (leave blank)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Model name:&lt;/strong&gt; &amp;#8220;llama3.2&amp;#8221; (the name of a model you added to Ollama via &lt;code&gt;ollama pull&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;QF-Test also makes it easy to integrate an AI model via the &lt;code&gt;ai&lt;/code&gt; scripting module, if you prefer the scripting approach.&lt;/p&gt;
&lt;p&gt;Here’s a minimal example of a &lt;a href="https://www.qftest.com/doc/manual/en/control.html#step_ServerScriptStep"&gt;server script&lt;/a&gt; that connects QF-Test to your locally running Ollama model:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;// Configure the AI model&lt;/span&gt;
&lt;span class="n"&gt;ai&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setDefaultConfig&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Ollama&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;http://localhost:11434&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;llama3.2&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;displayName:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Local AI&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Make a request to the AI and print it to the terminal&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ai&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ask&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;What is the answer to life, the universe and everything?&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;configName:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Local AI&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Let’s break down what’s happening:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;ai.setDefaultConfig(...)&lt;/code&gt;&lt;/strong&gt;:&lt;br /&gt;
   This line registers the model with QF-Test. You specify:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The type of endpoint (&amp;#8220;Provider&amp;#8221;) to use (&lt;code&gt;Ollama&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;The local endpoint url (&lt;code&gt;http://localhost:11434&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;An empty string for the API key (not needed for local models)&lt;/li&gt;
&lt;li&gt;The model name (&lt;code&gt;llama3.2&lt;/code&gt; in our case)&lt;/li&gt;
&lt;li&gt;A friendly display name (&lt;code&gt;Local AI&lt;/code&gt;) for use in the UI&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ai.ask(...)&lt;/code&gt;&lt;/strong&gt;:&lt;br /&gt;
 This line sends a prompt to the AI model. The &lt;code&gt;configName&lt;/code&gt; ensures it uses the local configuration we just defined. The result is returned directly and printed in the QF-Test terminal.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 3: Use AI in your tests&lt;/h2&gt;
&lt;p&gt;Beyond this toy example, you can now leverage your local AI model directly in your test cases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Check Text with AI&lt;/strong&gt;&lt;br /&gt;
  The AI integration can be used in a &lt;strong&gt;Check Text with AI&lt;/strong&gt; node. This is perfect for situations where you want QF-Test to validate text in your application UI dynamically. For example, you could check if a text matches a natural language description or even check if it&amp;#8217;s in the expected language.
  To learn more, see the documentation here: &lt;a href="https://www.qftest.com/doc/manual/en/checks.html#step_AICheckTextStep"&gt;Check Text with AI node&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AI Scripting Module&lt;/strong&gt;&lt;br /&gt;
  For advanced automation, the &lt;code&gt;ai&lt;/code&gt; scripting module gives you full programmatic control over AI requests in QF-Test:
  &lt;a href="https://www.qftest.com/doc/manual/en/tech_scripting_ai.html"&gt;AI scripting module documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The advantages of running locally&lt;/h2&gt;
&lt;p&gt;Running a local AI model has several advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Privacy:&lt;/strong&gt; Your test data never leaves your machine.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance:&lt;/strong&gt; Local inference can be faster than cloud requests.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost-free:&lt;/strong&gt; No API subscription needed for experimentation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By combining QF-Test’s robust automation framework with AI insights, you can enhance your tests, automate language checks, or even generate test suggestions — all without leaving your enterprise environment.&lt;/p&gt;
&lt;h2&gt;What&amp;#8217;s next&lt;/h2&gt;
&lt;p&gt;Once you have your local Ollama model running and integrated with QF-Test, try experimenting with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Natural language validations in your test cases&lt;/li&gt;
&lt;li&gt;Dynamic data generation for forms&lt;/li&gt;
&lt;li&gt;Multilingual text checks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more details on all AI integration options in QF-Test, check out our free special webinar &lt;strong&gt;&amp;#8220;When tests become intelligent: AI-driven checks with QF-Test&amp;#8221;&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;[[qf.Preview(videos/2026-03-02-special-webinar-ai-checks)]]&lt;/p&gt;
&lt;p&gt;With just a few steps, your tests can now become &lt;strong&gt;AI-aware&lt;/strong&gt; while staying fully under your control. It’s time to explore the power of combining QF-Test with local AI models!&lt;/p&gt;</content><category term="blog"/><category term="how-to"/><category term="ai"/></entry><entry><title>When tests become intelligent: AI-driven checks with QF-Test</title><link href="https://www.qftest.com/en/support/videos/special-webinar-ai-checks.html" rel="alternate"/><published>2026-03-02T00:00:00+01:00</published><updated>2026-03-02T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2026-03-02:/en/support/videos/special-webinar-ai-checks.html</id><summary type="html">&lt;p&gt;In this special webinar, we&amp;#8217;ll show you how to get the most out of the new AI integrations in QF-Test. With QF-Test 10, you can use AI to test non-deterministic UIs, validate UI components based on semantic criteria, generate test data, and much more.&lt;/p&gt;</summary><content type="html">&lt;p&gt;In this special webinar, we&amp;#8217;ll show you how to get the most out of the new AI integrations in QF-Test. With QF-Test 10, you can use AI to test non-deterministic UIs, validate UI components based on semantic criteria, generate test data, and much more.&lt;/p&gt;
&lt;h2&gt;Materials&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/videos/resources/2026-03-special-webinar-ai-en.pdf"&gt;Presentation (PDF)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/qfs/qftest-cmcp"&gt;QF-Test Connected MCP Server (Public Preview)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/videos/resources/2026-03-special-webinar-ai-browser-interaction-demo.qft"&gt;AI browser interaction demo (.qft)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/videos/resources/2026-03-special-webinar-ai-datadriver-demo.qft"&gt;AI data driver demo (.qft)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Contents&lt;/h2&gt;
&lt;h3&gt;Artificial Intelligence&lt;/h3&gt;
&lt;p&gt;A Large Language Model (LLM) auto-completes text prompts according to previously trained statistical connections.&lt;/p&gt;
&lt;h3&gt;Our Mission&lt;/h3&gt;
&lt;p&gt;QF-Test provides AI integrations that increase the productivity of test automation engineers without calling the quality of the results into
question.&lt;/p&gt;
&lt;p&gt;QF-Test builds on the expertise of QA professionals without replacing them.&lt;/p&gt;
&lt;p&gt;AI in QF-Test will always remain optional.&lt;/p&gt;
&lt;h3&gt;„Bring Your Own Model“&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;More flexibility&lt;/li&gt;
&lt;li&gt;No extra costs&lt;/li&gt;
&lt;li&gt;Better data privacy&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;AI Configuration&lt;/h3&gt;
&lt;p&gt;Your key to all AI functionality in QF-Test&lt;/p&gt;
&lt;h3&gt;Check text with AI&lt;/h3&gt;
&lt;p&gt;Semantic text checks in the UI of the application under test.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Testing a chat bot integration&lt;/li&gt;
&lt;li&gt;Checking the semantic content of text&lt;/li&gt;
&lt;li&gt;Checking the language of text&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;ai.ask and the AI Scripting Module&lt;/h3&gt;
&lt;p&gt;Send LLM requests in any scripting context.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Test data generation&lt;/li&gt;
&lt;li&gt;Advanced test run integrations&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Test generation with QF-Test – Sneak Preview&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Level 1: Test cases and test steps are generated from an existing test definition.&lt;/li&gt;
&lt;li&gt;Level 2: QF-Test agent executes pre-planned test steps; the interactions are recoded. A robust, repeatable test is created.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;QF-Test MCP Server&lt;/h3&gt;
&lt;p&gt;MCP (Model Context Protocol): Integrating external services into an LLM tool&lt;/p&gt;
&lt;p&gt;Future versions of QF-Test Pro will include an integrated MCP server. This will enable agent-based workflows with QF-Test.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Advantages over other automation MCPs:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Controlling Windows, iOS, Android, Java, and web applications&lt;/li&gt;
&lt;li&gt;Strong component recognition by combining QF-Test intelligence and artificial intelligence&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The experimental QF-Test Connected MCP Server (Public Preview) allows integrating QF-Test into agentic workflows today.&lt;/p&gt;
&lt;h3&gt;AI and Test Result Evaluation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Explain test failures and suggest corrective actions&lt;/li&gt;
&lt;li&gt;Analyze “component not found” errors&lt;/li&gt;
&lt;li&gt;Analyze text comparison diffs&lt;/li&gt;
&lt;li&gt;Summarize test reports&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your ideas are welcome!&lt;/p&gt;
&lt;h3&gt;What‘s the Price?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Basic AI features such as AI checks or test suite generation are and will remain included in the standard price of every QF-Test license.&lt;/li&gt;
&lt;li&gt;“Bring your own model”: Costs for using AI itself may arise depending on the chosen model and provider.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the future:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Advanced features such as integrating QF-Test into agent-based workflows via MCP will require a QF-Test Pro license.&lt;/li&gt;
&lt;li&gt;If there is sufficient interest: Secure, privacy-compliant access to AI models directly via QF-Test.&lt;/li&gt;
&lt;/ul&gt;</content><category term="videos"/><category term="specialwebinars"/><category term="ai"/></entry><entry><title>QF-Test and AI – Special webinar on March 2, 2026 – register now for free</title><link href="https://www.qftest.com/en/company/news/newsletters/qf-test-and-ai-special-webinar-on-march-2-2026-register-now-for-free.html" rel="alternate"/><published>2026-02-11T00:00:00+01:00</published><updated>2026-02-11T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2026-02-11:/en/company/news/newsletters/qf-test-and-ai-special-webinar-on-march-2-2026-register-now-for-free.html</id><summary type="html">&lt;p&gt;Tutorial about AI testing, Case studies: how our customer test mobile applications and Java Swing with QF-Test, training dates&lt;/p&gt;</summary><content type="html">&lt;p&gt;Hello dear QF-Test users!&lt;/p&gt;
&lt;p&gt;Get ready for the first QF-Test webinar of the year. On March 2, 2026 we will focus on “&lt;strong&gt;Artificial Intelligence&lt;/strong&gt;”. Business software requires reliability, not experimentation. That’s why, in this special webinar, we explain how we are using AI in a targeted way – now and in the future – where it delivers &lt;em&gt;real&lt;/em&gt; value, and how it helps you test more efficiently.  &lt;/p&gt;
&lt;p&gt;Best regards,&lt;br /&gt;
your QFS team&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Next QF-Test special webinar&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://register.gotowebinar.com/register/1914761468909710680"&gt;&lt;img alt="Release Notes" src="https://www.qftest.com/videos/resources/special-webinar-qftest-ai-en.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;March 2, 2026, 3:30 PM (CET) When tests become intelligent: AI-driven checks with QF-Test&lt;/h3&gt;
&lt;p&gt;In this special webinar, we&amp;#8217;ll show you how to get the most out of the new AI integrations in QF-Test. With QF-Test 10, you can use AI to test non-deterministic UIs, validate UI components based on semantic criteria, generate test data, and much more.&lt;/p&gt;
&lt;p&gt;&lt;a href="/support/schulung-beratung/webinare.html"&gt;Alternative date&lt;/a&gt;: Webinar in German on March 2, 2026, at 10:30 AM&lt;/p&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="https://register.gotowebinar.com/register/1914761468909710680"  class="button scroll-animated green chevron"&gt;Sign up for free to webinar&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;
&lt;h2&gt;Download QF-Test&lt;/h2&gt;
&lt;h3&gt;Are you already using the latest version of QF-Test?&lt;/h3&gt;
&lt;p&gt;The maintenance release QF-Test 10.0.2 increases flexibility for LLM communication (for example, for the AI Check node). It also improves the stability of communication with the QF-Test license server and fixes a few bugs.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://services.qftest.com/en/download/"&gt;&lt;img alt="Download QF-Test" src="/newsletters/resources/2025-09-25_Download-Thick-Bottom--Streamline-Streamline-3.0.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="https://services.qftest.com/en/download/"  class="button scroll-animated green chevron"&gt;Download QF-Test 10.0.2&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;To the &lt;a href="https://www.qftest.com/doc/manual/en/history.html#app_news"&gt;Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Watch the &lt;a href="/en/support/videos/qftest-version-10-highlights.html"&gt;Release video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Available since 2026-01-15&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Events in 2026&lt;/h2&gt;
&lt;h3&gt;QF-Test Basics: training courses via webinar&lt;/h3&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/training.html"&gt;&lt;img alt="Basic Training QF-Test" src="/newsletters/resources/QF-Test_OnlineSchulung.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;➡️February 23–26, 2026 in German&lt;/h3&gt;
&lt;h3&gt;📆March 23–26, 2026 in English&lt;/h3&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="/en/support/training-consulting/training.html"  class="button scroll-animated green chevron"&gt;More about the training courses&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;4 days, 2 × 2.5 hours each&lt;/li&gt;
&lt;li&gt;Effective and rapid knowledge transfer&lt;/li&gt;
&lt;li&gt;Small groups up to 8 participants&lt;/li&gt;
&lt;li&gt;You can interact with the trainers and ask questions at any time.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Individual QF-Test company trainings&lt;/h3&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/training.html#consulting"&gt;&lt;img alt="Individual QF-Test Training" src="/newsletters/resources/2025-10_OnlineSchulung-Ort.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Would you like a training course which is individually tailored to your company? Just send us an email to &lt;a href="https://services.qftest.com/en/support/contact/"&gt;service@qftest.com&lt;/a&gt;.&lt;/p&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="https://services.qftest.com/en/support/contact/?comment=Request%20individual%20training"  class="button scroll-animated green chevron"&gt;Ask our service team for a quote&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;
&lt;h2&gt;News&lt;/h2&gt;
&lt;h3&gt;Tutorial: Using GitHub Copilot with the QF-Test AI Integration&lt;/h3&gt;
&lt;p&gt;&lt;a href="/en/blog/article/llm-copilot.html"&gt;&lt;img alt="Tutorial GitHub Copilot" src="/newsletters/resources/copilot.png" /&gt;&lt;/a&gt;
We show how to connect GITHub Copilot to QF-Test using a simple custom model and the Copilot CLI.&lt;/p&gt;
&lt;p&gt;➜ &lt;a href="/en/blog/article/llm-copilot.html"&gt;Go to tutorial&lt;/a&gt;&lt;/p&gt;
&lt;div class="qf-spacer "&gt;&lt;/div&gt;
&lt;h3&gt;Testing ZK Applications with QF-Test&lt;/h3&gt;
&lt;p&gt;&lt;a href="/en/blog/article/testing-zk-applications-2026.html"&gt;&lt;img alt="ZK-Anwendungen mit QF-Test testen" src="https://www.qftest.com//blog/resources/qftest-zk-3d-compare.png" /&gt;&lt;/a&gt;
The great thing about ZK has always been that you can build web applications without having to deal with writing and maintaining HTML and JavaScript code.  &lt;/p&gt;
&lt;p&gt;➜ &lt;a href="/en/blog/article/testing-zk-applications-2026.html"&gt;Read the blog article now&lt;/a&gt;&lt;/p&gt;
&lt;div class="qf-spacer "&gt;&lt;/div&gt;
&lt;h3&gt;BITMARCK case study: best practice for mobile app testing&lt;/h3&gt;
&lt;p&gt;&lt;a href="/unternehmen/referenzen/fallstudien/bitmarck-mobile.html"&gt;&lt;img alt="Case Study Mobile Appp Testing" src="https://www.qftest.com/images/customer/bitmarck.png" /&gt;&lt;/a&gt;
Our customer BITMARCK Software GmbH uses QF-Test to perform mobile regression testing for iOS and Android applications. The case study shows how QF-Test ensures the high quality of iOS and Android applications in every release cycle.&lt;/p&gt;
&lt;p&gt;➜ &lt;a href="/en/company/references/case-studies/bitmarck-mobile.html"&gt;To the case study&lt;/a&gt;&lt;/p&gt;
&lt;div class="qf-spacer "&gt;&lt;/div&gt;

&lt;h3&gt;Case study ABS: automated nightly testing process saves significant time and effort&lt;/h3&gt;
&lt;p&gt;&lt;a href="/en/company/references/case-studies/abs.html"&gt;&lt;img alt="Case Study Java Swing Testing" src="/newsletters/resources/abslbs280.png" /&gt;&lt;/a&gt;
&amp;#8220;QF-Test, as the best solution for automated testing of our Swing-based ERP system for the laundry business, has exceeded our expectations for over 15 years.&amp;#8221;  &lt;/p&gt;
&lt;p&gt;➜ &lt;a href="/en/company/references/case-studies/abs.html"&gt;Read the case study now&lt;/a&gt;&lt;/p&gt;
&lt;div class="qf-spacer "&gt;&lt;/div&gt;

&lt;h3&gt;Master complex systems with QF-Test&lt;/h3&gt;
&lt;p&gt;&lt;a href="/en/blog/article/quality-engineering.html"&gt;&lt;img alt="mgm Quality Landscape" src="/newsletters/resources/image-2025-08-19-09-23-05-358.jpg" /&gt;&lt;/a&gt;
Based on the quality engineering strategy of Lilia Gargouri at mgm technology partners, our blog article shows how QF-Test helps organizations test software projects efficiently, scalably, and reliably.&lt;/p&gt;
&lt;p&gt;➜ &lt;a href="/en/blog/article/quality-engineering.html"&gt;Read the blog article now&lt;/a&gt;&lt;/p&gt;
&lt;div class="qf-spacer "&gt;&lt;/div&gt;

&lt;h3&gt;Partying in cozy alpine cabin vibes&lt;/h3&gt;
&lt;p&gt;&lt;a href="/en/company/news/company-events/new-years-meetup-mgm.html"&gt;&lt;img alt="" src="/companynews/resources/202601-eisstockschiessen.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In a relaxed atmosphere, full of coziness and great vibes, the QF-Test team took part in this year’s Winter Cabin Magic event hosted by our parent company, mgm technology partners.  &lt;/p&gt;
&lt;p&gt;➜ &lt;a href="/en/company/news/company-events/new-years-meetup-mgm.html"&gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;From our YouTube Channel&lt;/h2&gt;
&lt;p&gt;&lt;a href="/en/support/videos/welcome-to-qftest.html"&gt;&lt;img alt="Video about QF-Test" src="/newsletters/resources/imagevideo-qf-test-en.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;New video about QF-Test&lt;/h3&gt;
&lt;p&gt;Whether you’re building web apps, mobile experiences or desktop applications, QF-Test helps you deliver quality, faster.  &lt;/p&gt;
&lt;p&gt;➜ &lt;a href="/en/support/videos/welcome-to-qftest.html"&gt;Watch the video now&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Visit our &lt;a href="https://www.youtube.com/@qftest"&gt;YouTube channel&lt;/a&gt; to subscribe and follow us on &lt;a href="https://www.linkedin.com/company/quality-first-software-gmbh-qfs"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;</content><category term="newsletters"/></entry><entry><title>Tutorial: Using GitHub Copilot with the QF-Test AI Integration</title><link href="https://www.qftest.com/en/blog/article/llm-copilot.html" rel="alternate"/><published>2026-02-09T00:00:00+01:00</published><updated>2026-02-09T00:00:00+01:00</updated><author><name>Max Melzer</name></author><id>tag:www.qftest.com,2026-02-09:/en/blog/article/llm-copilot.html</id><summary type="html">&lt;p&gt;Since QF-Test 10, AI-driven capabilities are integrated directly into your testing workflow. This post shows how to connect &lt;strong&gt;GitHub Copilot&lt;/strong&gt; to QF-Test using a simple custom model and the &lt;strong&gt;Copilot CLI&lt;/strong&gt;.&lt;/p&gt;</summary><content type="html">&lt;p&gt;QF-Test is a comprehensive test automation solution built for Web, Desktop, Java-based, and Mobile applications, with a focus on long-term maintainability and enterprise-ready reliability. With the launch of &lt;strong&gt;QF-Test 10&lt;/strong&gt;, AI-driven capabilities are now integrated directly into your testing workflow. This post shows how to connect &lt;strong&gt;GitHub Copilot&lt;/strong&gt; to QF-Test using a simple custom model and the &lt;strong&gt;Copilot CLI&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Usually in QF-Test, AI providers are set up via &lt;a href="https://www.qftest.com/doc/manual/en/opt_llmintegration.html#opt_LLMProviders"&gt;&lt;em&gt;Options → Artificial Intelligence → AI Configurations&lt;/em&gt;&lt;/a&gt;. GitHub Copilot is an exception because it doesn&amp;#8217;t expose a standard API endpoint with a URL. Therefore, you cannot add Copilot in &lt;em&gt;Options → Artificial Intelligence → AI Configurations&lt;/em&gt;. The good news: you can still integrate Copilot by registering your own custom model in QF-Test that calls the GitHub Copilot CLI.&lt;/p&gt;
&lt;h2&gt;What you&amp;#8217;ll need&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://services.qftest.com/en/download/"&gt;QF-Test 10 or later&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Access to GitHub Copilot and GitHub Copilot CLI. As of now, a free GitHub account on the &amp;#8220;Free&amp;#8221; Copilot plan is enough to experiment with the Copilot CLI.&lt;/li&gt;
&lt;li&gt;Basic familiarity with scripting in QF-Test.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 1: Install and configure the GitHub Copilot CLI&lt;/h2&gt;
&lt;p&gt;&lt;img alt="" src="/blog/resources/github-copilot-cli.webp" /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install the GitHub Copilot CLI&lt;br /&gt;
&lt;a href="https://docs.github.com/en/copilot/how-tos/copilot-cli"&gt;Follow the official instructions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Log in from your Terminal&lt;br /&gt;
    Run &lt;code&gt;copilot login&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Verify it works&lt;br /&gt;
    Try a quick prompt: &lt;code&gt;copilot --prompt "Hello World"&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If that prints a response from Copilot, you&amp;#8217;re ready to connect it to QF-Test.&lt;/p&gt;
&lt;h2&gt;Step 2: Wire Copilot into QF-Test via a custom model&lt;/h2&gt;
&lt;p&gt;We&amp;#8217;ll use &lt;a href="https://www.qftest.com/doc/manual/en/tech_scripting_ai.html#ai_method_addCustomModel"&gt;&lt;code&gt;ai.addCustomModel&lt;/code&gt;&lt;/a&gt; in a &lt;a href="https://www.qftest.com/doc/manual/en/control.html#step_ServerScriptStep"&gt;Server Script&lt;/a&gt; so QF-Test can talk to Copilot by launching the CLI as a subprocess. In QF-Test:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a new Server Script node (language: Groovy).&lt;/li&gt;
&lt;li&gt;Paste the code below into the script.&lt;/li&gt;
&lt;li&gt;Adjust the path to the &lt;code&gt;copilot&lt;/code&gt; executable. &lt;code&gt;/opt/homebrew/bin/copilot&lt;/code&gt; will only work if Copilot CLI was installed via Homebrew on macOS.&lt;/li&gt;
&lt;li&gt;Run the script node.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;ai&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addCustomModel&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;GitHub Copilot&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/opt/homebrew/bin/copilot&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;--silent&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;--stream&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;off&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;--model&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;claude-sonnet-4.5&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;--prompt&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;proc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;proc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;outputStream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;proc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;waitFor&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;proc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;● &amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;})&lt;/span&gt;

&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ai&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ask&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;What is the answer to life, the universe and everything?&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;configName:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;GitHub Copilot&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;What this does:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Registers a LLM model named &amp;#8220;GitHub Copilot&amp;#8221; with the QF-Test AI integration.&lt;/li&gt;
&lt;li&gt;For each prompt (&lt;code&gt;msg&lt;/code&gt;), QF-Test starts the Copilot CLI and returns the CLI&amp;#8217;s text output back to QF-Test.&lt;/li&gt;
&lt;li&gt;Prints the result of a sample &lt;code&gt;ai.ask&lt;/code&gt; call in the QF-Test terminal.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Tip: You can change the model name passed to &lt;code&gt;--model&lt;/code&gt; to your preferred Copilot model.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you get an error saying &lt;code&gt;Cannot run program "/path/to/copilot": error=2, No such file or directory&lt;/code&gt;, you must update the path in the first item in the &lt;code&gt;cmd&lt;/code&gt; list to where the Copilot CLI is installed on your system.&lt;/p&gt;
&lt;p&gt;If everything works, you can remove the &lt;code&gt;println&lt;/code&gt; line at the end.&lt;/p&gt;
&lt;h2&gt;Step 3: Use Copilot with the QF-Test &lt;code&gt;ai&lt;/code&gt; scripting module&lt;/h2&gt;
&lt;p&gt;Once the custom model is registered, you can use it from any script with &lt;code&gt;ai.ask&lt;/code&gt;, for example:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kt"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ai&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ask&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Generate a JSON string of test data in the following format: ...&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nl"&gt;configName:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;GitHub Copilot&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setLocal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;data&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;For more on the &lt;code&gt;ai&lt;/code&gt; scripting module in QF-Test, see the &lt;a href="https://www.qftest.com/doc/manual/en/tech_scripting_ai.html"&gt;QF-Test manual&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Step 4: Validate UI text with &amp;#8220;Check text with AI&amp;#8221;&lt;/h2&gt;
&lt;p&gt;You can also bring Copilot into your test checks. The &lt;a href="https://www.qftest.com/doc/manual/en/checks.html#step_AICheckTextStep"&gt;&amp;#8220;Check text with AI&amp;#8221;&lt;/a&gt; node lets you  have the AI verify UI elements in your application using natural language. In the node&amp;#8217;s &amp;#8220;AI configuration&amp;#8221; field, &amp;#8220;GitHub Copilot&amp;#8221; should automatically appear in the dropdown.&lt;/p&gt;
&lt;p&gt;&lt;img alt="The &amp;quot;Check text with AI&amp;quot; node in QF-Test" src="https://www.qftest.com/doc/manual/en/images/att_AICheckTextStep.png" /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;That&amp;#8217;s it! Even though Copilot doesn&amp;#8217;t expose a standard URL+API key endpoint, you can still use it inside QF-Test by registering a custom model that calls the Copilot CLI. From there, &lt;code&gt;ai.ask&lt;/code&gt; helps you validate and generate data right in your tests, and &amp;#8220;Check text with AI&amp;#8221; lets you validate UI content in plain language. Happy testing!&lt;/p&gt;
&lt;p&gt;For more details on all AI integration options in QF-Test, see our free special webinar &lt;strong&gt;&amp;#8220;When tests become intelligent: AI-driven checks with QF-Test&amp;#8221;&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="video-card-horizontal flex-row-dynamic flex-wrap"&gt;
    &lt;a  href="https://www.qftest.com/en/support/videos/special-webinar-ai-checks.html" rel="bookmark" title="When tests become intelligent: AI-driven checks with QF-Test"&gt;
        &lt;img src="/videos/resources/special-webinar-qftest-ai-en.jpg" class="scroll-animated" width="640" height="480" alt=""&gt;
    &lt;/a&gt;
    &lt;div class="entry-content"&gt;
      &lt;h3 class="entry-title"&gt;
        &lt;a class="title" href="https://www.qftest.com/en/support/videos/special-webinar-ai-checks.html" rel="bookmark" title="When tests become intelligent: AI-driven checks with QF-Test"&gt;
            When tests become intelligent: AI-driven checks with QF-Test
        &lt;/a&gt;
      &lt;/h3&gt;
  &lt;p&gt;In this special webinar, we&amp;#8217;ll show you how to get the most out of the new AI integrations in QF-Test. With QF-Test 10, you can use AI to test non-deterministic UIs, validate UI components based on semantic criteria, generate test data, and much more.&lt;/p&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;div class="anchor-wrapper"&gt;
    &lt;a href="https://www.qftest.com/en/blog/article/llm-copilot-ssh-remote.html" class="container card scroll-animated width-normal clear imgfill   image-right"&gt;&lt;img class="container-image" src="/blog/resources/llm-copilot-ssh-remote.svg" alt=""&gt;&lt;div class="container-content"&gt;&lt;div class="container-title"&gt;&lt;div class="container-title-text"&gt;Using GitHub Copilot CLI via Remote SSH from QF-Test&lt;/div&gt;&lt;/div&gt;

&lt;div class="entry-content"&gt;  &lt;p&gt;This quick guide explains how to use the &lt;strong&gt;GitHub Copilot CLI&lt;/strong&gt; via a remote SSH connection directly from &lt;strong&gt;QF-Test&lt;/strong&gt; — including SSH key setup and troubleshooting.&lt;/p&gt;
&lt;/div&gt;

&lt;div class="container width-normal align-start justify-center row    " &gt;&lt;div class="container-content" &gt;&lt;address class="vcard author"&gt;
Irfan Yigit, ASC Technologies&lt;/address&gt;
&lt;div class="flex-column"&gt;&lt;div&gt;&lt;time class="published" datetime="2026-04-01T00:00:00+02:00"&gt;
        01/04/2026
&lt;/time&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;    &lt;/div&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="/en/solutions/test-automation-basics/ai-testautomation.html"&gt;More about AI-driven testautomation&lt;/a&gt;.&lt;/p&gt;</content><category term="blog"/><category term="how-to"/><category term="ai"/></entry><entry><title>Testing ZK Applications with QF-Test in 2026</title><link href="https://www.qftest.com/en/blog/article/testing-zk-applications-2026.html" rel="alternate"/><published>2026-02-05T00:00:00+01:00</published><updated>2026-02-05T00:00:00+01:00</updated><author><name>Max Melzer</name></author><id>tag:www.qftest.com,2026-02-05:/en/blog/article/testing-zk-applications-2026.html</id><summary type="html">&lt;p&gt;&lt;em&gt;This text was &lt;a href="https://docs.zkoss.org/small-talk/2026/02/05/qftest-testing-zk-applications"&gt;originally published as a ZK Small Talk&lt;/a&gt;. &lt;/em&gt;&lt;em&gt;ZK&lt;/em&gt;&lt;em&gt; is a framework for building web applications with Java and a long-standing partner of QF-Test.&lt;/em&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;This text was &lt;a href="https://docs.zkoss.org/small-talk/2026/02/05/qftest-testing-zk-applications"&gt;originally published as a ZK Small Talk&lt;/a&gt;. &lt;/em&gt;&lt;em&gt;ZK&lt;/em&gt;&lt;em&gt; is a framework for building web applications with Java and a long-standing partner of QF-Test.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;img alt="" src="/blog/resources/qftest-zk-3d-compare.png" /&gt;&lt;/p&gt;
&lt;p&gt;The great thing about ZK has always been that you can build web application without having to deal with the hassle of writing and maintaining HTML and JavaScript code. You define your application UI in concise &lt;a href="https://docs.zkoss.org/zk_dev_ref/ui_composing/zuml"&gt;&lt;code&gt;ZUML&lt;/code&gt; markup&lt;/a&gt; and little &lt;a href="https://docs.zkoss.org/zk_dev_ref/ui_composing/richlet"&gt;richlets&lt;/a&gt; written in Java, you can write unit tests for your business logic and even use &lt;a href="https://www.zkoss.org/product/zats"&gt;ZATS&lt;/a&gt; to test your UI.&lt;/p&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="https://docs.zkoss.org/small-talk/2026/02/05/qftest-testing-zk-applications"  class="button scroll-animated green chevron"&gt;Read more on the ZK Small Talks blog&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;</content><category term="blog"/><category term="how-to"/><category term="testing"/></entry><entry><title>End-to-end tests for automated testing of a Swing-based ERP solution</title><link href="https://www.qftest.com/en/company/references/case-studies/abs.html" rel="alternate"/><published>2026-02-03T00:00:00+01:00</published><updated>2026-02-03T00:00:00+01:00</updated><author><name>Anca Stamatopol</name></author><id>tag:www.qftest.com,2026-02-03:/en/company/references/case-studies/abs.html</id><summary type="html">&lt;p&gt;QF-Test as the best solution for automated testing of our Swing-based ERP solution&lt;/p&gt;</summary><content type="html">&lt;h2&gt;About ABS&lt;/h2&gt;
&lt;p&gt;ABS is a leading software company for laundry management systems, specialized worldwide in the laundry and textile rental industry. Our software has evolved into a comprehensive and integrated ERP solution for industrial laundries—including route accounting and contract management.&lt;/p&gt;
&lt;h2&gt;Automated End-to-End Testing without programming skills&lt;/h2&gt;
&lt;p&gt;After conducting extensive research on multiple automated testing solutions, we selected QF-Test as the best fit for our &lt;a href="/en/product/qf-test/java-testing/java-swing-awt.html"&gt;Java Swing&lt;/a&gt; based laundry ERP system.&lt;/p&gt;
&lt;p&gt;A key advantage was the &lt;strong&gt;ease of use&lt;/strong&gt;, which enabled our team to &lt;strong&gt;quickly build business flow tests without requiring advanced programming knowledge&lt;/strong&gt;.  &lt;/p&gt;
&lt;p&gt;This enabled us to&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;automate critical flows early on,&lt;/li&gt;
&lt;li&gt;significantly reduce manual testing effort, and&lt;/li&gt;
&lt;li&gt;accelerate delivery.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Expanding test coverage&lt;/h3&gt;
&lt;p&gt;Over time, the QF-Test tool has continued to mature, allowing us to &lt;strong&gt;extend our automated test coverage beyond Java Swing to web applications, mobile applications, and REST web services&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For unsuccessful test flows, QF-Test provides &lt;strong&gt;highly valuable diagnostic data&lt;/strong&gt;, including&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;screenshots,&lt;/li&gt;
&lt;li&gt;detailed step-by-step error information, and&lt;/li&gt;
&lt;li&gt;error messages.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additionally, by integrating Jython scripts into our dependencies, we are able to validate error log files, giving us deeper insights into failures and improving root-cause analysis.&lt;/p&gt;
&lt;h3&gt;Automated nightly testing saves time and effort&lt;/h3&gt;
&lt;p&gt;We implemented a fully automated nightly testing process using &lt;strong&gt;Jenkins&lt;/strong&gt; that executes all QF-Test test runs automatically and provides comprehensive results.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;These reports are extremely helpful for identifying code defects as well as opportunities to improve test flows.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The ability to run these automated tests on both master and feature branches has saved our team &lt;strong&gt;substantial amount of time and effort compared to manual end-to-end testing&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Outstanding support&lt;/h2&gt;
&lt;p&gt;Beyond the technology itself, our &lt;strong&gt;collaboration with the QF-Test team has been outstanding&lt;/strong&gt;. Their support team is responsive and knowledgeable, consistently helping us solve challenges when needed. They also regularly offer &lt;a href="/en/support/training-consulting/webinars.html"&gt;webinars&lt;/a&gt; that provide valuable insights into new features, enhancements, and best practices, ensuring we continuously get more value from the tool. After more than 15 years of use, QF-Test remains a &lt;strong&gt;trusted partner in our automated testing strategy&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;QF-Test, as the best solution for automated testing of our Swing-based ERP solution for the laundry industry, &lt;strong&gt;has exceeded our expectations for over 15 years&lt;/strong&gt;. The &lt;strong&gt;intuitive approach&lt;/strong&gt; enabled us to rapidly create end-to-end tests with minimal programming effort, drastically reducing manual testing needs. Thanks to the &lt;strong&gt;continuous innovation&lt;/strong&gt; from the QF-Test team, we have since expanded our test coverage to include mobile applications, web applications, and web services, making QF-Test a trusted long-term partner.&lt;/p&gt;
&lt;p&gt;Anca Stamatopol, QA Automation Team Lead, ABS Laundry Business Solutions&lt;/p&gt;</content><category term="casestudies"/><category term="it"/></entry><entry><title>Mobile Regression Testing for iOS and Android</title><link href="https://www.qftest.com/en/company/references/case-studies/bitmarck-mobile.html" rel="alternate"/><published>2026-02-02T00:00:00+01:00</published><updated>2026-02-02T00:00:00+01:00</updated><author><name>Dirk Kruck</name></author><id>tag:www.qftest.com,2026-02-02:/en/company/references/case-studies/bitmarck-mobile.html</id><summary type="html">&lt;p&gt;As a leading digitalization partner in statutory health insurance, BITMARCK is driving digital transformation in the industry with innovative products and services.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Expanding the GKV Software Standard BITMARCK_21c|ng&lt;/h2&gt;
&lt;h3&gt;About BITMARCK&lt;/h3&gt;
&lt;p&gt;As a leading digitalization partner in the statutory health insurance sector, BITMARCK is accelerating digital transformation within the industry through innovative products and services. The foundation for this is the GKV software standard BITMARCK_21c|ng, which is used by affiliated healthcare funds. Clients of the BITMARCK Group include company and guild health insurance funds, as well as DAK-Gesundheit and other substitute health insurers—over 30,000 employees and around 35 million insured individuals within statutory health insurance (GKV) benefit from BITMARCK’s IT services. More than 80 percent of German statutory health insurers are clients of the group. With more than 1,900 employees, BITMARCK generates annual revenues of more than half a billion euros.&lt;/p&gt;
&lt;h2&gt;The Challenge: Seamless Quality Assurance for Mobile Channels&lt;/h2&gt;
&lt;p&gt;After successfully implementing test automation for desktop clients (Web and Swing), BITMARCK GmbH faced the challenge of bringing the quality of its native iOS and Android apps within the GKV software standard BITMARCK_21c|ng up to the same high level.&lt;br /&gt;
This required a forward-looking and flexible extension of the existing test automation framework in order to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ensure a &lt;strong&gt;consistent user experience and functionality&lt;/strong&gt; across both mobile operating systems (iOS and Android).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quickly and efficiently create new mobile test cases&lt;/strong&gt; and integrate them into the existing set of over 4,500 regression tests.&lt;/li&gt;
&lt;li&gt;Integrate &lt;strong&gt;mobile test coverage&lt;/strong&gt; into the Continuous Delivery (CI/CD) pipeline to ensure stability with every release cycle.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;The Solution: Leveraging the QF-Test Platform for Mobile&lt;/h2&gt;
&lt;p&gt;The existing foundation, consisting of QF-Test and the jointly developed Multi-Client Recorder, served as the basis for the mobile expansion.&lt;/p&gt;
&lt;h3&gt;Mobile Regression Testing Strategy in Detail&lt;/h3&gt;
&lt;p&gt;BITMARCK focused on securing its native iOS and Android apps, which serve as important customer and employee portals, by taking the following steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Technology Selection and Integration:&lt;/strong&gt; Thanks to QF-Test’s platform-agnostic nature, the framework could be directly extended to native mobile apps. Integration was achieved via QF-Test, enabling seamless use of both physical devices and emulators.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mobile Test Object Recognition:&lt;/strong&gt; Close collaboration with QFS enabled the early implementation and optimization of mobile test object recognition. This ensured robust test cases that are resilient to minor UI changes across both mobile platforms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Specific Mobile Interactions:&lt;/strong&gt; Specific mobile interactions (such as swiping and handling virtual keyboards) are captured by the recorder and incorporated into test cases.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Result:&lt;/strong&gt; Mobile test coverage has been successfully integrated into the CI/CD pipeline and now ensures the quality of iOS and Android applications in every release cycle.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The Benefits&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cross-Platform Efficiency:&lt;/strong&gt; The Multi-Client Recorder optimizes test automation for Web clients, Swing clients, and native iOS and Android apps—all under one unified framework.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comprehensive Coverage:&lt;/strong&gt; Integration allows management and execution of regression tests across all client architectures, including the new mobile coverage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accelerated Test Development:&lt;/strong&gt; The recorder’s intuitive design carries over to mobile development, simplifying the creation and maintenance of test cases while significantly reducing maintenance effort.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maximum Mobile Software Quality:&lt;/strong&gt; By expanding its regression testing strategy, BITMARCK Software GmbH ensures the highest quality for its mobile solutions for statutory health insurance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Continuous Delivery:&lt;/strong&gt; Mobile coverage has become part of the CI/CD pipeline, guaranteeing the stability of native apps in every daily run.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The successful integration of &lt;strong&gt;mobile regression testing for iOS and Android&lt;/strong&gt; using QF-Test and the Multi-Client Recorder highlights the flexibility and future-readiness of BITMARCK GmbH’s test automation strategy. This expansion safeguards the growing importance of mobile channels and reaffirms the commitment to the highest quality standards in software development.&lt;/p&gt;
&lt;p&gt;Dirk Kruck, Test Engineer, BITMARCK Software GmbH&lt;/p&gt;</content><category term="casestudies"/><category term="healthcare"/><category term="it"/><category term="insurance"/></entry><entry><title>QF-Test Featured in mgm technology partners’ Blog on Quality and Efficiency Strategy</title><link href="https://www.qftest.com/en/blog/article/quality-engineering.html" rel="alternate"/><published>2026-01-29T00:00:00+01:00</published><updated>2026-01-29T00:00:00+01:00</updated><author><name>Monika Dühring</name></author><id>tag:www.qftest.com,2026-01-29:/en/blog/article/quality-engineering.html</id><summary type="html">&lt;p&gt;In their latest blog post, mgm technology partners presents their holistic approach to &lt;strong&gt;Quality Engineering&lt;/strong&gt;. Here we explain why we also find this approach worthwhile and how QF-Test fits into it.&lt;/p&gt;</summary><content type="html">&lt;p&gt;In the latest post on the mgm technology partners blog, &lt;a href="https://insights.mgm-tp.com/en/2026/quality-assurance/how-quality-engineering-makes-complex-systems-manageable/"&gt;&amp;#8220;How Quality Engineering Makes Complex Systems Manageable&amp;#8221;&lt;/a&gt;, &lt;a href="/author/lilia-gargouri.html"&gt;Lilia Gargouri&lt;/a&gt; presents their holistic approach to quality engineering &amp;ndash; with a focus on sustainable, scalable quality assurance in complex software projects. Unlike traditional testing, this approach emphasizes a systematic interplay of architecture, processes, data, models, and tools, making quality throughout the entire software lifecycle both predictable and controllable.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://insights.mgm-tp.com/wp-content/uploads/2025/08/image-2025-08-19-09-23-05-358.jpg" /&gt;&lt;/p&gt;
&lt;h2&gt;A particularly interesting aspect&lt;/h2&gt;
&lt;p&gt;The article highlights the critical role automation plays in this approach—and this is where QF-Test comes in. As a powerful tool for automated end-to-end and &lt;a href="/en/solutions/types-of-tests.html"&gt;UI testing&lt;/a&gt;, QF-Test delivers exactly the scalability and repeatability that complex applications require, helping teams use resources efficiently while ensuring high quality.&lt;/p&gt;
&lt;h2&gt;Why QF-Test matters for quality engineering&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Automated tests that go beyond classic manual methods to &lt;strong&gt;ensure consistent, reproducible quality&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Support for different types of applications&lt;/strong&gt; (web, desktop, Android, iOS applications, etc.), making it easier to integrate into diverse projects.&lt;/li&gt;
&lt;li&gt;Contribution to a shift-left strategy, helping to prevent defects early in the development process and thereby &lt;strong&gt;reducing effort and cost&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Overall, the article demonstrates how test automation—and especially the use of QF-Test as part of a test and quality engineering strategy—helps manage the challenges of complex software environments and ensures the highest quality standards.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;a href="https://insights.mgm-tp.com/en/2026/quality-assurance/how-quality-engineering-makes-complex-systems-manageable/"&gt;How Quality Engineering Makes Complex Systems Manageable&lt;/a&gt; by Lilia Gargouri, Head of Quality Engineering at mgm technology partners&lt;/p&gt;</content><category term="blog"/><category term="testing"/></entry><entry><title>QF-Test and mgm technology partners partying in cozy alpine cabin vibes</title><link href="https://www.qftest.com/en/company/news/company-events/new-years-meetup-mgm.html" rel="alternate"/><published>2026-01-21T00:00:00+01:00</published><updated>2026-01-21T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2026-01-21:/en/company/news/company-events/new-years-meetup-mgm.html</id><summary type="html">&lt;p&gt;In a relaxed atmosphere, with lots of cosiness and a great mood, the QF-Test team took part in this year&amp;#8217;s Winter Hüttenzauber organized by our parent company mgm technology partners.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="Curling 2026" src="/companynews/resources/202601-eisstockschiessen.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;With delicious food, cheerful curling and good music, there was definitely no shortage of fun. By the end, everyone was on the dance floor.
It was an all-around successful evening that strengthened team spirit and created many wonderful shared memories.&lt;/p&gt;</content><category term="companynews"/></entry><entry><title>QF-Test 10.0.2 available</title><link href="https://www.qftest.com/en/company/news/qf-test-10-0-2-available.html" rel="alternate"/><published>2026-01-15T00:00:00+01:00</published><updated>2026-01-15T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2026-01-15:/en/company/news/qf-test-10-0-2-available.html</id><content type="html">&lt;p&gt;This maintenance release increases flexibility for LLM communication (for example, for the AI Check node). It also improves the stability of communication with the QF-Test license server and fixes a few bugs.&lt;/p&gt;</content><category term="news"/></entry><entry><title>Maintenace release QF-Test 10.0.1 &amp; season’s greetings by QFS</title><link href="https://www.qftest.com/en/company/news/qf-test-1001-seasons-greetings.html" rel="alternate"/><published>2025-12-18T00:00:00+01:00</published><updated>2025-12-18T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-12-18:/en/company/news/qf-test-1001-seasons-greetings.html</id><summary type="html">&lt;p&gt;Happy holidays &amp;amp; a successful start to the new year with QF-Test&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="/en/index.html"&gt;&lt;img alt="QF-Test Logo" src="/newsletters/resources/qf-test+logo-200-xmas.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hello dear QF-Test users!&lt;/p&gt;
&lt;p&gt;As we approach the end of another remarkable year, we would like to take a moment to thank you for your trust, loyalty, and excellent collaboration. Together, we have once again achieved a great deal this year:&lt;/p&gt;
&lt;p&gt;&lt;a href="/en/product/release-notes-roadmap.html"&gt;&lt;img alt="QF-Test Version 9+10" src="/newsletters/resources/qf-test9-10png.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;With &lt;strong&gt;QF-Test 9 and 10&lt;/strong&gt;, you benefit from powerful enhancements such as WebAPI testing and AI-driven validation, improved accessibility testing and much more flexible image-based testing capabilities. We look forward to your &lt;a href="https://services.qftest.com/en/support/contact/?type=editions"&gt;feedback on our new QF-Test editions&lt;/a&gt;.  &lt;/p&gt;
&lt;p&gt;Through continuous development, we keep our finger on the pulse. Accordingly, we are releasing &lt;strong&gt;maintenance version 10.0.1&lt;/strong&gt; today with several important bug fixes.&lt;/p&gt;
&lt;p&gt;Features for integrating the &lt;strong&gt;test management tools Q12-TMT and Xray&lt;/strong&gt; as well as support for &lt;strong&gt;Oracle Forms&lt;/strong&gt; are &lt;strong&gt;currently under development&lt;/strong&gt; and will also be included in QF-Test 10 soon with upcoming minor updates.  &lt;/p&gt;
&lt;p&gt;We&amp;#8217;re excited to continue this journey with you in 2026! We wish you and your families a relaxing and restful Christmas season. Treat yourself to some quality time, enjoy the festive season, and recharge your batteries for the coming year.  &lt;/p&gt;
&lt;p&gt;With warm regards and best wishes for a successful, healthy, and happy 2026,&lt;br /&gt;
your QFS team&lt;/p&gt;</content><category term="news"/></entry><entry><title>Maintenace release QF-Test 10.0.1 &amp; season’s greetings by QFS</title><link href="https://www.qftest.com/en/company/news/newsletters/qf-test-1001-seasons-greetings.html" rel="alternate"/><published>2025-12-18T00:00:00+01:00</published><updated>2025-12-18T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-12-18:/en/company/news/newsletters/qf-test-1001-seasons-greetings.html</id><summary type="html">&lt;p&gt;🎄 Happy holidays &amp;amp; a successful start to the new year with QF-Test&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="/en/index.html"&gt;&lt;img alt="QF-Test Logo" src="/newsletters/resources/qf-test+logo-200-xmas.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hello dear QF-Test users!&lt;/p&gt;
&lt;p&gt;As we approach the end of another remarkable year, we would like to take a moment to thank you for your trust, loyalty, and excellent collaboration. Together, we have once again achieved a great deal this year:&lt;/p&gt;
&lt;p&gt;&lt;a href="/en/product/release-notes-roadmap.html"&gt;&lt;img alt="QF-Test Version 9+10" src="/newsletters/resources/qf-test9-10png.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;With &lt;strong&gt;QF-Test 9 and 10&lt;/strong&gt;, you benefit from powerful enhancements such as WebAPI testing and AI-driven validation, improved accessibility testing and much more flexible image-based testing capabilities. We look forward to your &lt;a href="https://services.qftest.com/en/support/contact/?comment=Feedback%20Editions"&gt;feedback on our new QF-Test editions&lt;/a&gt;.  &lt;/p&gt;
&lt;p&gt;Through continuous development, we keep our finger on the pulse. Accordingly, we are releasing &lt;strong&gt;maintenance version 10.0.1&lt;/strong&gt; today with several important bug fixes.&lt;/p&gt;
&lt;p&gt;Features for integrating the &lt;strong&gt;test management tools Q12-TMT and Xray&lt;/strong&gt; as well as support for &lt;strong&gt;Oracle Forms&lt;/strong&gt; are &lt;strong&gt;currently under development&lt;/strong&gt; and will also be included in QF-Test 10 soon with upcoming minor updates.  &lt;/p&gt;
&lt;p&gt;We&amp;#8217;re excited to continue this journey with you in 2026! We wish you and your families a relaxing and restful Christmas season. Treat yourself to some quality time, enjoy the festive season, and recharge your batteries for the coming year.  &lt;/p&gt;
&lt;p&gt;With warm regards and best wishes for a successful, healthy, and happy 2026,&lt;br /&gt;
your QFS team&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Download QF-Test&lt;/h2&gt;
&lt;h3&gt;Are you already using the latest version of QF-Test?&lt;/h3&gt;
&lt;p&gt;The maintenance release QF-Test 10.0.1 fixes startup issues under QF-Test 10.0.0 related to certain license files and addresses several other minor bugs.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://services.qftest.com/en/download/"&gt;&lt;img alt="Download QF-Test" src="/newsletters/resources/2025-09-25_Download-Thick-Bottom--Streamline-Streamline-3.0.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="https://services.qftest.com/en/download/"  class="button scroll-animated green chevron"&gt;Download QF-Test 10.0.1&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;To the &lt;a href="https://www.qftest.com/doc/manual/en/history.html#app_news"&gt;Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Watch the &lt;a href="/en/support/videos/qftest-version-10-highlights.html"&gt;Release video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Available since 2025-12-18&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Events in 2026&lt;/h2&gt;
&lt;h3&gt;Next QF-Test special webinar&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://register.gotowebinar.com/register/1914761468909710680"&gt;&lt;img alt="Release Notes" src="https://www.qftest.com/videos/resources/special-webinar-qftest-ai-en.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;March 2, 2026, 3:30 PM (CET) When tests become intelligent: AI-driven checks with QF-Test&lt;/h3&gt;
&lt;p&gt;In this special webinar, we&amp;#8217;ll show you how to get the most out of the new AI integrations in QF-Test. With QF-Test 10, you can use AI to test non-deterministic UIs, validate UI components based on semantic criteria, generate test data, and much more.&lt;/p&gt;
&lt;p&gt;&lt;a href="/support/schulung-beratung/webinare.html"&gt;Alternative date&lt;/a&gt;: Webinar in German on March 2, 2026, at 10:30 AM&lt;/p&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="https://register.gotowebinar.com/register/1914761468909710680"  class="button scroll-animated green chevron"&gt;Sign up for free to webinar&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;
&lt;h3&gt;QF-Test Basics: Training courses via webinar&lt;/h3&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/training.html"&gt;&lt;img alt="Basic Training QF-Test" src="/newsletters/resources/QF-Test_OnlineSchulung.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;February 23–26, 2026 in German&lt;/h3&gt;
&lt;h3&gt;March 23–26, 2026 in English&lt;/h3&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="/en/support/training-consulting/training.html"  class="button scroll-animated green chevron"&gt;More about the training courses&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;4 days, 2 × 2.5 hours each&lt;/li&gt;
&lt;li&gt;Effective and rapid knowledge transfer&lt;/li&gt;
&lt;li&gt;Small groups up to 8 participants&lt;/li&gt;
&lt;li&gt;You can interact with the trainers and ask questions at any time.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Individual QF-Test Company Trainings&lt;/h3&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/training.html#consulting"&gt;&lt;img alt="Individual QF-Test Training" src="/newsletters/resources/2025-10_OnlineSchulung-Ort.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Would you like a training course which is individually tailored to your company? Just send us an email to &lt;a href="https://services.qftest.com/en/support/contact/"&gt;service@qftest.com&lt;/a&gt;.&lt;/p&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="https://services.qftest.com/en/support/contact/?comment=Request%20individual%20training"  class="button scroll-animated green chevron"&gt;Ask our service team for a quote&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;
&lt;h2&gt;News&lt;/h2&gt;
&lt;h3&gt;Donations 2025&lt;/h3&gt;
&lt;p&gt;At QFS, we are pleased to once again support a number of nonprofit organizations with donations this year. Our employees also contribute by nominating projects that are particularly meaningful to them.   &lt;/p&gt;
&lt;p&gt;➜ &lt;a href="/en/company/news/company-events/donations-2025.html"&gt;These organizations are supported by QFS in 2025&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/en/company/news/company-events/donations-2025.html"&gt;&lt;img alt="QF-Test Spezialwebinar" src="/newsletters/resources/gift-heart--streamline-streamline-3.0.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;From our YouTube Channel&lt;/h2&gt;
&lt;p&gt;&lt;a href="/en/support/videos/welcome-to-qftest.html"&gt;&lt;img alt="Video about QF-Test" src="/newsletters/resources/imagevideo-qf-test-en.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;New video about QF-Test&lt;/h3&gt;
&lt;p&gt;Whether you’re building web apps, mobile experiences or desktop applications, QF-Test helps you deliver quality, faster.  &lt;/p&gt;
&lt;p&gt;➜ &lt;a href="/en/support/videos/welcome-to-qftest.html"&gt;Watch the video now&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Visit our &lt;a href="https://www.youtube.com/@qftest"&gt;YouTube channel&lt;/a&gt; to subscribe and follow us on &lt;a href="https://www.linkedin.com/company/quality-first-software-gmbh-qfs"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;</content><category term="newsletters"/></entry><entry><title>Donations 2025</title><link href="https://www.qftest.com/en/company/news/company-events/donations-2025.html" rel="alternate"/><published>2025-12-16T00:00:00+01:00</published><updated>2025-12-16T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-12-16:/en/company/news/company-events/donations-2025.html</id><summary type="html">&lt;p&gt;At QFS, we are pleased to once again support a number of nonprofit organizations with donations this year. Our employees also contribute by nominating projects that are particularly meaningful to them.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="Donations 2025" src="/newsletters/resources/gift-heart--streamline-streamline-3.0.png" title="Donations 2025" /&gt;&lt;/p&gt;
&lt;p&gt;At QFS, we are pleased to once again support a number of nonprofit organizations with donations this year. Our employees also contribute by nominating projects that are particularly meaningful to them. In 2025, the following organizations were considered:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://strassenkinder.de/"&gt;Don Bosco&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.freunde-djibos.de/" title="Link zu Freunden Djibos"&gt;Freunde Djibos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.globolab.org/"&gt;Globolab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jugendhilfe-ostafrika.de/"&gt;Jugendhilfe Ostafrika&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.aerzte-ohne-grenzen.de/spenden"&gt;Ärzte ohne Grenzen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://weilheim-schongau.bund-naturschutz.de/spenden"&gt;Bund Naturschutz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zwei-hospize-polling.de/"&gt;Förderverein zwei Hospize in Polling – Erwachsenenhospiz und Kinderhospiz e.V.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.germanwatch.org/de/spenden"&gt;Germanwatch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://heizhaus-leipzig.de/ueber-uns"&gt;Heizhaus Leipzig&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://geschenk-mit-herz.de/de"&gt;Humedica &amp;ndash; Geschenke mit Herz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.caritas.de/adressen/kath.-kindergarten-st.josef-der-arbeiter-waldram/79054/"&gt;Kath. Kirchenstiftung St. Andreas, Kindergarten St. Josef der Arbeiter Waldram&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lebensbruecke.de/besondere-kinder/"&gt;Lebensbrücke für Besondere Kinder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://missionerde.de/"&gt;Mission Erde e.v.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tierheim-gelting.de/"&gt;Tierheim Gelting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.unicef.de/"&gt;Unicef&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://united4rescue.org/"&gt;United4Rescue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://heimat-yesu.net/"&gt;Verein Heimat Yesu e.V.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="companynews"/></entry><entry><title>Welcome to QF-Test</title><link href="https://www.qftest.com/en/support/videos/welcome-to-qftest.html" rel="alternate"/><published>2025-12-12T00:00:00+01:00</published><updated>2025-12-12T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-12-12:/en/support/videos/welcome-to-qftest.html</id><summary type="html">&lt;p&gt;Meet QF-Test &amp;ndash; our all-in-one platform for automated UI testing.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Meet QF-Test &amp;ndash; our all-in-one platform for automated UI testing.&lt;/p&gt;
&lt;p&gt;Whether you’re building &lt;a href="/en/product/qf-test/web-testing.html"&gt;web apps&lt;/a&gt;, &lt;a href="/en/product/qf-test/testing-mobile-apps.html"&gt;mobile experiences&lt;/a&gt; or &lt;a href="/en/product/qf-test/java-testing.html"&gt;desktop applications&lt;/a&gt;, QF-Test helps you deliver quality, faster.&lt;/p&gt;
&lt;p&gt;QF-Test is built for all kinds of users, from &lt;a href="/en/company/references/testimonials/benefits-for-testers.html"&gt;manual testers and business analysts&lt;/a&gt; to &lt;a href="/en/company/references/testimonials/benefits-for-developers.html"&gt;automation engineers and software developers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can create complete and complex automated tests &lt;a href="/en/support/videos/quick-run-through-qf-test.html"&gt;without ever writing code&lt;/a&gt; &amp;ndash; but of course you always have the option to augment your tests with our &lt;a href="/en/support/videos/scripting-in-qf-test-basics.html"&gt;scripting engine&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Once you&amp;#8217;ve created your first tests with QF-Test, you can effortlessly spot regressions in your application &amp;ndash; less repetitive work, more confidence in every release.&lt;/p&gt;
&lt;p&gt;While QF-Test started as a way to test Java UIs, it has continuously evolved to support &lt;a href="/en/product/qf-test.html"&gt;many other UI technologies&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Whether on Windows, Linux or macOS, QF-Test reliably supports you in automating your Tests.&lt;/p&gt;
&lt;p&gt;Now you can unlock the full potential of QF-Test and create your own automated tests with ease and precision.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;If you are interested in testing your own application, contact us and try QF-Test for free at &lt;a href="/"&gt;qftest.com&lt;/a&gt;&lt;/p&gt;</content><category term="videos"/><category term="startervideos"/></entry><entry><title>QF-Test 10 available</title><link href="https://www.qftest.com/en/company/news/qf-test-10-available.html" rel="alternate"/><published>2025-12-09T00:00:00+01:00</published><updated>2025-12-09T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-12-09:/en/company/news/qf-test-10-available.html</id><summary type="html">&lt;p&gt;QF-Test 10 introduces powerful upgrades for WebAPI testing and AI-assisted validation.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Our new release &lt;strong&gt;QF-Test 10&lt;/strong&gt; takes test automation to the next level.  &lt;/p&gt;
&lt;p&gt;In addition to &lt;strong&gt;powerful enhancements&lt;/strong&gt; like &lt;strong&gt;WebAPI testing&lt;/strong&gt; and &lt;strong&gt;AI-driven validation&lt;/strong&gt;, you will benefit from improved &lt;strong&gt;accessibility testing&lt;/strong&gt; and much more flexible &lt;strong&gt;image-based testing&lt;/strong&gt; capabilities.  &lt;/p&gt;
&lt;p&gt;We are also excited to introduce our new &lt;strong&gt;QF-Test editions&lt;/strong&gt;. They make test automation simpler, more transparent, and better tailored to your specific needs. You can find more details in this newsletter.  &lt;/p&gt;</content><category term="news"/></entry><entry><title>QF-Test 10 with WebAPI Testing and new editions</title><link href="https://www.qftest.com/en/company/news/newsletters/2025-12-qftest10.html" rel="alternate"/><published>2025-12-09T00:00:00+01:00</published><updated>2025-12-09T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-12-09:/en/company/news/newsletters/2025-12-qftest10.html</id><summary type="html">&lt;p&gt;Extensions for WebAPI testing and AI-assisted validation, improved accessibility testing, and more flexible image-based testing&lt;/p&gt;</summary><content type="html">&lt;p&gt;Hello dear QF-Test users!&lt;/p&gt;
&lt;p&gt;Our new release &lt;strong&gt;QF-Test 10&lt;/strong&gt; takes test automation to the next level.  &lt;/p&gt;
&lt;p&gt;In addition to &lt;strong&gt;powerful enhancements&lt;/strong&gt; like &lt;strong&gt;WebAPI testing&lt;/strong&gt; and &lt;strong&gt;AI-driven validation&lt;/strong&gt;, you will benefit from improved &lt;strong&gt;accessibility testing&lt;/strong&gt; and much more flexible &lt;strong&gt;image-based testing&lt;/strong&gt; capabilities.  &lt;/p&gt;
&lt;p&gt;We are also excited to introduce our new &lt;strong&gt;QF-Test editions&lt;/strong&gt;. They make test automation simpler, more transparent, and better tailored to your specific needs. You can find more details in this newsletter.  &lt;/p&gt;
&lt;p&gt;Best wishes,&lt;br /&gt;
your QFS team&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Download QF-Test&lt;/h2&gt;
&lt;h3&gt;Do you already use the latest version of QF-Test?&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://services.qftest.com/en/download/"&gt;&lt;img alt="Download QF-Test" src="/newsletters/resources/2025-09-25_Download-Thick-Bottom--Streamline-Streamline-3.0.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="https://services.qftest.com/en/download/"  class="button scroll-animated green chevron"&gt;Download QF-Test 10.0&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;To the &lt;a href="https://www.qftest.com/doc/manual/en/history.html#app_news"&gt;Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Watch the &lt;a href="/en/support/videos/qftest-version-10-highlights.html"&gt;Release Video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Available since 2025-12-09&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;QF-Test is now available in the following editions&lt;/h2&gt;
&lt;div class="container width-normal plain image-left   " &gt;&lt;img class="container-image" src="/newsletters/resources/edition-web.png" alt=""&gt;&lt;div class="container-content" &gt;&lt;p&gt;&lt;strong&gt;QF-Test Web&lt;/strong&gt; – supports all common browsers, including accessibility testing, Electron applications and, new: APIs and web services&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="container width-normal plain image-left   " &gt;&lt;img class="container-image" src="/newsletters/resources/edition-desktop.png" alt=""&gt;&lt;div class="container-content" &gt;&lt;p&gt;&lt;strong&gt;QF-Test Desktop&lt;/strong&gt; – for Java programs and native Windows applications&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="container width-normal plain image-left   " &gt;&lt;img class="container-image" src="/newsletters/resources/edition-mobile.png" alt=""&gt;&lt;div class="container-content" &gt;&lt;p&gt;&lt;strong&gt;QF-Test Mobile&lt;/strong&gt; – for Android and iOS apps&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="container width-normal plain image-left   " &gt;&lt;img class="container-image" src="/newsletters/resources/edition-pro.png" alt=""&gt;&lt;div class="container-content" &gt;&lt;p&gt;&lt;strong&gt;QF-Test Pro&lt;/strong&gt; – combines all technologies and additionally supports hybrid applications&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;The editions&lt;/strong&gt; focus on the UI technologies and display only the relevant program features, making the QF-Test interface significantly leaner. Our manual is also optimized for each edition and contains only the information relevant to you.  &lt;/p&gt;
&lt;p&gt;Consistent with previous QF-Test versions, &lt;strong&gt;QF-Test Pro&lt;/strong&gt; combines the technologies of the other editions and also supports hybrid applications.  &lt;/p&gt;
&lt;p&gt;Depending on the UI technologies being tested, using a dedicated edition — QF-Test Web, QF-Test Desktop, or QF-Test Mobile — can be advantageous, as it focuses the feature set accordingly.  &lt;/p&gt;
&lt;p&gt;We are confident that the new editions will allow you to make your test automation projects even more efficient, and we look forward to supporting you along the way.  &lt;/p&gt;
&lt;p&gt;Our valued &lt;strong&gt;existing customers&lt;/strong&gt; do not need to take any action. You can continue to use QF-Test Pro as usual within the scope of your current licenses. Existing licenses and contracts will, of course, remain valid.  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For early adopters&lt;/strong&gt; who wish to expand their existing licenses under the previous scheme and pricing model, we offer the opportunity to request a corresponding quote until end of January 2026.  &lt;/p&gt;
&lt;p&gt;If you have any questions regarding the transition, you can contact our team at any time.&lt;/p&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="https://services.qftest.com/de/support/contact/?comment=Request%20editions"  class="button scroll-animated green chevron"&gt;Get in touch with our service team now&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;
&lt;h2&gt;Highlights in QF-Test 10&lt;/h2&gt;
&lt;div class="container width-normal plain image-left   " &gt;&lt;img class="container-image" src="/newsletters/resources/webapi.jpg" alt=""&gt;&lt;div class="container-content" &gt;&lt;p&gt;QF-Test 10 introduces powerful enhancements for &lt;a href="/en/product/qf-test/web-testing/api.html"&gt;WebAPI testing&lt;/a&gt;.  &lt;/p&gt;
&lt;p&gt;Create end-to-end HTTP requests, manage authentication, cookies, and proxies through dedicated nodes, and customize workflows to combine UI and API automation in hybrid scenarios.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="container width-normal plain image-left   " &gt;&lt;img class="container-image" src="/newsletters/resources/aicheck2.jpg" alt=""&gt;&lt;div class="container-content" &gt;&lt;p&gt;The new &amp;#8220;&lt;strong&gt;Check Text with AI&lt;/strong&gt;&amp;#8221; node and the &amp;#8220;ai&amp;#8221; scripting module enable the integration of externally hosted LLMs to perform dynamic text validations and handle non-deterministic UI behavior.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="container width-normal plain image-left   " &gt;&lt;img class="container-image" src="/newsletters/resources/a11y2.jpg" alt=""&gt;&lt;div class="container-content" &gt;&lt;p&gt;&lt;a href="/en/solutions/types-of-tests/accessibility-tests.html"&gt;Accessibility testing&lt;/a&gt; has also been significantly improved, with YAML-based configuration and additional checks for keyboard focus visibility and correct usage of the &amp;#8220;lang&amp;#8221; attribute.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="container width-normal plain image-left   " &gt;&lt;img class="container-image" src="/newsletters/resources/fetchimage.jpg" alt=""&gt;&lt;div class="container-content" &gt;&lt;p&gt;&lt;strong&gt;Image-based testing&lt;/strong&gt; is now much more flexible. Use the new &amp;#8220;Set Image&amp;#8221; and &amp;#8220;Read Image&amp;#8221; nodes to define image variables and apply them in the &amp;#8220;Check Image&amp;#8221; node and other image-related procedures.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;There are many, many more features in QF-Test 10 to explore. You can find all the details in the &lt;a href="https://www.qftest.com/doc/manual/en/history.html#app_news"&gt;Release Notes&lt;/a&gt; on our website.  &lt;/p&gt;
&lt;p&gt;Features for integrating the &lt;strong&gt;test management tools TMT and Xray&lt;/strong&gt; as well as support for &lt;strong&gt;Oracle Forms&lt;/strong&gt; are &lt;strong&gt;currently under development&lt;/strong&gt; and will also be included in QF-Test 10 soon with upcoming minor updates.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Events in 2026&lt;/h2&gt;
&lt;h3&gt;QF-Test Basics: Trainings via Webinar&lt;/h3&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/training.html"&gt;&lt;img alt="Basic Training QF-Test" src="/newsletters/resources/QF-Test_OnlineSchulung.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;February 23–26, 2026 – in German&lt;/h3&gt;
&lt;h3&gt;March 23–26, 2026 – in English&lt;/h3&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="/en/support/training-consulting/training.html"  class="button scroll-animated green chevron"&gt;More about the training courses&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;4 days, 2 × 2.5 hours each&lt;/li&gt;
&lt;li&gt;Effective and rapid knowledge transfer&lt;/li&gt;
&lt;li&gt;Small groups up to a maximum of 8 participants&lt;/li&gt;
&lt;li&gt;Interaction with the trainers and asking questions are possible at any time&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Individual QF-Test Company Training courses&lt;/h3&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/training.html#consulting"&gt;&lt;img alt="Individual QF-Test Training" src="/newsletters/resources/2025-10_OnlineSchulung-Ort.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Would you like a training course which is individually tailored to your company? Just send us an email to &lt;a href="https://services.qftest.com/en/support/contact/"&gt;service@qftest.com&lt;/a&gt;.&lt;/p&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="https://services.qftest.com/en/support/contact/?comment=Request%20individual%20training"  class="button scroll-animated green chevron"&gt;Ask our service team for a quote&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;
&lt;h2&gt;From our YouTube Channel&lt;/h2&gt;
&lt;p&gt;&lt;a href="/en/support/videos/webAPI-testing.html"&gt;&lt;img alt="special webinar on Web API Testing" src="https://www.qftest.com/videos/resources/special-webinar-webapi.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Going POSTal! Discover WebAPI Testing in QF-Test&lt;/h3&gt;
&lt;p&gt;QF-Test 10 fundamentally revamps web interface testing, focusing on web APIs such as REST, SOAP, and other web services. In this recording of a special webinar, we introduce you to the new features.  &lt;/p&gt;
&lt;p&gt;➜ &lt;a href="/en/support/videos/webAPI-testing.html"&gt;Watch the video now&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/en/support/videos/scripting-in-qf-test-basics.html"&gt;&lt;img alt="Video Scripting in QF-Test" src="/newsletters/resources/scripting-in-qf-test-basics-en.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Scripting in QF-Test (basics)&lt;/h3&gt;
&lt;p&gt;This video provides an overview of how to use scripts in QF-Test: the SUT script and the server script.  &lt;/p&gt;
&lt;p&gt;➜ &lt;a href="/en/support/videos/scripting-in-qf-test-basics.html"&gt;Watch the video now&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/en/support/videos/dependencies-in-qf-test-basics.html"&gt;&lt;img alt="Video about dependencies in QF-Test" src="https://www.qftest.com/videos/resources/dependencies-in-qf-test-basics.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Dependencies in QF-Test (basics)&lt;/h3&gt;
&lt;p&gt;This video explains the purposes and intentions of dependencies in QF-Test and shows how simple dependencies are implemented.  &lt;/p&gt;
&lt;p&gt;➜ &lt;a href="/en/support/videos/dependencies-in-qf-test-basics.html"&gt;Watch the video now&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Visit our &lt;a href="https://www.youtube.com/@qftest"&gt;YouTube channel&lt;/a&gt; to subscribe and follow us on &lt;a href="https://www.linkedin.com/company/quality-first-software-gmbh-qfs"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;</content><category term="newsletters"/></entry><entry><title>QF-Test Version 10.0</title><link href="https://www.qftest.com/en/product/release-notes-roadmap/qf-test-version-100.html" rel="alternate"/><published>2025-12-09T00:00:00+01:00</published><updated>2025-12-09T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-12-09:/en/product/release-notes-roadmap/qf-test-version-100.html</id><summary type="html">&lt;p&gt;QF-Test 10 introduces powerful upgrades for WebAPI testing and AI-assisted validation.&lt;/p&gt;</summary><content type="html">&lt;div class="container width-normal plain image-left   " &gt;&lt;img class="container-image" src="/newsletters/resources/webapi.jpg" alt=""&gt;&lt;div class="container-content" &gt;&lt;p&gt;QF-Test 10 introduces powerful enhancements for &lt;a href="/en/product/qf-test/web-testing/api.html"&gt;WebAPI testing&lt;/a&gt;.  &lt;/p&gt;
&lt;p&gt;Create end-to-end HTTP requests, manage authentication, cookies, and proxies through dedicated nodes, and customize workflows to combine UI and API automation in hybrid scenarios.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="container width-normal plain image-left   " &gt;&lt;img class="container-image" src="/newsletters/resources/aicheck2.jpg" alt=""&gt;&lt;div class="container-content" &gt;&lt;p&gt;The new &amp;#8220;&lt;strong&gt;Check Text with AI&lt;/strong&gt;&amp;#8221; node and the &amp;#8220;ai&amp;#8221; scripting module enable the integration of externally hosted LLMs to perform dynamic text validations and handle non-deterministic UI behavior.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="container width-normal plain image-left   " &gt;&lt;img class="container-image" src="/newsletters/resources/a11y2.jpg" alt=""&gt;&lt;div class="container-content" &gt;&lt;p&gt;&lt;a href="/en/solutions/types-of-tests/accessibility-tests.html"&gt;Accessibility testing&lt;/a&gt; has also been significantly improved, with YAML-based configuration and additional checks for keyboard focus visibility and correct usage of the &amp;#8220;lang&amp;#8221; attribute.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="container width-normal plain image-left   " &gt;&lt;img class="container-image" src="/newsletters/resources/fetchimage.jpg" alt=""&gt;&lt;div class="container-content" &gt;&lt;p&gt;&lt;strong&gt;Image-based testing&lt;/strong&gt; is now much more flexible. Use the new &amp;#8220;Set Image&amp;#8221; and &amp;#8220;Read Image&amp;#8221; nodes to define image variables and apply them in the &amp;#8220;Check Image&amp;#8221; node and other image-related procedures.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;There are many, many more features in QF-Test 10 to explore. You can find all the details in the &lt;a href="https://www.qftest.com/doc/manual/en/history.html#app_news"&gt;Release Notes&lt;/a&gt; on our website.  &lt;/p&gt;
&lt;p&gt;Features for integrating the &lt;strong&gt;test management tools TMT and Xray&lt;/strong&gt; as well as support for &lt;strong&gt;Oracle Forms&lt;/strong&gt; are &lt;strong&gt;currently under development&lt;/strong&gt; and will also be included in QF-Test 10 soon with upcoming minor updates.&lt;/p&gt;
&lt;h4 class=""&gt;&lt;p&gt;QF-Test Version 10.0.1&lt;/p&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;2025-12-18&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This maintenance release fixes startup issues under QF-Test 10.0.0 related to certain license files and addresses several other minor bugs.&lt;/p&gt;
&lt;h4 class=""&gt;&lt;p&gt;QF-Test Version 10.0.2&lt;/p&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;2026-01-15&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This maintenance release increases flexibility for LLM communication (for example, for the AI Check node). It also improves the stability of communication with the QF-Test license server and fixes a few bugs.&lt;/p&gt;
&lt;h4 class=""&gt;&lt;p&gt;QF-Test Version 10.0.3&lt;/p&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;2026-03-11&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This maintenance release adds support for Eclipse/SWT 4.39 alias &amp;#8220;2026-03&amp;#8221;, updates several libraries and fixes a number of bugs.&lt;/p&gt;</content><category term="releasenotes"/></entry><entry><title>QF-Test 10 – WebAPI, AI and more</title><link href="https://www.qftest.com/en/support/videos/qftest-version-10-highlights.html" rel="alternate"/><published>2025-12-09T00:00:00+01:00</published><updated>2025-12-09T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-12-09:/en/support/videos/qftest-version-10-highlights.html</id><summary type="html">&lt;p&gt;Hi there! Today I’m going to show you how you can test web APIs with QF-Test 10. I’ll also walk you through the new AI features in QF-Test, and we have some exciting updates on accessibility testing for web applications in QF-Test 10.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Transcript&lt;/h2&gt;
&lt;p&gt;Hi there! Today I’m going to show you how you can test web APIs with QF-Test 10. I’ll also walk you through the new AI features in QF-Test, and we have some exciting updates on accessibility testing for web applications in QF-Test 10.&lt;/p&gt;
&lt;p&gt;Finally, we’ll take a look at all the other great new features that come with version 10.&lt;/p&gt;
&lt;p&gt;QF-Test is the tool for professional UI test automation.&lt;/p&gt;
&lt;h3&gt;WebAPI&lt;/h3&gt;
&lt;p&gt;Testing web interfaces has long been possible in QF-Test, but only in a limited way. With QF-Test 10 and its new WebAPI testing capabilities, this test type has become both much more comfortable and significantly more powerful.&lt;/p&gt;
&lt;p&gt;You can now send GET, POST, and other HTTP requests directly via the new &amp;#8220;Web Request&amp;#8221; node. You get full control over every detail of your requests, with freely configurable headers and bodies.&lt;/p&gt;
&lt;p&gt;Authentication data can be neatly managed with the new &amp;#8220;Request Authentication&amp;#8221; node.&lt;/p&gt;
&lt;p&gt;Cookies and proxy settings can be configured via the new &amp;#8220;Request Options&amp;#8221; node.&lt;/p&gt;
&lt;p&gt;You can validate API responses by checking the expected status code or use QF-Test’s powerful scripting tools to parse and verify JSON, XML, or any other kind of server response.&lt;/p&gt;
&lt;p&gt;For maximum flexibility in designing your tests, QF-Test also provides &amp;#8220;Pre-Request Handler&amp;#8221; and &amp;#8220;Post-Request Handler&amp;#8221; nodes, enabling advanced configuration and post-processing of requests and responses.&lt;/p&gt;
&lt;p&gt;A comprehensive scripting API lets you model even complex scenarios in a clean and maintainable way.&lt;/p&gt;
&lt;p&gt;Unlike other API tools, QF-Test not only offers extensive tools for sending and receiving web requests. You also get access to all of QF-Test’s proven automation and reporting features within WebAPI tests, and QF-Test is excellent for hybrid testing that combines web UI and API interfaces.&lt;/p&gt;
&lt;h3&gt;AI Integration and the AI Text Check&lt;/h3&gt;
&lt;p&gt;Version 10 also brings the world of “Artificial Intelligence”- or more precisely, LLMs &amp;ndash; into QF-Test. In the new &amp;#8220;Check Text with AI&amp;#8221; node, you can let an LLM dynamically decide whether a given text is correct or contains errors.&lt;/p&gt;
&lt;p&gt;In addition, the new scripting API &amp;#8220;ai.ask&amp;#8221; lets you communicate with LLMs at any point during test execution to accomplish tasks that were previously cumbersome or impossible.&lt;/p&gt;
&lt;p&gt;QF-Test supports integrating various externally hosted LLMs so you can get started right away with your provider of choice. And through our powerful scripting interface, you can connect any LLM provider or API to your tests.&lt;/p&gt;
&lt;p&gt;This makes QF-Test 10 ideal for testing chatbots and other UI components with non-deterministic output. It also allows you to check texts for semantic criteria for which no algorithm exists &amp;ndash; but for which a good prompt does.&lt;/p&gt;
&lt;h3&gt;Updated Accessibility (A11y) Checks for Websites&lt;/h3&gt;
&lt;p&gt;Since QF-Test 9, you’ve been able to check websites for their accessibility. QF-Test 10 now includes additional accessibility tests.&lt;/p&gt;
&lt;p&gt;For example, you can now verify the visibility of the keyboard focus on elements.&lt;/p&gt;
&lt;p&gt;You can also ensure that your pages use the HTML &amp;#8220;lang&amp;#8221; attribute correctly.&lt;/p&gt;
&lt;p&gt;All of this is configured through our clean, new &amp;#8220;Check Accessibility&amp;#8221; node and can be tailored exactly to your needs.&lt;/p&gt;
&lt;p&gt;Accessibility tests created in QF-Test 9 continue to work normally, but if you’d like to take advantage of the new features, you can easily convert your old procedure calls to the new node using the context menu function &amp;#8220;Transform node into&amp;#8221;.&lt;/p&gt;
&lt;p&gt;The heart of the node is this text input area, where tests are defined interactively in a clean YAML syntax. Multiple tests can be enabled and configured at once.&lt;/p&gt;
&lt;p&gt;You can also flexibly exclude known issues or potential false positives from the test report.&lt;/p&gt;
&lt;h3&gt;New Nodes for Image Handling&lt;/h3&gt;
&lt;p&gt;Image comparisons have never been the ideal mechanism for UI test automation—but they can certainly be useful. Until now, QF-Test could only generate, process, and compare images through scripting.&lt;/p&gt;
&lt;p&gt;With QF-Test 10, image handling becomes dramatically simpler. The new &amp;#8220;Set Image&amp;#8221; node lets you assign an existing image directly to a QF-Test variable. Likewise, &amp;#8220;Fetch Image&amp;#8221; allows you to store the image of a specific UI component in a variable.&lt;/p&gt;
&lt;p&gt;We’ve also enhanced the familiar &amp;#8220;Check Image&amp;#8221; node and many procedures in the standard library so that they now accept images from variables. This gives you more flexibility when designing tests, making it much easier to reuse or log images.&lt;/p&gt;
&lt;h3&gt;Product Editions&lt;/h3&gt;
&lt;p&gt;Starting with version 10, QF-Test comes in four editions: Pro, Web, Desktop, and Mobile.&lt;/p&gt;
&lt;p&gt;QF-Test Pro is the full version with the complete feature set.&lt;/p&gt;
&lt;p&gt;If you want to focus on a specific UI technology, you can now use the Web, Desktop, or Mobile editions. These contain only the features needed for the respective application types, making them streamlined and easier to navigate. All new editions remain fully compatible with existing licenses.&lt;/p&gt;
&lt;h3&gt;Modeless Editing&lt;/h3&gt;
&lt;p&gt;QF-Test itself becomes easier to use in version 10. We’ve simplified our node editing concept so all invalid fields in your testsuite are now clearly marked, helping you immediately detect and fix issues that might break a test run. And you no longer need to endlessly click “OK” before continuing to edit your test suite.&lt;/p&gt;
&lt;h3&gt;New Debugger Dialog on Errors&lt;/h3&gt;
&lt;p&gt;When using QF-Test’s integrated debugger, you now get more detailed feedback when the test run stops due to an error or exception. In this new dialog, you can conveniently choose how to proceed with a single click.&lt;/p&gt;
&lt;h3&gt;Improved Manual&lt;/h3&gt;
&lt;p&gt;We’ve further optimized our HTML manual so it’s easier than ever to navigate the wealth of available information. The secondary sidebar lets you jump directly to specific sections of a page without losing context.&lt;/p&gt;
&lt;p&gt;You’ll also find the helpful Copy to Clipboard buttons for code snippets not only here but also in our HTML report and directly inside QF-Test.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;As always, you can learn more about everything that&amp;#8217;s new in QF-Test 10 from the detailed release notes on our website, qftest.com. There, you will also find a download link so you can get started with it right away.&lt;/p&gt;</content><category term="videos"/><category term="releasevideos"/></entry><entry><title>Can I integrate web testing with QF-Test into my CI/CD Pipeline?</title><link href="https://www.qftest.com/en/product/faq/integrate-qf-test-in-existing-ci-cd-pipeline.html" rel="alternate"/><published>2025-11-27T00:00:00+01:00</published><updated>2025-11-27T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-11-27:/en/product/faq/integrate-qf-test-in-existing-ci-cd-pipeline.html</id><summary type="html">&lt;p&gt;Yes, QF-Test can be integrated with&amp;#8230;&lt;/p&gt;</summary><content type="html">&lt;p&gt;&amp;#8230; common CI/CD systems such as Jenkins and GitLab.&lt;/p&gt;</content><category term="faqs"/><category term="faqwebtesting"/></entry><entry><title>How can QF-Test be integrated into existing test strategies and workflows?</title><link href="https://www.qftest.com/en/product/faq/integrate-qf-test-in-existing-test-strategy.html" rel="alternate"/><published>2025-11-27T00:00:00+01:00</published><updated>2025-11-27T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-11-27:/en/product/faq/integrate-qf-test-in-existing-test-strategy.html</id><summary type="html">&lt;p&gt;QF-Test can be easily integrated into existing test strategies because&amp;#8230;&lt;/p&gt;</summary><content type="html">&lt;p&gt;&amp;#8230; it supports modular test structures and common approaches, such as data-driven or component-driven testing. With clear interfaces and reusable building blocks, the tool fits seamlessly into existing QA workflows. Existing test processes can thus be gradually automated.&lt;/p&gt;</content><category term="faqs"/><category term="faqwebtesting"/></entry><entry><title>What is web testing?</title><link href="https://www.qftest.com/en/product/faq/what-is-web-testing.html" rel="alternate"/><published>2025-11-27T00:00:00+01:00</published><updated>2025-11-27T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-11-27:/en/product/faq/what-is-web-testing.html</id><summary type="html">&lt;p&gt;Web Testing refers to the systematic testing of web applications for functionality&amp;#8230;&lt;/p&gt;</summary><content type="html">&lt;p&gt;&amp;#8230; stability, appearance, and behavior across different browsers and devices. The goal is a bug-free, user-friendly, and reliable user experience.&lt;/p&gt;</content><category term="faqs"/><category term="faqwebtesting"/></entry><entry><title>Which browsers and technologies are supported by QF-Test?</title><link href="https://www.qftest.com/en/product/faq/which-browsers-and-frameworks-are-supported.html" rel="alternate"/><published>2025-11-27T00:00:00+01:00</published><updated>2025-11-27T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-11-27:/en/product/faq/which-browsers-and-frameworks-are-supported.html</id><summary type="html">&lt;p&gt;QF-Test covers all major browsers, including&amp;#8230;&lt;/p&gt;</summary><content type="html">&lt;p&gt;all major browsers Chrome, Firefox, Edge, and Safari, and is compatible with JavaScript frameworks such as Angular, React, and Vue. Additionally, the tool supports headless testing. You can find an overview at &lt;a href="/en/product/qf-test/web-testing.html"&gt;Web Testing&lt;/a&gt;. &lt;/p&gt;</content><category term="faqs"/><category term="faqwebtesting"/></entry><entry><title>Why should web testing be automated?</title><link href="https://www.qftest.com/en/product/faq/why-automate-web-testing.html" rel="alternate"/><published>2025-11-27T00:00:00+01:00</published><updated>2025-11-27T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-11-27:/en/product/faq/why-automate-web-testing.html</id><summary type="html">&lt;p&gt;Automated testing saves time, reduces manual errors, and allows teams to efficiently support frequent releases.&lt;/p&gt;</summary><content type="html">&lt;p&gt;For complex or dynamic web applications, automation is significantly more cost-effective in the long run than purely manual testing.&lt;/p&gt;</content><category term="faqs"/><category term="faqwebtesting"/></entry><entry><title>Can UI testing improve the usability of an application?</title><link href="https://www.qftest.com/en/product/faq/can-ui-testing-improve-the-usability-of-an-application.html" rel="alternate"/><published>2025-11-25T00:00:00+01:00</published><updated>2025-11-25T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-11-25:/en/product/faq/can-ui-testing-improve-the-usability-of-an-application.html</id><summary type="html">&lt;p&gt;Yes. Usability tests show whether users can intuitively understand functions and complete tasks efficiently.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Findings from these tests help optimize user guidance, avoid misunderstandings, and increase overall satisfaction with the application.&lt;/p&gt;</content><category term="faqs"/><category term="faqtesting"/></entry><entry><title>How does UI testing contribute to accessibility?</title><link href="https://www.qftest.com/en/product/faq/how-does-ui-testing-contribute-to-accessibility.html" rel="alternate"/><published>2025-11-25T00:00:00+01:00</published><updated>2025-11-25T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-11-25:/en/product/faq/how-does-ui-testing-contribute-to-accessibility.html</id><summary type="html">&lt;p&gt;Accessibility testing ensures that people with disabilities can also use the application to its full extent.&lt;/p&gt;</summary><content type="html">&lt;p&gt;This includes screen reader support, correct alternative text, sufficient contrast, and full keyboard navigation. &lt;a href="/en/solutions/types-of-tests/accessibility-tests.html"&gt;Accessibility testing&lt;/a&gt;is essential for both inclusion and compliance with legal requirements.&lt;/p&gt;</content><category term="faqs"/><category term="faqtesting"/></entry><entry><title>What is the difference between UI testing and UI testing?</title><link href="https://www.qftest.com/en/product/faq/what-is-the-difference-between-UI-and%20GUI-testing.html" rel="alternate"/><published>2025-11-25T00:00:00+01:00</published><updated>2025-11-25T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-11-25:/en/product/faq/what-is-the-difference-between-UI-and GUI-testing.html</id><summary type="html">&lt;p&gt;While UI testing covers all interactions on the user interface, UI testing focuses exclusively on graphical elements such as buttons, icons, or menus.&lt;/p&gt;</summary><content type="html">&lt;p&gt;In practice, however, the two terms are often used synonymously. It is crucial to clearly define which UI aspects are to be tested.&lt;/p&gt;</content><category term="faqs"/><category term="faqtesting"/></entry><entry><title>What is UI testing?</title><link href="https://www.qftest.com/en/product/faq/what-is-ui-testing.html" rel="alternate"/><published>2025-11-25T00:00:00+01:00</published><updated>2025-11-25T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-11-25:/en/product/faq/what-is-ui-testing.html</id><summary type="html">&lt;p&gt;UI testing refers to the systematic testing of an application&amp;#8217;s user interface.&lt;/p&gt;</summary><content type="html">&lt;p&gt;This involves checking whether controls such as buttons, forms, or navigation elements are functioning correctly and whether user interactions are being processed as expected. The goal is to achieve an error-free, consistent, and user-friendly interface.&lt;/p&gt;</content><category term="faqs"/><category term="faqtesting"/></entry><entry><title>What methods are available for UI testing?</title><link href="https://www.qftest.com/en/product/faq/what-methods-are-available-for-ui-testing.html" rel="alternate"/><published>2025-11-25T00:00:00+01:00</published><updated>2025-11-25T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-11-25:/en/product/faq/what-methods-are-available-for-ui-testing.html</id><summary type="html">&lt;p&gt;UI tests can be performed manually or automatically. QF-Test is a tool for automated UI testing.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Manual tests are suitable for initial evaluations of new features or exploratory testing, but they are time-consuming.
Automated tests are ideal for recurring &lt;a href="/en/solutions/types-of-tests/regression-tests.html"&gt;regression testing&lt;/a&gt; and enable frequent, consistent test runs—especially in agile development processes.&lt;/p&gt;</content><category term="faqs"/><category term="faqtesting"/></entry><entry><title>When should automated UI testing be used?</title><link href="https://www.qftest.com/en/product/faq/when-should-automated-ui-testing-be-used.html" rel="alternate"/><published>2025-11-25T00:00:00+01:00</published><updated>2025-11-25T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-11-25:/en/product/faq/when-should-automated-ui-testing-be-used.html</id><summary type="html">&lt;p&gt;Automation is worthwhile&amp;#8230;&lt;/p&gt;</summary><content type="html">&lt;p&gt;&amp;#8230; especially for frequently recurring test cases, such as &lt;a href="/en/solutions/types-of-tests/regression-tests.html"&gt;regression tests&lt;/a&gt; before releases. It enables fast, reproducible results and reduces manual effort—especially in complex or extensive applications.&lt;/p&gt;</content><category term="faqs"/><category term="faqtesting"/></entry><entry><title>Why is UI testing so important?</title><link href="https://www.qftest.com/en/product/faq/why-is-ui-testing-so-important.html" rel="alternate"/><published>2025-11-25T00:00:00+01:00</published><updated>2025-11-25T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-11-25:/en/product/faq/why-is-ui-testing-so-important.html</id><summary type="html">&lt;p&gt;The user interface is the most direct point of contact between users and software—problems have an immediate impact on the user experience.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Without UI testing, functional errors, unclear feedback, or defective elements often go undetected. Systematic testing increases quality, reduces support costs, and strengthens confidence in the application.&lt;/p&gt;</content><category term="faqs"/><category term="faqtesting"/></entry><entry><title>Scripting in QF-Test (basics)</title><link href="https://www.qftest.com/en/support/videos/scripting-in-qf-test-basics.html" rel="alternate"/><published>2025-11-14T00:00:00+01:00</published><updated>2025-11-14T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-11-14:/en/support/videos/scripting-in-qf-test-basics.html</id><summary type="html">&lt;p&gt;Here you can find the basics on scripting in QF-Test and lern about the SUT script and Server script.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Here you will learn about the basics of scripting in QF-Test and get a demonstration for using the SUT script and Server script nodes.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.qftest.com/doc/manual/en/user_scripting.html#usec_scripting"&gt;Further information: Scripting in QF-Test (Manual)&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Transcript&lt;/h2&gt;
&lt;p&gt;Welcome to this video about the scripting capabilities of QF-Test.&lt;/p&gt;
&lt;p&gt;Today I will give you an overview of how to use scripts in QF-Test.&lt;/p&gt;
&lt;p&gt;In addition to event nodes such as mouse clicks or checks and control structures such as loops or if nodes, QF-Test also offers the possibility to integrate arbitrary code snippets implemented in various scripting languages into the test run. Such scripts can greatly extend the functionality of QF-Test.&lt;/p&gt;
&lt;h3&gt;Script Types&lt;/h3&gt;
&lt;p&gt;To insert such a script, I select insert control structures from the menu and then &lt;strong&gt;Server&lt;/strong&gt; or &lt;strong&gt;SUT script&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unlike a Server script, an SUT script can interact directly with the system under test and therefore also determine the properties of graphical objects at runtime.&lt;/li&gt;
&lt;li&gt;A Server script on the other hand should be used for actions that are independent of the graphical user interface such as database or file operations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I am now adding an SUT script to my test suite. There are several scripting languages available for implementation. In the current version of QF-Test, there are &lt;strong&gt;Jython, Groovy, and JavaScript&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;SUT script example&lt;/h3&gt;
&lt;p&gt;A simple example of an SUT script is the count of rows in a table and then to write this row count to the QF-Test run log. We will now implement the script in the &lt;strong&gt;Groovy scripting language&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kt"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getComponent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;#VehicleTable&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kt"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getElementsByClassName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;TableRow&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kt"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rowCount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;logMessage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Table has &amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rowCount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; rows.&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;In line one of the script, the table is retrieved from the test application and stored in the variable &lt;code&gt;table&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;In line two, the table rows are retrieved into a list &lt;/li&gt;
&lt;li&gt;and stored in line three in the variable &lt;code&gt;rowCount&lt;/code&gt; with the length of this list.&lt;/li&gt;
&lt;li&gt;Line four finally writes this row count to the QF-Test run log.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Pseudo DOM API and accessing native Java component methods&lt;/h3&gt;
&lt;p&gt;To read the properties of web components, QF-Test offers its own DOM API which is documented in the manual and provides simple methods for accessing DOM properties and HTML elements.&lt;/p&gt;
&lt;p&gt;This approach works for every supported technology but the method names may be different because they are technology-dependent. You will find information on this in the respective documentation. For applications with Java Swing, methods can be assessed directly.&lt;/p&gt;
&lt;p&gt;When I now run the script, the number of table rows is written to the QF-Test run log, which we can see accordingly.&lt;/p&gt;
&lt;h3&gt;The QF-Test run context&lt;/h3&gt;
&lt;p&gt;Let&amp;#8217;s go back to the script. You can see in line one and in line four that a variable &lt;code&gt;rc&lt;/code&gt; is used there. This stands for the &lt;strong&gt;QF-Test run context&lt;/strong&gt; and offers you options for interacting with QF-Test methods and scripts. In our case, the aim is to identify a graphical component, our table, and write a message to the QF-Test run log.&lt;/p&gt;
&lt;p&gt;The run context also allows you to write your custom error messages to the run log or execute entire checks.&lt;/p&gt;
&lt;p&gt;The script editor also offers auto-completion for &lt;code&gt;rc&lt;/code&gt;. So you type &lt;code&gt;rc.&lt;/code&gt;, press &lt;kbd&gt;Control&lt;/kbd&gt;+&lt;kbd&gt;Space&lt;/kbd&gt;, and now you will see all supported methods and the corresponding documentation.&lt;/p&gt;
&lt;h3&gt;An example server script&lt;/h3&gt;
&lt;p&gt;A typical use case for a server script is to write a message or variable content into a file. You can see such a server script here now in the &lt;strong&gt;Jython scripting language&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getStr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;nameOfVehicle&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;testfile.txt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Vehicle is : &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;In line one, the QF-Test run context is assessed again and the content of a variable is determined which was previously set somewhere in the test run.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Outlook&lt;/h2&gt;
&lt;p&gt;Scripts and QF-Test allow you to extend your tests with any logic and simplify some complex tasks. However, scripts and QF-Test can do much more. Scripts allow you to develop so-called &lt;strong&gt;Resolvers&lt;/strong&gt; that optimize QF-Test&amp;#8217;s component recognition for your application. Alternatively, you can use a &lt;strong&gt;TestRunListener&lt;/strong&gt; to add additional logic to the test execution. In addition, QF-Test offers many other interfaces which you can learn more about in our detailed manual.&lt;/p&gt;
&lt;p&gt;You have now learned the most important basics about scripting support in QF-Test. In the &lt;strong&gt;QF-Test Help menu&lt;/strong&gt;, you will find further links to three available scripting languages and their documentation and tutorials. The QF-Test manual contains several chapters explaining scripts and their possible uses with many examples. Take advantage of this powerful feature to further advance your test automation.&lt;/p&gt;</content><category term="videos"/><category term="featurevideos"/></entry><entry><title>Dependencies in QF-Test (basics)</title><link href="https://www.qftest.com/en/support/videos/dependencies-in-qf-test-basics.html" rel="alternate"/><published>2025-11-03T00:00:00+01:00</published><updated>2025-11-03T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-11-03:/en/support/videos/dependencies-in-qf-test-basics.html</id><summary type="html">&lt;p&gt;See here why the so called dependencies are useful for your daily work with QF-Test and you&amp;#8217;ll learn how to implement them.&lt;/p&gt;</summary><content type="html">&lt;p&gt;See here why the so called dependencies are useful for your daily work with QF-Test and you&amp;#8217;ll learn how to implement them.&lt;/p&gt;
&lt;h2&gt;Materials for this video&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/videos/resources/1_Dependencies.qft"&gt;1_Dependencies.qft&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;&lt;a href="/videos/resources/1_Dependencies_done.qft"&gt;1_Dependencies_done.qft&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.qftest.com/doc/manual/en/dependencies.html"&gt;More information in the manual&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Abridged Transcript&lt;/h2&gt;
&lt;p&gt;This video covers the basics of QF-Test dependencies. It explains the purpose and intention of dependencies and shows how to implement a simple dependency.  &lt;/p&gt;
&lt;p&gt;This video does not cover advanced topics such as nested dependencies, characteristic variables, or error handling. Those parts are discussed in other videos.&lt;/p&gt;
&lt;p&gt;For the current video, I work in a specially provided test suite, which you can also download from the QF-Test website.  &lt;/p&gt;
&lt;p&gt;The test suite uses the &lt;strong&gt;CarConfigurator&lt;/strong&gt; provided by QF-Test in the web version as the &amp;#8220;system under test&amp;#8221; (SUT).  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you would like to work along with me during the video, you will find the suite in the commentary section.  &lt;/li&gt;
&lt;li&gt;If you would prefer to see the result of this tutorial straight away, you will also find that suite there.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Opening the Test Suite&lt;/h3&gt;
&lt;p&gt;Now I have opened the dependency test suite I just mentioned. Let&amp;#8217;s take a closer look at its implementation.  &lt;/p&gt;
&lt;p&gt;Here you can see a test suite implemented in a simple way:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This is the &lt;strong&gt;Setup node&lt;/strong&gt; that starts our &amp;#8220;system under test&amp;#8221; (the CarConfigurator)  &lt;/li&gt;
&lt;li&gt;Here are some &lt;strong&gt;test cases&lt;/strong&gt;  &lt;/li&gt;
&lt;li&gt;Finally, a &lt;strong&gt;Cleanup node&lt;/strong&gt; will close our SUT again  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this example, a single test case runs as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First, the application is reset  &lt;/li&gt;
&lt;li&gt;Then a vehicle is selected  &lt;/li&gt;
&lt;li&gt;Then a special model is selected  &lt;/li&gt;
&lt;li&gt;Then further accessories are selected  &lt;/li&gt;
&lt;li&gt;A discount is set  &lt;/li&gt;
&lt;li&gt;Finally, the calculated final price is checked  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The setup and Cleanup sequences use &lt;strong&gt;procedure calls&lt;/strong&gt;. By double-clicking on a procedure call, I also get to the Procedure node of QF-Test where I can view the existing procedures of this test suite.  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;SUT package&lt;/strong&gt; contains the procedures for starting and stopping our CarConfigurator  &lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;CarConfig package&lt;/strong&gt; contains procedures needed for the test cases (these are not of interest for the time being)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Running Test Cases&lt;/h3&gt;
&lt;p&gt;Now that you are more or less familiar with our test suite, I will run test cases from it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I select the test set and press &amp;#8220;Start test run&amp;#8221;  &lt;/li&gt;
&lt;li&gt;QF-Test now works its way through this test suite and executes the test cases with the different discount levels  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We wait until the test run is complete.&lt;/p&gt;
&lt;p&gt;The test case has run through and we can take a look at the QF-Test &lt;strong&gt;run log&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the details of the run log, we can see that first the &lt;strong&gt;setup&lt;/strong&gt; was run to start the SUT  &lt;/li&gt;
&lt;li&gt;Then the first &lt;strong&gt;test case&lt;/strong&gt; was executed  &lt;/li&gt;
&lt;li&gt;Then the application was completely closed with the &lt;strong&gt;Cleanup&lt;/strong&gt;  &lt;/li&gt;
&lt;li&gt;Then the application was restarted and the next test case was executed  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a complete restart on my system, we need approximately:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;28 seconds for the &lt;strong&gt;setup&lt;/strong&gt;  &lt;/li&gt;
&lt;li&gt;Almost 1 second for the &lt;strong&gt;Cleanup work&lt;/strong&gt;  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The whole thing adds up and accounts for a large part of the total test runtime, which we can also see in the &lt;strong&gt;performance view&lt;/strong&gt;.  &lt;/p&gt;
&lt;p&gt;Particularly with larger applications, constantly stopping and starting the application would be inefficient and does not represent real user behavior.  &lt;/p&gt;
&lt;p&gt;In our case, this tidying up is actually unnecessary during a normal run of a test case. The SUT has already been started and changes are reset in the test cases anyway.  &lt;/p&gt;
&lt;p&gt;However, I cannot simply remove the &lt;strong&gt;Cleanup node&lt;/strong&gt;, otherwise the application would still run on the test machine forever after a test run.  &lt;/p&gt;
&lt;p&gt;In addition, an error in the SUT in an unattended test run could compromise the entire test run instead of just a single test case.  &lt;/p&gt;
&lt;p&gt;This shows the first disadvantage of the current implementation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Cleanup node&lt;/strong&gt; is executed at the end of every test case  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Another disadvantage is that it is not easily possible to start just a single test case.  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For example, if a test case had thrown an exception during the last test run (due to an implementation error or a defect in the SUT), I cannot simply execute this test case again  &lt;/li&gt;
&lt;li&gt;I first have to run the &lt;strong&gt;setup&lt;/strong&gt; to start the application, or create the preconditions manually, which ultimately means executing the &lt;strong&gt;setup&lt;/strong&gt; again  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is still simple in this example, but as soon as test cases become larger and more complex, the entire setup can become tedious.  &lt;/p&gt;
&lt;p&gt;We can see that we won&amp;#8217;t get very far with these means.  &lt;/p&gt;
&lt;h3&gt;Introducing Dependencies&lt;/h3&gt;
&lt;p&gt;QF-Test dependencies now enter the stage.  &lt;/p&gt;
&lt;p&gt;Dependencies ensure that the &lt;strong&gt;preconditions for a test case are fulfilled&lt;/strong&gt;, if implemented correctly.  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Individual test cases can be executed without manually creating preconditions beforehand  &lt;/li&gt;
&lt;li&gt;This works even if a completely different test case was previously executed  &lt;/li&gt;
&lt;li&gt;Dependencies also regulate the Cleanup process and do not carry out unnecessary Cleanup work  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Summary:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dependencies&lt;/strong&gt; ensure a certain state  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Setup and Cleanup nodes&lt;/strong&gt; only execute a certain sequence  &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Creating a Simple Dependency&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;I use the test set from earlier and copy it directly below  &lt;/li&gt;
&lt;li&gt;Rename the test case, for example, &amp;#8220;Tests with dependencies&amp;#8221;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Insert a &lt;strong&gt;Dependency node&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Menu: &lt;code&gt;Insert → Dependencies → Dependency&lt;/code&gt;  &lt;/li&gt;
&lt;li&gt;Right-click: &lt;code&gt;Insert node → Dependency&lt;/code&gt;  &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Name the dependency &amp;#8220;SUT started&amp;#8221;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Add a &lt;strong&gt;Setup node&lt;/strong&gt; and &lt;strong&gt;Cleanup node&lt;/strong&gt; by dragging the existing nodes into the dependency  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Why define the dependency at the test set level?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Each node inherits the dependencies of its parent node by default  &lt;/li&gt;
&lt;li&gt;In this case, each test case inherits the dependencies of the test set  &lt;/li&gt;
&lt;li&gt;Defining it at test set level is sufficient as it automatically applies to all contained test cases  &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Testing the Dependency&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ensure no SUT is running.  &lt;/li&gt;
&lt;li&gt;Try to start a single test case in the old test set → QF-Test throws a &lt;strong&gt;ComponentNotFound&lt;/strong&gt; exception  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now try the new dependency:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Execute the first test case of the new test set  &lt;/li&gt;
&lt;li&gt;The test case is executed without any problems, even though the precondition was not fulfilled before the test case started  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What happened:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;QF-Test first looked at the &lt;strong&gt;Dependency&lt;/strong&gt; when the test case was started  &lt;/li&gt;
&lt;li&gt;The entry &lt;code&gt;"Required dependency"&lt;/code&gt; indicates that the test case requires &lt;code&gt;"SUT started"&lt;/code&gt;  &lt;/li&gt;
&lt;li&gt;QF-Test jumps to the dependency and executes the &lt;strong&gt;Setup node&lt;/strong&gt;  &lt;/li&gt;
&lt;li&gt;The SUT starts automatically  &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Full Test Set Execution with Dependency&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Close the run log and all clients  &lt;/li&gt;
&lt;li&gt;Execute the entire test set  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Observations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Execution is much faster than the old test set  &lt;/li&gt;
&lt;li&gt;The application is not closed between individual test cases  &lt;/li&gt;
&lt;li&gt;From the run log, we see that no Cleanup node is executed between test cases  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Time savings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Around 30 seconds per test case from the second test case onward  &lt;/li&gt;
&lt;li&gt;Around 2 seconds on the first test case  &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;How Dependencies Work&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Precondition setup sequences are ensured at the beginning of each test case  &lt;/li&gt;
&lt;li&gt;QF-Test maintains a &lt;strong&gt;list of currently valid dependencies&lt;/strong&gt; (&lt;code&gt;Stored dependencies&lt;/code&gt;)  &lt;/li&gt;
&lt;li&gt;At the beginning of the first test case, the list is empty  &lt;/li&gt;
&lt;li&gt;When the dependency is executed, QF-Test saves the dependency name in the list  &lt;/li&gt;
&lt;li&gt;Every new test case compares its required dependency with the stored dependencies  &lt;/li&gt;
&lt;li&gt;If they match, the Cleanup node is skipped  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Setup nodes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Should start the SUT only if it is not already running  &lt;/li&gt;
&lt;li&gt;In the example, a &lt;strong&gt;Wait for client node&lt;/strong&gt; checks whether the CarConfigurator client is available  &lt;/li&gt;
&lt;li&gt;The result is stored in &lt;code&gt;IsSUTRunning&lt;/code&gt;  &lt;/li&gt;
&lt;li&gt;The subsequent &lt;strong&gt;If node&lt;/strong&gt; starts the SUT only if necessary  &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Advanced Behavior&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Another test set demonstrates handling of different dependencies  &lt;/li&gt;
&lt;li&gt;Required dependencies are compared with stored dependencies  &lt;/li&gt;
&lt;li&gt;If a stored dependency is no longer needed, QF-Test executes the &lt;strong&gt;Cleanup&lt;/strong&gt;  &lt;/li&gt;
&lt;li&gt;This allows combining and executing test cases from multiple test sets intelligently  &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Reusing Dependencies&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Dependencies can be copied between test sets, but changes would require updating each copy manually  &lt;/li&gt;
&lt;li&gt;QF-Test allows storing dependencies in the &lt;strong&gt;Procedures section&lt;/strong&gt;  &lt;/li&gt;
&lt;li&gt;New test sets or test cases can reference these stored dependencies  &lt;/li&gt;
&lt;li&gt;The &amp;#8220;Dependency reference&amp;#8221; node acts as a link to the existing dependency  &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Dependencies simplify test case execution and precondition management  &lt;/li&gt;
&lt;li&gt;Setup nodes are executed at the start of each test case  &lt;/li&gt;
&lt;li&gt;Cleanup nodes are executed only when necessary  &lt;/li&gt;
&lt;li&gt;Using stored dependencies allows reuse across multiple test sets  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In a follow-up video, we will cover &lt;strong&gt;nested dependencies&lt;/strong&gt; and &lt;strong&gt;error and exception handling&lt;/strong&gt;.  &lt;/p&gt;
&lt;p&gt;Check your own QF-Test test suites to see if dependencies are already used — implementing them is definitely worth it!&lt;/p&gt;</content><category term="videos"/><category term="featurevideos"/></entry><entry><title>Practice instead of theory: Why my dual study program at QFS was the best decision</title><link href="https://www.qftest.com/en/company/news/company-events/marcel-schmid-student.html" rel="alternate"/><published>2025-10-27T00:00:00+01:00</published><updated>2025-10-27T00:00:00+01:00</updated><author><name>Marcel Schmied</name></author><id>tag:www.qftest.com,2025-10-27:/en/company/news/company-events/marcel-schmid-student.html</id><summary type="html">&lt;p&gt;This fall, I completed my dual study program in computer science at the Cooperative State University of Saxony – in cooperation with Quality First Software GmbH (QFS), which is now part of mgm technology partners.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="" src="/companynews/resources/2025-10-marcel-schmid.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Hello, I’m Marcel Schmied, 23 years old, and I’m from Leipzig.&lt;/p&gt;
&lt;p&gt;This fall, I completed my dual study program in computer science at the Cooperative State University of Saxony – in cooperation with Quality First Software GmbH (QFS), which is now part of mgm technology partners.&lt;/p&gt;
&lt;p&gt;When I started my studies, QFS was still an independent company. During my very first practical phase, however, the team became part of mgm – which was exciting at first but not a problem at all. The team stayed the same, the environment remained familiar, and the working style just as family-like as before.&lt;/p&gt;
&lt;h2&gt;A Start with a Summer Party and Team Spirit&lt;/h2&gt;
&lt;p&gt;Even before my studies officially began, I had the chance to meet the team at the annual summer party – a two-day event with colleagues and their families. This open and welcoming atmosphere made getting started incredibly easy for me.&lt;/p&gt;
&lt;p&gt;After that, the classic alternating model began: three months of theory at the university, followed by three months of practical work in the company. While I found the university phases rather dry – lots of lectures, little practical relevance – I looked forward to every single practical phase at QFS all the more.&lt;/p&gt;
&lt;h2&gt;From QF-Test to Web Development – Learning Through Practice&lt;/h2&gt;
&lt;p&gt;In my first practical phase, I got to know QF-Test. It enables automated testing of graphical user interfaces – and I was instantly fascinated and impressed by how simple yet powerful the tool is. Writing tests with it was genuinely fun!&lt;/p&gt;
&lt;p&gt;In the following phases, I was able to explore many different areas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/qfs/qftest-gradle-plugin"&gt;Development of a Gradle plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/blog/article/performance-comparison-of-vms-and-docker-containers.html"&gt;Performance testing of Docker environments and VMs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Initial tasks in web development&lt;/li&gt;
&lt;li&gt;And even active development on QF-Test itself, for example in the licensing process and improving dialogs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My personal highlight was my bachelor’s thesis. I focused on continuous integration and deployment – specifically on what’s known as the Bouquet integration, a central component of QFS’s build pipeline. It allows feature branches to be merged dynamically, enabling long-term interaction testing – an exciting and practical approach that still fascinates me.&lt;/p&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="/pdf/BachelorarbeitMarcelSchmied.pdf"  class="button scroll-animated green pdf"&gt;Schmied, Marcel: Efficient Strategies for Continuous Integration of Long-Term Feature Branches&lt;svg height="32" viewBox="0 0 480 480" width="32" xmlns="http://www.w3.org/2000/svg"&gt;&lt;g transform="matrix(.98087602 0 0 .98087602 -67.254307 3.334145)"&gt;&lt;path d="m188.18173 15.668499c-12.00499 0-21.74448 9.739502-21.74448 21.74992v347.989201c0 12.01042 9.73949 21.74448 21.74448 21.74448h250.12069c12.01041 0 21.74447-9.73406 21.74447-21.74448v-269.02005l-104.83366-100.719071z" fill="#08509c"/&gt;&lt;path d="m460.05234 116.38757h-83.08919c-12.01043 0-21.74448-9.7395-21.74448-21.749918v-78.969153z" fill="#133170"/&gt;&lt;/g&gt;&lt;path d="m465 412.54215c0 26.22623-21.66404 47.48212-48.38341 47.48212h-353.233188c-26.729849 0-48.3834-21.25589-48.3834-47.48212v-145.04606c0-26.22623 21.653551-47.47182 48.3834-47.47182h353.233178c26.71938 0 48.38341 21.24559 48.38341 47.47182z" fill="#133170" stroke-width="1.00423"/&gt;&lt;g fill="#fff" transform="matrix(3.1466331 0 0 3.1466331 -321.75582 -433.54716)"&gt;&lt;path d="m143.227 249.665h-6.956v10.615c0 1.519-.359 2.668-1.074 3.454s-1.62 1.175-2.713 1.175c-1.145 0-2.065-.389-2.761-1.164s-1.048-1.916-1.048-3.416v-28.901c0-1.673.385-2.866 1.152-3.581s1.987-1.074 3.659-1.074h9.744c2.885 0 5.096.221 6.649.666 1.534.427 2.862 1.134 3.977 2.122s1.961 2.2 2.544 3.633.868 3.042.868 4.834c0 3.82-1.175 6.713-3.528 8.685s-5.858 2.952-10.513 2.952zm-1.841-17.189h-5.115v11.461h5.115c1.792 0 3.285-.187 4.49-.561 1.197-.374 2.114-.988 2.746-1.841s.947-1.968.947-3.353c0-1.654-.486-3.001-1.459-4.041-1.089-1.112-3.33-1.665-6.724-1.665z"/&gt;&lt;path d="m168.319 226.773h9.901c2.574 0 4.782.239 6.627.715 1.845.475 3.51 1.373 5.014 2.687 3.906 3.341 5.856 8.423 5.856 15.244 0 2.253-.198 4.307-.587 6.163s-.999 3.532-1.815 5.025-1.867 2.825-3.147 4.004c-1.007.905-2.107 1.628-3.3 2.174-1.194.546-2.477.932-3.847 1.152-1.373.221-2.922.333-4.644.333h-9.901c-1.381 0-2.421-.21-3.121-.625s-1.156-1.007-1.366-1.766c-.217-.76-.322-1.744-.322-2.956v-27.494c0-1.639.367-2.821 1.1-3.555s1.917-1.101 3.552-1.101zm2.941 6.009v25.451h5.755c1.261 0 2.253-.034 2.967-.101.715-.067 1.459-.239 2.226-.513.767-.273 1.433-.655 1.994-1.152 2.541-2.148 3.813-5.848 3.813-11.102 0-3.701-.558-6.469-1.673-8.314-1.119-1.841-2.496-3.016-4.131-3.517s-3.615-.756-5.934-.756h-5.018v.004z"/&gt;&lt;path d="m224.797 232.629h-14.963v9.59h12.509c1.16 0 2.024.258 2.593.778.572.52.857 1.216.857 2.084s-.288 1.56-.868 2.073-1.441.767-2.582.767h-12.509v12.355c0 1.568-.355 2.731-1.063 3.491-.703.76-1.616 1.137-2.724 1.137-1.126 0-2.043-.385-2.75-1.152-.703-.767-1.059-1.927-1.059-3.48v-28.845c0-1.093.161-1.983.486-2.672.326-.688.831-1.194 1.523-1.508.688-.314 1.572-.471 2.645-.471h17.904c1.209 0 2.11.269 2.698.804.591.539.883 1.242.883 2.11 0 .887-.292 1.598-.883 2.137-.586.533-1.488.802-2.697.802z"/&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;h2&gt;Small Company, Big Team Spirit&lt;/h2&gt;
&lt;p&gt;What made QFS special for me was the working atmosphere.&lt;/p&gt;
&lt;p&gt;The team was open, helpful, and like a family from the very beginning. I could always ask questions, received honest feedback, and was involved in decision-making. Beyond work, there were many opportunities to get to know colleagues – whether at the Leipzig company run, the table tennis cup, or simply during lunch breaks, where we tried out a new restaurant every week (if one could be found).&lt;/p&gt;
&lt;h2&gt;Looking Back and Ahead&lt;/h2&gt;
&lt;p&gt;When I look back on my dual study program today, I’m very grateful for my time at QFS and mgm. I was able to gain insight into nearly all areas of software development, gather practical experience, and discover where my strengths lie.&lt;/p&gt;
&lt;p&gt;Now I’m continuing with a master’s degree in data science – to further specialize.&lt;/p&gt;
&lt;p&gt;I’m taking with me a wealth of experiences, exciting projects, and wonderful memories – and with that, a big thank you to all my colleagues who accompanied me on this journey.&lt;/p&gt;</content><category term="companynews"/></entry><entry><title>Going POSTal! Discover WebAPI Testing in QF-Test</title><link href="https://www.qftest.com/en/support/videos/webAPI-testing.html" rel="alternate"/><published>2025-10-20T00:00:00+02:00</published><updated>2025-10-20T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-10-20:/en/support/videos/webAPI-testing.html</id><summary type="html">&lt;p&gt;In this webinar, we will give a brief introduction to web accessibility and present the new accessibility testing features of QF-Test.&lt;/p&gt;</summary><content type="html">&lt;p&gt;With QF-Test 10, the testing of web interfaces has been fundamentally revised, with a focus on web APIs such as REST, SOAP and other web services. In this special webinar, we will introduce you to the new functions.&lt;/p&gt;
&lt;p&gt;Materials:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://services.qftest.com/en/download/webapi"&gt;QF-Test WebAPI Preview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/qfs/webinars/-/tree/main/webapi"&gt;Demo suite and presentation slides&lt;/a&gt; (Requires QF-Test 10 or QF-Test WebAPI Preview)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;With the upcoming &lt;strong&gt;QF-Test version 10&lt;/strong&gt;, web application and web API testing have been fundamentally redesigned. A major focus of this release is on &lt;strong&gt;Web APIs&lt;/strong&gt; such as REST, SOAP, and other web-based services.&lt;/p&gt;
&lt;p&gt;Testing APIs differs significantly from traditional UI testing.
While QF-Test still supports visual test nodes, &lt;strong&gt;script nodes&lt;/strong&gt; are often needed to simulate realistic workflows.
Complex test logic can be wrapped in reusable &lt;strong&gt;procedures&lt;/strong&gt;, making it easy to maintain and scale even sophisticated tests.&lt;/p&gt;
&lt;p&gt;After the introduction, Thomas hands over to his colleague &lt;strong&gt;Plamen Vesselinov&lt;/strong&gt;, who presents the new features live in action.&lt;/p&gt;
&lt;h3&gt;Introduction to Web API Testing&lt;/h3&gt;
&lt;p&gt;Plamen begins by explaining the difference between &lt;strong&gt;UI testing&lt;/strong&gt; and &lt;strong&gt;API testing&lt;/strong&gt;.
Up to now, QF-Test has primarily been used to automate user interfaces — clicking buttons, entering text, and verifying visible changes.
In contrast, Web APIs communicate directly via the &lt;strong&gt;network&lt;/strong&gt;, exchanging data through &lt;strong&gt;HTTP requests&lt;/strong&gt;, most commonly in &lt;strong&gt;JSON format&lt;/strong&gt; (though XML and other formats are also supported).&lt;/p&gt;
&lt;p&gt;For example:
A client application can query a server for user information via an API by providing an ID. The server responds with the requested data. Using a &lt;strong&gt;PUT request&lt;/strong&gt;, this data can then be modified.&lt;/p&gt;
&lt;h3&gt;Demo: Using the New Web Request Node&lt;/h3&gt;
&lt;p&gt;Plamen then demonstrates the new &lt;strong&gt;Web Request node&lt;/strong&gt; introduced in QF-Test 10.
This node is designed specifically for API testing and allows users to configure and send HTTP requests directly from within QF-Test.&lt;/p&gt;
&lt;p&gt;He uses a simple REST service — a sample &lt;em&gt;Pet Store&lt;/em&gt; API — to illustrate:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A &lt;strong&gt;POST request&lt;/strong&gt; adds a new pet (“Wolf”) to the store.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;PUT request&lt;/strong&gt; updates the pet’s name.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;GET request&lt;/strong&gt; retrieves the updated information.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;QF-Test logs each step in detail: the exact &lt;strong&gt;request&lt;/strong&gt; sent, the &lt;strong&gt;response&lt;/strong&gt; received, the &lt;strong&gt;status code&lt;/strong&gt;, and the full &lt;strong&gt;JSON content&lt;/strong&gt;.
A status code of &lt;strong&gt;200&lt;/strong&gt; indicates success.&lt;/p&gt;
&lt;p&gt;QF-Test 10 also introduces &lt;strong&gt;syntax highlighting&lt;/strong&gt; for JSON and XML bodies and supports custom HTTP headers such as &lt;code&gt;Content-Type&lt;/code&gt; and &lt;code&gt;Accept&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Pre- and Post-Request Handlers&lt;/h3&gt;
&lt;p&gt;For more advanced scenarios, QF-Test provides &lt;strong&gt;Pre-Request&lt;/strong&gt; and &lt;strong&gt;Post-Request Handlers&lt;/strong&gt;.
These allow users to modify a request before it is sent or process a response after it is received.&lt;/p&gt;
&lt;p&gt;Typical use cases include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Setting authentication credentials&lt;/li&gt;
&lt;li&gt;Adjusting request headers&lt;/li&gt;
&lt;li&gt;Automatically verifying response content&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Handlers are executed in a defined order:
Global handlers run first, followed by local handlers defined within the test case itself.&lt;/p&gt;
&lt;h3&gt;Test Cases, Variables, and Assertions&lt;/h3&gt;
&lt;p&gt;Next, Plamen presents a complete &lt;strong&gt;test suite&lt;/strong&gt; that adds several pets using different data sets.
The suite uses a &lt;strong&gt;data driver&lt;/strong&gt; so that the same test case can be executed multiple times with varying input values.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Assertion API&lt;/strong&gt; (&lt;code&gt;rc.check&lt;/code&gt;) enables checks and validations without interrupting the test flow if one fails.
All results are documented clearly in both the execution log and the &lt;strong&gt;HTML report&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;QF-Test 10 adds convenient &lt;strong&gt;Copy buttons&lt;/strong&gt; in the report and log views, making it easier to extract large JSON bodies or specific sections for debugging.&lt;/p&gt;
&lt;h3&gt;Scripting and Technical Background&lt;/h3&gt;
&lt;p&gt;Under the hood, QF-Test uses the &lt;strong&gt;&lt;code&gt;java.net.http&lt;/code&gt; package&lt;/strong&gt; from the Java Development Kit to handle web requests.
This means that standard Java methods and classes are directly available within QF-Test scripting environments (e.g., &lt;strong&gt;Groovy&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;Scripts can be used to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Loop through data&lt;/li&gt;
&lt;li&gt;Dynamically set variables&lt;/li&gt;
&lt;li&gt;Parse responses&lt;/li&gt;
&lt;li&gt;Implement custom checks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All related classes and objects (&lt;code&gt;Request&lt;/code&gt;, &lt;code&gt;Response&lt;/code&gt;, &lt;code&gt;rc.web&lt;/code&gt;, &lt;code&gt;rc.check&lt;/code&gt;, etc.) are documented in detail in the &lt;strong&gt;QF-Test manual&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Authentication&lt;/h3&gt;
&lt;p&gt;QF-Test 10 natively supports several authentication schemes in its Web Request node:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Basic Authentication&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bearer Token Authentication&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API Key Authentication&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These credentials can be supplied either through HTTP headers or URL parameters.
Sensitive information (such as tokens) can be encrypted or hidden from logs and reports.&lt;/p&gt;
&lt;h3&gt;SOAP Example&lt;/h3&gt;
&lt;p&gt;In addition to REST APIs, QF-Test also supports &lt;strong&gt;SOAP web services&lt;/strong&gt;.
Plamen demonstrates this using a simple &lt;em&gt;Calculator&lt;/em&gt; service that adds two numbers.
The SOAP request includes an XML body and a &lt;code&gt;SOAPAction&lt;/code&gt; header.&lt;/p&gt;
&lt;p&gt;If the service responds successfully (status 200), QF-Test displays the result.
If not, the system issues a warning rather than failing the test, since the problem is likely with the demo service itself.&lt;/p&gt;
&lt;h3&gt;Proxy and Certificate Management&lt;/h3&gt;
&lt;p&gt;QF-Test provides extensive options for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Proxy configuration&lt;/strong&gt; (HTTP/S),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cookie management&lt;/strong&gt;, and&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Certificate handling&lt;/strong&gt;, including &lt;strong&gt;client certificates&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By default, QF-Test accepts all SSL certificates, but this can be customized.
There is also a built-in &lt;strong&gt;procedure&lt;/strong&gt; that allows testing Web APIs with client-side certificates.&lt;/p&gt;
&lt;p&gt;To observe live network traffic, Plamen recommends using a &lt;strong&gt;MITM proxy&lt;/strong&gt;.
Such a proxy can be integrated with QF-Test, allowing users to watch HTTP requests and responses as they happen.&lt;/p&gt;
&lt;h3&gt;Future Outlook&lt;/h3&gt;
&lt;p&gt;The QF-Test team is continuously expanding the Web API testing capabilities.
Planned features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support for &lt;strong&gt;WebSockets&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;Additional &lt;strong&gt;authentication mechanisms&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;Enhanced &lt;strong&gt;response validation tools&lt;/strong&gt;, and&lt;/li&gt;
&lt;li&gt;More pre-built &lt;strong&gt;procedures&lt;/strong&gt; within the &lt;code&gt;webapi&lt;/code&gt; package.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Thomas Max concludes the session by thanking all participants.
The QF-Test team welcomes &lt;strong&gt;feedback, questions, and feature requests&lt;/strong&gt; and encourages attendees to reach out via email after the webinar.&lt;/p&gt;</content><category term="videos"/><category term="specialwebinars"/></entry><entry><title>QF-Test Special Webinar about WebAPI Testing</title><link href="https://www.qftest.com/en/company/news/newsletters/qf-test-special-webinar-about-webapi-testing.html" rel="alternate"/><published>2025-10-15T00:00:00+02:00</published><updated>2025-10-15T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-10-15:/en/company/news/newsletters/qf-test-special-webinar-about-webapi-testing.html</id><summary type="html">&lt;p&gt;Sign up now for special webinar about testing of web APIs with QF-Test on October 20, 2025&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Hello dear QF-Test users!&lt;/h2&gt;
&lt;p&gt;We would like to cordially invite you to our &lt;strong&gt;next free QF-Test special webinar on October 20, 2025&lt;/strong&gt;, at 3:30 PM!  &lt;/p&gt;
&lt;p&gt;With the upcoming version 10 of QF-Test we are expanding our proven test automation tool with a powerful new feature: &lt;strong&gt;support for web API testing&lt;/strong&gt;.  &lt;/p&gt;
&lt;p&gt;This means that QF‑Test now offers comprehensive capabilities not only for UI test automation, but also for &lt;strong&gt;automated testing of web interfaces (web APIs)&lt;/strong&gt; thus REST, SOAP, and other web services.  &lt;/p&gt;
&lt;p&gt;Best wishes,&lt;br /&gt;
your QFS team&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Upcoming QF-Test special webinar&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://register.gotowebinar.com/register/4480482843899086679"&gt;&lt;img alt="Registration special webinar" src="https://www.qftest.com/videos/resources/special-webinar-webapi.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;October 20, 2025, 3:30 PMGoing POSTal! Discover WebAPI Testing in QF-Test&lt;/h3&gt;
&lt;p&gt;With QF-Test 10, the testing of web interfaces has been fundamentally revised, with a focus on web APIs such as REST, SOAP and other web services. In this special webinar, we will introduce you to the new functions.&lt;/p&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="https://register.gotowebinar.com/#register/4480482843899086679"  class="button scroll-animated green chevron"&gt;Sign up for free&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="/support/schulung-beratung/webinare.html"&gt;Special webinar in German&lt;/a&gt;, October 20, 2025, 10:30 AM&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;WebAPI early adopters wanted&lt;/h2&gt;
&lt;p&gt;If you would like to try out the new feature for &lt;strong&gt;testing web services and web APIs&lt;/strong&gt; before QF-Test 10 is released, we are happy to welcome you as early adopter.  &lt;/p&gt;
&lt;p&gt;Please let us know what is particularly important to you when testing web APIs and which use cases you would like to cover with them.&lt;/p&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="https://services.qftest.com/en/support/contact/?comment=Web-API%20Early%20Adopters"  class="button scroll-animated green chevron"&gt;Get in touch with our service team now&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;
&lt;h2&gt;Save the date: Events in 2025&lt;/h2&gt;
&lt;h3&gt;QF-Test Basics: Training via Webinar&lt;/h3&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/training.html"&gt;&lt;img alt="Basic Training QF-Test" src="/newsletters/resources/QF-Test_OnlineSchulung.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;November 10–13, 2025in English&lt;/h3&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="/en/support/training-consulting/training.html#training"  class="button scroll-animated green chevron"&gt;More about the training&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;4 days, 2 × 2,5 hours each&lt;/li&gt;
&lt;li&gt;Effective and rapid knowledge transfer&lt;/li&gt;
&lt;li&gt;Small groups up to a maximum of 8 participants&lt;/li&gt;
&lt;li&gt;Interaction with the trainers and asking questions are possible at any time&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Individual QF-Test Company Trainings&lt;/h3&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/training.html#consulting"&gt;&lt;img alt="Individual QF-Test Training" src="/newsletters/resources/2025-10_OnlineSchulung-Ort.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Would you like a training course which is individually tailored to your company? Just send us an email to &lt;a href="https://services.qftest.com/en/support/contact/"&gt;service@qftest.com&lt;/a&gt;.&lt;/p&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="https://services.qftest.com/en/support/contact/?comment=Request%20individual%20training"  class="button scroll-animated green chevron"&gt;Ask our service team for a quote&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;hr /&gt;
&lt;h2&gt;From our YouTube Channel&lt;/h2&gt;
&lt;p&gt;&lt;a href="/en/support/videos/beyond-strings-object-variables.html"&gt;&lt;img alt="special webinar objekt variables" src="https://www.qftest.com/videos/resources/object-vars-special-webinar-en.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Beyond Strings – how to effectively use object variables in QF-Test 9&lt;/h3&gt;
&lt;p&gt;This webinar video provides a technical overview of the concept of object variables in QF-Test.  &lt;/p&gt;
&lt;p&gt;➜ &lt;a href="/en/support/videos/beyond-strings-object-variables.html"&gt;Watch the Video now&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Visit our &lt;a href="https://www.youtube.com/@qftest"&gt;YouTube channel&lt;/a&gt; to subscribe and follow us on &lt;a href="https://www.linkedin.com/company/quality-first-software-gmbh-qfs"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Download QF-Test&lt;/h2&gt;
&lt;h3&gt;Do you already use the latest version of QF-Test?&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://services.qftest.com/en/download/"&gt;&lt;img alt="Download QF-Test" src="/newsletters/resources/2025-09-25_Download-Thick-Bottom--Streamline-Streamline-3.0.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="https://services.qftest.com/en/download/"  class="button scroll-animated green chevron"&gt;Download QF-Test 9.0.6&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;To the &lt;a href="https://www.qftest.com/doc/manual/en/history.html#app_news"&gt;Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Available since 2025-09-10&lt;/li&gt;
&lt;/ul&gt;</content><category term="newsletters"/></entry><entry><title>“Challenge Accepted!” – QFS in Bulgaria</title><link href="https://www.qftest.com/en/company/news/qa-challenge-accepted.html" rel="alternate"/><published>2025-10-13T00:00:00+02:00</published><updated>2025-10-13T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-10-13:/en/company/news/qa-challenge-accepted.html</id><summary type="html">&lt;p&gt;QFS attended the &amp;#8220;QA Challenge Accepted&amp;#8221; and &amp;#8220;Dev Challenge Accepted&amp;#8221; events in Sofia, Bulgaria. Both events offered exciting insights into current trends and numerous opportunities to network with other professionals from the IT and QA industries.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;button class="plain" onclick="document.getElementById('6462').showModal()" title="Enlarge"&gt;&lt;/p&gt;
&lt;figure&gt;
    &lt;img src="/images/2025-dev-challenge-accepted.jpg"
        class=" scroll-animated"
        alt=""
        style="max-width:400px "&gt;&lt;/figure&gt;
&lt;p&gt;&lt;/button&gt;&lt;dialog popover id="6462" anchor="trigger-6462"&gt;&lt;/p&gt;
&lt;div class="container card scroll-animated width-full accent    "&gt;&lt;div class="container-content"&gt;        &lt;button onclick="document.getElementById('6462').close()"
                class="button blue tertiary"
                id="trigger-6462"
                style="margin: -15px -15px 10px auto; position: relative"&gt;Close&lt;/button&gt;
            &lt;figure&gt;
        &lt;img class="plain" src="/images/2025-dev-challenge-accepted.jpg" alt=""&gt;&lt;/figure&gt;
    &lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;/dialog&gt;&lt;/p&gt;
&lt;p&gt;Our &lt;a href="/en/author/plamen-vesselinov.html"&gt;QF-Test &lt;em&gt;Head of Support&lt;/em&gt; Plamen Vesselinov&lt;/a&gt; recently attended the &lt;a href="https://qachallengeaccepted.com/"&gt;&amp;#8220;QA Challenge Accepted&amp;#8221;&lt;/a&gt; and &lt;a href="https://www.challengeaccepted.dev/"&gt;&amp;#8220;Dev Challenge Accepted&amp;#8221;&lt;/a&gt; events in Bulgaria.&lt;/p&gt;
&lt;p&gt;The conferences took place for the 11th time, this year at the John Atanasoff Forum in Sofia.&lt;/p&gt;
&lt;p&gt;Both events offered exciting insights into current trends and numerous opportunities to network with other professionals from the IT and QA industries.&lt;/p&gt;
&lt;p&gt;When asked about his highlights, Plamen said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I found the discussions and practical tips particularly valuable, which I can now apply directly in my work for QF-Test as a customer support and mentor. The inspiring atmosphere and the many new ideas have further broadened my perspective on our customers&amp;#8217; needs.&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="news"/></entry><entry><title>QFS at TACON2025 in Leipzig, Germany</title><link href="https://www.qftest.com/en/company/news/tacon-leipzig.html" rel="alternate"/><published>2025-10-02T00:00:00+02:00</published><updated>2025-10-02T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-10-02:/en/company/news/tacon-leipzig.html</id><summary type="html">&lt;p&gt;Two fantastic days at TACON2025 in Leipzig are behind us – and we’re already looking forward to next year! The keynote by Richard Seidl and the test automation insights from our mgm colleague Lilia Gargouri were real highlights.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;button class="plain" onclick="document.getElementById('1298').showModal()" title="Enlarge"&gt;&lt;/p&gt;
&lt;figure&gt;
    &lt;img src="/images/2025-tacon-leipzig-max.jpeg"
        class=" scroll-animated"
        alt="Selfie of Thomas Max attending TACON 2025"
        style="max-width:400px "&gt;&lt;/figure&gt;
&lt;p&gt;&lt;/button&gt;&lt;dialog popover id="1298" anchor="trigger-1298"&gt;&lt;/p&gt;
&lt;div class="container card scroll-animated width-full accent    "&gt;&lt;div class="container-content"&gt;        &lt;button onclick="document.getElementById('1298').close()"
                class="button blue tertiary"
                id="trigger-1298"
                style="margin: -15px -15px 10px auto; position: relative"&gt;Close&lt;/button&gt;
            &lt;figure&gt;
        &lt;img class="plain" src="/images/2025-tacon-leipzig-max.jpeg" alt="Selfie of Thomas Max attending TACON 2025"&gt;&lt;/figure&gt;
    &lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;/dialog&gt;&lt;/p&gt;
&lt;p&gt;Two fantastic days at &lt;a href="https://summit-community.de/veranstaltung/summit_events/"&gt;TACON2025 in Leipzig&lt;/a&gt; are behind us – and we’re already looking forward to next year!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://events.summit-community.de/event/tacon-2025/summary/"&gt;&amp;#8220;TACON&amp;#8221;&lt;/a&gt; stands for &amp;#8220;Testing, Test Automation and Quality Management in Software Development.&amp;#8221; For years, TACON has been a central meeting point for testing experts to exchange ideas about current developments and to network.&lt;/p&gt;
&lt;p&gt;&lt;a href="/en/author/thomas-max.html"&gt;Thomas Max&lt;/a&gt; was there for QF-Test and summarized the time like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The keynote by Richard Seidl and the test automation insights from my &lt;a href="/en/author/lilia-gargouri.html"&gt;mgm colleague Lilia Gargouri&lt;/a&gt; were real highlights. In addition to many exciting presentations, there were great reunions and new acquaintances. Many thanks to everyone involved and to the summit team for the excellent organization!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Lilia Gargouri’s talk was titled &lt;strong&gt;&amp;#8220;Success in E2E Test Automation: Key Lessons from a Decade of Experience&amp;#8221;&lt;/strong&gt; and was even awarded &amp;#8220;Best Lecture of TACON&amp;#8221; by the audience. The presentation was about how mgm technology partners, with the help of QF-Test and other technologies, ensure efficient test automation of projects.&lt;/p&gt;
&lt;p&gt;You can learn more about Lilia’s work in this interview on our blog:&lt;/p&gt;
&lt;div class="anchor-wrapper"&gt;
    &lt;a href="https://www.qftest.com/en/blog/article/from-mgms-coffee-kitchen-to-test-automation-with-qf-test.html" class="container card scroll-animated width-normal clear imgfill   image-right"&gt;&lt;img class="container-image" src="/blog/resources/Lilia_CWR_edited.jpg" alt=""&gt;&lt;div class="container-content"&gt;&lt;div class="container-title"&gt;&lt;div class="container-title-text"&gt;From mgm’s coffee kitchen to test automation with QF-Test&lt;/div&gt;&lt;/div&gt;&lt;div class="entry-content"&gt;  &lt;p&gt;Lilia Gargouri is head of the mgm Quality Team together with Martin Varendorff. In this interview, she describes for us how she found her way to QF-Test, what&amp;#8217;s important to her in test automation, and about her hopes for the closer cooperation between our companies in the future.&lt;/p&gt;
&lt;/div&gt;

&lt;div class="container width-normal align-start justify-center row    " &gt;&lt;div class="container-content" &gt;&lt;address class="vcard author"&gt;
&lt;strong class="flex-row-dynamic gap-small"&gt;
&lt;img src="/images/staff/thomas.jpg" height="60" width="60" class="author-profile-pic" alt="Thomas Max"&gt;
Thomas Max
&lt;/strong&gt;&lt;/address&gt;
&lt;div class="flex-column"&gt;&lt;div&gt;&lt;time class="published" datetime="2022-09-22T00:00:00+02:00"&gt;
22/09/2022
&lt;/time&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;    &lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</content><category term="news"/></entry><entry><title>QF-Test 9.0.6 available</title><link href="https://www.qftest.com/en/company/news/qf-test-9-0-6-available.html" rel="alternate"/><published>2025-09-10T00:00:00+02:00</published><updated>2025-09-10T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-09-10:/en/company/news/qf-test-9-0-6-available.html</id><content type="html">&lt;p&gt;This maintenance release adds support for Eclipse / SWT 4.37 alias &amp;#8220;2025-09&amp;#8221;, updates a couple of bundled libraries and fixes a few minor bugs.&lt;/p&gt;</content><category term="news"/></entry><entry><title>What QF-Test editions are available, and what are the differences?</title><link href="https://www.qftest.com/en/product/faq/what-qf-test-editions-are-available.html" rel="alternate"/><published>2025-08-01T00:00:00+02:00</published><updated>2025-08-01T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-08-01:/en/product/faq/what-qf-test-editions-are-available.html</id><summary type="html">&lt;p&gt;Since version 10, QF-Test is available in four editions&lt;/p&gt;</summary><content type="html">&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;QF-Test Web&lt;/strong&gt; for web browsers, accessibility, Electron applications, API and web service testing  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QF-Test Desktop&lt;/strong&gt; for Java and native Windows applications  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QF-Test Mobile&lt;/strong&gt; for Android and iOS apps  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QF-Test Pro&lt;/strong&gt; combines all technologies and additionally supports hybrid applications. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The first three editions focus on the specific UI technologies mentioned above, while QF-Test Pro offers the complete functionality, equivalent to previous QF-Test versions. 
A detailed overview of features per edition is available on &lt;a href="/en/product/pricing.html"&gt;QF-Test Pricing&lt;/a&gt; or can be requested from our service team.  &lt;/p&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="https://services.qftest.com/en/support/contact/?type=editions"  class="button scroll-animated green chevron"&gt;Contact Our Service Team&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="https://services.qftest.com/en/download/"  class="button scroll-animated green chevron"&gt;Download QF-Test&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;</content><category term="faqs"/><category term="faqeditions"/></entry><entry><title>QF-Test 9.0.5 available</title><link href="https://www.qftest.com/en/company/news/qf-test-9-0-5-available.html" rel="alternate"/><published>2025-07-30T00:00:00+02:00</published><updated>2025-07-30T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-07-30:/en/company/news/qf-test-9-0-5-available.html</id><content type="html">&lt;p&gt;This maintenance release raises the embedded JRE to Temurin 17.0.16, updates some embedded libraries and fixes a few small bugs.&lt;/p&gt;</content><category term="news"/></entry><entry><title>QF-Test 9.0.5 available</title><link href="https://www.qftest.com/en/company/news/newsletters/2025-07-qftest-905-available.html" rel="alternate"/><published>2025-07-30T00:00:00+02:00</published><updated>2025-07-30T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-07-30:/en/company/news/newsletters/2025-07-qftest-905-available.html</id><summary type="html">&lt;p&gt;Training Dates 2025, News and Blogs, Video of special webinar on object variables&lt;/p&gt;</summary><content type="html">&lt;p&gt;Hello dear QF-Test users!&lt;/p&gt;
&lt;p&gt;What&amp;#8217;s new?&lt;/p&gt;
&lt;p&gt;Today&amp;#8217;s maintenance release &lt;strong&gt;QF-Test 9.0.5&lt;/strong&gt; raises the embedded JRE to Temurin 17.0.16, updates some embedded libraries and fixes a few small bugs to further improve stability and reliability.&lt;/p&gt;
&lt;p&gt;We are currently preparing the next special webinar on a new feature of the upcoming version 10. This time it&amp;#8217;s all about &lt;strong&gt;testing web interfaces (WebAPIs)&lt;/strong&gt; such as REST, SOAP and other web services. If you are already interested in advance, &lt;a href="https://services.qftest.com/en/support/contact/"&gt;please contact us&lt;/a&gt; &amp;ndash; early adopters are very welcome! Please let us know what is particularly important to you in API testing and which use cases you would like to cover.&lt;/p&gt;
&lt;p&gt;The recording of our July special webinar on &lt;strong&gt;object variables&lt;/strong&gt; is now available online. The video shows how to use object variables efficiently in your tests. You will find the link further down in the newsletter.&lt;/p&gt;
&lt;p&gt;As always, you can also look forward to the latest training dates, practice-oriented blog articles such as “&lt;strong&gt;Scrolling your web application with QF-Test&lt;/strong&gt;” and helpful video tutorials.&lt;/p&gt;
&lt;p&gt;Best wishes,&lt;br /&gt;
 your QFS team&lt;/p&gt;
&lt;h2&gt;QF-Test Version 9.0.5&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://services.qftest.com/en/download/"&gt;&lt;img alt="QF-Test Download" src="/newsletters/resources/2025-03_Download-Button-Pfeil-gruen-Schachtel-dunkelblau.png" title="QF-Test Download" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download &lt;a href="https://services.qftest.com/en/download/"&gt;QF-Test version 9.0.5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;To the &lt;a href="https://www.qftest.com/doc/manual/en/history.html"&gt;Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Save the date: Events in 2025&lt;/h2&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/training.html"&gt;&lt;img alt="Online Training QF-Test" src="/newsletters/resources/OnlineSchulung-Monitor-Hut-dunkelblau-HGblau.png" title="Online Training QF-Test" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;QF-Test Basics: Training via Webinar&lt;/strong&gt;&lt;br /&gt;
&lt;a href="/en/support/training-consulting/training.html#a30295-659e55fa94d68760261203"&gt;September 29 – October 2, 2025, German&lt;/a&gt;&lt;br /&gt;
&lt;a href="/en/support/training-consulting/training.html#a30295-6613a7774f6b6588956332"&gt;November 10&lt;/a&gt;&lt;a href="/en/support/training-consulting/training.html#a30295-659e55fa94d68760261203"&gt;–&lt;/a&gt; &lt;a href="/en/support/training-consulting/training.html#a30295-6613a7774f6b6588956332"&gt;13, 2025, English&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;4 days, 2 × 2,5 hours each&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Effective and rapid knowledge transfer in small groups up to a maximum of 8 participants&lt;/li&gt;
&lt;li&gt;Interaction with the trainers and asking questions are possible at any time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;➜ &lt;a href="https://services.qftest.com/en/support/contact/"&gt;Sign up now&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Would you like a &lt;a href="/en/support/training-consulting/training.html#c30865"&gt;training course&lt;/a&gt; which is individually tailored to your company? Just send us an email to &lt;a href="https://services.qftest.com/en/support/contact/"&gt;service@qftest.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/webinars.html#c34104"&gt;&lt;img alt="" src="/newsletters/resources/spezialwebinar-WebAPI_qf-test.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Special Webinar&lt;/strong&gt;&lt;br /&gt;
&lt;a href="/en/support/training-consulting/webinars.html#c34103"&gt;Going POSTal! Discover WebAPI Testing in QF-Test&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;October 20, 2025, 3:30 PM (CEST)&lt;/strong&gt; (provisional)&lt;/p&gt;
&lt;p&gt;With QF-Test 10, the testing of web interfaces is fundamentally revised, with a focus on web APIs such as REST, SOAP and other web services. In this special webinar, we present the new functions.&lt;/p&gt;
&lt;p&gt;➜ &lt;a href="/en/support/training-consulting/webinars.html#c34103"&gt;Sign up for free&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/support/schulung-beratung/webinare.html"&gt;Special webinar in German&lt;/a&gt; at 10:30 a.m.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://summit-community.de/2023/05/31/cvent-session/?title=Erfolg%20in%20der%20E2E-Testautomatisierung:%20Wichtige%20Lektionen%20aus%20einem%20Jahrzehnt&amp;amp;eventId=cd3d638b-d143-4298-b414-a94dac89b234&amp;amp;sessionId=2a3548cb-288f-47dc-96e4-8b3df41c5002"&gt;&lt;img alt="" src="/newsletters/resources/Tacon_01.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Talk at TACON 2025: Erfolg in der E2E-Testautomatisierung&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;September 23–24, 2025, Leipzig, Germany&lt;/strong&gt;&lt;br /&gt;
 Lilia Gargouri, Head of Quality Assurance at mgm technology partners, gives a talk about how to increase the maintainability and stability of their tests through modular test architectures and effective test data management. Participants learn how to minimize volatile tests and apply robust test design principles.&lt;/p&gt;
&lt;p&gt;➜ &lt;a href="https://summit-community.de/2023/05/31/cvent-session/?title=Erfolg%20in%20der%20E2E-Testautomatisierung:%20Wichtige%20Lektionen%20aus%20einem%20Jahrzehnt&amp;amp;eventId=cd3d638b-d143-4298-b414-a94dac89b234&amp;amp;sessionId=2a3548cb-288f-47dc-96e4-8b3df41c5002"&gt;To Tacon&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://insights.mgm-tp.com/en/2025/quality-assurance/experience-q12-tmt-live-conferences-events-and-webinars-2025/"&gt;&lt;img alt="Q12 Test Management Tool Screenshot" src="/newsletters/resources/TMT-Screenshot.png" title="Q12 Test Management Tool Screenshot" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q12-TMT Test Management Tool&lt;/strong&gt;&lt;br /&gt;
 Our parent company mgm technology partners will be represented with Q12-TMT at international and German conferences, events and webinars. As a professional tool for structured test case creation, planning, execution, documentation and reporting, TMT may also be of interest to you as a supplement to QF-Test.&lt;/p&gt;
&lt;p&gt;➜ &lt;a href="https://insights.mgm-tp.com/en/2025/quality-assurance/experience-q12-tmt-live-conferences-events-and-webinars-2025/"&gt;To testing events with mgm in 2025&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;News&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Scrolling on the Web with QF-Test: The complete guide&lt;/strong&gt; &lt;strong&gt;–&lt;/strong&gt;  In this blog post, you`ll get to know all about how to control how QF-Test scrolls your web application and how to control that scrolling yourself.&lt;br /&gt;
   ➜ &lt;a href="/en/blog/article/web-scrolling.html"&gt;Go to the blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;From our YouTube Channel&lt;/h2&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/webinars.html#c35054"&gt;&lt;img alt="" src="/newsletters/resources/object-vars-special-webinar-en.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Special webinar video&lt;/strong&gt;&lt;br /&gt;
&lt;a href="/en/support/training-consulting/webinars.html#c35054"&gt;Beyond Strings &amp;ndash; how to effectively use object variables in QF-Test 9&lt;/a&gt;&lt;br /&gt;
 As of QF-Test 9 any objects can be stored in QF-Test variables. In this special webinar we show, how object variables can be used profitably in your tests.&lt;br /&gt;
 ➜ &lt;a href="/en/support/training-consulting/webinars.html#c35054"&gt;Watch the video now&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Visit our &lt;a href="https://www.youtube.com/channel/UCo6yiK49wlGY1Busavn0LZw"&gt;YouTube channel&lt;/a&gt; to subscribe and follow us on &lt;a href="https://www.linkedin.com/company/quality-first-software-gmbh-qfs/"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;</content><category term="newsletters"/></entry><entry><title>Summer Party of QFS and mgm technology partners</title><link href="https://www.qftest.com/en/company/news/company-events/qfs-mgm-summer-party.html" rel="alternate"/><published>2025-07-25T00:00:00+02:00</published><updated>2025-07-25T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-07-25:/en/company/news/company-events/qfs-mgm-summer-party.html</id><summary type="html">&lt;p&gt;QFS and mgm had a wonderful summer party at the Rosengarten in Munich&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="Summer Party" src="/companynews/resources/20250725-summerparty.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Together with our parent company mgm technology partners, we enjoyed a wonderful summer party at the Rosengarten in Munich. With delicious food and a relaxed atmosphere, it was a great opportunity to chat, catch up with old contacts, and get to know new colleagues. It was a successful evening that strengthened team spirit and community—we are already looking forward to the next one!&lt;/p&gt;</content><category term="companynews"/></entry><entry><title>Scrolling on the Web with QF-Test – The complete guide</title><link href="https://www.qftest.com/en/blog/article/web-scrolling.html" rel="alternate"/><published>2025-07-16T00:00:00+02:00</published><updated>2025-07-16T00:00:00+02:00</updated><author><name>Max Melzer</name></author><id>tag:www.qftest.com,2025-07-16:/en/blog/article/web-scrolling.html</id><summary type="html">&lt;p&gt;In this blog post, I will tell you all about how to control how QF-Test scrolls your web application and how to control that scrolling yourself.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A question that comes up time and again during web application test automation with QF-Test is: &lt;strong&gt;How do I scroll?&lt;/strong&gt; How do I trigger a scroll event? Can I tell QF-Test to turn the mouse wheel? Can I simulate scrolling with the mouse in QF-Test? I just want to scroll down a little!&lt;/p&gt;
&lt;p&gt;In general, our first response to these kinds of questions is: &lt;strong&gt;You shouldn&amp;#8217;t have to.&lt;/strong&gt; QF-Test handles scrolling by itself and will fully automatically scroll elements into the viewport as soon as it needs to interact with them. That&amp;#8217;s why QF-Test does not record scroll events, or offer a &amp;#8216;Scroll&amp;#8217; node, because in 99% of cases, QF-Test will do the right thing automatically.&lt;/p&gt;
&lt;p&gt;But you&amp;#8217;re probably here because you&amp;#8217;re part of that 1% of cases where that mechanism is not enough. So in this blog post, I will tell you all about how QF-Test scrolls your web application and how to control that scrolling yourself.&lt;/p&gt;
&lt;h2&gt;Scroll manually using keyboard events&lt;/h2&gt;
&lt;p&gt;If you just want to scroll a set amount, you should try to scroll by recording keyboard events.&lt;/p&gt;
&lt;p&gt;In most web applications, the arrow keys can be used to scroll around. &lt;kbd&gt;Space&lt;/kbd&gt; and &lt;kbd&gt;Shift&lt;/kbd&gt;+&lt;kbd&gt;Space&lt;/kbd&gt; will scroll roughly one window height, and the &lt;kbd&gt;Home&lt;/kbd&gt; and &lt;kbd&gt;End&lt;/kbd&gt; keys should scroll to the top and bottom of the document, respectively. That way you might be able to skip the more complicated methods described below. &lt;/p&gt;
&lt;h2&gt;Fine-tune the QF-Test scrolling algorithm&lt;/h2&gt;
&lt;p&gt;Let&amp;#8217;s say QF-Test is already scrolling for you, but it&amp;#8217;s not quite doing it the way you need. QF-Test offers several SUT options you can use to configure its scrolling behavior.&lt;/p&gt;
&lt;p&gt;You can set these options in a &lt;a href="https://www.qftest.com/doc/manual/en/user_scripting.html#usec_scripting_options"&gt;SUT script node&lt;/a&gt; or using the &lt;a href="https://www.qftest.com/doc/manual/en/tech_doctags.html#sec_doctags_execution"&gt;&lt;code&gt;@option&lt;/code&gt; doctag&lt;/a&gt; in QF-Test 9.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;Options.OPT_WEB_SCROLL_VISIBLE&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;This option controls how web nodes are scrolled visible. Possible values are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Options.VAL_WEB_SCROLL_VISIBLE_DEFAULT&lt;/code&gt; (use the QF-Test algorithm),&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Options.VAL_WEB_SCROLL_VISIBLE_NEVER&lt;/code&gt; (prohibits scrolling),&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Options.VAL_WEB_SCROLL_VISIBLE_TOP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Options.VAL_WEB_SCROLL_VISIBLE_BOTTOM&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Options.VAL_WEB_SCROLL_VISIBLE_MINIMAL&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;a custom JSON string matching the &lt;code&gt;options&lt;/code&gt; parameter of the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView"&gt;&lt;code&gt;Element:scrollIntoView&lt;/code&gt; JavaScript API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Options other than &amp;#8220;default&amp;#8221; and &amp;#8220;never&amp;#8221; will call &lt;code&gt;node.scrollIntoView()&lt;/code&gt; directly in the browser&amp;#8217;s JavaScript context. &lt;code&gt;scrollIntoView&lt;/code&gt; is a pretty powerful part of the JavaScript Element API. You can learn all about it&amp;#8217;s advanced options in the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView"&gt;mdn web docs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can also override this option on an individual component by setting the node property &lt;code&gt;qfs:scrollvisible&lt;/code&gt;:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kt"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getComponent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;myElement&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// replace with a component&amp;#39;s QF-Test ID&lt;/span&gt;
&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;qfs:scrollvisible&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;VAL_WEB_SCROLL_VISIBLE_NEVER&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;&lt;code&gt;Options.OPT_WEB_MIN_DELAY_AFTER_AUTO_SCROLL&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;With this option, you can introduce some additional delay after every automatic scroll action, in &lt;code&gt;ms&lt;/code&gt;. This is useful if your application uses animations that are triggered by scrolling or if your application just needs a little more time to reload data after scrolling. The default value is 150.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;Options.OPT_PLAY_SCROLL_ITEM&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Set to &lt;code&gt;False&lt;/code&gt; to stop QF-Test from automatically scrolling to sub-items of lists, tables or trees. You can use this if QF-Test scrolls to weird places when navigating a tree, for example.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;Options.OPT_PLAY_SCROLL_PADDING&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Extra padding for automatic scrolling, in &lt;code&gt;px&lt;/code&gt;. Use this to make QF-Test increase or decrease the calculated minimal required scroll amount so that more of the surroundings of the target element remain visible. The default value is 5.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;Options.OPT_PLAY_WEB_AUTO_SCROLL&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;When set to &lt;code&gt;False&lt;/code&gt;, QF-Test will not perform any auto-scrolling at all. Use this to completely opt-out of automatic scrolling and handle it manually.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Scroll components into view&lt;/h2&gt;
&lt;p&gt;You can trigger the QF-Test scrolling algorithm manually in an SUT script like this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getComponent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;myElement&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// replace with a component&amp;#39;s QF-Test ID&lt;/span&gt;
&lt;span class="c1"&gt;// Boolean scrollPointVisible(int targetX, int targetY, boolean propagate)&lt;/span&gt;
&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scrollPointVisible&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This will try to scroll the element so that it becomes visible. If the element cannot be made completely visible, it will scroll it so that at least the requested target point becomes visible.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;If the QF-Test algorithm is not helpful in your situation, maybe because you want to trigger a scroll action by itself, you can use a small SUT script which calls any JavaScript scrolling function like this: &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getComponent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;myElement&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// replace with a component&amp;#39;s QF-Test ID&lt;/span&gt;
&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;evalJS&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;_qf_node.scrollIntoView()&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// arbitrary JavaScript&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Scroll by set amounts&lt;/h2&gt;
&lt;p&gt;But what if you need even more control over the scrolling or don&amp;#8217;t have a particular component you want to scroll to?&lt;/p&gt;
&lt;p&gt;You can also any scroll container by a precise amount using JavaScript.&lt;/p&gt;
&lt;p&gt;For example, this SUT script would scroll the window down by 25 pixels:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getComponent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;genericDocument&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;evalJS&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;window.scrollBy(0,25)&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The first parameter of &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollBy"&gt;the &lt;code&gt;scrollBy&lt;/code&gt; method&lt;/a&gt; controls the x-axis, so you can even scroll sideways using this method.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;And that&amp;#8217;s it. That was all you need to know about scrolling web content with QF-Test to get you out of even the trickiest situations.&lt;/p&gt;
&lt;p&gt;If you are still stuck, you can &lt;a href="https://services.qftest.com/en/support/request/"&gt;get in touch with our support team&lt;/a&gt;, who are always happy to help!&lt;/p&gt;</content><category term="blog"/><category term="how-to"/></entry><entry><title>Beyond Strings – How To Effectively Use Object Variables In QF-Test 9</title><link href="https://www.qftest.com/en/support/videos/beyond-strings-object-variables.html" rel="alternate"/><published>2025-07-15T00:00:00+02:00</published><updated>2025-07-15T00:00:00+02:00</updated><author><name>Pascal Bihler</name></author><id>tag:www.qftest.com,2025-07-15:/en/support/videos/beyond-strings-object-variables.html</id><summary type="html">&lt;p&gt;In this webinar, we will do a technical deep dive into the new &amp;#8220;object variables&amp;#8221; concept in QF-Test 9.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://gitlab.com/qfs/webinars/-/tree/main/objectvariables?ref_type=heads"&gt;Slides and Materials&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Contents&lt;/h2&gt;
&lt;p&gt;00:00 Intro&lt;br /&gt;
02:08 Until QF-Test 8: All variables are Strings&lt;br /&gt;
02:50 Automatic Conversion&lt;br /&gt;
6:22 Since QF-Test 9: Variables store original object&lt;br /&gt;
12:32 Representation in run log and protocol&lt;br /&gt;
16:48 Replacement of variable values (expand)&lt;br /&gt;
19:08 Simplified access in scripts&lt;br /&gt;
22:31 Default values&lt;br /&gt;
31:10 Return value in procedures&lt;br /&gt;
31:33 Conversion if required&lt;br /&gt;
47:16 Additional information&lt;br /&gt;
51:30 Usage example: Configuration&lt;br /&gt;
56:40 Usage example: Process Parameters  &lt;/p&gt;
&lt;h2&gt;Code examples and summaries&lt;/h2&gt;
&lt;h3&gt;Until QF-Test 8: All variables are Strings&lt;/h3&gt;
&lt;p&gt;Simple Assignment: Name (String) -&amp;gt; Value (String)&lt;/p&gt;
&lt;h3&gt;Automatic Conversion&lt;/h3&gt;
&lt;p&gt;Write:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setGlobal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Numbervalue&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// -&amp;gt; Converts into the String &amp;quot;23&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setLocal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Booleanvalue&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// -&amp;gt; Converts into the &amp;quot;true&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Object&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// -&amp;gt; Converts into the String &amp;quot;java.lang.Object@29f364c&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Read:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getStr&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// -&amp;gt; returns directly the variable value&lt;/span&gt;
&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBool&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// -&amp;gt; Value in (&amp;quot;1&amp;quot;,&amp;quot;y&amp;quot;,&amp;quot;yes&amp;quot;,&amp;quot;true&amp;quot;,&amp;quot;True&amp;quot;,…) ?&lt;/span&gt;
&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// -&amp;gt; Integer.valueOf(Value) / new BigInteger(Value)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Since QF-Test 9: Variables store original object&lt;/h3&gt;
&lt;p&gt;New Assignment: Name (String) -&amp;gt; VariableData&lt;/p&gt;
&lt;p&gt;With:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Value (any Object): &lt;code&gt;.getObject()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;String value (String): &lt;code&gt;.toString()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Description (String): &lt;code&gt;.getDescription()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No change &amp;#8220;from the outside&amp;#8221; during access:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Like before: &lt;code&gt;$(name)&lt;/code&gt; and &lt;code&gt;${group:name}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Like before: &lt;code&gt;rc.getStr(…)&lt;/code&gt;, &lt;code&gt;rc.getInt(…)&lt;/code&gt;, &lt;code&gt;rc.getBool(…)&lt;/code&gt;, …&lt;/li&gt;
&lt;li&gt;New: &lt;code&gt;rc.getObj(name)&lt;/code&gt; and &lt;code&gt;rc.getObj(group, name)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Representation in run log and protocol&lt;/h3&gt;
&lt;p&gt;Replacement of variable values (expand)&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setLocal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ext&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;TXT&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setLocal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;filename&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;qftest.$(ext)&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getStr&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;filename&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;expand:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// -&amp;gt; &amp;#39;qftest.TXT&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getStr&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;filename&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;expand:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// -&amp;gt; &amp;#39;qftest.$(ext)&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getStr&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;filename&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// ?&lt;/span&gt;
&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getStr&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;filename&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;expand:&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// -&amp;gt; &amp;#39;qftest.TXT&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setLocal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;regexp&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Pattern&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;compile&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;abc$(ext)&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getStr&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;regexp&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;expand:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// -&amp;gt; &amp;#39;abcTXT&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getStr&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;regexp&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;expand:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// -&amp;gt; &amp;#39;abc$(ext)&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getStr&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;regexp&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// -&amp;gt; &amp;#39;abc$(ext)&amp;#39; – new!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Simplified access in scripts&lt;/h3&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;obj1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getObj&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;varname&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setLocal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;answer&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;obj2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getObj&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;groupname&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;propname&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getObj&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;qftest&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;suite.dir&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;xxx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getObj&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;decrypt&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;C2094F52F62C0D7953E0CEFF81E269A7&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;newGroup&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;newName&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;newValue&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;obj1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;vars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;varname&lt;/span&gt;
&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;vars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;answer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;
&lt;span class="n"&gt;obj2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;groupname&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;propname&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;groupname&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;propname&lt;/span&gt;
&lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;qftest&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;suite.dir&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;qftest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;suite&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dir&lt;/span&gt;
&lt;span class="n"&gt;xxx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;decrypt&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;C2094F52F62C0D7953E0CEFF81E269A7&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newGroup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;newValue&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Default values&lt;/h3&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;dflt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getObj&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;default&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;unknown:Standardvalue&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;dflt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;unknown:Standardvalue&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;dflt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withDefault&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Standardvalue&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;vars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;unknown&lt;/span&gt;
&lt;span class="n"&gt;gd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withDefault&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Standardvalue&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;unknowngrp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;unknownprop&lt;/span&gt;
&lt;span class="n"&gt;dflt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withDefault&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Standardvalue&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getObj&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;unknown&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;gd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withDefault&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Standardvalue&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getObj&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;unknowngrp&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;unknownprop&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Return value in procedures&lt;/h3&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ReturnException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;NeuerValue&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;returnValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;NeuerValue&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;returnValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myObject&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;qf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;wrapObject&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myObject&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;qf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;wrapObject&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myObject&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;String value&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Description&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;returnValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Conversion if required&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Replacements in combinations: -&amp;gt; String
    &amp;ndash; &lt;code&gt;"Today I turn $(age)."&lt;/code&gt;
    &amp;ndash; &lt;code&gt;"${qftest:suite.dir}/test.png"&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Complete replacement -&amp;gt; Object type is preserved!
    &amp;ndash; &lt;code&gt;"$(data)"&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Still automatic:
    &amp;ndash; &lt;code&gt;rc.getInt(…)&lt;/code&gt;, &lt;code&gt;rc.getNum(…)&lt;/code&gt;, &lt;code&gt;rc.getStr(…)&lt;/code&gt;, &lt;code&gt;rc.getBool(…)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Explicitely with the special group &amp;#8220;as&amp;#8221;:
    &amp;ndash; String expansion: &lt;code&gt;${as:int:23}&lt;/code&gt;, &lt;code&gt;${as:bool:$(is_available)}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getObj&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;as&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;int:23&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getObj&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;as&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bool:$(is_available)&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Valid types:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;str, bool, number, object, pattern, int, long, float, double, cmdline, json&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Variable exchange QF-Test &amp;lt;-&amp;gt; SUT&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;QF-Test and the application under test run in different processes&lt;/li&gt;
&lt;li&gt;Data exchange via (Java Remote Method Invocation)&lt;/li&gt;
&lt;li&gt;Also objects in variables&lt;/li&gt;
&lt;li&gt;Must be &lt;code&gt;Serializable&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The class definition has to be available in both processes&lt;/li&gt;
&lt;li&gt;Works for example with standard classes:
    &amp;ndash; String, Wrappers (Integer, Boolean, &amp;#8230;), Pattern, Date
    &amp;ndash; ArrayLists, HashSets (depending in the contents)&lt;/li&gt;
&lt;li&gt;Falls back on the &amp;#8220;String value&amp;#8221; in the other process&lt;/li&gt;
&lt;li&gt;In the original process still available as Object (+String)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Additional information&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Decrypted flag
    &amp;ndash; Is set automatically if &lt;code&gt;${decrypt:…}&lt;/code&gt; is expanded.
    &amp;ndash; The &amp;#8220;description&amp;#8221; of the value (e.g. in the run log) is always &lt;code&gt;***&lt;/code&gt;
    &amp;ndash; &lt;code&gt;rc.logMessage(rc.getStr("secret"))&lt;/code&gt; still logs the real value!
    &amp;ndash; Is &amp;#8220;inherited&amp;#8221; during expansion.&lt;/li&gt;
&lt;li&gt;AutoExpandable flag
    &amp;ndash; Avoids replacing variables in Strings &amp;#8220;by incident&amp;#8221;
    &amp;ndash; E.g. in the return value of &lt;code&gt;qfs.utils.readTextFromFile&lt;/code&gt;
    &amp;ndash; &lt;code&gt;rc.returnValue(text, autoExpandable:false)&lt;/code&gt;
    &amp;ndash; &lt;code&gt;wrapped = qf.wrapObject(text); wrapped.setAutoExpandable(false)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Rerun from run log
    &amp;ndash; Only available for certain (simple) objects&lt;/li&gt;
&lt;/ul&gt;</content><category term="videos"/><category term="specialwebinars"/></entry><entry><title>Quality First Software GmbH at the job event on July 11, 2025 – foosball, interviews, and career opportunities</title><link href="https://www.qftest.com/en/company/news/company-events/job-event-geretsried.html" rel="alternate"/><published>2025-07-14T00:00:00+02:00</published><updated>2025-07-14T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-07-14:/en/company/news/company-events/job-event-geretsried.html</id><summary type="html">&lt;p&gt;Did you miss the event? No problem—we are always happy to receive applications and exciting contacts!&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="/unternehmen/jobs.html"&gt;&lt;img alt="QFS at Job-Event in Geretsried" src="/companynews/resources/qfs-job-event-geretsried.JPG" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Are you looking for an internship, a working student position or a partner for your future dual study program (Bachelor of Science in Computer Science)?  Then visit us on July 11, 2025 in Geretsried&lt;/p&gt;
&lt;p&gt;Come along and challenge us &amp;ndash; foosball with the team of QF-Test is not just about winning, but above all about fun and good conversation! Take the opportunity to get to know us in a relaxed atmosphere, ask questions and find out more about QF-Test and our working environment. We look forward to exchanging ideas with you &amp;ndash; at the table and beyond!&lt;/p&gt;</content><category term="companynews"/></entry><entry><title>Fancy a match at the QFS foosball table?</title><link href="https://www.qftest.com/en/company/news/company-events/fancy-a-match-at-the-qfs-foosball-table.html" rel="alternate"/><published>2025-07-11T00:00:00+02:00</published><updated>2025-07-11T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-07-11:/en/company/news/company-events/fancy-a-match-at-the-qfs-foosball-table.html</id><summary type="html">&lt;p&gt;Are you looking for an internship, a working student position or a partner for your future dual study program (Bachelor of Science in Computer Science)?  Then visit us on July 11, 2025 in Geretsried&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://www.neuorientierung0812.de/"&gt;&lt;img alt="Job-Event Geretsried" src="/companynews/resources/Banner_Job-Event_Geretsried_250x200px.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Are you looking for an internship, a working student position or a partner for your future dual study program (Bachelor of Science in Computer Science)?  Then visit us on July 11, 2025 in Geretsried&lt;/p&gt;
&lt;p&gt;Come along and challenge us &amp;ndash; foosball with the team of QF-Test is not just about winning, but above all about fun and good conversation! Take the opportunity to get to know us in a relaxed atmosphere, ask questions and find out more about QF-Test and our working environment. We look forward to exchanging ideas with you &amp;ndash; at the table and beyond!&lt;/p&gt;</content><category term="companynews"/></entry><entry><title>What are the benefits of the new edition model?</title><link href="https://www.qftest.com/en/product/faq/what-are-the-benefits-of-qf-test-editions.html" rel="alternate"/><published>2025-07-01T00:00:00+02:00</published><updated>2025-07-01T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-07-01:/en/product/faq/what-are-the-benefits-of-qf-test-editions.html</id><summary type="html">&lt;p&gt;The new edition model makes QF-Test more intuitive to use, clearly structured, and optimally adapted to individual requirements.&lt;/p&gt;</summary><content type="html">&lt;p&gt;QF-Test is a product with a wide range of features for testing various UI technologies. &lt;/p&gt;
&lt;p&gt;With the introduction of &lt;a href="/en/product/pricing.html"&gt;editions&lt;/a&gt;, features are now focused on three core areas: Desktop, Web, and Mobile. This makes using QF-Test more &lt;strong&gt;simple, clear, and tailored&lt;/strong&gt; to specific needs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;QF-Test Pro&lt;/strong&gt; is as an edition that continues to provide the &lt;strong&gt;full range of functionality&lt;/strong&gt;. It combines all technologies and additionally supports hybrid applications.&lt;/p&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="https://services.qftest.com/en/download/"  class="button scroll-animated green chevron"&gt;Download QF-Test&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;</content><category term="faqs"/><category term="faqeditions"/></entry><entry><title>Object variables – free special webinar on July 14, 2025</title><link href="https://www.qftest.com/en/company/news/object-variables-free-special-webinar-on-july-14-2025.html" rel="alternate"/><published>2025-06-25T00:00:00+02:00</published><updated>2025-06-25T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-06-25:/en/company/news/object-variables-free-special-webinar-on-july-14-2025.html</id><summary type="html">&lt;p&gt;We are pleased to invite you to our next free special webinar&lt;/p&gt;</summary><content type="html">&lt;p&gt;We are pleased to invite you to our next free special webinar:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;#8220;Beyond Strings &amp;ndash; how to effectively use object variables in QF-Test 9&amp;#8221;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Monday, July 14, 2025, 3:30 PM – 4:30 PM CEST&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Until now all QF-Test variables contained only strings &amp;ndash; if you wanted to store e.g. numbers, they were always converted back and forth.&lt;/p&gt;
&lt;p&gt;As of QF-Test 9 any objects can be stored in QF-Test variables. In this special webinar we show, how object variables can be used profitably in your tests.&lt;/p&gt;
&lt;p&gt;Sign up now!&lt;/p&gt;</content><category term="news"/></entry><entry><title>QF-Test 9.0.4 available</title><link href="https://www.qftest.com/en/company/news/qf-test-9-0-4-available.html" rel="alternate"/><published>2025-06-11T00:00:00+02:00</published><updated>2025-06-11T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-06-11:/en/company/news/qf-test-9-0-4-available.html</id><content type="html">&lt;p&gt;This maintenance release adds support for Java 25 as well as for Eclipse / SWT 4.36 alias &amp;#8220;2025-06&amp;#8221; and fixes a number of bugs.&lt;/p&gt;</content><category term="news"/></entry><entry><title>QF-Test 9.0.4 &amp; QF-Test Special webinar on object variables</title><link href="https://www.qftest.com/en/company/news/newsletters/2025-06-qftest-904-webinar-objectvariables.html" rel="alternate"/><published>2025-06-11T00:00:00+02:00</published><updated>2025-06-11T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-06-11:/en/company/news/newsletters/2025-06-qftest-904-webinar-objectvariables.html</id><summary type="html">&lt;p&gt;Training Dates 2025, News and Blogs, Video of special webinar on Web Accessibility&lt;/p&gt;</summary><content type="html">&lt;h2&gt;QF-Test 9.0.4 available, special webinar about object variables&lt;/h2&gt;
&lt;p&gt;Hello dear QF-Test users!&lt;/p&gt;
&lt;p&gt;Today&amp;#8217;s maintenance release QF-Test 9.0.4 adds support for Java 25 as well as for Eclipse / SWT 4.36 alias &amp;#8220;2025-06&amp;#8221; and fixes a number of bugs.&lt;/p&gt;
&lt;p&gt;We also cordially invite you to our &lt;strong&gt;free special webinar on July 14, 2025&lt;/strong&gt; at 3:30 PM. The focus will be on the topic of &lt;a href="/en/support/training-consulting/webinars.html"&gt;object variables&lt;/a&gt;, which has opened up completely new possibilities beyond strings since QF-Test 9. We look forward to your participation!&lt;/p&gt;
&lt;p&gt;In this newsletter, you’ll also find upcoming training dates, hands-on blog articles, and helpful QF-Test videos.&lt;/p&gt;
&lt;p&gt;Best wishes,&lt;br /&gt;
 your QFS team&lt;/p&gt;
&lt;h2&gt;QF-Test Version 9.0.4&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://services.qftest.com/en/download/"&gt;&lt;img alt="QF-Test Download" src="/newsletters/resources/2025-03_Download-Button-Pfeil-gruen-Schachtel-dunkelblau.png" title="QF-Test Download" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download &lt;a href="https://services.qftest.com/en/download/"&gt;QF-Test version 9.0.4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;See the new features of QF-Test 9 in our release video &lt;a href="https://services.qftest.com/en/download/"&gt;Automatically test the accessibility of your web application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;To the &lt;a href="https://www.qftest.com/doc/manual/en/history.html"&gt;Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Save the date: Events in 2025&lt;/h2&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/webinars.html#c34103"&gt;&lt;img alt="" src="/newsletters/resources/Spezialwebinar-objectvariables.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Special Webinar&lt;/strong&gt;&lt;br /&gt;
&lt;a href="/en/support/training-consulting/webinars.html#c34103"&gt;Beyond Strings &amp;ndash; how to effectively use object variables in QF-Test 9&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;July 14, 2025, 3:30 PM (CEST)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Until now all QF-Test variables contained only strings &amp;ndash; if you wanted to store e.g. numbers, they were always converted back and forth. As of QF-Test 9 any objects can be stored in QF-Test variables. In this special webinar we show, how object variables can be used profitably in your tests.&lt;/p&gt;
&lt;p&gt;➜ &lt;a href="/en/support/training-consulting/webinars.html#c34103"&gt;Sign up for free&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/support/schulung-beratung/webinare.html"&gt;Special webinar in German&lt;/a&gt; at 10:30 a.m.&lt;/p&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/training.html"&gt;&lt;img alt="Online Training QF-Test" src="/newsletters/resources/OnlineSchulung-Monitor-Hut-dunkelblau-HGblau.png" title="Online Training QF-Test" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;QF-Test Basics: Training via Webinar&lt;/strong&gt;&lt;br /&gt;
&lt;a href="/en/support/training-consulting/training.html#a30295-659e55fa94d68760261203"&gt;September 29 – October 2, 2025, German&lt;/a&gt;&lt;br /&gt;
&lt;a href="/en/support/training-consulting/training.html#a30295-6613a7774f6b6588956332"&gt;November 10&lt;/a&gt;&lt;a href="/en/support/training-consulting/training.html#a30295-659e55fa94d68760261203"&gt;–&lt;/a&gt; &lt;a href="/en/support/training-consulting/training.html#a30295-6613a7774f6b6588956332"&gt;13, 2025, English&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;4 days, 2 × 2,5 hours each&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Effective and rapid knowledge transfer in small groups up to a maximum of 8 participants&lt;/li&gt;
&lt;li&gt;Interaction with the trainers and asking questions are possible at any time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;➜ &lt;a href="https://services.qftest.com/en/support/contact/"&gt;Sign up now&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Would you like a &lt;a href="/en/support/training-consulting/training.html#c30865"&gt;training course&lt;/a&gt; which is individually tailored to your company? Just send us an email to &lt;a href="https://services.qftest.com/en/support/contact/"&gt;service@qftest.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://summit-community.de/2023/05/31/cvent-session/?title=Erfolg%20in%20der%20E2E-Testautomatisierung:%20Wichtige%20Lektionen%20aus%20einem%20Jahrzehnt&amp;amp;eventId=cd3d638b-d143-4298-b414-a94dac89b234&amp;amp;sessionId=2a3548cb-288f-47dc-96e4-8b3df41c5002"&gt;&lt;img alt="" src="/newsletters/resources/Tacon_01.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Talk at TACON 2025: Erfolg in der E2E-Testautomatisierung&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;September 23–24, 2025, Leipzig, Germany&lt;/strong&gt;&lt;br /&gt;
 Lilia Gargouri, Head of Quality Assurance at mgm technology partners, gives a talk about how to increase the maintainability and stability of their tests through modular test architectures and effective test data management. Participants learn how to minimize volatile tests and apply robust test design principles.&lt;/p&gt;
&lt;p&gt;➜ &lt;a href="https://summit-community.de/2023/05/31/cvent-session/?title=Erfolg%20in%20der%20E2E-Testautomatisierung:%20Wichtige%20Lektionen%20aus%20einem%20Jahrzehnt&amp;amp;eventId=cd3d638b-d143-4298-b414-a94dac89b234&amp;amp;sessionId=2a3548cb-288f-47dc-96e4-8b3df41c5002"&gt;To Tacon&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://insights.mgm-tp.com/en/2025/quality-assurance/experience-q12-tmt-live-conferences-events-and-webinars-2025/"&gt;&lt;img alt="Q12 Test Management Tool Screenshot" src="/newsletters/resources/TMT-Screenshot.png" title="Q12 Test Management Tool Screenshot" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q12-TMT Test Management Tool&lt;/strong&gt;&lt;br /&gt;
 Our parent company mgm technology partners will be represented with Q12-TMT at international and German conferences, events and webinars. As a professional tool for structured test case creation, planning, execution, documentation and reporting, TMT may also be of interest to you as a supplement to QF-Test.&lt;/p&gt;
&lt;p&gt;➜ &lt;a href="https://insights.mgm-tp.com/en/2025/quality-assurance/experience-q12-tmt-live-conferences-events-and-webinars-2025/"&gt;To testing events with mgm in 2025&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;News&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Maximizing SUT windows – a good idea?&lt;/strong&gt; Scale windows in QF-Test rather than maximize them &amp;ndash; this ensures stable and reproducible tests. If you still need full-screen mode, you can maximize windows with a small script.&lt;br /&gt;
   ➜ &lt;a href="/en/blog/article/maximizing-windows.html"&gt;Go to the blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How can I create screenshots of my client application with QF-Test?&lt;/strong&gt; Screenshots from QF-Test can be saved easily with a simple script. This allows screen recordings to be used specifically for further analysis or documentation purposes &amp;ndash; without any detour via the run log.&lt;br /&gt;
   ➜ &lt;a href="/en/blog/article/creating-screenshot-files.html"&gt;Go to the blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What QA engineers say about QF‑Test&lt;/strong&gt;– &amp;#8220;I&amp;#8217;ve been automating with QF-Test again for almost 5 months now and it&amp;#8217;s a lot of fun. QF-Test is a miracle bag, practically everything can be implemented, stability and performance are unsurpassed. I love it! :-)&amp;#8221;&lt;br /&gt;
   Thank you Walter Hodel, Senior Test Automation Engineer, Product Quality, Xebia Switzerland AG. We love your feedback!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;From our YouTube Channel&lt;/h2&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/webinars.html#c21743"&gt;&lt;img alt="" src="/newsletters/resources/accessibility_testing_special_webinar_video.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Special webinar video&lt;/strong&gt;&lt;br /&gt;
&lt;a href="/en/support/training-consulting/webinars.html#c21743"&gt;Web Accessibility Testing with QF-Test&lt;/a&gt;&lt;br /&gt;
 In this webinar recording we give an introduction to web accessibility and present the new accessibility testing features of QF-Test.&lt;br /&gt;
 ➜ &lt;a href="/en/support/training-consulting/webinars.html#c21743"&gt;Watch the video now&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Visit our &lt;a href="https://www.youtube.com/channel/UCo6yiK49wlGY1Busavn0LZw"&gt;YouTube channel&lt;/a&gt; to subscribe and follow us on &lt;a href="https://www.linkedin.com/company/quality-first-software-gmbh-qfs/"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;</content><category term="newsletters"/></entry><entry><title>Maximizing SUT windows – a good idea?</title><link href="https://www.qftest.com/en/blog/article/maximizing-windows.html" rel="alternate"/><published>2025-06-03T00:00:00+02:00</published><updated>2025-06-03T00:00:00+02:00</updated><author><name>Max Melzer</name></author><id>tag:www.qftest.com,2025-06-03:/en/blog/article/maximizing-windows.html</id><summary type="html">&lt;p&gt;Scale windows in QF-Test rather than maximize them &amp;ndash; this ensures stable and reproducible tests. If you still need full-screen mode, you can maximize windows with a small script.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="" src="/blog/resources/maximize-window.png" /&gt;&lt;/p&gt;
&lt;p&gt;In QF-Test product support we are often asked how to set a QF-Test controlled browser or other SUT windows to fullscreen mode.&lt;/p&gt;
&lt;h2&gt;It&amp;#8217;s better to work with fixed window sizes&lt;/h2&gt;
&lt;p&gt;In fact, we advise against maximizing windows for the following reason: The maximized window size depends on the system, a fixed window size is the same on every system instead.&lt;/p&gt;
&lt;p&gt;QF-Test is comparatively resistant to changes in component coordinates. However, web applications in particular can display completely different page layouts depending on the window size. In the worst case, this can lead to individual components no longer being found.&lt;/p&gt;
&lt;p&gt;If the browser is always started with a fixed window size instead, the test behaves uniformly on all computers.&lt;/p&gt;
&lt;p&gt;In the preparation sequence that opens the browser, you will find an &amp;#8220;Open browser window&amp;#8221; node below the &amp;#8220;Start SUT if necessary&amp;#8221; node, in which you can specify a uniform window size.&lt;/p&gt;
&lt;h2&gt;How to use fullscreen anyway&lt;/h2&gt;
&lt;p&gt;If you &lt;em&gt;still&lt;/em&gt; want to maximize your browser window, you can use the following Jython server script in QF-Test to maximize all windows containing e.g. &amp;#8220;Edge&amp;#8221; in the window title under Windows:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;autowin&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;re&lt;/span&gt;

&lt;span class="n"&gt;windows&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;autowin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getAllWindows&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;win&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;windows&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;autowin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getWindowText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;win&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.*Edge.*&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;autowin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;maximizeWindow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;win&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You can customize the regular expression &lt;code&gt;".*Edge.*"&lt;/code&gt; to address exactly the window you are interested in with its window title.&lt;/p&gt;</content><category term="blog"/><category term="how-to"/></entry><entry><title>Do existing customers need to take action to switch to the new editions?</title><link href="https://www.qftest.com/en/product/faq/switch-to-qf-test-editions-for-customers.html" rel="alternate"/><published>2025-06-01T00:00:00+02:00</published><updated>2025-06-01T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-06-01:/en/product/faq/switch-to-qf-test-editions-for-customers.html</id><summary type="html">&lt;p&gt;Existing customers do not need to take any action.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Existing licenses, maintenance, or subscription contracts remain fully valid. Existing customers can continue to use &lt;strong&gt;QF-Test Pro&lt;/strong&gt; as usual within the scope of their current licenses.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For an optimized user experience, simply use the edition that suits you best:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;QF-Test Web&lt;/strong&gt; for web browsers, accessibility, Electron applications, API and web service testing  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QF-Test Desktop&lt;/strong&gt; for Java and native Windows applications  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QF-Test Mobile&lt;/strong&gt; for Android and iOS apps  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QF-Test Pro&lt;/strong&gt; combines all technologies and additionally supports hybrid applications.  &lt;/li&gt;
&lt;/ol&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="https://services.qftest.com/en/download/"  class="button scroll-animated green chevron"&gt;Download QF-Test&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;If you have any questions or customization requests, our service team will be happy to assist you.&lt;/p&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="https://services.qftest.com/en/support/contact/?type=editions"  class="button scroll-animated green chevron"&gt;Contact Our Service Team&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;</content><category term="faqs"/><category term="faqeditions"/></entry><entry><title>How can I create screenshots of my client application with QF-Test?</title><link href="https://www.qftest.com/en/blog/article/creating-screenshot-files.html" rel="alternate"/><published>2025-05-20T00:00:00+02:00</published><updated>2025-05-20T00:00:00+02:00</updated><author><name>Max Melzer</name></author><id>tag:www.qftest.com,2025-05-20:/en/blog/article/creating-screenshot-files.html</id><summary type="html">&lt;p&gt;Screenshots from QF-Test can be saved easily with a simple script. This allows screen recordings to be used specifically for further analysis or documentation purposes &amp;ndash; without any detour via the run log.&lt;/p&gt;</summary><content type="html">&lt;p&gt;QF-Test only provides on-board means to write screenshots of a client application to the test-run log. This can be done via the &amp;#8220;Message&amp;#8221; node or the procedure &lt;code&gt;qfs.run-log.screenshots.logScreenshot&lt;/code&gt; from the qfs.qft standard library.&lt;/p&gt;
&lt;h2&gt;Save screenshots to a file&lt;/h2&gt;
&lt;p&gt;Sometimes you don&amp;#8217;t want to store a screenshot in the test-run log but use it for other things and store it in a directory first. This is of course also possible with QF-Test, but it requires a script &amp;ndash; but just a very small one:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;imagewrapper&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ImageWrapper&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;java.io&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;
&lt;span class="n"&gt;screenshot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ImageWrapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grabImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;#Window:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;screenshot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;writeToFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;qftest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;suite&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/screenshot.png&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;img alt="" src="/blog/resources/screenshot-qftest-com-en.png" /&gt;&lt;/p&gt;
&lt;p&gt;This Jython SUT script uses the exact same mechanism to create screenshots that is used for the test run log.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;rc.groups.qftest.suite.dir&lt;/code&gt; is a useful shortcut to get the directory of the current test suite. You can of course also call &lt;code&gt;writeToFile()&lt;/code&gt; with any other path. &lt;code&gt;"#Window:"&lt;/code&gt; is a &lt;a href="https://www.qftest.com/doc/manual/de/user_smartid.html"&gt;SmartID&lt;/a&gt; and stands for the first window of your application. You can also specify a more specific component here to take a screenshot of a specific part of the application UI.&lt;/p&gt;
&lt;p&gt;You can read more about the &lt;code&gt;ImageWrapper&lt;/code&gt; class in the QF-Test manual: &lt;a href="https://www.qftest.com/doc/manual/en/tech_scripting.html"&gt;The &lt;code&gt;ImageWrapper&lt;/code&gt; class&lt;/a&gt;.&lt;/p&gt;</content><category term="blog"/><category term="how-to"/></entry><entry><title>Web Accessibility Testing with QF-Test</title><link href="https://www.qftest.com/en/support/videos/web-accessiblity-testing.html" rel="alternate"/><published>2025-05-19T00:00:00+02:00</published><updated>2025-05-19T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-05-19:/en/support/videos/web-accessiblity-testing.html</id><summary type="html">&lt;p&gt;In this webinar, we will give a brief introduction to web accessibility and present the new accessibility testing features of QF-Test.&lt;/p&gt;</summary><content type="html">&lt;p&gt;By June 28, 2025, business websites within the EU must be accessible. But what does accessibility mean in a web context? Who is affected and what do website operators need to be aware of?
And above all: How can QF-Test support you in meeting the legal requirements?&lt;/p&gt;
&lt;p&gt;In this webinar, we will give a brief introduction to web accessibility and present the new accessibility testing features of QF-Test.&lt;/p&gt;
&lt;p&gt;Material: &lt;a href="https://gitlab.com/qfs/webinars/-/raw/9e862192ad9c7f5264839163dcd18b402c6db61c/a11y_qf-test_specialwebinar_handout-en.pdf?inline=false"&gt;Presentation &amp;#8220;Accessibility testing&amp;#8221;&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Abridged Transcript&lt;/h2&gt;
&lt;p&gt;Welcome to this special webinar about accessibility testing with QF-Test. My name is Daniel Rieth, a junior software developer at Quality First Software, and my co-moderator, Sofya Leventhal – a fellow software developer – will be keeping an eye on the chat during this event. We are both involved in the accessibility testing project at Quality First Software. Today, I will present the accessibility testing features we’ve implemented.&lt;/p&gt;
&lt;h3&gt;Agenda&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Basics of accessibility and accessibility laws&lt;/li&gt;
&lt;li&gt;Overview of QF-Test and its accessibility testing features&lt;/li&gt;
&lt;li&gt;Live demo of accessibility testing&lt;/li&gt;
&lt;li&gt;Notes and frequently asked questions&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;What Is Accessibility?&lt;/h3&gt;
&lt;p&gt;Accessibility is about removing barriers for people with disabilities. Originally discussed in contexts such as public transportation, the focus has shifted to the digital world as more of our activities move online.&lt;/p&gt;
&lt;h4&gt;Web Accessibility&lt;/h4&gt;
&lt;p&gt;The W3C (World Wide Web Consortium) defines web accessibility as ensuring that, despite a disability, everyone can perceive, understand, navigate, and interact with the web. There are multiple kinds of disabilities that can affect web interactions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Visual disabilities&lt;/strong&gt;: Includes color blindness, low vision, and blindness. Screen readers (integrated into iOS, Windows, Android, or available as third-party programs like Jaws and NVDA) help users interact with digital content.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hearing disabilities&lt;/strong&gt;: Users who are hard of hearing or deaf may require subtitles or sign language interpretation for multimedia.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cognitive disabilities&lt;/strong&gt;: Poor content structure or unintuitive controls can hinder understanding and navigation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Physical disabilities&lt;/strong&gt;: Issues with control movements (e.g., drag-and-drop, pinch-to-zoom) may require simplified interactions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is essential for developers to offer text alternatives for graphics and images, provide accessible multimedia content, and ensure that controls are easy to use.&lt;/p&gt;
&lt;h3&gt;Why Make Websites Accessible?&lt;/h3&gt;
&lt;p&gt;There are several motivations, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Humanistic&lt;/strong&gt;: Enabling everyone to participate fully.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Economic&lt;/strong&gt;: Increasing your reach and customer base.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User experience&lt;/strong&gt;: Accessible websites tend to be more user-friendly and better structured.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Legal compliance&lt;/strong&gt;: In Europe (and other regions), laws require websites to be accessible to avoid penalties.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Accessibility Laws and Regulations&lt;/h3&gt;
&lt;h4&gt;European Accessibility Act (EAA)&lt;/h4&gt;
&lt;p&gt;The EAA implements the resolutions of the UN Convention on the Rights of Persons with Disabilities. It mandates that products and services (including online and digital offerings) be accessible. As an EU directive, it is transposed into national laws. For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;German implementation – BFSG&lt;/strong&gt;: A law to strengthen accessibility that goes into effect at the end of June. It affects most B2C websites and digital communication tools. Similar laws or guidelines exist in other regions, like the American with Disabilities Act (ADA) in the United States, though the specific requirements may vary.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Web Content Accessibility Guidelines (WCAG)&lt;/h4&gt;
&lt;p&gt;WCAG provides a set of guidelines to make web content accessible. They are structured around four principles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Perceivable&lt;/strong&gt;: Content must be presentable to users in ways they can perceive.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operable&lt;/strong&gt;: User interface components and navigation must be operable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Understandable&lt;/strong&gt;: Information and operation of the user interface must be understandable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Robust&lt;/strong&gt;: Content must be robust enough to be interpreted reliably by various user agents, including assistive technologies.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each guideline also comes with levels of conformance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Level A&lt;/strong&gt;: Minimum accessibility features; without these, some users may find the site unusable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level AA&lt;/strong&gt;: Addresses the biggest and most common barriers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level AAA&lt;/strong&gt;: The highest level, exceeding legal requirements.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Overview of QF-Test&lt;/h3&gt;
&lt;p&gt;QF-Test provides an automated UI testing solution with multiple ways to simulate user interactions, record sessions, and run extensive test suites. It supports different technologies with a special focus on web applications.&lt;/p&gt;
&lt;h4&gt;Accessibility Testing Features&lt;/h4&gt;
&lt;p&gt;To test accessibility using QF-Test, there are two primary approaches:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Integration with an existing accessibility library&lt;/strong&gt;: We integrated the open-source library &lt;em&gt;axe core&lt;/em&gt;, which is developed by experts in web content accessibility guidelines. We enhanced its logging and reporting capabilities to make its results more user-friendly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QF-Test’s native accessibility checks&lt;/strong&gt;: We implemented additional procedures for testing aspects like color contrast for graphics—not just text. This allows us to check images (JPEG, PNG, SVG) for proper contrast and verify that alternative texts are provided.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;QF-Test version 9.0 (or higher) is required to use these features. You can try these features with a free trial license before committing to a full purchase.&lt;/p&gt;
&lt;h3&gt;Live Demo Walkthrough&lt;/h3&gt;
&lt;h4&gt;Starting with the Quick Start Wizard&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Click the wand icon in QF-Test to open the Quick Start Wizard.&lt;/li&gt;
&lt;li&gt;Select the accessibility testing module.&lt;/li&gt;
&lt;li&gt;Define the URL of the website to test (in our demo, we use a demo website intentionally filled with accessibility errors).&lt;/li&gt;
&lt;li&gt;Choose which accessibility tests to run—either the comprehensive &lt;em&gt;axe&lt;/em&gt; tests or specific tests like the color contrast check.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Running an Accessibility Test&lt;/h4&gt;
&lt;p&gt;1. &lt;strong&gt;Setup and execution&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;The test setup includes a procedure that checks the entire website (or a defined scope) for errors based on selected rules, such as color contrast checks for text.&lt;/p&gt;
&lt;p&gt;2. &lt;strong&gt;Logging and screenshots&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;During the test run, QF-Test logs details, takes screenshots of problematic elements, and highlights errors (e.g., elements with a red border indicating contrast issues).&lt;/p&gt;
&lt;p&gt;3. &lt;strong&gt;Error details&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;Each error message includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The rule ID (e.g., for color contrast or missing alternative text)&lt;/li&gt;
&lt;li&gt;An impact rating (ranging from critical to minor)&lt;/li&gt;
&lt;li&gt;The faulty element’s identification details (XPath or CSS selector)&lt;/li&gt;
&lt;li&gt;A descriptive error message with tips for remediation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;4. &lt;strong&gt;Remedial actions&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;For example, one error might indicate that light green text on a white background doesn’t meet contrast requirements (minimum 4.5:1 ratio). Changing the text color from light green to black can resolve the error.&lt;/p&gt;
&lt;h4&gt;Reporting&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;QF-Test can generate detailed reports that include screenshots, logs, and all error messages.&lt;/li&gt;
&lt;li&gt;These reports provide a quick overview for developers and non-certified QF-Test users, summarizing successful and failed checks.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Advanced Configuration&lt;/h3&gt;
&lt;p&gt;QF-Test offers extensive configuration options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rule exclusions&lt;/strong&gt;: Skip checks for certain rules if you are confident they are not an issue.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scope definition&lt;/strong&gt;: Limit checks to specific parts of a page using a QF-Test ID or a smart selector.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logging options&lt;/strong&gt;: Customize how many screenshots are taken and how errors are grouped or reported.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, you can configure checks to focus on specific elements (such as icons represented by IMG tags) by defining custom generic classes and adjusting the scope within the test parameters.&lt;/p&gt;
&lt;h3&gt;Presentation Notes and Closing Remarks&lt;/h3&gt;
&lt;p&gt;During the live demo, we observed that even if all automatic tests run successfully, it does not guarantee full accessibility compliance. Some guidelines—such as ensuring meaningful titles or alternative texts—require human judgment. While automation can catch up to roughly 75% of issues, manual review remains essential.&lt;/p&gt;
&lt;p&gt;Future improvements planned for QF-Test include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Additional checks for focus visibility when elements are activated.&lt;/li&gt;
&lt;li&gt;Extending accessibility testing support beyond web applications to desktop software.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Q&amp;amp;A and Final Thoughts&lt;/h3&gt;
&lt;p&gt;Thank you for joining this webinar on accessibility testing with QF-Test. We hope that the demonstration and walkthrough have provided valuable insights into how to implement and benefit from these accessibility features.&lt;/p&gt;
&lt;p&gt;Happy testing, and let’s make the web accessible for everyone!&lt;/p&gt;</content><category term="videos"/><category term="specialwebinars"/></entry><entry><title>QF-Test Special Webinar Web Accessibility</title><link href="https://www.qftest.com/en/company/news/newsletters/2025-05-accessibility-webinar.html" rel="alternate"/><published>2025-05-13T00:00:00+02:00</published><updated>2025-05-13T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-05-13:/en/company/news/newsletters/2025-05-accessibility-webinar.html</id><summary type="html">&lt;p&gt;Training Dates 2025&lt;/p&gt;</summary><content type="html">&lt;h2&gt;QF-Test Special Webinar Web Accessibility&lt;/h2&gt;
&lt;p&gt;Hello dear QF-Test users!&lt;/p&gt;
&lt;p&gt;We would also like to invite you to our next &lt;strong&gt;free special webinar on May 19, 2024&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/webinars.html#c34103"&gt;&lt;img alt="Special Webinar Web Accessibility" src="/newsletters/resources/Spezialwebinar-Accessibility.png" title="Special Webinar Web Accessibility" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/webinars.html#c34103"&gt;Web Accessibility Testing with QF-Test&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;May 19, 2025, 3:30 PM (CEST)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;By June 28, 2025, business websites within the EU must be accessible. But what does accessibility mean in a web context? Who is affected and what do website operators need to be aware of?&lt;br /&gt;
 And above all: How can QF-Test support you in meeting the legal requirements?&lt;/p&gt;
&lt;p&gt;In this webinar, we will give a brief introduction to web accessibility and present the new accessibility testing features of QF-Test.&lt;/p&gt;
&lt;p&gt;➜ &lt;a href="/en/support/training-consulting/webinars.html#c34103"&gt;Sign up for free&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/support/schulung-beratung/webinare.html"&gt;Special webinar in German&lt;/a&gt; at 10:30 a.m.&lt;/p&gt;
&lt;p&gt;We look forward to your participation!&lt;/p&gt;
&lt;p&gt;Best wishes,&lt;br /&gt;
 your QFS team&lt;/p&gt;
&lt;h2&gt;Save the date: Events in 2025&lt;/h2&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/training.html#a30295-654c8d5cec687736087741"&gt;&lt;img alt="QF-Test Expert Day" src="/newsletters/resources/ExpertentagOnlineSchulung-dunkelblau-HGgelb.png" title="QF-Test Expert Day" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Online Expert Day&lt;/strong&gt;&lt;br /&gt;
&lt;a href="/en/support/training-consulting/training.html#a30295-654c8d5cec687736087741"&gt;Toolbox for stable component detection of web applications&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;May 26, 2025, 2 × 2,5 hours, in German&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Following the great success of the previous Expert Days, an English version has now been scheduled. In this online training, we will dive deeply into QF-Test and show you how to optimize the interaction with your web application. With practical exercises on special topics and individual answers to your personal questions, we will ensure that you get the most out of the training. Register now and make your testing processes even more efficient.&lt;/p&gt;
&lt;p&gt;➜ &lt;a href="/en/support/training-consulting/training.html#a30295-654c8d5cec687736087741"&gt;Details, pricing and registration&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/training.html"&gt;&lt;img alt="Online Training QF-Test" src="/newsletters/resources/OnlineSchulung-Monitor-Hut-dunkelblau-HGblau.png" title="Online Training QF-Test" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NEW! QF-Test Basics: Training via Webinar&lt;/strong&gt;&lt;br /&gt;
&lt;a href="/en/support/training-consulting/training.html#a30295-6613a7774f6b6588956332"&gt;June 23 &amp;ndash; 26, 2025, English&lt;/a&gt;&lt;br /&gt;
&lt;a href="/en/support/training-consulting/training.html#a30295-659e55fa94d68760261203"&gt;June 30 &amp;ndash; July 3, 2025, German&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;4 days, 2 × 2,5 hours each&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Effective and rapid knowledge transfer in small groups up to a maximum of 8 participants&lt;/li&gt;
&lt;li&gt;Interaction with the trainers and asking questions are possible at any time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;➜ &lt;a href="https://services.qftest.com/en/support/contact/"&gt;Sign up now&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;#8220;&lt;em&gt;QF-Test is definitively a powerful tool. I think this training will be a game changer in our way to use it and to think our new QF NextGen Framework! Very encouraging. Thank you very much.&lt;/em&gt;&amp;#8221;&lt;/p&gt;
&lt;p&gt;Paul Singuinia, training participant, TotalEnergies One Tech, France&lt;/p&gt;
&lt;p&gt;Would you like a &lt;a href="/en/support/training-consulting/training.html#c30865"&gt;training course&lt;/a&gt; which is individually tailored to your company? Just send us an email to &lt;a href="https://services.qftest.com/en/support/contact/"&gt;service@qftest.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://insights.mgm-tp.com/en/2025/quality-assurance/experience-q12-tmt-live-conferences-events-and-webinars-2025/"&gt;&lt;img alt="Q12 Test Management Tool Screenshot" src="/newsletters/resources/TMT-Screenshot.png" title="Q12 Test Management Tool Screenshot" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q12-TMT Test Management Tool&lt;/strong&gt;&lt;br /&gt;
 Our parent company mgm technology partners will be represented with Q12-TMT at international and German conferences, events and webinars. As a professional tool for structured test case creation, planning, execution, documentation and reporting, TMT may also be of interest to you as a supplement to QF-Test.&lt;/p&gt;
&lt;p&gt;➜ &lt;a href="https://insights.mgm-tp.com/en/2025/quality-assurance/experience-q12-tmt-live-conferences-events-and-webinars-2025/"&gt;To testing events with mgm in 2025&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;From Our YouTube Channel&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Feature video &amp;ndash; Scripting in QF-Test&lt;/strong&gt; &amp;ndash; Scripting in QF-Test allows you to use the common scripting languages Jython, Groovy and JavaScript to extend your tests with arbitrary logic and simplify some complex test automation tasks. This video gives an overview of the basics of using scripts in QF-Test.&lt;br /&gt;
   ➜ &lt;a href="/support/videos.html#a21198-5e9db62370195479837108"&gt;Watch the video now&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feature video &amp;ndash; Intelligent test pre- and post-processing&lt;/strong&gt;: Dependencies can be used to automatically control preconditions and cleanup work for test cases so that they can be executed independently and flexibly &amp;ndash; ideal for retriggering only faulty tests or debugging, for example. This video shows how dependencies work and the benefits of the feature.&lt;br /&gt;
   ➜ &lt;a href="/support/videos.html#a21198-5e9db62970dd7530509510"&gt;Watch the video now&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Visit our &lt;a href="https://www.youtube.com/channel/UCo6yiK49wlGY1Busavn0LZw"&gt;YouTube channel&lt;/a&gt; to subscribe and follow us on &lt;a href="https://www.linkedin.com/company/quality-first-software-gmbh-qfs/"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;</content><category term="newsletters"/></entry><entry><title>Special webinar: Web Accessibility Testing with QF-Test</title><link href="https://www.qftest.com/en/company/news/special-webinar-web-accessibility-testing-with-qf-test.html" rel="alternate"/><published>2025-05-06T00:00:00+02:00</published><updated>2025-05-06T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-05-06:/en/company/news/special-webinar-web-accessibility-testing-with-qf-test.html</id><summary type="html">&lt;p&gt;Free QF-Test special webinar on Monday, May 19, 2025, 3:30 PM &amp;ndash; 4:30 PM CEST, in English&lt;/p&gt;</summary><content type="html">&lt;p&gt;Free QF-Test special webinar on Monday, May 19, 2025, 3:30 PM &amp;ndash; 4:30 PM CEST, in English&lt;/p&gt;
&lt;p&gt;By June 28 of this year, business websites within the EU must be accessible. But what does accessibility mean in a web context? What do providers have to pay attention to? And above all: How can QF-Test support you in meeting the legal requirements?&lt;/p&gt;
&lt;p&gt;In this webinar, we will give a brief introduction to web accessibility and present the new accessibility testing features of QF-Test.&lt;/p&gt;</content><category term="news"/></entry><entry><title>Fit4Community Sport Challenge 2025</title><link href="https://www.qftest.com/en/company/news/company-events/fit4community-sport-challenge-2025.html" rel="alternate"/><published>2025-05-01T00:00:00+02:00</published><updated>2025-05-01T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-05-01:/en/company/news/company-events/fit4community-sport-challenge-2025.html</id><summary type="html">&lt;p&gt;With 48 teams and 449 participants from 20 mgm locations we successfully raised 21,000 € for World Bicycle Relief under the banner of #mgmfit4community.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="mgmFit4Community2025 Challenge 2025" src="/companynews/resources/fit4community-sport-challenge-2025.png" /&gt;&lt;/p&gt;
&lt;p&gt;With 48 teams and 449 participants from 20 mgm locations we successfully raised 21,000 € for World Bicycle Relief under the banner of #mgmfit4community. For 31 days, participants pushed their limits through sweating, biking, hiking, and running. Together, we have achieved something truly remarkable.&lt;/p&gt;
&lt;p&gt;World Bicycle Relief is an international, non-profit organization that specializes in large-scale, comprehensive bicycle distribution programs to aid poverty relief in developing countries around the world. Their programs focus primarily on education, economic development, and health care.&lt;/p&gt;</content><category term="companynews"/></entry><entry><title>I have purchased existing QF-Test licenses or a previous version of QF-Test 10. What does this mean for me, and which edition should I use in the future?</title><link href="https://www.qftest.com/en/product/faq/switch-to-new-qf-test-editions-from-previous-version.html" rel="alternate"/><published>2025-05-01T00:00:00+02:00</published><updated>2025-05-01T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-05-01:/en/product/faq/switch-to-new-qf-test-editions-from-previous-version.html</id><summary type="html">&lt;p&gt;Existing licenses remain fully valid&amp;#8230;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Existing customers do not need to take any action and can continue to use &lt;strong&gt;QF-Test Pro&lt;/strong&gt; as usual within the scope of their current licenses. This edition offers the &lt;strong&gt;full functionality&lt;/strong&gt; of QF-Test versions prior to QF-Test 10.&lt;/p&gt;
&lt;p&gt;Depending on the UI technologies being tested, it may be advantageous to use a dedicated edition — &lt;strong&gt;QF-Test Web, QF-Test Desktop, or QF-Test Mobile&lt;/strong&gt; — as they &lt;strong&gt;focus on the relevant range of functions&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Depending on the UI technologies you need to test, using another edition — &lt;strong&gt;QF-Test Web, QF-Test Desktop, or QF-Test Mobile&lt;/strong&gt; — may offer advantages, as it &lt;strong&gt;focuses features accordingly&lt;/strong&gt;.  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;QF-Test Web&lt;/strong&gt; for web browsers, accessibility, Electron applications, API and web service testing  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QF-Test Desktop&lt;/strong&gt; for Java and native Windows applications  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QF-Test Mobile&lt;/strong&gt; for Android and iOS apps  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QF-Test Pro&lt;/strong&gt; combines all technologies and additionally supports hybrid applications. &lt;/li&gt;
&lt;/ol&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="https://services.qftest.com/en/download/"  class="button scroll-animated green chevron"&gt;Download QF-Test&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Our service team is happy to assist you in selecting the edition that best fits your needs. &lt;/p&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="https://services.qftest.com/en/support/contact/?type=editions"  class="button scroll-animated green chevron"&gt;Contact Our Service Team&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;</content><category term="faqs"/><category term="faqeditions"/></entry><entry><title>QF-Test 9.0.3 available</title><link href="https://www.qftest.com/en/company/news/qf-test-9-0-3-available.html" rel="alternate"/><published>2025-04-29T00:00:00+02:00</published><updated>2025-04-29T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-04-29:/en/company/news/qf-test-9-0-3-available.html</id><content type="html">&lt;p&gt;This maintenance release updates the embedded JRE to Temurin 17.0.15 and fixes several bugs.&lt;/p&gt;</content><category term="news"/></entry><entry><title>Maintenance release 9.0.2 available</title><link href="https://www.qftest.com/en/company/news/maintenance-release-9-0-2-available.html" rel="alternate"/><published>2025-04-09T00:00:00+02:00</published><updated>2025-04-09T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-04-09:/en/company/news/maintenance-release-9-0-2-available.html</id><content type="html">&lt;p&gt;This maintenance release fixes a potential corruption of the system configuration file, improves client connectivity and adds object type support to data drivers. It also comes with some updated libraries and fixes a few bugs.&lt;/p&gt;</content><category term="news"/></entry><entry><title>Maintenance Release QF-Test 9.0.2</title><link href="https://www.qftest.com/en/company/news/newsletters/2025-02-qftest902-accessibility-webinar.html" rel="alternate"/><published>2025-04-09T00:00:00+02:00</published><updated>2025-04-09T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-04-09:/en/company/news/newsletters/2025-02-qftest902-accessibility-webinar.html</id><summary type="html">&lt;p&gt;Training dates and more, Case study, tool comparison, news and blogs&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Maintenance Release QF-Test 9.0.2 available&lt;/h2&gt;
&lt;p&gt;Hello dear QF-Test users!&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ve again been busy in the last few weeks: Today`s release &lt;strong&gt;QF-Test 9.0.2&lt;/strong&gt; fixes a potential corruption of the system configuration file, improves client connectivity and adds object type support to data drivers. It also comes with some updated libraries and fixes a few bugs. QF-Test 9.0.1 improved some of the new features in QF-Test 9, including the manual and screenshots in reports for accessibility testing.&lt;/p&gt;
&lt;p&gt;In addition we would also like to invite you to our next &lt;strong&gt;special webinar on May 19, 2024&lt;/strong&gt;. This time it&amp;#8217;s all about &lt;a href="/en/support/training-consulting/webinars.html#c34101"&gt;automated testing for accessibility&lt;/a&gt; – we look forward to your participation!&lt;/p&gt;
&lt;p&gt;Best wishes,&lt;br /&gt;
 your QFS team&lt;/p&gt;
&lt;h2&gt;QF-Test Version 9.0.2&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://services.qftest.com/en/download/"&gt;&lt;img alt="QF-Test Download" src="/newsletters/resources/2025-03_Download-Button-Pfeil-gruen-Schachtel-dunkelblau.png" title="QF-Test Download" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download &lt;a href="https://services.qftest.com/en/download/"&gt;QF-Test version 9.0.2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;See the new features of QF-Test 9 in our &lt;strong&gt;release video&lt;/strong&gt; &lt;a href="https://services.qftest.com/en/download/"&gt;Automatically test the accessibility of your web application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;To the &lt;a href="https://www.qftest.com/doc/manual/en/history.html"&gt;Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;News&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Case study:&lt;/strong&gt; Testing a complex software solution for social insurance&lt;br /&gt;
   ➜ &lt;a href="/en/company/references/case-studies/bitmarck.html"&gt;To the Case study of BITMARCK Software GmbH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QF-Test vs. Tosca&lt;/strong&gt; – why an IT service provider recommends QF-Test to its customer for testing a Java Swing application.&lt;br /&gt;
   ➜ &lt;a href="/en/company/references/evaluation-reports/dvz.html"&gt;To the comparison by DVZ GmbH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It&amp;#8217;s not magic: How the CustomWebResolver makes your web application UI testable&lt;/strong&gt;  – we are convinced that semantic components and the CustomWebResolver are the best way to create reliable, robust and comprehensive UI tests for web applications.&lt;br /&gt;
   ➜ &lt;a href="/en/blog.html"&gt;Go to the blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automated web accessibility testing&lt;/strong&gt;– in his bachelor thesis and in our next special webinar, Daniel Rieth put QF-Test through its paces for the automated testing of web application accessibility.&lt;br /&gt;
   ➜ &lt;a href="/en/solutions/types-of-tests/accessibility-tests.html"&gt;More about Web Accessibility Testing with QF-Test&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Save the date: Events in 2025&lt;/h2&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/webinars.html#c34103"&gt;&lt;img alt="Special Webinar Web Accessibility" src="/newsletters/resources/Spezialwebinar-Accessibility.png" title="Special Webinar Web Accessibility" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Special webinar&lt;/strong&gt;&lt;br /&gt;
&lt;a href="/en/support/training-consulting/webinars.html#c34103"&gt;Web Accessibility Testing with QF-Test&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;May 19, 2025, 3:30 PM (CEST)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;By June 28 of this year, business websites within the EU must be accessible.&lt;br /&gt;
 But what does accessibility mean in a web context? What do providers have to pay attention to?&lt;br /&gt;
 And above all: How can QF-Test support you in meeting the legal requirements?&lt;/p&gt;
&lt;p&gt;In this webinar, we will give a brief introduction to web accessibility and present the new accessibility testing features of QF-Test.&lt;/p&gt;
&lt;p&gt;➜ &lt;a href="/en/support/training-consulting/webinars.html#c34103"&gt;Sign up for free&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ll publish the &lt;a href="/en/support/training-consulting/webinars.html#c21743"&gt;recording&lt;/a&gt; (without the Q&amp;amp;A) afterwards. Special webinar in German: 10:30 a.m.&lt;/p&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/training.html#a30295-654c8d5cec687736087741"&gt;&lt;img alt="QF-Test Expert Day" src="/newsletters/resources/ExpertentagOnlineSchulung-dunkelblau-HGgelb.png" title="QF-Test Expert Day" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Online Expert Day&lt;/strong&gt;&lt;br /&gt;
&lt;a href="/en/support/training-consulting/training.html#a30295-654c8d5cec687736087741"&gt;Toolbox for stable component detection of web applications&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;May 26, 2025, 2 × 2,5 hours, in German&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Following the great success of the previous Expert Days, an English version has now been scheduled. In this online training, we will dive deeply into QF-Test and show you how to optimize the interaction with your web application. With practical exercises on special topics and individual answers to your personal questions, we will ensure that you get the most out of the training. Register now and make your testing processes even more efficient.&lt;/p&gt;
&lt;p&gt;➜ &lt;a href="/en/support/training-consulting/training.html#a30295-654c8d5cec687736087741"&gt;Details, pricing and registration&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/training.html"&gt;&lt;img alt="Online Training QF-Test" src="/newsletters/resources/OnlineSchulung-Monitor-Hut-dunkelblau-HGblau.png" title="Online Training QF-Test" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NEW! QF-Test Basics: Training via Webinar&lt;/strong&gt;&lt;br /&gt;
&lt;a href="/en/support/training-consulting/training.html#a30295-6613a7774f6b6588956332"&gt;June 23 &amp;ndash; 26, 2025, English&lt;/a&gt;&lt;br /&gt;
&lt;a href="/en/support/training-consulting/training.html#a30295-659e55fa94d68760261203"&gt;June 30 &amp;ndash; July 3, 2025, German&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;4 days, 2 × 2,5 hours each&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Effective and rapid knowledge transfer in small groups up to a maximum of 8 participants&lt;/li&gt;
&lt;li&gt;Interaction with the trainers and asking questions are possible at any time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;➜ &lt;a href="https://services.qftest.com/en/support/contact/"&gt;Sign up now&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;#8220;&lt;em&gt;QF-Test is definitively a powerful tool. I think this training will be a game changer in our way to use it and to think our new QF NextGen Framework! Very encouraging. Thank you very much.&lt;/em&gt;&amp;#8221;&lt;/p&gt;
&lt;p&gt;Paul Singuinia, training participant, TotalEnergies One Tech, France&lt;/p&gt;
&lt;p&gt;Would you like a &lt;a href="/en/support/training-consulting/training.html#c30865"&gt;training course&lt;/a&gt; which is individually tailored to your company? Just send us an email to &lt;a href="https://services.qftest.com/en/support/contact/"&gt;service@qftest.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://insights.mgm-tp.com/en/2025/quality-assurance/experience-q12-tmt-live-conferences-events-and-webinars-2025/"&gt;&lt;img alt="Q12 Test Management Tool Screenshot" src="/newsletters/resources/TMT-Screenshot.png" title="Q12 Test Management Tool Screenshot" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q12-TMT Test Management Tool&lt;/strong&gt;&lt;br /&gt;
 Our parent company mgm technology partners will be represented with Q12-TMT at international and German conferences, events and webinars. As a professional tool for structured test case creation, planning, execution, documentation and reporting, TMT may also be of interest to you as a supplement to QF-Test.&lt;/p&gt;
&lt;p&gt;➜ &lt;a href="https://insights.mgm-tp.com/en/2025/quality-assurance/experience-q12-tmt-live-conferences-events-and-webinars-2025/"&gt;To testing events with mgm in 2025&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;From our YouTube Channel&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Release video &amp;#8220;Automatically test the accessibility of your web application with QF-Test 9&amp;#8221;&lt;/strong&gt; – In this video we give you a short overview about the new features of QF-Test 9.&lt;br /&gt;
   ➜ &lt;a href="/en/support/videos.html#a22249-5f048d01474d7610742997"&gt;Watch the video now&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Visit our &lt;a href="https://www.youtube.com/channel/UCo6yiK49wlGY1Busavn0LZw"&gt;YouTube channel&lt;/a&gt; to subscribe and follow us on &lt;a href="https://www.linkedin.com/company/quality-first-software-gmbh-qfs/"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;</content><category term="newsletters"/></entry><entry><title>It’s not magic: How the CustomWebResolver makes your web application UI testable</title><link href="https://www.qftest.com/en/blog/article/cwr-testable-web-ui.html" rel="alternate"/><published>2025-04-04T00:00:00+02:00</published><updated>2025-04-04T00:00:00+02:00</updated><author><name>Max Melzer</name></author><id>tag:www.qftest.com,2025-04-04:/en/blog/article/cwr-testable-web-ui.html</id><summary type="html">&lt;p&gt;We explain why QF-Test is so much better at testing web applications than other tools and what this &amp;#8220;CustomWebResolver&amp;#8221; has to do with it.&lt;/p&gt;</summary><content type="html">&lt;p&gt;With QF-Test, our goal is to make testing web application UIs as easy as testing a native application. This presents some challenges for which we developed a unique solution we call the &lt;strong&gt;CustomWebResolver&lt;/strong&gt;. In this blog post, I will explain why QF-Test is so much better at testing web applications than other tools and what this &amp;#8220;CustomWebResolver&amp;#8221; has to do with it.&lt;/p&gt;
&lt;h2&gt;The problem with CSS and XPath selectors&lt;/h2&gt;
&lt;p&gt;Most browser-based UI testing tools rely on CSS selectors or XPath to select an element to interact with or validate. This approach has several downsides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Very verbose:&lt;/strong&gt; A typical CSS selector looks like this: &lt;code&gt;body &amp;gt; main &amp;gt; div  &amp;gt; ul &amp;gt; li:nth-of-type(3) &amp;gt; button.my-action&lt;/code&gt;, the same as an XPath would be: &lt;code&gt;.//body/main/div/ul/li[3]/button[@class="my-action"]&lt;/code&gt;. Not very readable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not very stable:&lt;/strong&gt; These selectors rely on the underlying HTML structure of the application to remain the same, otherwise they break.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not easy to auto-generate:&lt;/strong&gt; This becomes important when recording an interaction. Generating a CSS or XPath selector for an HTML element programmatically is easy. Generating a &lt;em&gt;stable, concise and reusable&lt;/em&gt; selector, however, must usually be done by hand.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No Shadow DOM access:&lt;/strong&gt; It is not possible to use CSS or XPath to select an element encapsulated in a &amp;#8220;shadow root&amp;#8221;. This is a problem with applications built on the Web Components standard. Instead, JavaScript and a deep understanding of web technologies are required.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Technology-specific:&lt;/strong&gt; These selectors are only applicable to HTML, they cannot be used in a cross-platform context.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No checking of state:&lt;/strong&gt; With these selectors, you only &lt;em&gt;found&lt;/em&gt; the element. Checking if the element has the required state to pass a test needs to be handled separately.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;There is a better way: The QF-Test CustomWebResolver&lt;/h2&gt;
&lt;p&gt;Although you can also work with selectors here, QF-Test offers a better way: A technology we call the &lt;strong&gt;CustomWebResolver&lt;/strong&gt;, or &lt;strong&gt;CWR&lt;/strong&gt; for short, resolves the raw HTML of your application into a semantic tree of well-defined UI components. This offers several advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No knowledge of HTML required:&lt;/strong&gt; Test authors are not required to understand the intricacies of the DOM structure of the application to address components.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Semantic tests:&lt;/strong&gt; UI components can be addressed based on their semantic function as presented to the user, instead their structural position in the DOM or the HTML code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unified handling of similar components:&lt;/strong&gt;  UI components that have the same semantic function but are implemented differently on the HTML level are still addressed in the same way.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Checks included:&lt;/strong&gt; The state of a UI component can automatically be checked according to common criteria like &amp;#8220;is it visible&amp;#8221;, &amp;#8220;what&amp;#8217;s the text content?&amp;#8221;, &amp;#8220;what&amp;#8217;s the input value?&amp;#8221;, &amp;#8220;is it enabled or disabled?&amp;#8221;, &amp;#8220;is it checked or selected?&amp;#8221;, and more.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don&amp;#8217;t worry about the Shadow DOM:&lt;/strong&gt; With a CustomWebResolver you never have to think about things like shadow roots – QF-Test just takes care of everything.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Robust against DOM changes:&lt;/strong&gt; The CustomWebResolver is much more resilient against changes to the DOM structure. And if changes are necessary, they can be made in a central place instead of everywhere a component is used.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-platform:&lt;/strong&gt; Because it is not bound to HTML, the QF-Test component structure can be reused between applications built with Java UI libraries, Native Windows UIs and even iOS and Android apps with little adjustment needed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selection via SmartID:&lt;/strong&gt; In QF-Test you can select a component via the very compact &lt;a href="https://www.qftest.com/doc/manual/en/user_smartid.html"&gt;SmartID syntax&lt;/a&gt; like this: &lt;code&gt;#List:&amp;amp;2@#Button:&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Okay, but how does this magical CustomWebResolver technology work?&lt;/h2&gt;
&lt;p&gt;The basis of the CustomWebResolver is the translation of the DOM structure into a &lt;em&gt;tree of components&lt;/em&gt; of certain &lt;em&gt;generic classes&lt;/em&gt; based on a set of &lt;em&gt;mappings&lt;/em&gt;. Let&amp;#8217;s untangle that statement.&lt;/p&gt;
&lt;h3&gt;Generic classes&lt;/h3&gt;
&lt;p&gt;Any application UI consists of a number of widgets, or &lt;em&gt;components&lt;/em&gt;, that serve some purpose. There are usually windows with different panels which contain labels, tables, trees, lists, checkboxes, text inputs, sliders, drop-downs, and so on.&lt;/p&gt;
&lt;p&gt;QF-Test comes with a big list of &lt;a href="https://www.qftest.com/doc/manual/en/tech_genericclasses.html#sec_genericclasses"&gt;&lt;em&gt;generic classes&lt;/em&gt;&lt;/a&gt; which can be used to describe almost every component imaginable in an application UI. QF-Test understands their &lt;em&gt;semantics&lt;/em&gt;, i.e. how they work, and can automatically offer the right actions and checks per component.&lt;/p&gt;
&lt;p&gt;For example, QF-Test knows to offer a &amp;#8220;&amp;#8216;checked&amp;#8217; state&amp;#8221; check for the generic class &lt;code&gt;CheckBox&lt;/code&gt;, but not for e.g. the generic class &lt;code&gt;TextField&lt;/code&gt;, and it understands that you can click a &lt;code&gt;CheckBox&lt;/code&gt; component to toggle it&amp;#8217;s &amp;#8216;checked&amp;#8217; state. It also understands that a &lt;code&gt;Table&lt;/code&gt; or &lt;code&gt;List&lt;/code&gt; can contain child elements and gives you easy access to them.&lt;/p&gt;
&lt;h3&gt;CWR mappings&lt;/h3&gt;
&lt;p&gt;The job of the &lt;em&gt;CustomWebResolver&lt;/em&gt; is to look at the DOM of your application and figure out which HTML elements belong to which generic class. To do this, it uses &lt;em&gt;mappings&lt;/em&gt; which are usually defined in a YAML document. The simplest mapping possible looks like this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;genericClasses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;btn&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This piece of YAML, when interpreted by the CustomWebResolver, will tell QF-Test to assign every HTML element with the CSS class &lt;code&gt;btn&lt;/code&gt; the generic class &lt;code&gt;Button&lt;/code&gt; and therefore understand that it&amp;#8217;s a button that can be activated as long as it&amp;#8217;s not disabled or invisible.&lt;/p&gt;
&lt;p&gt;With the CustomWebResolver configured like this, you can now select &amp;#8220;OK&amp;#8221; buttons using the SmartID &lt;code&gt;#Button:OK&lt;/code&gt;, regardless of where this button is or what HTML tag it actually uses, as long as it has the CSS class &lt;code&gt;btn&lt;/code&gt; and a label &amp;#8220;OK&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Here is another example of a CustomWebResolver mapping, this time a more complex one:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;genericClasses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ComboBox&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;attribute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;role&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;attributeValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;combobox&lt;/span&gt;
&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;List:ComboBoxList&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ul&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ComboBox&lt;/span&gt;
&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;Item:ComboBoxListItem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;li&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;List:ComboBoxList&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The mapping above is for a &lt;code&gt;ComboBox&lt;/code&gt;, i.e. some kind of drop-down select input. It actually consists of multiple sub-components:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The drop-down itself,&lt;/li&gt;
&lt;li&gt;the list that appears when the drop-down is opened and&lt;/li&gt;
&lt;li&gt;the individual selectable options.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Thanks to these mappings, the CustomWebResolver can tell QF-Test to handle this kind of drop-down as a single semantic component: QF-Test can automatically select a given option in the list, it can fetch the current selection or check that a given option is the current selection, or it can return the entire list of available options &amp;ndash; all through the QF-Test UI without writing any code or messing with the DOM.&lt;/p&gt;
&lt;h3&gt;The component tree&lt;/h3&gt;
&lt;p&gt;Finally, once all relevant components are mapped to generic classes, QF-Test can discard the rest of the HTML and you are left with a &lt;em&gt;beautifully simple tree of semantic components&lt;/em&gt;, on which you can build your tests.&lt;/p&gt;
&lt;p&gt;&lt;button class="plain" onclick="document.getElementById('2978').showModal()" title="Enlarge"&gt;&lt;/p&gt;
&lt;figure&gt;
    &lt;img src="/blog/resources/reduction-of-complexity-side-by-side.png"
        class=" scroll-animated"
        alt=""
        style=" "&gt;&lt;figcaption&gt;&lt;p&gt;A side-by-side illustration of how the complexity of the DOM tree of a web application is reduced if all the DIVs and SPANs are replaced with semantic components. The non-optimized tree on the left has way deeper nesting than the optimized, semantic tree.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;/button&gt;&lt;dialog popover id="2978" anchor="trigger-2978"&gt;&lt;/p&gt;
&lt;div class="container card scroll-animated width-full accent    "&gt;&lt;div class="container-content"&gt;        &lt;button onclick="document.getElementById('2978').close()"
                class="button blue tertiary"
                id="trigger-2978"
                style="margin: -15px -15px 10px auto; position: relative"&gt;Close&lt;/button&gt;
            &lt;figure&gt;
        &lt;img class="plain" src="/blog/resources/reduction-of-complexity-side-by-side.png" alt=""&gt;&lt;figcaption&gt;&lt;p&gt;A side-by-side illustration of how the complexity of the DOM tree of a web application is reduced if all the DIVs and SPANs are replaced with semantic components. The non-optimized tree on the left has way deeper nesting than the optimized, semantic tree.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
    &lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;/dialog&gt;&lt;/p&gt;
&lt;h2&gt;And how do I configure this CustomWebResolver for my application?&lt;/h2&gt;
&lt;p&gt;The only thing users of QF-Test have to do is to provide the initial configuration for the CustomWebResolver. We have implemented three ways to make this as easy as possible:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;For a growing list of web component frameworks, we bundle comprehensive CWR configurations with QF-Test. QF-Test will automatically recognize and translate any components from these frameworks into generic classes, ready for you to use in your tests and checks. We support popular frameworks like &lt;strong&gt;Vaadin&lt;/strong&gt;, &lt;strong&gt;Angular Material UI&lt;/strong&gt;, and &lt;strong&gt;Google Web Toolkit&lt;/strong&gt;. Check out &lt;a href="https://www.qftest.com/doc/manual/en/tech_ajax.html#sec_ajax"&gt;the full list&lt;/a&gt; to see if your framework is already supported.&lt;/li&gt;
&lt;li&gt;If you use a different framework, but your application adheres to the &lt;a href="https://www.w3.org/WAI/standards-guidelines/aria/"&gt;WAI-ARIA standards for web accessibility&lt;/a&gt; by marking components with &lt;code&gt;role&lt;/code&gt; and &lt;code&gt;aria-*&lt;/code&gt; attributes, QF-Test will use these attributes to automatically configure the CustomWebResolver. The better the accessibility of your UI, the better QF-Test will work with it – a double win!&lt;/li&gt;
&lt;li&gt;Otherwise, you&amp;#8217;ll need to write your own CWR mappings. This is not super-difficult, but it requires some knowledge of the HTML structure of your application. Don&amp;#8217;t worry, QF-Test does a lot to help you with this. QF-Test comes with &lt;a href="https://www.qftest.com/doc/manual/en/tech_custom_web_resolver.html#sec_custom_web_resolver"&gt;a comprehensive user interface&lt;/a&gt; which helps you at every step when editing and verifying your configuration. And with the &lt;a href="https://www.qftest.com/doc/manual/en/user_componentinspection.html#usec_inspector"&gt;QF-Test UI Inspector&lt;/a&gt;, you can see the effect of your CWR configuration in real-time. And if you&amp;#8217;re still having trouble, &lt;a href="https://services.qftest.com/en/support/request/"&gt;our support team is ready to assist you&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;button class="plain" onclick="document.getElementById('7859').showModal()" title="Enlarge"&gt;&lt;/p&gt;
&lt;figure&gt;
    &lt;img src="https://www.qftest.com/doc/manual/en/images/cwr_gutter.png"
        class=" scroll-animated"
        alt=""
        style=" "&gt;&lt;figcaption&gt;&lt;p&gt;A screenshot of the Edit menu in the QF-Test CustomWebResolver node. It includes all kinds of contextual actions to help you generate a valid CWR configuration in YAML format.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;/button&gt;&lt;dialog popover id="7859" anchor="trigger-7859"&gt;&lt;/p&gt;
&lt;div class="container card scroll-animated width-full accent    "&gt;&lt;div class="container-content"&gt;        &lt;button onclick="document.getElementById('7859').close()"
                class="button blue tertiary"
                id="trigger-7859"
                style="margin: -15px -15px 10px auto; position: relative"&gt;Close&lt;/button&gt;
            &lt;figure&gt;
        &lt;img class="plain" src="https://www.qftest.com/doc/manual/en/images/cwr_gutter.png" alt=""&gt;&lt;figcaption&gt;&lt;p&gt;A screenshot of the Edit menu in the QF-Test CustomWebResolver node. It includes all kinds of contextual actions to help you generate a valid CWR configuration in YAML format.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
    &lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;/dialog&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;We believe that semantic components and the CustomWebResolver are the best way to build reliable, robust and comprehensive UI tests for web applications. And &lt;a href="/en/company/references/evaluation-reports.html"&gt;our customers think so, too&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you have been using QF-Test for the web already but have not made full use of the power of the CustomWebResolver yet, you should give it a try. And if you are totally new to QF-Test, you can get started with &lt;a href="https://services.qftest.com/en/license/request/"&gt;a free trial&lt;/a&gt; today!&lt;/p&gt;
&lt;h2&gt;Read more&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The CustomWebResolver in the QF-Test manual: &lt;a href="https://www.qftest.com/doc/manual/en/tech_customajax.html#sec_customajax"&gt;Improving component recognition with a CustomWebResolver&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tutorial for configuring your first CustomWebResolver: &lt;a href="https://www.qftest.com/doc/manual/en/tech_customajax_demo.html#sec_customajax_demo"&gt;Example for &amp;#8220;CarConfigurator Web&amp;#8221; demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;List of frameworks with built-in CWR: &lt;a href="https://www.qftest.com/doc/manual/en/tech_ajax.html#sec_ajax"&gt;Special support for various web frameworks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Detailed documentation of everything the CWR can do: &lt;a href="https://www.qftest.com/doc/manual/en/tech_custom_web_resolver.html#sec_custom_web_resolver"&gt;The Install CustomWebResolver node&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="blog"/><category term="how-to"/><category term="testing"/></entry><entry><title>Can I upgrade to QF-Test Pro?</title><link href="https://www.qftest.com/en/product/faq/subscription-switching-editions.html" rel="alternate"/><published>2025-04-02T00:00:00+02:00</published><updated>2025-04-02T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-04-02:/en/product/faq/subscription-switching-editions.html</id><summary type="html">&lt;p&gt;You can upgrade from Desktop, Web or Mobile to QF-Test Pro at any time.&lt;/p&gt;</summary><content type="html">&lt;p&gt;An upgrade from Desktop, Web or Mobile to QF-Test Pro is always possible – just get in touch with our sales team.&lt;/p&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="mailto:sales@qftest.com"  class="button scroll-animated green chevron"&gt;Contact Our Sales Team&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;</content><category term="faqs"/><category term="faqeditions"/></entry><entry><title>Can I expand my existing license?</title><link href="https://www.qftest.com/en/product/faq/expanding-existing-license.html" rel="alternate"/><published>2025-04-01T00:00:00+02:00</published><updated>2025-04-01T00:00:00+02:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-04-01:/en/product/faq/expanding-existing-license.html</id><summary type="html">&lt;p&gt;Expanding existing licenses is possible at any time.&lt;/p&gt;</summary><content type="html">&lt;p&gt;New licenses follow the new edition model and can be combined with existing licenses.&lt;/p&gt;
&lt;p&gt;Temporarily, early adopters can expand their licenses under the previous scheme. A direct quote can be requested for this option.  &lt;/p&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="mailto:sales@qftest.com"  class="button scroll-animated green chevron"&gt;Contact Our Sales Team&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;</content><category term="faqs"/><category term="faqeditions"/></entry><entry><title>Maintenance version 9.0.1 available</title><link href="https://www.qftest.com/en/company/news/maintenance-version-9-0-1-available.html" rel="alternate"/><published>2025-03-12T00:00:00+01:00</published><updated>2025-03-12T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-03-12:/en/company/news/maintenance-version-9-0-1-available.html</id><content type="html">&lt;p&gt;This maintenance release improves on some of the new features in QF-Test 9 like the manual or screenshots in reports for accessibility tests. It also comes with some updated libraries and fixes a few bugs.&lt;/p&gt;</content><category term="news"/></entry><entry><title>Can I switch editions without losing my configuration?</title><link href="https://www.qftest.com/en/product/faq/switch-between-qf-test-editions.html" rel="alternate"/><published>2025-03-01T00:00:00+01:00</published><updated>2025-03-01T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-03-01:/en/product/faq/switch-between-qf-test-editions.html</id><summary type="html">&lt;p&gt;Changing editions is possible without any difficulty.&lt;/p&gt;</summary><content type="html">&lt;p&gt;All editions access the same configuration data without modifying any data tied to features of another edition. This ensures a smooth edition switch without issues.  &lt;/p&gt;</content><category term="faqs"/><category term="faqeditions"/></entry><entry><title>Objects in QF-Test variables – an overview</title><link href="https://www.qftest.com/en/blog/article/objects-in-qf-test-variables.html" rel="alternate"/><published>2025-02-20T00:00:00+01:00</published><updated>2025-02-20T00:00:00+01:00</updated><author><name>Pascal Bihler</name></author><id>tag:www.qftest.com,2025-02-20:/en/blog/article/objects-in-qf-test-variables.html</id><summary type="html">&lt;p&gt;QF-Test 9 introduces object variables. This new feature has an effect on many parts of QF-Test. This article presents an overview of the most important new features.&lt;/p&gt;</summary><content type="html">&lt;p&gt;When working with variables in QF-Test, the biggest challenge so far has been to understand which variable is currently active with which value. Important here are the variable stacks – &lt;a href="https://www.qftest.com/doc/manual/en/user_variables.html#usec_var_lookup"&gt;the manual explains their function in detail&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;The status quo up to QF-Test 9&lt;/h2&gt;
&lt;p&gt;The values stored in variables used to be strings always. Other objects (e.g. numbers) were converted to a string when stored in a variable with &lt;code&gt;rc.setLocal&lt;/code&gt; or &lt;code&gt;rc.setGlobal&lt;/code&gt; and stored in the QF-Test main process. When read with &lt;code&gt;rc.getInt&lt;/code&gt; or &lt;code&gt;rc.getBool&lt;/code&gt; the value was then translated back.&lt;/p&gt;
&lt;p&gt;Using this mechanism it is also possible to set a variable in an &lt;a href="https://www.qftest.com/doc/manual/en/control.html#step_ClientScriptStep"&gt;SUT script&lt;/a&gt; and then use its value in a &lt;a href="https://www.qftest.com/doc/manual/en/control.html#step_ServerScriptStep"&gt;server script&lt;/a&gt; or an &lt;a href="https://www.qftest.com/doc/manual/en/control.html#step_IfSequence"&gt;If node&lt;/a&gt; (and vice versa). If you wanted to cache complex objects, you always had to work with the &lt;a href="https://www.qftest.com/doc/manual/en/user_scripting.html#usec_scriptvars"&gt;&amp;#8220;global&amp;#8221; script variables&lt;/a&gt; of a scripting language, and across process boundaries you had to use &lt;code&gt;rc.fromSUT&lt;/code&gt;and &lt;code&gt;rc.toSUT&lt;/code&gt; or &lt;code&gt;rc.fromServer&lt;/code&gt; and &lt;code&gt;rc.toServer&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;After more than 20 years this simple understanding of values has reached its limits and has been extended with QF-Test 9: it is now possible to store arbitrary objects in QF-Test variables and thus return complex objects from a procedure, for example.&lt;/p&gt;
&lt;h2&gt;Ensuring backwards compatibility&lt;/h2&gt;
&lt;p&gt;First things first: We have invested a lot of effort to ensure backwards compatibility. The preexisting access methods in the run context return the same types, values can be stored in the same way and when things get complicated (for example when a non-serializable or very large object from an SUT script wants to be stored in a QF-Test variable), QF-Test falls back to the previously used string representation.&lt;/p&gt;
&lt;h2&gt;Object variables in variable tables&lt;/h2&gt;
&lt;p&gt;In QF-Test you can tell right away in any variables table (e.g. in the &lt;a href="https://www.qftest.com/doc/manual/en/user_variables.html#sec_N77251"&gt;options dialog&lt;/a&gt; or in the &lt;a href="https://www.qftest.com/doc/manual/en/user_debugging.html#usec_debugger"&gt;debugger&lt;/a&gt; window) whether a variable value is a string or has a different type: In the first case, everything looks the same as before, i.e. only the string appears in the table. In the second case, the variable value is preceded by the type of the object in parentheses, e.g. &lt;code&gt;(Boolean) true&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The type of a stored variable can also be changed here via the context menu.&lt;/p&gt;
&lt;h2&gt;Object variables in &amp;#8220;Set variable&amp;#8221;, &amp;#8220;Return&amp;#8221; and parameter tables&lt;/h2&gt;
&lt;p&gt;In case of the &lt;a href="https://www.qftest.com/doc/manual/en/miscnodes.html#step_SetGlobalStep"&gt;&amp;#8220;Set variable&amp;#8221; node&lt;/a&gt; and the &lt;a href="https://www.qftest.com/doc/manual/en/procedures.html#step_ReturnStep"&gt;&amp;#8220;Return&amp;#8221; node&lt;/a&gt; in a procedure, the type of the set or returned variable can now also be explicitly specified. This is done at runtime, i.e. when the node is executed, the character string specified as the value in the node is converted into the selected type.&lt;/p&gt;
&lt;p&gt;In the same way, the type of the parameter can also be defined in &lt;a href="https://www.qftest.com/doc/manual/en/user_gui.html#usec_tables"&gt;parameter tables&lt;/a&gt;, for example in sequences – here too, the conversion takes place when the node is executed. The value of the parameter then appears in the table again with a type reference, for example: &lt;code&gt;(as Number) 3.141&lt;/code&gt;. The &amp;#8220;as&amp;#8221; indicates that the conversion takes place at runtime.&lt;/p&gt;
&lt;p&gt;Such a conversion can also be carried out everywhere a variable expansion takes place with the help of the &lt;a href="https://www.qftest.com/doc/manual/en/user_variables.html#usec_externaldata"&gt;special group &amp;#8220;as&amp;#8221;&lt;/a&gt;, the syntax looks like &lt;code&gt;${as:fromjson:[1,2,3,4]}&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Object variables via &lt;code&gt;rc.getObj&lt;/code&gt; and &lt;code&gt;rc.vars&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;rc.getObj&lt;/code&gt; method can now be used to read the object value of a variable in a script or script expression. Analogous to the existing methods such as &lt;code&gt;rc.getStr&lt;/code&gt;, &lt;code&gt;rc.getNum&lt;/code&gt; or &lt;code&gt;rc.getBool&lt;/code&gt;, the variable (with one parameter) or a group variable (property, with two parameters) is evaluated here and its value returned – in this case without conversion.&lt;/p&gt;
&lt;p&gt;An expansion of nested variable expressions in the value only takes place automatically if the value is a string, otherwise it must be explicitly requested via the parameter &lt;code&gt;expand=true&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://www.qftest.com/doc/manual/en/tech_scripting.html#sec_api_rc"&gt;run context&lt;/a&gt; now also offers a practical shortcut to any variable object: instead of &lt;code&gt;rc.getObj("variablename")&lt;/code&gt; you can now simply write &lt;code&gt;rc.vars.variablename&lt;/code&gt;, and &lt;code&gt;rc.groups.qftest.suite.file&lt;/code&gt; returns the &lt;code&gt;File&lt;/code&gt; object of the current test suite.&lt;/p&gt;
&lt;h2&gt;Object variables and &lt;code&gt;$(name)&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;When you use the familiar &lt;code&gt;$&lt;/code&gt; notation for &lt;a href="https://www.qftest.com/doc/manual/en/user_variables.html#usec_variables"&gt;variables&lt;/a&gt;, the object value of the variable is used for as long as possible: if the variable &lt;code&gt;average&lt;/code&gt; has the value &lt;code&gt;(double) 2.3&lt;/code&gt;, for example, the new variable would also have the type &lt;code&gt;double&lt;/code&gt; for a &amp;#8220;Set variable&amp;#8221; node with the default value &lt;code&gt;$(average)&lt;/code&gt;. However, if you combine the variables with further text, e.g. &lt;code&gt;My average: $(average)&lt;/code&gt;, the string representation of the variable value is automatically used and the new variable becomes a string, as well.&lt;/p&gt;
&lt;p&gt;As before, you cannot simply write &lt;code&gt;$(name) == "John"&lt;/code&gt; as a check expression in an &lt;a href="https://www.qftest.com/doc/manual/en/control.html#step_IfSequence"&gt;If node&lt;/a&gt; – the correct syntax would be &lt;code&gt;"$(name)" == "John"&lt;/code&gt;. But script expressions are preferably used without the &lt;code&gt;$&lt;/code&gt; notation, so it&amp;#8217;s better to use &lt;code&gt;rc.getStr("name") == "John"&lt;/code&gt; – or now &lt;code&gt;rc.vars.name == "John"&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Various small improvements&lt;/h2&gt;
&lt;p&gt;These changes to the QF-Test variable system also allowed us to integrate other long-awaited features into QF-Test 9: The standard procedures and the special &lt;a href="https://www.qftest.com/doc/manual/en/user_variables.html#usec_externaldata"&gt;&amp;#8220;qftest&amp;#8221;-group&lt;/a&gt; now return their values as objects, as seen above.&lt;/p&gt;
&lt;p&gt;It is now also possible in many places to hide values in variables using the context menu and only evaluate them again at runtime with &lt;code&gt;${decrypt:...}&lt;/code&gt; without the true values appearing in the run log.&lt;/p&gt;
&lt;p&gt;Also the &lt;a href="https://www.qftest.com/doc/manual/en/processes.html#step_ProcessClientStarter"&gt;&amp;#8220;Start process&amp;#8221; node&lt;/a&gt; now accepts a list object as a parameter, which makes it possible to implement start nodes with a variable number of parameters much more easily.&lt;/p&gt;
&lt;p&gt;These are small things, but they all contribute to making working and testing with QF-Test even more comfortable.&lt;/p&gt;
&lt;h2&gt;Outlook&lt;/h2&gt;
&lt;p&gt;If you have made it this far, you will have noticed that the topic is complex and certainly cannot be covered exhaustively here.&lt;/p&gt;
&lt;p&gt;The developers behind QF-Test will provide details in an upcoming special webinar on the topic of object variables – and the &lt;a href="https://www.qftest.com/doc/manual/en/manual.html"&gt;newly redesigned QF-Test manual&lt;/a&gt; also explains variables in detail.&lt;/p&gt;</content><category term="blog"/><category term="how-to"/></entry><entry><title>QF-Test 9 available</title><link href="https://www.qftest.com/en/company/news/qf-test-9-available.html" rel="alternate"/><published>2025-02-20T00:00:00+01:00</published><updated>2025-02-20T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-02-20:/en/company/news/qf-test-9-available.html</id><summary type="html">&lt;p&gt;The new version QF-Test 9 supports you in the automated testing of your websites or web applications for compliance with established accessibility standards.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The new version QF-Test 9 supports you in the automated testing of your websites or web applications for compliance with established accessibility standards.&lt;/p&gt;
&lt;p&gt;We also added object-based variables to QF-Test and completely revised our manual, including navigation and local full-text search. There are many more features to discover like e.g. the revised manual and a new search and filter function in the UI inspector. Download QF-Test 9 now and start testing!&lt;/p&gt;</content><category term="news"/></entry><entry><title>QF-Test 9 now available: Automated accessibility testing of web applications</title><link href="https://www.qftest.com/en/company/news/newsletters/2025-02-qftest9.html" rel="alternate"/><published>2025-02-20T00:00:00+01:00</published><updated>2025-02-20T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-02-20:/en/company/news/newsletters/2025-02-qftest9.html</id><summary type="html">&lt;p&gt;Automated accessibility testing of web applications, Training dates and more, News and Blogs around accessibility testing, Video of special webinar &amp;#8220;Efficient end-to-end testautomation&amp;#8221;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Hello dear QF-Test users!&lt;/p&gt;
&lt;p&gt;Making your web content accessible to everyone is no longer optional, but often a must – at least when the German Accessibility Improvement Act (BFSG) comes into force in June 2025. Our new version &lt;a href="https://services.qftest.com/en/download/"&gt;QF-Test 9&lt;/a&gt; can now support you in the automated testing of your websites or web applications for compliance with established &lt;strong&gt;accessibility&lt;/strong&gt; standards.&lt;/p&gt;
&lt;p&gt;We also added &lt;strong&gt;object-based variables&lt;/strong&gt; to QF-Test and completely revised our &lt;strong&gt;manual&lt;/strong&gt;, including navigation and local full-text search. Find out more in the highlights below.&lt;/p&gt;
&lt;p&gt;Best wishes,&lt;br /&gt;
 your QFS team&lt;/p&gt;
&lt;h2&gt;QF-Test Version 9&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://services.qftest.com/en/download/"&gt;&lt;img alt="Download Button QF-Test" src="/newsletters/resources/Download-Button-NL-fin.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download &lt;a href="https://services.qftest.com/en/download/"&gt;QF-Test version 9&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;See the new features in our &lt;strong&gt;release video&lt;/strong&gt; &amp;#8220;&lt;a href="https://services.qftest.com/en/download/"&gt;Automatically test the accessibility of your web application with QF-Test 9&lt;/a&gt;&amp;#8221;&lt;/li&gt;
&lt;li&gt;To the &lt;a href="https://www.qftest.com/doc/manual/en/history.html"&gt;Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Highlights in QF-Test 9&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.qftest.com/doc/manual/en/user_accessibility.html#usec_accessibility"&gt;&lt;img alt="" src="/newsletters/resources/sc-a11y-3.png" /&gt;&lt;/a&gt;With QF-Test 9 you can automatically test your websites and web applications for &lt;strong&gt;accessibility&lt;/strong&gt; and take important steps towards compliance with BFSG, WCAG and other standards. In addition to all test modules of the proven axe-core library, we also offer the testing of graphics for required color contrasts. Each test run is complemented by an interactive report containing accurate screenshots and solution proposals.&lt;a href="https://www.qftest.com/doc/manual/en/user_scripting.html#usec_scripting"&gt;&lt;img alt="" src="/newsletters/resources/sc-objectvars-1.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Our power users will be thrilled about the new &lt;strong&gt;object-based variable concept&lt;/strong&gt;. QF-Test variables are no longer limited to strings &amp;ndash; you can now also store lists, UI components, images and arbitrary data structures.&lt;br /&gt;
 See also our latest blog about &lt;a href="/en/blog.html"&gt;Objects in QF-Test variables&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.qftest.com/doc/manual/en/manual.html"&gt;&lt;img alt="" src="/newsletters/resources/sc-manual-1.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Our &lt;strong&gt;HTML manual&lt;/strong&gt; has been completely revised for QF-Test 9. With its integrated navigation and lightning-fast full-text search, you always keep an overview &amp;ndash; now also in dark mode.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.qftest.com/doc/manual/en/user_componentinspection.html#usec_componentinspection"&gt;&lt;img alt="" src="/newsletters/resources/sc-inspector-filter-1.png" /&gt;&lt;/a&gt;The &lt;strong&gt;UI inspector&lt;/strong&gt;, our powerful tool for understanding QF-Test&amp;#8217;s live view of your application, now has search and filter function so you won&amp;#8217;t get lost even in deeply nested hierarchies.&lt;/p&gt;
&lt;p&gt;There are many more features to discover in QF-Test 9 such as an &lt;strong&gt;&amp;#8221;@option&amp;#8221;-Doctag&lt;/strong&gt;. All details can be found in the &lt;a href="https://www.qftest.com/doc/manual/en/history.html"&gt;Release Notes&lt;/a&gt;. Please also take a look at the notes on &lt;a href="https://www.qftest.com/doc/manual/en/history.html#incompatibilities_9_0"&gt;possibly incompatible changes&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Save the date: Events in 2025&lt;/h2&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/training.html"&gt;&lt;img alt="Training QF-Test Icon" src="/newsletters/resources/Schulung-hellblau.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;QF-Test Basics: Training via Webinar&lt;/strong&gt;&lt;br /&gt;
&lt;a href="/en/support/training-consulting/training.html#a30295-659e55fa94d68760261203"&gt;March 17-20, 2025, German&lt;/a&gt;&lt;br /&gt;
&lt;a href="/en/support/training-consulting/training.html#a30295-6613a7774f6b6588956332"&gt;March 24-27, 2025, English&lt;/a&gt;&lt;br /&gt;
 4 days, 2 × 2,5 hours each&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Effective and rapid knowledge transfer in small groups up to a maximum of 8 participants&lt;/li&gt;
&lt;li&gt;Interaction with the trainers and asking questions are possible at any time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;➜ &lt;a href="https://services.qftest.com/en/support/contact/"&gt;Sign up now&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Would you like a &lt;a href="/en/support/training-consulting/training.html#c30865"&gt;training course&lt;/a&gt; which is individually tailored to your company? Just send us an email to &lt;a href="https://services.qftest.com/en/support/contact/"&gt;service@qftest.com&lt;/a&gt;.  &lt;/p&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/webinars.html#c34103"&gt;&lt;img alt="special webinar QF-Test Icon" src="/newsletters/resources/Spezialwebinar-Accessibility.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Free special webinar&lt;/strong&gt;&lt;br /&gt;
&lt;a href="/en/support/training-consulting/webinars.html#c34103"&gt;Web Accessibility Testing with QF-Test&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;May 19, 2025, 3:30 PM (CEST)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;By June 28 of this year, business websites within the EU must be accessible.&lt;br /&gt;
 But what does accessibility mean in a web context? What do providers have to pay attention to?&lt;br /&gt;
 And above all: How can QF-Test support you in meeting the legal requirements?&lt;/p&gt;
&lt;p&gt;In this webinar, we will give a brief introduction to web accessibility and present the new accessibility testing features of QF-Test.&lt;/p&gt;
&lt;p&gt;➜&lt;a href="/en/support/training-consulting/webinars.html#c34103"&gt;Sign up now for free special webinar&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ll publish the &lt;a href="/en/support/training-consulting/webinars.html#c21743"&gt;recording&lt;/a&gt; (without the Q&amp;amp;A) afterwards. Special webinar in German: 10:30 a.m.&lt;/p&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/training.html#a30295-654c8d5cec687736087741"&gt;&lt;img alt="Online QF-Test Expert Day Icon" src="/newsletters/resources/Expertentag-hellblau.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Online Expert Day&lt;/strong&gt;&lt;br /&gt;
&lt;a href="/en/support/training-consulting/training.html#a30295-654c8d5cec687736087741"&gt;Toolbox for stable component detection of web applications&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;May 26, 2025, 2 × 2,5 h, in German&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Following the great success of the previous Expert Days, an English version has now been scheduled. In this online training, we will dive deeply into QF-Test and show you how to optimize the interaction with your web application. With practical exercises on special topics and individual answers to your personal questions, we will ensure that you get the most out of the training. Register now and make your testing processes even more efficient.&lt;/p&gt;
&lt;p&gt;➜&lt;a href="/en/support/training-consulting/training.html#a30295-654c8d5cec687736087741"&gt;Details, pricing and registration&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;News&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Accessibility testing for web applications:&lt;/strong&gt; The online magazine “Informatik Aktuell” has published an interesting article on the topic of accessibility with several approaches and considerations. QF-Test will also provide accessibility tests for websites from the next version.&lt;br /&gt;
   ➜&lt;a href="https://www.informatik-aktuell.de/entwicklung/methoden/automatisierte-barrierefreiheitstests.html"&gt;To the German article on Informatik-aktuell.de&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accessibility testing: QF-Test compared to other tools&lt;/strong&gt; &amp;ndash; Tobias Kirsch, Senior Software Engineer at Adesso evaluates QF-Test beta test developer version with a11y checks.&lt;br /&gt;
   ➜&lt;a href="https://www.adesso.de/de/news/blog/qf-test-beta-test-entwicklerversion-mit-a11y-checks.jsp"&gt;Go to the German blog from Adesso&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;From a simple email to a memorable internship&lt;/strong&gt; – &amp;#8220;This feeling of being ready and useful very quickly was extremely satisfying and gave me a lot of motivation&amp;#8221; Find out more about Maxime&amp;#8217;s internship at QFS.&lt;br /&gt;
   ➜&lt;a href="/en/blog/article/from-a-simple-email-to-a-memorable-internship.html"&gt;Go to the blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;From our YouTube Channel&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Special webinar &amp;#8220;Efficient end-to-end test automation with QF-Test&amp;#8221;:&lt;/strong&gt; In this recording, Lilia Gargouri shows how QF-Test has been used at mgm technology partners for over ten years &amp;ndash; across five different UI technologies and ten locations, in a mixed team of developers, QA analysts and business analysts &amp;ndash; and how it has saved them thousands of hours of manual testing.&lt;br /&gt;
   ➜ &lt;a href="/en/support/videos.html#a23229-5f92b04658db8486169706"&gt;Watch the video now&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Visit our &lt;a href="https://www.youtube.com/channel/UCo6yiK49wlGY1Busavn0LZw"&gt;YouTube channel&lt;/a&gt; to subscribe and follow us on &lt;a href="https://www.linkedin.com/company/quality-first-software-gmbh-qfs/"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;</content><category term="newsletters"/></entry><entry><title>QF-Test Version 9.0</title><link href="https://www.qftest.com/en/product/release-notes-roadmap/qf-test-version-90.html" rel="alternate"/><published>2025-02-20T00:00:00+01:00</published><updated>2025-02-20T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-02-20:/en/product/release-notes-roadmap/qf-test-version-90.html</id><summary type="html">&lt;p&gt;QF-Test 9 introduces accessibility testing for web applications to ensure compliance with WCAG and other standards,&amp;#8230;&lt;/p&gt;</summary><content type="html">&lt;p&gt;based on the proven axe-core library but including additional features like testing the color contrast of graphical elements and a highly informative visual Report.&lt;/p&gt;
&lt;p&gt;QF-Test power users will be thrilled that &lt;strong&gt;variables&lt;/strong&gt; are no longer limited to strings. You can now also store lists, UI components, images and arbitrary data structures.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.qftest.com/doc/manual/en/history.html#features_9_0"&gt;Detailed Release Notes QF-Test Version 9.0&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Highlights in QF-Test 9&lt;/h2&gt;
&lt;div class="container width-normal plain image-left   " &gt;&lt;img class="container-image" src="/newsletters/resources/sc-a11y-3.png" alt=""&gt;&lt;div class="container-content" &gt;&lt;p&gt;With QF-Test 9 you can automatically test your websites and web applications for &lt;strong&gt;accessibility&lt;/strong&gt; and take important steps towards compliance with BFSG, WCAG and other standards. In addition to all test modules of the proven axe-core library, we also offer the testing of graphics for required color contrasts. Each test run is complemented by an interactive report containing accurate screenshots and solution proposals.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.qftest.com/doc/manual/en/user_accessibility.html"&gt;More Information&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="container width-normal plain image-left   " &gt;&lt;img class="container-image" src="/newsletters/resources/sc-objectvars-1.png" alt=""&gt;&lt;div class="container-content" &gt;&lt;p&gt;Our power users will be thrilled about the new &lt;strong&gt;object-based variable concept&lt;/strong&gt;. QF-Test variables are no longer limited to strings &amp;ndash; you can now also store lists, UI components, images and arbitrary data structures.
See also our latest blog about &lt;a href="/en/blog.html"&gt;Objects in QF-Test variables&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.qftest.com/doc/manual/en/user_scripting.html#usec_scripting"&gt;More Information&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="container width-normal plain image-left   " &gt;&lt;img class="container-image" src="/newsletters/resources/sc-manual-1.png" alt=""&gt;&lt;div class="container-content" &gt;&lt;p&gt;Our &lt;strong&gt;HTML manual&lt;/strong&gt; has been completely revised for QF-Test 9. With its integrated navigation and lightning-fast full-text search, you always keep an overview &amp;ndash; now also in dark mode.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.qftest.com/doc/manual/en/preface.html"&gt;More Information&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="container width-normal plain image-left   " &gt;&lt;img class="container-image" src="/newsletters/resources/sc-inspector-filter-1.png" alt=""&gt;&lt;div class="container-content" &gt;&lt;p&gt;The &lt;strong&gt;UI inspector&lt;/strong&gt;, our powerful tool for understanding QF-Test&amp;#8217;s live view of your application, now has search and filter function so you won&amp;#8217;t get lost even in deeply nested hierarchies.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.qftest.com/doc/manual/en/user_componentinspection.html"&gt;More Information&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;There are many more features to discover in QF-Test 9 such as &lt;strong&gt;an &amp;#8220;@option&amp;#8221; doctag&lt;/strong&gt;. All details can be found in the &lt;a href="https://www.qftest.com/doc/manual/en/history.html"&gt;Release Notes&lt;/a&gt;. Please also take a look at the notes on &lt;a href="https://www.qftest.com/doc/manual/en/history.html#incompatibilities_9_0"&gt;possibly incompatible changes&lt;/a&gt;.&lt;/p&gt;
&lt;h4 class=""&gt;&lt;p&gt;QF-Test Version 9.0.1&lt;/p&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;2025-03-12&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This maintenance release improves on some of the new features in QF-Test 9 like the manual or screenshots in reports for accessibility tests. It also comes with some updated libraries and fixes a few bugs.&lt;/p&gt;
&lt;h4 class=""&gt;&lt;p&gt;QF-Test Version 9.0.2&lt;/p&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;2025-04-09&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This maintenance release fixes a potential corruption of the system configuration file, improves client connectivity and adds object type support to data drivers. It also comes with some updated libraries and fixes a few bugs.&lt;/p&gt;
&lt;h4 class=""&gt;&lt;p&gt;QF-Test Version 9.0.3&lt;/p&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;2025-04-29&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This maintenance release updates the embedded JRE to Temurin 17.0.15 and fixes several bugs.&lt;/p&gt;
&lt;h4 class=""&gt;&lt;p&gt;QF-Test Version 9.0.4&lt;/p&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;2025-06-11&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This maintenance release adds support for Java 25 as well as for Eclipse / SWT 4.36 alias “2025-06” and fixes a number of bugs.&lt;/p&gt;
&lt;h4 class=""&gt;&lt;p&gt;QF-Test Version 9.0.5&lt;/p&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;2025-07-30&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This maintenance release raises the embedded JRE to Temurin 17.0.16, updates some embedded libraries and fixes a few small bugs.&lt;/p&gt;
&lt;h4 class=""&gt;&lt;p&gt;QF-Test Version 9.0.6&lt;/p&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;2025-09-10&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This maintenance release adds support for Eclipse / SWT 4.37 alias &amp;#8220;2025-09&amp;#8221;, updates a couple of bundled libraries and fixes a few minor bugs.&lt;/p&gt;</content><category term="releasenotes"/></entry><entry><title>Automatically test the accessibility of your web application with QF-Test 9</title><link href="https://www.qftest.com/en/support/videos/qftest-version-9-highlights.html" rel="alternate"/><published>2025-02-20T00:00:00+01:00</published><updated>2025-02-20T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-02-20:/en/support/videos/qftest-version-9-highlights.html</id><summary type="html">&lt;p&gt;In this video we show you how you can use QF-Test 9 to test the accessibility of your website or web application. It&amp;#8217;s quick and almost completely automatic! We will also demonstrate some of the other abilities QF-Test has gained with version 9.&lt;/p&gt;</summary><content type="html">&lt;p&gt;In this video we show you how you can use QF-Test 9 to test the accessibility of your website or web application. It&amp;#8217;s quick and almost completely automatic! We will also demonstrate some of the other abilities QF-Test has gained with version 9.&lt;/p&gt;
&lt;p&gt;QF-Test 9 introduces accessibility testing for web applications to ensure compliance with WCAG and other standards, based on the proven axe-core library but including additional features like testing the color contrast of graphical elements and a highly informative visual report. QF-Test power users will be thrilled that variables are no longer limited to strings. You can now also store lists, UI components, images and arbitrary other data structures.&lt;/p&gt;
&lt;h2&gt;Transcript&lt;/h2&gt;
&lt;p&gt;Hi! In this video we will show you how you can use QF-Test 9 to test the accessibility of your website or web application. It&amp;#8217;s quick and almost completely automatic! Also, we will demonstrate some of the other abilities QF-Test has gained with version 9. QF-Test is the tool for professional UI test automation.&lt;/p&gt;
&lt;p&gt;In terms of accessibility, a lot has changed with QF-Test 9. Firstly, we have significantly improved the usability and accessibility of QF-Test itself: Using QF-Test with a screen reader or just a keyboard works much better now than before.&lt;/p&gt;
&lt;p&gt;Secondly, QF-Test can now assist you with making your own applications more accessible. Version 9 introduces a whole new suite of accessibilty checks. With them, you can fully automatically test your web application for conformity to WCAG (&amp;#8220;wee-cag&amp;#8221;/&amp;#8221;double-u c a g&amp;#8221;), the Web Content Accessibility Guidelines – an important step towards compliance with the European Accessibility Act and other laws.&lt;/p&gt;
&lt;p&gt;As always with QF-Test, it could not be easier to get started with the new accessibility testing tools.&lt;/p&gt;
&lt;p&gt;Every good test in QF-Test starts with the Quickstart Wizard. In here you will find a new entry for our accessiblity tests.&lt;/p&gt;
&lt;p&gt;Basically, we only need to enter a URL and off we go. Using QF-Test 9, you can test the accessiblity of any website or web application.&lt;/p&gt;
&lt;p&gt;In the next step, you can optionally define exactly which checks QF-Test should perform. QF-Test version 9 can run every check included with the well-known and trusted open-source library &amp;#8220;axe-core&amp;#8221;. In addition, we offer color contrasts checks of graphics. Our goal is to introduce support for more aspects of accessiblity testing in future versions of QF-Test.&lt;/p&gt;
&lt;p&gt;But for now, wo don&amp;#8217;t need to do anything else. With one click, QF-Test now launches a browser and thoroughly puts our app through its paces.&lt;/p&gt;
&lt;p&gt;The best part of this feature, however, is the reporting built into QF-Test. For every test run, QF-Test generates a comprehensive technical run log.&lt;/p&gt;
&lt;p&gt;In addition, there&amp;#8217;s a clear and interactive HTML report. It visualizes which elements of your application failed which checks using lots of screenshots. It also offers tips on how to fix many of these issues.&lt;/p&gt;
&lt;p&gt;On the occasion of this update, we also upgraded the HTML report. Next to some visual upgrades, it now offers a dark mode, same as QF-Test itself. We also greatly improved the navigation through screenshots and messages.&lt;/p&gt;
&lt;p&gt;QF-Test 9 also includes a new example test suite which you can use as inspiration for your own tests. It&amp;#8217;s the only sample suite in QF-Test which will generate errors when run. But don&amp;#8217;t worry: In this case, this is on purpose - so you can get a realistic impression of what a typical QF-Test accessiblity report looks like.&lt;/p&gt;
&lt;p&gt;As with all features, you can find detailed information about everything new in QF-Test in the included manual. And in this version, we have completely overhauled the HTML manual.&lt;/p&gt;
&lt;p&gt;It now includes an intuitive navigation sidebar, so you always know where you are in the manual.&lt;/p&gt;
&lt;p&gt;We also added a lightning-fast search engine to the manual. Using it, you can effortlessly find what ever you are looking for – even without an internet connection.&lt;/p&gt;
&lt;p&gt;The new manual is much more readable and more informative. And most importantly, it also includes a cool dark mode.&lt;/p&gt;
&lt;p&gt;One chapter of the manual that has gotten especially interesting in QF-Test 9 is the one on &amp;#8220;Variables&amp;#8221;. With this update, we have extended our variable system by object variables. Now, you can no longer just store strings in QF-Test variables, but lists, UI components, images and any other data structure you want.&lt;/p&gt;
&lt;p&gt;This addition makes QF-Test more powerful than ever. For example, object variables allow you to define a variable as encrypted and keep it encrypted throughout your whole suite, and it&amp;#8217;s true value will never be logged.&lt;/p&gt;
&lt;p&gt;In many places in QF-Test, you can now choose a desired object type when defining a variable. And many procedures across the qfs.qft standard library will now optionally return objects.&lt;/p&gt;
&lt;p&gt;We also developed powerful new scripting APIs such as &amp;#8220;rc.vars&amp;#8221;. With &amp;#8220;rc.vars&amp;#8221;, it becomes incredibly intutive to read and write QF-Test variables.&lt;/p&gt;
&lt;p&gt;And of course, all of these additions are backwards-compatible. Your existing tests will perform exactly as before and you only have to dive into this topic once you are ready for it. But we are confident that especially our power users will quickly learn to use the new object variables in QF-Test 9 to great effect.&lt;/p&gt;
&lt;p&gt;Our UI inspector is still the best tool to keep tabs on how QF-Test sees your application in real-time. With QF-Test 9, we have enhanced the UI inspector with a search and filter function.&lt;/p&gt;
&lt;p&gt;Using it, you can get a better overview about which component classes show up where in your application. Especially with more complicated component hierarchies, this feature can be invaluable.&lt;/p&gt;
&lt;p&gt;Another very neat little addition to QF-Test 9 is the ability to set options only for the scope of a specific node.&lt;/p&gt;
&lt;p&gt;Often, you only need an option for a brief moment to override an otherwise useful default behavior of QF-Test. Thanks to the new &amp;#8220;option&amp;#8221; doctag, you can now summarize the annoying &amp;#8220;set option&amp;#8221;, &amp;#8220;perform action&amp;#8221;, &amp;#8220;reset option&amp;#8221; steps into one action.&lt;/p&gt;
&lt;p&gt;You can not only set the doctag on individual nodes, you can also set it on an entire test step - or any other sequence. The option will then apply for all nodes that are part of that sequence.&lt;/p&gt;
&lt;p&gt;And that&amp;#8217;s not even everything that&amp;#8217;s new in QF-Test 9. There are a ton of smaller improvements and features. Visit our website and take a look at the full release notes to learn about all the details.&lt;/p&gt;
&lt;p&gt;Not convinced yet? Try QF-Test 9 for yourself today! You can download QF-Test for free at www.qftest.com and start testing right away.&lt;/p&gt;</content><category term="videos"/><category term="releasevideos"/></entry><entry><title>From a simple email to a memorable internship</title><link href="https://www.qftest.com/en/blog/article/from-a-simple-email-to-a-memorable-internship.html" rel="alternate"/><published>2025-02-10T00:00:00+01:00</published><updated>2025-02-10T00:00:00+01:00</updated><author><name>Maxime Mouffron</name></author><id>tag:www.qftest.com,2025-02-10:/en/blog/article/from-a-simple-email-to-a-memorable-internship.html</id><summary type="html">&lt;p&gt;In my 21 years I never left France before. And suddenly, I am driving a thousand kilometers to live in Germany for three months. How did this happen?&lt;/p&gt;</summary><content type="html">&lt;p&gt;In my 21 years, I never left France before. And suddenly, I am driving a thousand kilometers to live in Germany for three months. How did this happen?&lt;/p&gt;
&lt;p&gt;Soon after I began working with QF-Test at Thales, and since I am the only person on my team working with this software, I decided that it might be fun to learn more about QF-Test directly next to the people who built it. So, I sent an email, and a few days later, I got an interview with QFS.&lt;/p&gt;
&lt;p&gt;It only took a week or two to get a definitive answer, and I left for Germany on the 30th of July. Of course – because I like stupid challenges – I decided to drive to Leipzig, from Paris, on my motorcycle. 14 hours of riding later, through rain and sunshine, I finally arrived in Leipzig. Two days later, I started working.&lt;/p&gt;
&lt;p&gt;Working at QFS was a really enriching and weird (in a good way) experience. The work culture is completely different from what I am used to, whether it&amp;#8217;d be at Thales or other smaller companies. Coffee break? 3 minutes. &lt;em&gt;3 minutes!?&lt;/em&gt; Fastest I ever managed was 10! Maybe we are a bit too much into coffee in France. Or is it just an excuse not to work? I&amp;#8217;ll let you decide. Same goes for the lunch break. If we go out in France, at a restaurant, it&amp;#8217;ll be for at least an hour and a half. In Germany, 30 minutes is all you need. These are only small things, but it shocked me how much we love not to work during working hours in France.&lt;/p&gt;
&lt;p&gt;About the actual work: I have never seen such a good cohesion in a team as at QFS. Communication was smooth, not too many meeting, so we actually had time to work. And the team is awesome. Found a bug? Have an issue? A question? Just ask or talk about it, and you&amp;#8217;ll get the answer, or the bug fixed. And even as an intern, a new person working at the company, the onboarding was pretty smooth. Everything is done logically and is easily understandable. It didn&amp;#8217;t take me more than a week to understand most of my job and start working. This feeling of being ready and useful very quickly was extremely satisfying and gave me a lot of motivation to perform my tasks.&lt;/p&gt;
&lt;p&gt;The tasks were satisfying as well. To be given a task, some time, and some liberties to do it, without having a strict deadline, is really comfortable. And when it is done, and everybody is happy about it, it feels even better. I don&amp;#8217;t have the words to explain it better, but trust me, it was a pleasure working at QFS.&lt;/p&gt;
&lt;p&gt;This internship also allowed me to visit and live in a foreign country. As a first timer, this was a bit difficult. Going to Aldi, the barber, or the bakery for the first time felt like I had never done it before. But in the end, it is just like everywhere else. It is &lt;em&gt;not that hard&lt;/em&gt;. I also got to visit the countryside, and I even made a rider friend along the way. I got to ride very fast, to see incredible landscapes (The Zugspitze with Gregor and Tina!), towns, to feel the german weather (not the best…) and to meet new people.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Maxime on his favorite mode of transportation" src="/blog/resources/maxim-2.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Even though I loved my stay in Germany, going back to France was a relief. I got my habits back, my birds, my cars, my gym, everything. But I would go back to Germany if given the opportunity, no doubt.&lt;/p&gt;
&lt;p&gt;In conclusion: QFS is an amazing company, leaded by amazing people, and I understand why it is considered such &lt;a href="/en/company/jobs/great-place-to-work.html"&gt;a great place to work&lt;/a&gt;. I learned a lot, and am ready to get QF-Test operational at Thales very soon, as well as making it more widely used across our different teams.&lt;/p&gt;</content><category term="blog"/><category term="company"/></entry><entry><title>Accessibility testing for web applications: Three approaches and additional considerations</title><link href="https://www.qftest.com/en/company/news/accessibility-testing-for-web-applications-three-approaches-and-additional-considerations.html" rel="alternate"/><published>2025-02-06T00:00:00+01:00</published><updated>2025-02-06T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-02-06:/en/company/news/accessibility-testing-for-web-applications-three-approaches-and-additional-considerations.html</id><content type="html">&lt;p&gt;The online magazine &amp;#8220;Informatik Aktuell&amp;#8221; has published an article on &amp;#8220;Accessibility testing for web applications: Three approaches and additional considerations&amp;#8221;. QF-Test will also provide accessibility tests for websites from the next version.&lt;/p&gt;</content><category term="news"/></entry><entry><title>How does QF-Test handle mixed testing environments (e.g., Desktop and Web applications)?</title><link href="https://www.qftest.com/en/product/faq/handling-mixed-testing-environments.html" rel="alternate"/><published>2025-02-01T00:00:00+01:00</published><updated>2025-02-01T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-02-01:/en/product/faq/handling-mixed-testing-environments.html</id><summary type="html">&lt;p&gt;For mixed testing environments, we recommend the &lt;strong&gt;QF-Test Pro Edition&lt;/strong&gt;, as it includes &amp;#8230;&lt;/p&gt;</summary><content type="html">&lt;p&gt;&amp;#8230; all technologies and features and additionally supports hybrid applications. This allows you to combine tests for Desktop, Web, and Mobile applications flexibly. Our service team can advise on the best solution for your project.  &lt;/p&gt;
&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="https://services.qftest.com/en/support/contact/?type=consulting"  class="button scroll-animated green chevron"&gt;Contact Our Service Team&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;div class="flex-row justify-center my width-normal button-wrapper"&gt;
    &lt;a href="https://services.qftest.com/en/download/"  class="button scroll-animated green chevron"&gt;Download QF-Test&lt;svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"&gt;
    &lt;path d="M13.697 22.317l6.85-6.658L13.696 9 12 10.65l5.152 5.009L12 20.667z"&gt;
    &lt;/path&gt;
&lt;/svg&gt;&lt;/a&gt;
&lt;/div&gt;</content><category term="faqs"/><category term="faqeditions"/></entry><entry><title>Where can I report a bug in QF-Test</title><link href="https://www.qftest.com/en/product/faq/where-can-i-report-a-bug-in-qf-test.html" rel="alternate"/><published>2025-01-24T00:00:00+01:00</published><updated>2025-01-24T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-01-24:/en/product/faq/where-can-i-report-a-bug-in-qf-test.html</id><summary type="html">&lt;p&gt;Simply send us an email&lt;/p&gt;</summary><content type="html">&lt;p&gt;Send us a description of the issue via email to &lt;a href="mailto:support@qftest.com"&gt;support@qftest.com&lt;/a&gt; and we will have a look. Please make sure to provide as much information as possible, especially &lt;a href="/en/support/product-support.html" title="See test-suite and run-log"&gt;test suites and run logs&lt;/a&gt;.&lt;/p&gt;</content><category term="faqs"/><category term="faqbugreports"/></entry><entry><title>How can I suggest features (Feature requests) for QF-Test?</title><link href="https://www.qftest.com/en/product/faq/how-can-i-suggest-features-feature-requests-for-qf-test.html" rel="alternate"/><published>2025-01-23T00:00:00+01:00</published><updated>2025-01-23T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-01-23:/en/product/faq/how-can-i-suggest-features-feature-requests-for-qf-test.html</id><summary type="html">&lt;p&gt;Feature requests are always welcome&lt;/p&gt;</summary><content type="html">&lt;p&gt;Please send your ideas and wishes to &lt;a href="mailto:support@qftest.com"&gt;support@qftest.com&lt;/a&gt;.&lt;/p&gt;</content><category term="faqs"/><category term="faqbugreports"/></entry><entry><title>Are there any free offerings?</title><link href="https://www.qftest.com/en/product/faq/are-there-any-free-offerings.html" rel="alternate"/><published>2025-01-22T00:00:00+01:00</published><updated>2025-01-22T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-01-22:/en/product/faq/are-there-any-free-offerings.html</id><summary type="html">&lt;p&gt;Sure! Here is a list of our free offerings&lt;/p&gt;</summary><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="https://services.qftest.com/en/download/"&gt;Free Trial of QF-Test&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/support/training-consulting/webinars.html#c17992"&gt;Free Special Webinars&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;YouTube &lt;a href="/en/support/videos.html"&gt;Videos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.qftest.com/doc/tutorial/en/contents.html"&gt;Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.qftest.com/doc/manual/en/contents.html"&gt;Manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/blog.html"&gt;Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;During Evaluation: &lt;a href="/en/support/training-consulting/webinars.html#c19095"&gt;Free Starter Webinar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="faqs"/><category term="faqsupport"/></entry><entry><title>What about consulting for QF-Test?</title><link href="https://www.qftest.com/en/product/faq/what-about-consulting-for-qf-test.html" rel="alternate"/><published>2025-01-21T00:00:00+01:00</published><updated>2025-01-21T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-01-21:/en/product/faq/what-about-consulting-for-qf-test.html</id><summary type="html">&lt;p&gt;We offer consulting and often combine this with a workshop&lt;/p&gt;</summary><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/support/training-consulting/training.html#c30561"&gt;Supporting your PoC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/support/training-consulting/training.html#c30561"&gt;Consulting and workshops at your site or via Webinar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/support/training-consulting/training.html#c30561"&gt;Remote project accompaniment&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="faqs"/><category term="faqsupport"/></entry><entry><title>What about training for QF-Test?</title><link href="https://www.qftest.com/en/product/faq/what-about-training-for-qf-test.html" rel="alternate"/><published>2025-01-20T00:00:00+01:00</published><updated>2025-01-20T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-01-20:/en/product/faq/what-about-training-for-qf-test.html</id><summary type="html">&lt;p&gt;QF-Test training for beginners and advanced users in German and English takes place regularly&lt;/p&gt;</summary><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="/fr/support/formation-consultation/formation.html"&gt;Training at your site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/fr/support/formation-consultation/formation.html"&gt;Training at our site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/fr/support/formation-consultation/formation.html"&gt;Training via Webinar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="faqs"/><category term="faqsupport"/></entry><entry><title>Where can I get help troubleshooting?</title><link href="https://www.qftest.com/en/product/faq/where-can-i-get-help-troubleshooting.html" rel="alternate"/><published>2025-01-19T00:00:00+01:00</published><updated>2025-01-19T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-01-19:/en/product/faq/where-can-i-get-help-troubleshooting.html</id><summary type="html">&lt;p&gt;Please read this FAQ to see if your question has already been answered. If not please read on.&lt;/p&gt;</summary><content type="html">&lt;ul&gt;
&lt;li&gt;Additional information can be found in the &lt;a href="https://www.qftest.com/doc/manual/en/faq.html#app_faq" title="Technical FAQ"&gt;technical FAQ&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/product/get-started-with-qf-test.html"&gt;Get started&lt;/a&gt;: For when you&amp;#8217;re having trouble installing and licensing QF-Test.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.qftest.com/doc/tutorial/en/contents.html"&gt;Interactive tutorial&lt;/a&gt;: For getting started with QF-Test quickly (especially note the chapter &lt;a href="https://www.qftest.com/doc/tutorial/en/firsthelpjava.html#tut_firsthelpjava" title="Getting help"&gt;Getting help&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.qftest.com/doc/manual/en/contents.html"&gt;Manual&lt;/a&gt;: All further questions should be answered by our comprehensive manual.&lt;/li&gt;
&lt;li&gt;Context sensitive help: click the right mouse button on pretty much any part of the QF-Test UI and select &amp;#8220;What&amp;#8217;s this?&amp;#8221; to jump to the corresponding manual page.&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/support/videos.html"&gt;Videos&lt;/a&gt;: Check out our growing library of videos about various subjects for beginners and advanced users.&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/blog.html"&gt;Blog&lt;/a&gt;: We sometimes share helpful tips and tricks for using QF-Test on our blog.&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/support/product-support.html"&gt;Free email support&lt;/a&gt;: During your evaluation period of QF-Test we grant free support. This channel, including guaranteed response time, is also available to customers with a &lt;a href="/pdf/en/contract-maintenance-qf-test-2.0.pdf" title="Software Maintenance Agreement"&gt;maintenance contract&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</content><category term="faqs"/><category term="faqsupport"/></entry><entry><title>I have received a license file as attachment of an email. What shall I do with it?</title><link href="https://www.qftest.com/en/product/faq/i-have-recieved-a-license-file-as-attachment-of-an-email-what-shall-i-do-with-it.html" rel="alternate"/><published>2025-01-18T00:00:00+01:00</published><updated>2025-01-18T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-01-18:/en/product/faq/i-have-recieved-a-license-file-as-attachment-of-an-email-what-shall-i-do-with-it.html</id><summary type="html">&lt;p&gt;To answer this question, we have written a dedicated blog article&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="/en/blog/article/license-licensenew-licensetxt-licensedat-licenseold-licenseserver-whos-gonn.html"&gt;&amp;#8220;license&amp;#8221;, &amp;#8220;license.new&amp;#8221;, &amp;#8220;license.txt&amp;#8221;, &amp;#8220;license.dat&amp;#8221;, &amp;#8220;license.old&amp;#8221;, &amp;#8220;license.server&amp;#8221; … Who’s gonna know about that?&lt;/a&gt;&lt;/p&gt;</content><category term="faqs"/><category term="faqlicenses"/></entry><entry><title>What is the best way to get started with QF-Test?</title><link href="https://www.qftest.com/en/product/faq/what-is-the-best-way-to-get-started-with-qf-test.html" rel="alternate"/><published>2025-01-16T00:00:00+01:00</published><updated>2025-01-16T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-01-16:/en/product/faq/what-is-the-best-way-to-get-started-with-qf-test.html</id><summary type="html">&lt;p&gt;Download the trial version without registration and request a trial license now.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="/en/product/get-started-with-qf-test.html"&gt;Get started with QF-Test&lt;/a&gt;&lt;/p&gt;</content><category term="faqs"/><category term="faqeval"/></entry><entry><title>QF-Test special webinar “Efficient end-to-end test automation” on Feb. 3, 2025</title><link href="https://www.qftest.com/en/company/news/qf-test-special-webinar-efficient-end-to-end-test-automation-on-feb-3-2025.html" rel="alternate"/><published>2025-01-16T00:00:00+01:00</published><updated>2025-01-16T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-01-16:/en/company/news/qf-test-special-webinar-efficient-end-to-end-test-automation-on-feb-3-2025.html</id><content type="html">&lt;p&gt;We are starting the new year with an invitation to our exciting new special webinar by Lilia Gargouri, a proven expert in quality assurance and test automation and soon to be a member of the German Testing Board.&lt;/p&gt;</content><category term="news"/></entry><entry><title>QF-Test special webinar “Efficient end-to-end test automation” on Feb. 3, 2025</title><link href="https://www.qftest.com/en/company/news/newsletters/2025-01-efficient-test-automation.html" rel="alternate"/><published>2025-01-16T00:00:00+01:00</published><updated>2025-01-16T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-01-16:/en/company/news/newsletters/2025-01-efficient-test-automation.html</id><summary type="html">&lt;p&gt;Efficient end-to-end test automation, Training dates in 2025, News and Blogs to Plugin Development&lt;/p&gt;</summary><content type="html">&lt;p&gt;Hello dear QF-Test users!&lt;/p&gt;
&lt;p&gt;We are starting the new year with an invitation to our exciting new special webinar by Lilia Gargouri, a proven expert in quality assurance and test automation and soon to be a member of the German Testing Board.  &lt;/p&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/webinars.html"&gt;&lt;img alt="special webinar QF-Test Icon" src="/newsletters/resources/LiliaGargouri-SpecialWebinar.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How can we achieve higher quality with less effort?&lt;/strong&gt;&lt;br /&gt;
 This is the core question of Lilia Gargouri, Head of Quality Assurance at mgm technology partners.&lt;br /&gt;
 In this webinar, she shows how QF-Test has been used for over ten years in currently 22 projects at mgm &amp;ndash; with five different UI technologies and across ten locations, in a mixed team of developers, QA analysts and business analysts &amp;ndash; and how it saves them thousands of hours of manual testing.&lt;br /&gt;
 ➜&lt;a href="https://register.gotowebinar.com/register/9166252851011494492"&gt;Sign up now&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Best wishes and a good start in 2025,&lt;br /&gt;
 your QFS team&lt;/p&gt;
&lt;h2&gt;Save the date: Events in 2025&lt;/h2&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/training.html"&gt;&lt;img alt="QF-Test basic training icon" src="/newsletters/resources/Schulung-hellblau.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;QF-Test Basics: Training via Webinar&lt;/strong&gt;&lt;br /&gt;
&lt;a href="/en/support/training-consulting/training.html#a30295-659e55fa94d68760261203"&gt;March 10-13, 2025, German&lt;/a&gt;&lt;br /&gt;
&lt;a href="/en/support/training-consulting/training.html#a30295-6613a7774f6b6588956332"&gt;March 24-27, 2025, English&lt;/a&gt;&lt;br /&gt;
 4 days, 2 × 2,5 hours each&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Effective and rapid knowledge transfer in small groups up to a maximum of 8 participants&lt;/li&gt;
&lt;li&gt;Interaction with the trainers and asking questions are possible at any time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;➜ &lt;a href="https://services.qftest.com/en/support/contact/"&gt;Sign up now&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Would you like a &lt;a href="/en/support/training-consulting/training.html#c30865"&gt;training course&lt;/a&gt; which is individually tailored to your company? Just send us an email to &lt;a href="https://services.qftest.com/en/support/contact/"&gt;service@qftest.com&lt;/a&gt;.  &lt;/p&gt;
&lt;p&gt;&lt;a href="/en/support/training-consulting/training.html#a30295-654c8d5cec687736087741"&gt;&lt;img alt="QF-Test online expert day icon" src="/newsletters/resources/Expertentag-hellblau.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Online Expert Day&lt;/strong&gt;&lt;br /&gt;
&lt;a href="/en/support/training-consulting/training.html#a30295-654c8d5cec687736087741"&gt;Toolbox for stable component detection of web applications&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;May 26, 2025, 2 × 2,5 h, in German&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Following the great success of the previous Expert Days, an English version has now been scheduled. In this online training, we will dive deeply into QF-Test and show you how to optimize the interaction with your web application. With practical exercises on special topics and individual answers to your personal questions, we will ensure that you get the most out of the training. Register now and make your testing processes even more efficient.&lt;/p&gt;
&lt;p&gt;➜&lt;a href="/en/support/training-consulting/training.html#a30295-654c8d5cec687736087741"&gt;Details, pricing and registration&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;News&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Introduction to QF-Test Plugin Development&lt;/strong&gt; – We show you step by step using an example how to customize QF-Test to your needs to make your testing process more efficient.&lt;br /&gt;
   ➜&lt;a href="/en/blog/article/introduction-to-qf-test-plugin-development.html"&gt;Go to the blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extending the QF-Test Assertion API&lt;/strong&gt; &amp;ndash; A practical introduction.&lt;br /&gt;
   ➜&lt;a href="/en/blog/article/extending-the-qf-test-assertion-api.html"&gt;Go to the blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Visit our &lt;a href="https://www.youtube.com/channel/UCo6yiK49wlGY1Busavn0LZw"&gt;YouTube channel&lt;/a&gt; to subscribe and follow us on &lt;a href="https://www.linkedin.com/company/quality-first-software-gmbh-qfs/"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;</content><category term="newsletters"/></entry><entry><title>And where do I get this license file?</title><link href="https://www.qftest.com/en/product/faq/and-where-do-i-get-this-license-file.html" rel="alternate"/><published>2025-01-15T00:00:00+01:00</published><updated>2025-01-15T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-01-15:/en/product/faq/and-where-do-i-get-this-license-file.html</id><summary type="html">&lt;p&gt;You can request a free trial license valid for 4 weeks&lt;/p&gt;</summary><content type="html">&lt;p&gt;Request it using the &lt;a href="https://services.qftest.com/en/license/request/"&gt;trial request form&lt;/a&gt;. With this license you can evaluate QF-Test for your application without restrictions.&lt;/p&gt;</content><category term="faqs"/><category term="faqeval"/></entry><entry><title>Extending the QF-Test Assertion API – A practical introduction</title><link href="https://www.qftest.com/en/blog/article/extending-the-qf-test-assertion-api.html" rel="alternate"/><published>2025-01-14T00:00:00+01:00</published><updated>2025-01-14T00:00:00+01:00</updated><author><name>Pascal Bihler</name></author><id>tag:www.qftest.com,2025-01-14:/en/blog/article/extending-the-qf-test-assertion-api.html</id><summary type="html">&lt;p&gt;The API of the fluid check expressions in QF-Test is well equipped so that most checks can be written very easily. In some special cases, however, you may wish to extend the API, as is possible with chai.JS plugins. In this post, we show you how.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Since QF-Test 9 there is a new and comfortable way to check conditions in scripts: The &lt;a href="https://www.qftest.com/doc/manual/de/tech_scripting.html#sec_qfaa"&gt;QF-Test Assertion API&lt;/a&gt;, which is loosely based on the &lt;a href="https://www.chaijs.com/"&gt;chai.JS library known from Javascript&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In a Groovy script, for example, we can now write:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kt"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bar&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="kt"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;beverages&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;tea:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;chai&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;matcha&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;oolong&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="n"&gt;expect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;be&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;String&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;should&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;be&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bar&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="n"&gt;expect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;have&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lengthOf&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="n"&gt;expect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;beverages&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;have&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;property&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;tea&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lengthOf&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The API of the fluid check expressions is well equipped so that most checks can be written very easily. In some special cases, however, you may wish to extend the API, as is possible with &lt;a href="https://www.chaijs.com/plugins/"&gt;chai.JS plugins&lt;/a&gt;. For example, it would be nice if you could use the following expression to check whether a given string represents a valid JSON object:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kt"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;validJson&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;[1,2,3,&amp;quot;s&amp;quot;,{}&amp;quot;key&amp;quot;:&amp;quot;value&amp;quot;}]&amp;#39;&lt;/span&gt;
&lt;span class="kt"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;invalidJson&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;[{]&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;validJson&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;should&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;be&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;json&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;invalidJson&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;should&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;not&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;be&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;json&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;QF-Test offers an interface for such extensions of the Assertions API as well, which we would like to demonstrate in this blog post.&lt;/p&gt;
&lt;p&gt;To enable a dynamic extension of the API, a proxy object is created under the hood for each assertion whenever a test expression is executed. In addition to the standard methods of each assertion, this proxy also supports any methods that have been registered as extensions in the meantime. An interface definition in the form of an interface is first required for these extensions:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;de.qfs.lib.assertions.external&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;de.qfs.lib.assertions.Assertion&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;JsonAssertion&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;extends&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Assertion&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Assertion&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Please note that&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the interface is normally placed in the &lt;code&gt;en.qfs.lib.assertions.external&lt;/code&gt; package,&lt;/li&gt;
&lt;li&gt;it extends the existing &lt;code&gt;Assertion&lt;/code&gt; interface,&lt;/li&gt;
&lt;li&gt;and that each new API method in turn returns the assertion object itself.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This makes it possible to chain the method calls. The code to be executed can now be defined in a separate class that implements the interface and derives it from &lt;code&gt;en.qfs.lib.assertions.AssertionExtension&lt;/code&gt;. However, it is easier to do this directly in the interface definition as a &lt;code&gt;default&lt;/code&gt; implementation:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Assertion&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The implementation of the method does not yet do very much, it merely returns a reference to its own assertion object, as required. To perform or report the actual check, the inherited method &lt;code&gt;doAssert(condition, message, negatedMessage, expected, actual)&lt;/code&gt; must be called:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;condition&lt;/code&gt; is a boolean value or a function with a boolean return value that contains or returns the result of the check.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;message&lt;/code&gt; is a string that can be used for an error message or for the check performed in QF-Test &amp;ndash; the placeholder &lt;code&gt;#{this}&lt;/code&gt; is replaced by the checked object, &lt;code&gt;#{exp}&lt;/code&gt; by the expected value and &lt;code&gt;#{act}&lt;/code&gt; by the actual value (usually identical to the checked object).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;negatedMessage&lt;/code&gt; contains the message that is used for checks whose call chain contains a &lt;code&gt;not&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;expected&lt;/code&gt; contains the expected value.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;actual&lt;/code&gt; contains the actual value.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With the exception of &lt;code&gt;condition&lt;/code&gt;, all parameters are optional and can be omitted at the end of the parameter list.&lt;/p&gt;
&lt;p&gt;Our assertion method might now look like this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Assertion&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;doAssert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;isObjectJson&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;expected #{this} to be a json string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;expected #{this} not to be json string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;We have outsourced the actual check to a separate method in which we try to read the input as JSON and return &lt;code&gt;true&lt;/code&gt; if successful and &lt;code&gt;false&lt;/code&gt; if an error occurs:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;isObjectJson&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;_obj&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;instanceof&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;Json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ParseException&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that the expression &lt;code&gt;_obj()&lt;/code&gt; was used to access the object to be checked.&lt;/p&gt;
&lt;p&gt;In order to be able to use our new method in check expressions, it must be registered once with the &lt;code&gt;AssertionFactory&lt;/code&gt;. This factory is a singleton and provides the instance method &lt;code&gt;registerExtension(extension, overwrite)&lt;/code&gt; for this purpose:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;extension&lt;/code&gt; is the new assertion interface of the extension. Either a class that implements the interface or an object of such a class can be specified here.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;overwrite&lt;/code&gt; determines how to proceed with already registered methods of the same name. If &lt;code&gt;true&lt;/code&gt;, the method of the newly registered extension is preferred, with &lt;code&gt;false&lt;/code&gt; the previously registered one is.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The easiest way to register an extension is to do so when initializing a QF-Test plugin. &lt;a href="/en/blog/article/introduction-to-qf-test-plugin-development.html"&gt;A general description of how to build QF-Test plugins can be found in the previous blog article&lt;/a&gt;. For the plugin that provides our Assertion API extension, the corresponding plugin class could look like this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;de.qfs.apps.qftest.shared.QFTestPlugin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;de.qfs.lib.assertions.AssertionFactory&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;de.qfs.lib.assertions.external.JsonAssertion&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;JsonAssertionPlugin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;implements&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;QFTestPlugin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nd"&gt;@Override&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;AssertionFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;registerExtension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JsonAssertion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If you want to add &amp;#8220;properties&amp;#8221; to the call chain, please note that the associated methods must each be preceded by a &lt;code&gt;get&lt;/code&gt; &amp;ndash; the script engines &lt;em&gt;Jython&lt;/em&gt; or &lt;em&gt;Groovy&lt;/em&gt; then automatically convert the properties in the check expression into the corresponding method call.&lt;/p&gt;
&lt;p&gt;As an example, we want to extend our new API to include the check for &lt;a href="https://datatracker.ietf.org/doc/html/rfc8259#section-1"&gt;&amp;#8220;primitive&amp;#8221; JSON objects&lt;/a&gt;:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kt"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;primitiveObj&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;quot;String&amp;quot;&amp;#39;&lt;/span&gt;
&lt;span class="kt"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nonPrimitiveObj&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;[1,2,3]&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;primitiveObj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;should&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;be&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;primitive&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;json&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;nonPrimitiveObj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;should&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;not&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;be&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;primitive&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;json&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then we add the corresponding &lt;code&gt;getPrimitive&lt;/code&gt; method to our &lt;code&gt;JsonAssertion&lt;/code&gt; interface:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Assertion&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getPrimitive&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;primitive&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and add the test method:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;isObjectJson&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;primitive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AssertionUtil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;flagAsBoolean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;primitive&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;_obj&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;instanceof&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JsonValue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;primitive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;valueIsObjectOrArray&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;                                  &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isObject&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isArray&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;valueIsObjectOrArray&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ParseException&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A typical Assertion API scheme is used here: in the property method, a status value is set in the assertion object with &lt;code&gt;self().flag(name, value)&lt;/code&gt;, which is then retrieved during evaluation. To achieve this, the &lt;code&gt;self().flag(name)&lt;/code&gt; method returns the corresponding status value. To simplify matters, the class &lt;code&gt;en.qfs.lib.assertions.AssertionUtil&lt;/code&gt; offers the static helper methods &lt;code&gt;flagAsBoolean(assertion, name)&lt;/code&gt; and &lt;code&gt;flagAsString(assertion, name)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The message for the error case should also be adjusted to reflect the status:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Assertion&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;primitive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AssertionUtil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;flagAsBoolean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;primitive&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;descriptor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;primitive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;primitive &amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;doAssert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;isObjectJson&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;expected #{this} to be a &amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;descriptor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;json string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;expected #{this} not to be &amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;descriptor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;json string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Finally, in order to hide the internal details in the stack trace of the &lt;code&gt;AssertionError&lt;/code&gt; thrown in the event of an error, the test method can define itself as an entry point (&lt;em&gt;ssfi&lt;/em&gt; stands for &lt;em&gt;start stack function indicator&lt;/em&gt;)):&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Assertion&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;_ssfi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JsonAssertion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;json&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note: Due to the class loader used, extensions are currently restricted to &lt;strong&gt;Server&lt;/strong&gt; scripts and &lt;strong&gt;Groovy SUT&lt;/strong&gt; scripts.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://gitlab.com/qfs/qftest-plugins"&gt;code of the entire extension is available on GitLab&lt;/a&gt;.&lt;/p&gt;</content><category term="blog"/><category term="how-to"/></entry><entry><title>Is a trial version available for download?</title><link href="https://www.qftest.com/en/product/faq/is-a-trial-version-available-for-download.html" rel="alternate"/><published>2025-01-14T00:00:00+01:00</published><updated>2025-01-14T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-01-14:/en/product/faq/is-a-trial-version-available-for-download.html</id><summary type="html">&lt;p&gt;Yes. You can download the trial version without registration.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Get QF-Test on our &lt;a href="https://services.qftest.com/en/download/" title="Download test version"&gt;Download page&lt;/a&gt;. You can start your application with QF-Test and get a first impression of the tool and to check out the tutorials. To save your work you&amp;#8217;ll need a license.&lt;/p&gt;</content><category term="faqs"/><category term="faqeval"/></entry><entry><title>My boss doesn’t want to spend any money! What can I tell him/her?</title><link href="https://www.qftest.com/en/product/faq/my-boss-doesnt-want-to-spend-any-money-what-can-i-tell-himher.html" rel="alternate"/><published>2025-01-13T00:00:00+01:00</published><updated>2025-01-13T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-01-13:/en/product/faq/my-boss-doesnt-want-to-spend-any-money-what-can-i-tell-himher.html</id><summary type="html">&lt;p&gt;Thanks to the great usablity of QF-Test, testers can get off the ground quickly and efficiently. Combined with the low licensing fees, you can expect a quick return on investment&lt;/p&gt;</summary><content type="html">&lt;p&gt;Just compare the &lt;a href="/en/product/pricing.html"&gt;cost of QF-Test licenses&lt;/a&gt; with the cost of developers&amp;#8217; or testers&amp;#8217; wages and the cost of bugs detected after release – not to mention the damage to your company&amp;#8217;s reputation.&lt;/p&gt;
&lt;p&gt;If your boss is still on the fence, you can send them a link to our page &lt;a href="/en/company/references/testimonials/benefits-for-decision-makers.html" title="Benefits for decision-makers"&gt;Benefits for decision-makers&lt;/a&gt;.&lt;/p&gt;</content><category term="faqs"/><category term="faqwhy"/></entry><entry><title>What’s the point of test automation?</title><link href="https://www.qftest.com/en/product/faq/whats-the-point-of-test-automation.html" rel="alternate"/><published>2025-01-12T00:00:00+01:00</published><updated>2025-01-12T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-01-12:/en/product/faq/whats-the-point-of-test-automation.html</id><summary type="html">&lt;p&gt;Automated software testing reduces the time and money spent on quality assurance&lt;/p&gt;</summary><content type="html">&lt;p&gt;Comprehensive automated tests, executed regularly during software development, will help to find bugs at an early stage. The reproducible security achieved this way ensures higher quality and shorter time to market at lower maintenance expense.&lt;/p&gt;</content><category term="faqs"/><category term="faqwhy"/></entry><entry><title>I already do unit testing, why is that not enough?</title><link href="https://www.qftest.com/en/product/faq/i-already-do-unit-testing-why-is-that-not-enough.html" rel="alternate"/><published>2025-01-11T00:00:00+01:00</published><updated>2025-01-11T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-01-11:/en/product/faq/i-already-do-unit-testing-why-is-that-not-enough.html</id><summary type="html">&lt;p&gt;Though indispensable, unit tests can only test small parts of a system in isolation (&amp;#8220;steering wheel OK, motor OK&amp;#8221;)&lt;/p&gt;</summary><content type="html">&lt;p&gt;UI-based testing exercises an application as a whole, because a working steering wheel and motor in isolation (&lt;a href="/en/solutions/types-of-tests/unittest.html"&gt;unit tests&lt;/a&gt;) don&amp;#8217;t guarantee roadworthiness. For more, see our page &lt;a href="/en/company/references/testimonials/benefits-for-developers.html" title="What advantages does QF-Test offer developers?"&gt;Benefits for developers&lt;/a&gt;.&lt;/p&gt;</content><category term="faqs"/><category term="faqwhy"/></entry><entry><title>What are SmartIDs?</title><link href="https://www.qftest.com/en/product/faq/what-are-smartids.html" rel="alternate"/><published>2025-01-10T00:00:00+01:00</published><updated>2025-01-10T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-01-10:/en/product/faq/what-are-smartids.html</id><summary type="html">&lt;p&gt;SmartID is a technology first introduced in QF-Test 6.0. With it, referencing your application&amp;#8217;s components in QF-Test becomes much simpler than before&lt;/p&gt;</summary><content type="html">&lt;p&gt;Instead of recording a component and referencing it via its &amp;#8220;QF-Test ID&amp;#8221;, with a SmartID you can reference the UI element directy by its properties. For example, the SmartID &lt;code&gt;Button:label=OK&lt;/code&gt; references a button with the label &amp;#8220;OK&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Thanks to this technology it becomes possible to reference components much more precisely and intuitively, regardless of the SUT.&lt;/p&gt;
&lt;div class="anchor-wrapper"&gt;
    &lt;a href="https://www.qftest.com/en/blog/article/smartid-the-next-generation-of-component-recognition.html" class="container card scroll-animated width-normal clear imgfill   image-right"&gt;&lt;img class="container-image" src="/images/icons/streamline-icon-credit-card-check@212x212-gruen.svg" alt=""&gt;&lt;div class="container-content"&gt;&lt;div class="container-title"&gt;&lt;div class="container-title-text"&gt;SmartID – The next generation of component recognition&lt;/div&gt;&lt;/div&gt;

&lt;div class="entry-content"&gt;  &lt;p&gt;We are always working on improving component recognition in QF-Test. With QF-Test 6.0 we introduced a completely new paradigm: SmartID&lt;/p&gt;
&lt;/div&gt;

&lt;div class="container width-normal align-start justify-center row    " &gt;&lt;div class="container-content" &gt;&lt;address class="vcard author"&gt;
&lt;strong class="flex-row-dynamic gap-small"&gt;
                &lt;img src="/images/staff/max.jpg" height="60" width="60" class="author-profile-pic" alt="Max Melzer"&gt;
            Max Melzer
            &lt;/strong&gt;&lt;/address&gt;
&lt;div class="flex-column"&gt;&lt;div&gt;&lt;time class="published" datetime="2022-12-16T00:00:00+01:00"&gt;
        16/12/2022
&lt;/time&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;    &lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</content><category term="faqs"/><category term="faqgeneral"/></entry><entry><title>Introduction to QF-Test Plugin Development</title><link href="https://www.qftest.com/en/blog/article/introduction-to-qf-test-plugin-development.html" rel="alternate"/><published>2025-01-09T00:00:00+01:00</published><updated>2025-01-09T00:00:00+01:00</updated><author><name>Pascal Bihler</name></author><id>tag:www.qftest.com,2025-01-09:/en/blog/article/introduction-to-qf-test-plugin-development.html</id><summary type="html">&lt;p&gt;In this blog post we unveil the full potential of QF-Test plugins.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Some people may have stumbled over &lt;a href="https://www.qftest.com/doc/manual/en/tech_scripting.html#sec_plugindir"&gt;the &lt;code&gt;plugin&lt;/code&gt; directory in QF-Test&lt;/a&gt; and wondered why it is there and how to use it. In fact, the directory (with its subdirectories &lt;code&gt;qftest&lt;/code&gt; and &lt;code&gt;sut&lt;/code&gt;) serves multiple purposes:&lt;/p&gt;
&lt;p&gt;Upfront, if you place any &lt;code&gt;.jar&lt;/code&gt; file containing Java classes in that directory, they will be automatically added to the QF-Test and/or SUT classpath and therefore available for use in server or SUT script nodes, in data driver nodes (e.g. JDBC drivers) etc. If the library is placed in the &lt;code&gt;qftest&lt;/code&gt; subdirectory, the contained classes are only available within the main QF-Test process and server scripts, but not within the classpath of the tested application. If you place the library in &lt;code&gt;sut&lt;/code&gt;, you can use it within SUT scripts only. A library placed directly in &lt;code&gt;plugin&lt;/code&gt; is available in both context.&lt;/p&gt;
&lt;p&gt;In addition, it is possible to enhance the QF-Test test execution itself, or to add special functionality. Unforgotten is the &lt;a href="https://www.youtube.com/watch?v=qvroe4d-nxg"&gt;holistic plugin&lt;/a&gt;, which caused QF-Test to play &amp;#8220;characteristic&amp;#8221; sounds during test execution so users could listen to their tests running. While this example may be rather playful, we will see how to use this mechanism for more serious tasks.&lt;/p&gt;
&lt;p&gt;With QF-Test 8 and the &lt;a href="https://plugins.gradle.org/plugin/de.qfs.qftest"&gt;QF-Test Grade plugin 2.1.0&lt;/a&gt; we made the development of QF-Test plugins very comfortable &amp;ndash; it&amp;#8217;s time to take a deep dive into the topic.&lt;/p&gt;
&lt;p&gt;In this example, we will build add a plugin which extends QF-Test with an embedded web server that displays the current execution state. The final result can be found at &lt;a href="https://gitlab.com/qfs/qftest-plugins/webstatus-plugin"&gt;gitlab.com/qfs/qftest-plugins/webstatus-plugin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Technically, QF-Test plugins are also &lt;code&gt;.jar&lt;/code&gt; files which are placed in the &lt;code&gt;plugin&lt;/code&gt; folder. But they contain a specific pointer file in &lt;code&gt;META-INF/services&lt;/code&gt; which allows QF-Test to load the plugin class at runtime.&lt;/p&gt;
&lt;p&gt;For development, any IDE which supports Gradle builds can be used, for example IntelliJ. To follow along, create a new project, name it &lt;code&gt;webstatus&lt;/code&gt;, select &lt;em&gt;Gradle&lt;/em&gt; as build system and make sure that at least Java 17 is selected as JDK.&lt;/p&gt;
&lt;p&gt;&lt;img alt="New Project view in IntelliJ" src="/blog/resources/plugindev/1-new_project.png" /&gt;&lt;/p&gt;
&lt;p&gt;As a first step, we add the QF-Test Gradle plugin to the project by adding it to the &lt;code&gt;plugins&lt;/code&gt; section of the &lt;code&gt;build.gradle&lt;/code&gt; file:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;java&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;de.qfs.qftest&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;2.1.0&amp;#39;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If we now reload the project (e.g. using the reload button in the &amp;#8220;Gradle&amp;#8221; IntelliJ panel), Gradle will automatically download the latest QF-Test and add it to the project&amp;#8217;s &lt;code&gt;testImplementation&lt;/code&gt; dependencies.&lt;/p&gt;
&lt;p&gt;&lt;img alt="IntelliJ Gradle view" src="/blog/resources/plugindev/2-reload-gradle.png" /&gt;&lt;/p&gt;
&lt;p&gt;You can instruct the plugin to use the QF-Test installation you already have on your system by adding the &lt;code&gt;version = 'local'&lt;/code&gt; property in a new &lt;code&gt;qftest&lt;/code&gt; section of the &lt;code&gt;build.gradle&lt;/code&gt; file (If you did not install QF-Test at the default location, you can use the &lt;code&gt;versionDir&lt;/code&gt; property instead, as described in the &lt;a href="https://gitlab.com/qfs/qftest-gradle-plugin/-/tree/main/DemoProject#optional-gradlebuild-configuration"&gt;documentation of the QF-Test Gradle Plugin&lt;/a&gt;):&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;qftest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;local&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Until now, the instructions have been similar to any project which uses the QF-Test Gradle plugin for test execution. To put the project into &amp;#8220;QF-Test plugin development mode&amp;#8221;, we need to add another property to the &lt;code&gt;qftest&lt;/code&gt; section of &lt;code&gt;build.gradle&lt;/code&gt;:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;qftest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;local&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;pluginClass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;de.qfs.apps.qftest.plugins.WebStatusPlugin&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In our example &lt;code&gt;de.qfs.apps.qftest.plugins.WebStatusPlugin&lt;/code&gt; is the fully qualified class name of the plugin class we&amp;#8217;re about to develop. Since the QF-Test plugin will only be available in the QF-Test main process, we can tell the Gradle plugin to focus on this development environment:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;qftest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;local&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;pluginClass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;de.qfs.apps.qftest.plugins.WebStatusPlugin&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;devScopes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;qftest&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;// default: [&amp;#39;qftest&amp;#39;,&amp;#39;sut&amp;#39;]&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;After having setup the build system, we can start developing the plugin itself: Let&amp;#8217;s create a new class and let it implement &lt;code&gt;de.qfs.apps.qftest.shared.QFTestPlugin&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Skeleton of the plugin class" src="/blog/resources/plugindev/3-empty-class.png" /&gt;&lt;/p&gt;
&lt;p&gt;Since the Gradle plugin automatically extended the &lt;code&gt;implementation&lt;/code&gt; dependencies, the required QF-Test classes are directly available using code completion. As a first step, we simply add a &amp;#8220;Hello World&amp;#8221; output:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nd"&gt;@Override&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Hello plugin world!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;To start up QF-Test including the plugin, we can use the &lt;code&gt;startQFTest&lt;/code&gt; task of Gradle &amp;ndash; the Gradle Plugin will automatically take care of creating the required &lt;code&gt;services&lt;/code&gt; file and make the new class available to QF-Test:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt; &lt;/span&gt;%&lt;span class="w"&gt; &lt;/span&gt;./gradlew&lt;span class="w"&gt; &lt;/span&gt;startQFTest
Starting&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;Gradle&lt;span class="w"&gt; &lt;/span&gt;Daemon

&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Task&lt;span class="w"&gt; &lt;/span&gt;:startQFTest
Starting&lt;span class="w"&gt; &lt;/span&gt;QF-Test&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;local&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

BUILD&lt;span class="w"&gt; &lt;/span&gt;SUCCESSFUL&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;7s
&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;actionable&lt;span class="w"&gt; &lt;/span&gt;tasks:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;executed
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Our plugin class is compiled, QF-Test starts up &amp;ndash; but no output! What went wrong?&lt;/p&gt;
&lt;p&gt;By default, the &lt;code&gt;startQFTest&lt;/code&gt; task is used to start QF-Test interactively in a &amp;#8220;fire-and-forget&amp;#8221; manner &amp;ndash; no outputs are attached and the Gradle task does not wait until QF-Test is closed. To see the debug output, we must change the &lt;code&gt;fork&lt;/code&gt; property of the task, by adding this new definition to the &lt;code&gt;build.gradle&lt;/code&gt;:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;startQFTestAndWait&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;type:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;StartQFTestTask&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;fork&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now, we use this new task to start QF-Test, and our output becomes visible:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;%&lt;span class="w"&gt; &lt;/span&gt;./gradlew&lt;span class="w"&gt; &lt;/span&gt;startQFTestAndWait

&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Task&lt;span class="w"&gt; &lt;/span&gt;:startQFTestAndWait
Starting&lt;span class="w"&gt; &lt;/span&gt;QF-Test&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;local&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

Hello&lt;span class="w"&gt; &lt;/span&gt;plugin&lt;span class="w"&gt; &lt;/span&gt;world!
&amp;lt;&lt;span class="o"&gt;=========&lt;/span&gt;----&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;75&lt;/span&gt;%&lt;span class="w"&gt; &lt;/span&gt;EXECUTING&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;17s&lt;span class="o"&gt;]&lt;/span&gt;
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;:startQFTestAndWait
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;init()&lt;/code&gt; method is called very early during the startup of QF-Test or the SUT, as soon as the class has been loaded. You can distinguish different execution contexts by calling the static methods &lt;code&gt;isRunningInSUT()&lt;/code&gt; (i.e. SUT (&lt;code&gt;true&lt;/code&gt;) or QF-Test (&lt;code&gt;false&lt;/code&gt;)) and &lt;code&gt;isRunningInteractively()&lt;/code&gt; (interactive (&lt;code&gt;true&lt;/code&gt;) or batch mode (&lt;code&gt;false&lt;/code&gt;)) of the class &lt;code&gt;de.qfs.apps.qftest.shared.Util&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you want to delay execution until QF-Test has loaded or the SUT has been connected, you can listen for the &lt;code&gt;"qftest-loaded"&lt;/code&gt; or &lt;code&gt;"sut-loaded"&lt;/code&gt; notifications respectively:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;de.qfs.lib.notifications.DefaultNotificationCenter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;de.qfs.lib.notifications.Notification&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

&lt;span class="nd"&gt;@Override&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Plugin init&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;DefaultNotificationCenter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;addObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;qftestLoaded&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;qftest-loaded&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;DefaultNotificationCenter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;addObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sutLoaded&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;sut-loaded&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;qftestLoaded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Notification&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;QF-Test loaded&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;sutLoaded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Notification&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;SUT loaded&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Notifications are a powerful mechanism in QF-Test to send synchronous messages (= well defined Strings with optional additional data) in a decoupled way. The concept is well known &lt;a href="https://developer.apple.com/documentation/foundation/notificationcenter"&gt;from the Apple Foundation framework&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can also use notifications in your QF-Test scripts &amp;ndash; just type &amp;#8220;notifications.&amp;#8221; in a script and press &lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;Space&lt;/kbd&gt; to get a documentation about the available &lt;code&gt;UserNotifications&lt;/code&gt; and simplified sender and observer methods. We can also use such a &lt;code&gt;UserNotifications&lt;/code&gt; with the notification observer technique &amp;ndash; e.g. to monitor test execution state in a basic fashion (If compilation fails due to a class file version issue, make sure you&amp;#8217;re using at least JDK 17 for your project):&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;de.qfs.apps.qftest.extensions.qftest.TestRunEvent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;de.qfs.apps.qftest.extensions.qftest.TestSuiteNode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;de.qfs.apps.qftest.shared.script.modules.UserNotifications&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WebStatusPlugin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;implements&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;QFTestPlugin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Queue&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TestSuiteNode&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nodeStack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LinkedList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;running&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nd"&gt;@Override&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;DefaultNotificationCenter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;addObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;runStarted&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;UserNotifications&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;RUN_STARTED&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;DefaultNotificationCenter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;addObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;runStopped&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;UserNotifications&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;RUN_STOPPED&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;DefaultNotificationCenter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;addObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;nodeEntered&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;UserNotifications&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;NODE_ENTERED&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;DefaultNotificationCenter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;addObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;nodeExited&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;UserNotifications&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;NODE_EXITED&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;runStarted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Notification&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;notification&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;nodeStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;running&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;runStopped&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Notification&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;notification&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;running&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;nodeEntered&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Notification&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;notification&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;TestRunEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TestRunEvent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;notification&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getUserInfoValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;event&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;nodeStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNode&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;nodeExited&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Notification&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;notification&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;nodeStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;poll&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In order to present the current test execution state in the browser, we need an embedded web server delivering this information as a web page. Unfortunately, Java 17 (which is used to execute QF-Test) does not include a simple HTTP server module yet (this has only been introduced with Java 18). But a look in the &lt;code&gt;lib&lt;/code&gt; library of QF-Test reveals that the &lt;a href="https://undertow.io/"&gt;&lt;code&gt;undertow&lt;/code&gt; library&lt;/a&gt; is bundled, which includes a simple HTTP server class. When we add &lt;code&gt;'undertow'&lt;/code&gt; to the &lt;code&gt;devScopes&lt;/code&gt; property, the corresponding library bundled with QF-Test is automatically added to our &lt;code&gt;implementation&lt;/code&gt; dependencies:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;qftest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;local&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;pluginClass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;de.qfs.apps.qftest.plugins.WebStatusPlugin&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;devScopes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;qftest&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;undertow&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;With this library, we sketch out a simple &lt;code&gt;WebStatusServer&lt;/code&gt; class which returns the current execution state upon request:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;de.qfs.apps.qftest.plugins&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;io.undertow.Undertow&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;io.undertow.server.HttpServerExchange&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;io.undertow.util.Headers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WebStatusServer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;WebStatusServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WebStatusPlugin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Undertow&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Undertow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addHttpListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;running&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nodeStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;peek&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getType&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;: &amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Test execution running&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Test execution stopped&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="p"&gt;}}).&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRuntime&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;addShutdownHook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Undertow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ListenerInfo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;listenerInfo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getListenerInfo&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;iterator&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;QF-Test status available at &amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;listenerInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getProtcol&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;:/&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;listenerInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAddress&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;protected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HttpServerExchange&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;                          &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getResponseHeaders&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;REFRESH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getResponseSender&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;endExchange&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;We load this web server in the &lt;code&gt;WebStatusPlugin&lt;/code&gt; class as soon as QF-Test has loaded:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;qftestLoaded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Notification&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;notification&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;WebStatusServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;But unfortunately, the start of our plugin now fails:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c"&gt;% ./gradlew startQFTestAndWait&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;startQFTestAndWait&lt;/span&gt;
&lt;span class="n"&gt;Starting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;QF-Test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;(local)&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;...&lt;/span&gt;&lt;span class="c"&gt;) main de.qfs.lib.notifications.DefaultNotification.getDefaultExceptionHandler().ExceptionHandler.handleException(Throwable,Notification,Observer): (#147) exception: java.lang.NoClassDefFoundError: io/undertow/Undertow (...)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;undertow&lt;/code&gt; library appears to be bundled by QF-Test, but is not normally available in the default classpath, so we have to do some reflection calls to add the library to the classpath and instantiate it &amp;ndash; luckily the QF-Test &lt;code&gt;de.qfs.lib&lt;/code&gt; package has helper methods for these tasks:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;de.qfs.apps.qftest.shared.system.Native&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;de.qfs.lib.util.DynamicClassLoader&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;de.qfs.lib.util.Reflector&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;qftestLoaded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Notification&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;notification&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;ClassLoader&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getClass&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getClassLoader&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;DynamicClassLoader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;loadJarIntoClassLoader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;Native&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getVersionDir&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/lib/undertow.jar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;?&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;serverClass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;cl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;loadClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;de.qfs.apps.qftest.plugins.WebStatusServer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Reflector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createInstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serverClass&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;WebStatusPlugin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Could not start WebStatus server: &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;printStackTrace&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now start QF-Test, head over to [http://localhost:9000] and watch our test progress on every automatic reload!&lt;/p&gt;
&lt;p&gt;Finally, to ship this great new QF-Test plugin, we build an all-containing &lt;code&gt;.jar&lt;/code&gt; file using &lt;code&gt;./gradlew jar&lt;/code&gt; and copy the resulting file from the &lt;code&gt;build/libs&lt;/code&gt; folder to the &lt;code&gt;plugin/qftest&lt;/code&gt; folder of QF-Test, so it is available in all our test runs.&lt;/p&gt;
&lt;p&gt;In an upcoming blog post, we&amp;#8217;ll see how easy it is to use the QF-Test plugin mechanism to extend the new QF-Test 8 Assertion API. Until then, let this post inspire your creativity!&lt;/p&gt;</content><category term="blog"/><category term="how-to"/></entry><entry><title>How can I extend my QF-Test maintenance contract?</title><link href="https://www.qftest.com/en/product/faq/how-can-i-extend-my-qf-test-maintenance-contract.html" rel="alternate"/><published>2025-01-09T00:00:00+01:00</published><updated>2025-01-09T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-01-09:/en/product/faq/how-can-i-extend-my-qf-test-maintenance-contract.html</id><summary type="html">&lt;p&gt;Would you like to renew your maintenance contract, support contract or license agreement?&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://services.qftest.com/en/support/contact/?type=purchase"&gt;Just get in touch with us&lt;/a&gt;&lt;/p&gt;</content><category term="faqs"/><category term="faqmaintenance"/></entry><entry><title>Is QF-Test a low-code/no-code tool?</title><link href="https://www.qftest.com/en/product/faq/is-qf-test-a-low-codeno-code-tool.html" rel="alternate"/><published>2025-01-09T00:00:00+01:00</published><updated>2025-01-09T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-01-09:/en/product/faq/is-qf-test-a-low-codeno-code-tool.html</id><summary type="html">&lt;p&gt;Yes! QF-Test is designed as low-code software so that you can develop, run and maintain your tests without programming knowledge using &amp;#8220;capture and replay&amp;#8221;.&lt;/p&gt;</summary><content type="html">&lt;p&gt;However, experienced developers can also interact with QF-Test and your SUT at the script level at any time to develop even more powerful automations.&lt;/p&gt;</content><category term="faqs"/><category term="faqgeneral"/></entry><entry><title>How much does QF-Test cost?</title><link href="https://www.qftest.com/en/product/faq/how-much-does-qf-test-cost.html" rel="alternate"/><published>2025-01-08T00:00:00+01:00</published><updated>2025-01-08T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-01-08:/en/product/faq/how-much-does-qf-test-cost.html</id><summary type="html">&lt;p&gt;License types and prices for QF-Test are listed on our Prices page&lt;/p&gt;</summary><content type="html">&lt;p&gt;You can choose between purchasing a persistent license or a subscription license. All QF-Test licenses are &amp;#8220;floating&amp;#8221; within a network.&lt;/p&gt;
&lt;p&gt;&lt;a href="/en/product/pricing.html"&gt;Prices&lt;/a&gt;&lt;/p&gt;</content><category term="faqs"/><category term="faqgeneral"/></entry><entry><title>When can I use the latest QF-Test version?</title><link href="https://www.qftest.com/en/product/faq/when-can-i-use-the-latest-qf-test-version.html" rel="alternate"/><published>2025-01-08T00:00:00+01:00</published><updated>2025-01-08T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-01-08:/en/product/faq/when-can-i-use-the-latest-qf-test-version.html</id><summary type="html">&lt;p&gt;Your QF-Test license knows your maintenance period and you can always download and use the latest version from our homepage&amp;#8230;&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://services.qftest.com/en/download/"&gt;Download&lt;/a&gt;&lt;/p&gt;</content><category term="faqs"/><category term="faqmaintenance"/></entry><entry><title>What do the version numbers mean e.g. QF-Test Version 7.1.2?</title><link href="https://www.qftest.com/en/product/faq/what-do-the-version-numbers-mean-eg-qf-test-version-712.html" rel="alternate"/><published>2025-01-07T00:00:00+01:00</published><updated>2025-01-07T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-01-07:/en/product/faq/what-do-the-version-numbers-mean-eg-qf-test-version-712.html</id><summary type="html">&lt;p&gt;The QF-Test version numbers consist of three parts, major~, medium~ and minor version.&lt;/p&gt;</summary><content type="html">&lt;p&gt;QF-Test licenses are generally valid for all minor versions within the same major.medium version, plus all older QF-Test versions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Minor upgrades&lt;/strong&gt; are free of charge&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Major&lt;/strong&gt; and &lt;strong&gt;Medium upgrades&lt;/strong&gt; are liable to costs or included in the maintenance contract.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have an old QF-Test version and want to upgrade it, &lt;a href="mailto:sales@qftest.com"&gt;please contact us directly&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Major upgrade&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;major&lt;/strong&gt; upgrade refers to the &amp;#8220;&lt;strong&gt;first&lt;/strong&gt;&amp;#8221; version number, e.g. from &lt;strong&gt;6&lt;/strong&gt;.4.3 to &lt;strong&gt;7&lt;/strong&gt;.0.0.&lt;/p&gt;
&lt;p&gt;Medium upgrade&lt;/p&gt;
&lt;p&gt;A&lt;strong&gt;medium&lt;/strong&gt;upgrade refers to the version number in the &amp;#8220;&lt;strong&gt;middle&lt;/strong&gt;&amp;#8221; , e.g. from 7.&lt;strong&gt;0&lt;/strong&gt;.0 to 7.&lt;strong&gt;1&lt;/strong&gt;.0.&lt;/p&gt;
&lt;p&gt;Minor upgrade&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Minor&lt;/strong&gt; upgrades &lt;strong&gt;(=Updates)&lt;/strong&gt; e.g. from 7.0.&lt;strong&gt;1&lt;/strong&gt; to 7.0.&lt;strong&gt;2&lt;/strong&gt; are in general free of charge as they mainly contain bug fixes and are part of the product warranty.&lt;/p&gt;</content><category term="faqs"/><category term="faqmaintenance"/></entry><entry><title>Who is using QF-Test?</title><link href="https://www.qftest.com/en/product/faq/who-is-using-qf-test.html" rel="alternate"/><published>2025-01-07T00:00:00+01:00</published><updated>2025-01-07T00:00:00+01:00</updated><author><name>Quality First Software</name></author><id>tag:www.qftest.com,2025-01-07:/en/product/faq/who-is-using-qf-test.html</id><summary type="html">&lt;p&gt;More than 1,400 companies in over 60 countries rely on QF-Test. More than 8,500 licenses are in use from small companies up to the largest IT service providers&lt;/p&gt;</summary><content type="html">&lt;p&gt;For examples, see our &lt;a href="/en/company/references.html" title="References"&gt;References page&lt;/a&gt;.&lt;/p&gt;</content><category term="faqs"/><category term="faqgeneral"/></entry></feed>