- Getting Started
- Setup and Configuration
- Automation Projects
- Dependencies
- Types of Workflows
- Control Flow
- File Comparison
- Automation Best Practices
- Source Control Integration
- Debugging
- Logging
- The Diagnostic Tool
- Workflow Analyzer
- About Workflow Analyzer
- ST-NMG-001 - Variables Naming Convention
- ST-NMG-002 - Arguments Naming Convention
- ST-NMG-004 - Display Name Duplication
- ST-NMG-005 - Variable Overrides Variable
- ST-NMG-006 - Variable Overrides Argument
- ST-NMG-008 - Variable Length Exceeded
- ST-NMG-009 - Prefix Datatable Variables
- ST-NMG-011 - Prefix Datatable Arguments
- ST-NMG-012 - Argument Default Values
- ST-NMG-016 - Argument Length Exceeded
- ST-NMG-017 - Class name matches default namespace
- ST-DBP-002 - High Arguments Count
- ST-DBP-003 - Empty Catch Block
- ST-DBP-007 - Multiple Flowchart Layers
- ST-DPB-010 - Multiple instances of [Workflow] or [Test Case]
- ST-DBP-020 - Undefined Output Properties
- ST-DBP-021 - Hardcoded Timeout
- ST-DBP-023 - Empty Workflow
- ST-DBP-024 - Persistence Activity Check
- ST-DBP-025 - Variables Serialization Prerequisite
- ST-DBP-026 - Delay Activity Usage
- ST-DBP-027 - Persistence Best Practice
- ST-DBP-028 - Arguments Serialization Prerequisite
- ST-USG-005 - Hardcoded Activity Arguments
- ST-USG-009 - Unused Variables
- ST-USG-010 - Unused Dependencies
- ST-USG-014 - Package Restrictions
- ST-USG-017 - Invalid parameter modifier
- ST-USG-020 - Minimum Log Messages
- ST-USG-024 - Unused Saved for Later
- ST-USG-025 - Saved Value Misuse
- ST-USG-026 - Activity Restrictions
- ST-USG-027 - Required Packages
- ST-USG-028 - Restrict Invoke File Templates
- ST-USG-032 - Required Tags
- ST-USG-034 - Automation Hub URL
- Variables
- Arguments
- Imported Namespaces
- Coded automations
- Introduction
- Registering custom services
- Before and After contexts
- Generating code
- Generating coded test case from manual test cases
- Trigger-based Attended Automation
- Recording
- UI Elements
- Selectors
- Object Repository
- Data Scraping
- Image and Text Automation
- Citrix Technologies Automation
- RDP Automation
- VMware Horizon Automation
- Salesforce Automation
- SAP Automation
- macOS UI Automation
- The ScreenScrapeJavaSupport Tool
- The WebDriver Protocol
- Extensions
- About extensions
- SetupExtensions tool
- UiPathRemoteRuntime.exe is not running in the remote session
- UiPath Remote Runtime blocks Citrix session from being closed
- UiPath Remote Runtime causes memory leak
- UiPath.UIAutomation.Activities package and UiPath Remote Runtime versions mismatch
- The required UiPath extension is not installed on the remote machine
- Screen resolution settings
- Group Policies
- Cannot communicate with the browser
- Chrome extension is removed automatically
- The extension may have been corrupted
- Check if the extension for Chrome is installed and enabled
- Check if ChromeNativeMessaging.exe is running
- Check if ComSpec variable is defined correctly
- Enable access to file URLs and Incognito mode
- Multiple browser profiles
- Group Policy conflict
- Known issues specific to MV3 extensions
- List of extensions for Chrome
- Chrome Extension on Mac
- Group Policies
- Cannot communicate with the browser
- Edge extension is removed automatically
- The extension may have been corrupted
- Check if the Extension for Microsoft Edge is installed and enabled
- Check if ChromeNativeMessaging.exe is running
- Check if ComSpec variable is defined correctly
- Enable access to file URLs and InPrivate mode
- Multiple browser profiles
- Group Policy conflict
- Known issues specific to MV3 extensions
- List of extensions for Edge
- Troubleshooting
- Extension for Safari
- Extension for VMware Horizon
- Extension for Amazon WorkSpaces
- SAP Solution Manager plugin
- Excel Add-in
- Studio testing
- Troubleshooting

Studio User Guide
Troubleshooting
This topic presents the most frequent reasons why the Extension for Firefox might not work properly, and how to solve these issues.
Extensions fail to install in Firefox versions older than v128 or v115 ESR. You can apply certain workarounds, but this depends on how old your Firefox version is and whether or not it is an ESR (Extended Support Release) version.
Solution for Firefox ESR
-
Go to
about:config
. -
Toggle
xpinstall.signatures.required
flag tofalse
.
Firefox v102.10 ESR or newer
xpinstall.signatures.required
preference for all users and profiles automatically. For more details, refer to Policy Templates for Firefox.
Firefox older than v102.10 ESR
xpinstall.signatures.required
through Group Policy. As an alternative, you can use AutoConfig files:
-
Save the following inside a text file:
// First line must be a comment. pref("xpinstall.signatures.required", false);
// First line must be a comment. pref("xpinstall.signatures.required", false); -
Name the text file
allow-unsigned-extensions.cfg
. -
Save the following inside a text file:
// First line must be a comment. pref("general.config.filename", "allow-unsigned-extensions.cfg"); pref("general.config.obscure_value", 0);
// First line must be a comment. pref("general.config.filename", "allow-unsigned-extensions.cfg"); pref("general.config.obscure_value", 0); -
Name the text file
allow-unsigned-extensions.js
. -
Find the Firefox install directory, typically
C:\Program Files\Mozilla Firefox
. -
Copy
allow-unsigned-extensions.cfg
toC:\Program Files\Mozilla Firefox
. -
Copy
allow-unsigned-extensions.js
toC:\Program Files\Mozilla Firefox\pref
.
Firefox - normal releases
For non-ESR releases of Firefox, you must use AutoConfig files.
-
Save the following inside a text file:
// First line must be a comment. // In Firefox 55+, settings to configure add-on signing (and legacy add-ons) are stored in AddonSettings.jsm // The module exports an object with read-only properties, but that is not an issue since we can just replace // the exported object. // https://searchfox.org/mozilla-central/rev/2e08acdf8862e68b13166970e17809a3b5d6a555/toolkit/mozapps/extensions/internal/AddonSettings.jsm Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); function patchAddonSettings(modulePath) { var Module = Components.utils.import(modulePath, {}); // Note: we read the data from preferences instead of hard-coding a "true", so // that by default legacy add-ons are disabled. This enables the user to only // enable legacy add-ons for specific Firefox profiles when really needed. var AddonSettings; if ("lazy" in Module) { AddonSettings = Object.create(Module.lazy.AddonSettings); } else { AddonSettings = Object.create(Module.AddonSettings); } XPCOMUtils.defineLazyPreferenceGetter(AddonSettings, "REQUIRE_SIGNING", "xpinstall.signatures.required", false); XPCOMUtils.defineLazyPreferenceGetter(AddonSettings, "ALLOW_LEGACY_EXTENSIONS", "extensions.legacy.enabled", true); XPCOMUtils.defineLazyPreferenceGetter(AddonSettings, "LANGPACKS_REQUIRE_SIGNING", "extensions.langpacks.signatures.required", false); if ("lazy" in Module) { Module.lazy.AddonSettings = AddonSettings; } else { Module.AddonSettings = AddonSettings; } } // This is necessary to allow legacy add-ons via preferences. try { patchAddonSettings("resource://gre/modules/addons/XPIProvider.jsm"); } catch (e) { // AddonSettings is not in this file starting with Firefox 61, // but it comes back in Firefox 74 } try { patchAddonSettings("resource://gre/modules/addons/XPIDatabase.jsm"); } catch (e) { // AddonSettings is not in this file until Firefox 61 } // This override is needed to enable unsigned add-ons via preferences. patchAddonSettings("resource://gre/modules/addons/XPIInstall.jsm"); // This override is needed to allow unsigned add-ons to show up without warning in about:addons. // (this is UI-only, the add-on is not actually disabled despite what the UI claims). patchAddonSettings("resource://gre/modules/addons/AddonSettings.jsm"); Components.classes['@mozilla.org/consoleservice;1'] .getService(Components.interfaces.nsIConsoleService) .logStringMessage("enablelegacy.cfg: the extensions.legacy.enabled preference is working again."); pref("xpinstall.signatures.required", false);
// First line must be a comment. // In Firefox 55+, settings to configure add-on signing (and legacy add-ons) are stored in AddonSettings.jsm // The module exports an object with read-only properties, but that is not an issue since we can just replace // the exported object. // https://searchfox.org/mozilla-central/rev/2e08acdf8862e68b13166970e17809a3b5d6a555/toolkit/mozapps/extensions/internal/AddonSettings.jsm Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); function patchAddonSettings(modulePath) { var Module = Components.utils.import(modulePath, {}); // Note: we read the data from preferences instead of hard-coding a "true", so // that by default legacy add-ons are disabled. This enables the user to only // enable legacy add-ons for specific Firefox profiles when really needed. var AddonSettings; if ("lazy" in Module) { AddonSettings = Object.create(Module.lazy.AddonSettings); } else { AddonSettings = Object.create(Module.AddonSettings); } XPCOMUtils.defineLazyPreferenceGetter(AddonSettings, "REQUIRE_SIGNING", "xpinstall.signatures.required", false); XPCOMUtils.defineLazyPreferenceGetter(AddonSettings, "ALLOW_LEGACY_EXTENSIONS", "extensions.legacy.enabled", true); XPCOMUtils.defineLazyPreferenceGetter(AddonSettings, "LANGPACKS_REQUIRE_SIGNING", "extensions.langpacks.signatures.required", false); if ("lazy" in Module) { Module.lazy.AddonSettings = AddonSettings; } else { Module.AddonSettings = AddonSettings; } } // This is necessary to allow legacy add-ons via preferences. try { patchAddonSettings("resource://gre/modules/addons/XPIProvider.jsm"); } catch (e) { // AddonSettings is not in this file starting with Firefox 61, // but it comes back in Firefox 74 } try { patchAddonSettings("resource://gre/modules/addons/XPIDatabase.jsm"); } catch (e) { // AddonSettings is not in this file until Firefox 61 } // This override is needed to enable unsigned add-ons via preferences. patchAddonSettings("resource://gre/modules/addons/XPIInstall.jsm"); // This override is needed to allow unsigned add-ons to show up without warning in about:addons. // (this is UI-only, the add-on is not actually disabled despite what the UI claims). patchAddonSettings("resource://gre/modules/addons/AddonSettings.jsm"); Components.classes['@mozilla.org/consoleservice;1'] .getService(Components.interfaces.nsIConsoleService) .logStringMessage("enablelegacy.cfg: the extensions.legacy.enabled preference is working again."); pref("xpinstall.signatures.required", false); -
Name the text file
enable-legacy.cfg
. -
Save the following inside a text file:
// First line must be a comment. pref("general.config.filename", "enablelegacy.cfg"); pref("general.config.obscure_value", 0); pref("general.config.sandbox_enabled", false);
// First line must be a comment. pref("general.config.filename", "enablelegacy.cfg"); pref("general.config.obscure_value", 0); pref("general.config.sandbox_enabled", false); -
Name the text file
enablelegacy-prefs.js
. -
Find the Firefox install directory, typically
C:\Program Files\Mozilla Firefox
. -
Copy
allow-unsigned-extensions.cfg
toC:\Program Files\Mozilla Firefox
. -
Copy
allow-unsigned-extensions.js
toC:\Program Files\Mozilla Firefox\pref
.
Recent versions of Firefox, like 102,10 ESR, re-enable the extension automatically once the flag is set. In older versions such as 68.0.2 ESR, it may be necessary to reinstall the extension.
The Group Policy Offline installation method does not work with Firefox 68.0.2 ESR and possibly older versions. A temporary workaround involves adding the following to a PowerShell script and running it with administrator privileges:
# Define the registry path
$regPath = "HKLM:\SOFTWARE\Policies\Mozilla\Firefox\Extensions\Install"
function Convert-WindowsPathToFileUrl($path) {
$unixPath = $path -replace '\\', '/'
$escapedPath = $unixPath -replace ' ', '%20'
return "file:///" + $escapedPath
}
function Fix-FirefoxProfile($prefsPath, $fileUrl) {
if (-not (Test-Path $prefsPath)) {
Write-Host "prefs.js not found: $prefsPath"
return
}
Write-Host "Processing prefs.js: $prefsPath"
$content = Get-Content -Path $prefsPath -Raw
$pattern = 'user_pref\("browser\.policies\.runOncePerModification\.extensionsInstall",\s*"(.+?)"\);'
if (-not ($content -match $pattern)) {
Write-Host " -> No matching preference found in prefs.js."
return
}
$jsonArrayString = $matches[1]
# Unescape \" to "
$jsonArrayStringUnescaped = $jsonArrayString -replace '\\\"', '"'
try {
$list = ConvertFrom-Json -InputObject $jsonArrayStringUnescaped
} catch {
Write-Host " -> Error parsing JSON inside prefs.js preference (after unescaping)."
return
}
if (-not ($list -contains $fileUrl)) {
Write-Host " -> File URL not present in extensionsInstall list."
return
}
$newList = $list | Where-Object { $_ -ne $fileUrl }
$newJsonArrayString = ($newList | ConvertTo-Json -Compress)
# prefs.js expects it wrapped as a string, escaping " as \"
$escapedNewJsonArrayString = $newJsonArrayString -replace '"', '\"'
$newPrefLine = "user_pref(""browser.policies.runOncePerModification.extensionsInstall"", `"$escapedNewJsonArrayString`");"
# Replace the old line
$oldPrefLine = $matches[0]
$content = $content -replace [regex]::Escape($oldPrefLine), $newPrefLine
Set-Content -Path $prefsPath -Value $content -Encoding UTF8
Write-Host " -> prefs.js updated."
}
function Fix-AllFirefoxProfiles($fileUrl) {
$profilesPath = "$env:APPDATA\Mozilla\Firefox\Profiles"
if (-not (Test-Path $profilesPath)) {
Write-Host "Firefox profiles directory not found: $profilesPath"
return
}
$profiles = Get-ChildItem -Path $profilesPath -Directory
foreach ($profile in $profiles) {
$prefsPath = Join-Path $profile.FullName "prefs.js"
Fix-FirefoxProfile -prefsPath $prefsPath -fileUrl $fileUrl
}
}
if (-not (Test-Path $regPath)) {
Write-Host "Registry path not found: $regPath"
return
}
$values = Get-ItemProperty -Path $regPath
foreach ($property in $values.PSObject.Properties) {
$name = $property.Name
$value = $property.Value
if ($value -notmatch "^[a-zA-Z]:\\.*\\uipath-ff\.xpi$") {
continue
}
Write-Host "Found Windows path for uipath-ff.xpi in entry '$name': $value"
$fileUrl = Convert-WindowsPathToFileUrl $value
Write-Host " -> Converted to file URL: $fileUrl"
Set-ItemProperty -Path $regPath -Name $name -Value $fileUrl
Write-Host " -> Updated registry key '$name'."
Fix-AllFirefoxProfiles -fileUrl $fileUrl
}
# Define the registry path
$regPath = "HKLM:\SOFTWARE\Policies\Mozilla\Firefox\Extensions\Install"
function Convert-WindowsPathToFileUrl($path) {
$unixPath = $path -replace '\\', '/'
$escapedPath = $unixPath -replace ' ', '%20'
return "file:///" + $escapedPath
}
function Fix-FirefoxProfile($prefsPath, $fileUrl) {
if (-not (Test-Path $prefsPath)) {
Write-Host "prefs.js not found: $prefsPath"
return
}
Write-Host "Processing prefs.js: $prefsPath"
$content = Get-Content -Path $prefsPath -Raw
$pattern = 'user_pref\("browser\.policies\.runOncePerModification\.extensionsInstall",\s*"(.+?)"\);'
if (-not ($content -match $pattern)) {
Write-Host " -> No matching preference found in prefs.js."
return
}
$jsonArrayString = $matches[1]
# Unescape \" to "
$jsonArrayStringUnescaped = $jsonArrayString -replace '\\\"', '"'
try {
$list = ConvertFrom-Json -InputObject $jsonArrayStringUnescaped
} catch {
Write-Host " -> Error parsing JSON inside prefs.js preference (after unescaping)."
return
}
if (-not ($list -contains $fileUrl)) {
Write-Host " -> File URL not present in extensionsInstall list."
return
}
$newList = $list | Where-Object { $_ -ne $fileUrl }
$newJsonArrayString = ($newList | ConvertTo-Json -Compress)
# prefs.js expects it wrapped as a string, escaping " as \"
$escapedNewJsonArrayString = $newJsonArrayString -replace '"', '\"'
$newPrefLine = "user_pref(""browser.policies.runOncePerModification.extensionsInstall"", `"$escapedNewJsonArrayString`");"
# Replace the old line
$oldPrefLine = $matches[0]
$content = $content -replace [regex]::Escape($oldPrefLine), $newPrefLine
Set-Content -Path $prefsPath -Value $content -Encoding UTF8
Write-Host " -> prefs.js updated."
}
function Fix-AllFirefoxProfiles($fileUrl) {
$profilesPath = "$env:APPDATA\Mozilla\Firefox\Profiles"
if (-not (Test-Path $profilesPath)) {
Write-Host "Firefox profiles directory not found: $profilesPath"
return
}
$profiles = Get-ChildItem -Path $profilesPath -Directory
foreach ($profile in $profiles) {
$prefsPath = Join-Path $profile.FullName "prefs.js"
Fix-FirefoxProfile -prefsPath $prefsPath -fileUrl $fileUrl
}
}
if (-not (Test-Path $regPath)) {
Write-Host "Registry path not found: $regPath"
return
}
$values = Get-ItemProperty -Path $regPath
foreach ($property in $values.PSObject.Properties) {
$name = $property.Name
$value = $property.Value
if ($value -notmatch "^[a-zA-Z]:\\.*\\uipath-ff\.xpi$") {
continue
}
Write-Host "Found Windows path for uipath-ff.xpi in entry '$name': $value"
$fileUrl = Convert-WindowsPathToFileUrl $value
Write-Host " -> Converted to file URL: $fileUrl"
Set-ItemProperty -Path $regPath -Name $name -Value $fileUrl
Write-Host " -> Updated registry key '$name'."
Fix-AllFirefoxProfiles -fileUrl $fileUrl
}
Description
Mozilla introduced an extension signing verification algorithm in Firefox, which disables add-ons for Firefox version 65.0 and lower. As such, if you install the UiPath Extension for Firefox on the browser version 65.0 or lower, the following error message is displayed:
This add-on could not be installed because it appears to be corrupt.
Solution 1
Update Firefox to version v66.0.4 or higher.
Solution 2
Starting with Studio 2020.8, the Firefox extension is newly signed and it should be properly installed on older versions of the Firefox browser.
Check if the UiPath Extension for Firefox is installed and enabled:
- In Mozilla Firefox, go to about:addons > Extensions.
- If the extension is not present, install it as explained here.
- Make sure the UiPath Extension is updated to the latest version.
To prevent possible issues:
- In Mozilla Firefox, go to about:addons > Extensions.
- Open Task Manager or Process Explorer.
- Check if the
ChromeNativeMessaging.exe
process is running.Note: A separateChromeNativeMessaging
instance is running for the Chrome extension, so you need to close Google Chrome when performing this check.
ChromeNativeMessaging
is not running:
- In Mozilla Firefox, go to about:addons > Extensions.
- Remove the UiPath extension manually by clicking the Remove button.
- Reinstall it as explained here.
In case the above information did not solve your issue, you can try getting additional information by viewing traces and analyzing the errors thrown by the UiPath extension. The following are types of traces you can collect and analyze:
For the general extension traces in Mozilla Firefox:
Go to Open menu > Web Developer > Browser Console (Ctrl+Shift+J). The Browser Console is displayed. All the errors generated by the extension are displayed here.
For traces generated by the web page you want to automate:
Go to Open menu> Web Developer > Web Console (Ctrl+Shift+K). The Web Console is displayed. All the errors for the current web page are displayed here.
For full traces, (not only errors) do the following:
- Open the Registry Editor.
- Navigate to the
HKEY_CURRENT_USER\SOFTWARE\UiPath
key. - Double-click the WebExtensionTrace REG_DWORD value. The Edit DWORD Value window is displayed.
- In the Value Data field, change the value to 1, and click OK. The value is saved.
Note: If the
WebExtensionTrace
REG_DWORD value does not exist, you have to create it, by right-clicking the right panel, selecting New > DWORD (32-bit) Value, and providing the values mentioned above.
Check if there is some data missing in the Registry Editor:
- Open the Registry Editor.
- Navigate to the
HKEY_CURRENT_USER\SOFTWARE\Mozilla\NativeMessagingHosts\com.uipath.chromenativemsg
key. - Open the
(Default)
REG_SZ value. The Edit String window is displayed and should contain a path similar toC:\Users\YOUR_USER_NAME\AppData\Local\UiPath\uipath-ff.json
. - Open the .json file at the path found above with a text editor, such as Notepad++.
- Check that the path property correctly points to where
ChromeNativeMessaging.exe
is located, similar toC:\Program Files (x86)\UiPath Studio\UiPath\BrowserExtension\ChromeNativeMessaging.exe
.
Starting with UiPath version 2023.10, the UiPath Extension for Firefox supports automating multiple browser instances running with multiple user profiles at the same time.
Opening the browser with a specific profile is now possible when using the Use Application/Browser activity. To specify a profile at browser start-up, you must append an argument to the browser command line. To do so, use the Arguments property in the Unified Application Target input section.
-profile "full_profile_path"
. To retrieve the full profile path, navigate to about:profiles
and retrieve the Root Directory for that profile.