diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index 63aa25c..97da42a 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -39,11 +39,11 @@ jobs:
steps:
- name: Checkout repository
- uses: actions/checkout@v2
+ uses: actions/checkout@v4
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
- uses: github/codeql-action/init@v1
+ uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
@@ -54,7 +54,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
- uses: github/codeql-action/autobuild@v1
+ uses: github/codeql-action/autobuild@v3
# âšī¸ Command-line programs to run using the OS shell.
# đ https://git.io/JvXDl
@@ -68,5 +68,5 @@ jobs:
# make release
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@v1
+ uses: github/codeql-action/analyze@v3
\ No newline at end of file
diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
index 6f443c2..215bb39 100644
--- a/.github/workflows/maven.yml
+++ b/.github/workflows/maven.yml
@@ -14,7 +14,7 @@ jobs:
fail-fast: false
matrix:
os: [ 'ubuntu-latest', 'macos-latest', 'windows-latest' ]
- java-version: [ 11 ]
+ java-version: [ 17 ]
browser: ['googlechromeheadless', 'firefoxheadless', 'edgeheadless']
include:
- os: ubuntu-latest
@@ -43,9 +43,9 @@ jobs:
runs-on: ${{ matrix.os }}
name: Test on ${{ matrix.os }} with Java ${{ matrix.java-version }} using browser ${{ matrix.browser }}
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v4
- name: Set up JDK ${{ matrix.java-version }}
- uses: actions/setup-java@v2.3.0
+ uses: actions/setup-java@v4
with:
distribution: zulu
java-version: ${{ matrix.java-version }}
@@ -75,7 +75,7 @@ jobs:
run: echo "${{ env.SHA }}"
- name: Archive acceptances test results
- uses: actions/upload-artifact@v2.2.4
+ uses: actions/upload-artifact@v4
with:
name: at-results-${{ matrix.browser }}-${{ matrix.os }}-${{ matrix.java-version }}
path: target/robotframework-reports
@@ -91,7 +91,7 @@ jobs:
echo "::set-output name=JOB_STATUS::$(python -c "print('${{ job.status }}'.lower())")"
if: always() && job.status == 'failure'
- - uses: octokit/request-action@7e93b91076fad3920c29d44eb2a6311d929db3dd
+ - uses: octokit/request-action@dad4362715b7fb2ddedf9772c8670824af564f0d #v2.4.0
name: Update status with Github Status API
id: update_status_pr
with:
@@ -112,17 +112,20 @@ jobs:
runs-on: ubuntu-latest
name: Release package
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v4
- name: Set up JDK
- uses: actions/setup-java@v2.3.0
+ uses: actions/setup-java@v4
with:
distribution: zulu
- java-version: 11
+ java-version: 17
- name: Release Maven package
- uses: samuelmeuli/action-maven-publish@201a45a3f311b2ee888f252ba9f4194257545709
- with:
- gpg_private_key: ${{ secrets.gpg_private_key }}
- gpg_passphrase: ${{ secrets.gpg_passphrase }}
- nexus_username: ${{ secrets.nexus_username }}
- nexus_password: ${{ secrets.nexus_password }}
- maven_args: -DskipTests -B -ntp
+ run:
+ echo $GPG_PRIVATE_KEY > .m2/private-key.txt
+ gpg --import --batch .m2/private-key.txt
+ rm .m2/private-key.txt
+ mvn clean deploy --batch-mode --activate-profiles deploy --settings ${{ github.workspace }}/.m2/settings.xml -DskipTests -B -ntp
+ env:
+ GPG_PRIVATE_KEY: ${{ secrets.gpg_private_key }}
+ GPG_PASSPHRASE: ${{ secrets.gpg_passphrase }}
+ NEXUS_USERNAME: ${{ secrets.nexus_username }}
+ NEXUS_PASSWORD: ${{ secrets.nexus_password }}
diff --git a/.m2/settings.xml b/.m2/settings.xml
new file mode 100644
index 0000000..6264c03
--- /dev/null
+++ b/.m2/settings.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+ gpg
+
+ true
+
+
+ gpg
+
+ ${env.GPG_PASSPHRASE}
+
+
+
+
+
+
+
+ ossrh
+
+ ${env.NEXUS_USERNAME}
+ ${env.NEXUS_PASSWORD}
+
+
+
\ No newline at end of file
diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md
index ae9e646..4957e88 100644
Binary files a/DEPENDENCIES.md and b/DEPENDENCIES.md differ
diff --git a/README.md b/README.md
index d1c0ccd..bb9e4fd 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,10 @@
+> [!WARNING]
+> Repository is not currently maintained. Version released on 25th of January will probably be last one for this library as it has mostly lost it's meaning after Robot Framework dropped Jython support (due to dropping support for Python 2)
+>
+> If you're interested of starting to maintain this library please check [MarketSquare](https://marketsquare.github.io/) and create issue to there.
+>
+> Repository will be archived for time being to make this very clear.
+
# Java port of the Python based SeleniumLibrary for Robot Framework
## Introduction
@@ -18,18 +25,18 @@ your pom.xml:
com.github.marketsquare
robotframework-seleniumlibrary
- 4.0.0.0
+ 4.28.1.0
test
If you cannot use the robotframework-maven-plugin you can use the
-[jar-with-dependencies](https://repo1.maven.org/maven2/com/github/marketsquare/robotframework-seleniumlibrary/4.0.0.0/robotframework-seleniumlibrary-4.0.0.0-jar-with-dependencies.jar),
-which contains all required libraries except ios/android ones (Appium and Selendroid). Running of tests with this can be done with command `java -jar robotframework-seleniumlibrary-4.0.0.0-jar-with-dependencies.jar `.
+[jar-with-dependencies](https://repo1.maven.org/maven2/com/github/marketsquare/robotframework-seleniumlibrary/4.28.1.0/robotframework-seleniumlibrary-4.28.1.0-jar-with-dependencies.jar),
+which contains all required libraries except ios/android ones (Appium). Running of tests with this can be done with command `java -jar robotframework-seleniumlibrary-4.28.1.0-jar-with-dependencies.jar `.
- More information about this library can be found in the
- [Keyword Documentation](https://repo1.maven.org/maven2/com/github/marketsquare/robotframework-seleniumlibrary/4.0.0.0/robotframework-seleniumlibrary-4.0.0.0.html).
+ [Keyword Documentation](https://repo1.maven.org/maven2/com/github/marketsquare/robotframework-seleniumlibrary/4.28.1.0/robotframework-seleniumlibrary-4.28.1.0.html).
- For keyword completion in RIDE you can download this
- [Library Specs](https://repo1.maven.org/maven2/com/github/marketsquare/robotframework-seleniumlibrary/4.0.0.0/robotframework-seleniumlibrary-4.0.0.0.xml)
+ [Library Specs](https://repo1.maven.org/maven2/com/github/marketsquare/robotframework-seleniumlibrary/4.28.1.0/robotframework-seleniumlibrary-4.28.1.0.xml)
and place it in your PYTHONPATH.
## Old versions
@@ -82,8 +89,8 @@ which contains all required libraries. Running of tests with this can be done wi
## Testing IOS/Android browsers with library
-Pre-Selenium 4 fat-jar contains Appium and Selendroid that allow testing of IOS and Android browsers. Those are dropped in Selenium 4 -versions,
-so dependencies needs to be handles self with either Maven/Gradle or manually. If there's need to have fat-jar with those, please create issue about that.
+Pre-Selenium 4 fat-jar contained Appium and Selendroid that allowed testing of IOS and Android browsers. Those are dropped in Selenium 4 -versions,
+so dependencies needs to be handles self with either Maven/Gradle or manually. Also 4.28.1.0 version of the library moved purely to Appium. If there's need to have fat-jar with those, please create issue about that.
## Differences
diff --git a/pom.xml b/pom.xml
index 4d69e68..51c2829 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
com.github.marketsquare
robotframework-seleniumlibrary
- 4.0.0.1-SNAPSHOT
+ 4.28.1.0-SNAPSHOT
jar
Robot Framework :: SeleniumLibrary
@@ -72,11 +72,12 @@
UTF-8
true
true
- 1.9.8.RC1
- 11
+ 1.9.21.2
+ 17
+ 11
2.1.0
- 4.1
- 4.0.0
+ 4.1.2
+ 4.28.1
SeleniumLibrary
googlechromeheadless
False
@@ -108,22 +109,10 @@
json-simple
1.1.1
-
- io.selendroid
- selendroid-client
- 0.17.0
-
-
- org.seleniumhq.selenium
- selenium-java
-
-
- provided
-
io.appium
java-client
- 7.6.0
+ 9.4.0
org.seleniumhq.selenium
@@ -139,12 +128,12 @@
org.apache.commons
commons-exec
- 1.3
+ 1.4.0
org.seleniumhq.selenium
htmlunit-driver
- 2.53.0
+ 4.13.0
org.seleniumhq.selenium
@@ -163,18 +152,19 @@
org.mockito
mockito-core
- 2.28.2
+ 5.15.2
test
io.github.bonigarcia
webdrivermanager
- 5.0.3
+
+ 5.7.0
org.apache.commons
commons-lang3
- 3.12.0
+ 3.17.0
@@ -341,9 +331,9 @@
- ${java.version}
- ${java.version}
- ${java.version}
+ ${java.compile.version}
+ ${java.runtime.version}
+ ${java.compile.version}
true
diff --git a/src/main/java/com/github/markusbernhardt/seleniumlibrary/keywords/BrowserManagement.java b/src/main/java/com/github/markusbernhardt/seleniumlibrary/keywords/BrowserManagement.java
index 7a90687..24a9af3 100644
--- a/src/main/java/com/github/markusbernhardt/seleniumlibrary/keywords/BrowserManagement.java
+++ b/src/main/java/com/github/markusbernhardt/seleniumlibrary/keywords/BrowserManagement.java
@@ -1,9 +1,9 @@
package com.github.markusbernhardt.seleniumlibrary.keywords;
+import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.ios.IOSDriver;
import io.github.bonigarcia.wdm.WebDriverManager;
import io.github.bonigarcia.wdm.config.DriverManagerType;
-import io.selendroid.client.SelendroidDriver;
import java.io.File;
import java.lang.reflect.Field;
@@ -61,6 +61,8 @@
import com.github.markusbernhardt.seleniumlibrary.utils.WebDriverCache;
import com.github.markusbernhardt.seleniumlibrary.utils.WebDriverCache.SessionIdAliasWebDriverTuple;
+import static org.openqa.selenium.remote.Browser.HTMLUNIT;
+
@RobotKeywords
public class BrowserManagement extends RunOnFailureKeywordsAdapter {
@@ -639,14 +641,14 @@ protected WebDriver createLocalWebDriver(String browserName, Capabilities desire
return new SafariDriver(new SafariOptions().merge(desiredCapabilities));
case "android":
try {
- return new SelendroidDriver(desiredCapabilities);
+ return new AndroidDriver(desiredCapabilities);
} catch (Exception e) {
throw new SeleniumLibraryFatalException(e);
}
case "ipad":
case "iphone":
try {
- return new IOSDriver<>(new URL(""), desiredCapabilities);
+ return new IOSDriver(new URL(""), desiredCapabilities);
} catch (Exception e) {
throw new SeleniumLibraryFatalException("Creating " + browserName + " instance failed.", e);
}
@@ -716,7 +718,7 @@ protected Capabilities createCapabilities(String browserName, String desiredCapa
case "firefoxheadless":
desiredCapabilities = new FirefoxOptions();
parseBrowserOptionsFirefox(browserOptions, desiredCapabilities);
- ((FirefoxOptions)desiredCapabilities).setHeadless(true);
+ ((FirefoxOptions)desiredCapabilities).addArguments("-headless");
break;
case "ie":
case "internetexplorer":
@@ -727,7 +729,7 @@ protected Capabilities createCapabilities(String browserName, String desiredCapa
break;
case "edgeheadless":
desiredCapabilities = new EdgeOptions();
- ((EdgeOptions)desiredCapabilities).setHeadless(true);
+ ((EdgeOptions)desiredCapabilities).addArguments("--headless=chrome");
break;
case "gc":
case "chrome":
@@ -742,14 +744,14 @@ protected Capabilities createCapabilities(String browserName, String desiredCapa
desiredCapabilities = new ChromeOptions();
logging.debug("Parsing chrome options: "+browserOptions);
parseBrowserOptionsChrome(browserOptions, desiredCapabilities);
- ((ChromeOptions)desiredCapabilities).setHeadless(true);
+ ((ChromeOptions)desiredCapabilities).addArguments("--headless=chrome");
break;
case "safari":
desiredCapabilities = new SafariOptions();
break;
case "htmlunit":
case "htmlunitwithjs":
- desiredCapabilities = DesiredCapabilities.htmlUnit();
+ desiredCapabilities = new DesiredCapabilities(HTMLUNIT.browserName(), "", Platform.ANY);
((DesiredCapabilities) desiredCapabilities).setBrowserName("htmlunit");
break;
default:
@@ -858,7 +860,7 @@ protected void parseBrowserOptionsFirefox(String browserOptions, Capabilities de
logging.warn("Unknown browserOption: " + key + ":" + entry.getValue());
}
}
- ((FirefoxOptions) desiredCapabilities).setCapability(FirefoxDriver.PROFILE, firefoxProfile);
+ ((FirefoxOptions) desiredCapabilities).setProfile(firefoxProfile);
} else {
logging.warn("Invalid browserOptions: " + browserOptions);
}
diff --git a/src/test/java/com/github/markusbernhardt/seleniumlibrary/keywords/BrowserManagementTest.java b/src/test/java/com/github/markusbernhardt/seleniumlibrary/keywords/BrowserManagementTest.java
index 799b749..e137322 100644
--- a/src/test/java/com/github/markusbernhardt/seleniumlibrary/keywords/BrowserManagementTest.java
+++ b/src/test/java/com/github/markusbernhardt/seleniumlibrary/keywords/BrowserManagementTest.java
@@ -1,8 +1,12 @@
package com.github.markusbernhardt.seleniumlibrary.keywords;
import static org.junit.Assert.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
+import java.io.IOException;
+
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.Capabilities;
@@ -41,25 +45,39 @@ public void testCreateDesiredCapabilities() {
String desired = "{\"platform\":\"WINDOWS\",\"browserName\":\"firefox\",\"version\":\"\"}";
String browserOptions = "{\"preferences\": {\"network.proxy.type\": 1, \"network.proxy.http\": \"localhost\", \"network.proxy.http_port\": 73571}}";
Capabilities dc = bm.createCapabilities("firefox", desired, browserOptions);
- FirefoxProfile profile = (FirefoxProfile) dc.getCapability("firefox_profile");
- assertTrue(dc.getCapability("platform").toString().equals("WINDOWS"));
- assertTrue(profile.getStringPreference("network.proxy.http", "wrong") != "wrong");
+ @SuppressWarnings("unchecked")
+ String profileString = ((java.util.Map) dc.getCapability("moz:firefoxOptions")).get("profile");
+ FirefoxProfile profile;
+ try {
+ profile = FirefoxProfile.fromJson(profileString);
+ assertTrue(dc.getCapability("platform").toString().equals("WINDOWS"));
+ assertTrue(profile.getStringPreference("network.proxy.http", "wrong") != "wrong");
+ } catch (IOException e) {
+ fail(e.getMessage());
+ }
}
@Test
public void testCreateDesiredCapabilitiesWithoutBrowserOptions() {
String desired = "{\"platform\":\"WINDOWS\",\"browserName\":\"firefox\",\"version\":\"\"}";
Capabilities dc = bm.createCapabilities("firefox", desired, null);
- FirefoxProfile profile = (FirefoxProfile) dc.getCapability("firefox_profile");
assertTrue(dc.getCapability("platform").toString().equals("WINDOWS"));
}
+ @SuppressWarnings("rawtypes")
@Test
public void testCreateDesiredCapabilitiesWithOnlyBrowserOptions() {
String browserOptions = "{\"preferences\": {\"network.proxy.type\": 1, \"network.proxy.http\": \"localhost\", \"network.proxy.http_port\": 73571}}";
Capabilities dc = bm.createCapabilities("firefox", null, browserOptions);
- FirefoxProfile profile = (FirefoxProfile) dc.getCapability("firefox_profile");
- assertTrue(profile.getStringPreference("network.proxy.http", "wrong") != "wrong");
+ @SuppressWarnings("unchecked")
+ String profileString = ((java.util.Map) dc.getCapability("moz:firefoxOptions")).get("profile");
+ FirefoxProfile profile;
+ try {
+ profile = FirefoxProfile.fromJson(profileString);
+ assertTrue(profile.getStringPreference("network.proxy.http", "wrong") != "wrong");
+ } catch (IOException e) {
+ fail(e.getMessage());
+ }
}
@Test
@@ -79,7 +97,6 @@ public void parseChromeBrowserOptions() {
@Test
public void parseChromeCapabilities() {
- ChromeOptions chromeOptions = new ChromeOptions();
String browserName = "googlechromeheadless";
String browserOptions = "{\"args\":[\"start-maximized\"],\"extensions\":[],\"prefs\":{\"intl.accept_languages\":\"de-AT\"}}";
String desiredCapabilitiesString = "{}";
diff --git a/src/test/robotframework/objects/Google.Site.txt b/src/test/robotframework/objects/Google.Site.txt
index 47ab5cd..93a0758 100644
--- a/src/test/robotframework/objects/Google.Site.txt
+++ b/src/test/robotframework/objects/Google.Site.txt
@@ -24,7 +24,7 @@ Go To
${Current.Location}= Get Location
Run Keyword If '${Current.Location}'!='${Google.Site.Url}' SeleniumLibrary.Go To ${Google.Site.Url}
Title Should Be ${Google.Site.PageTitle}
- Handle Cookie Consent xpath:(//div[@role="none"])[last()]
+ Handle Cookie Consent //*[@id="L2AGLb"]
Close
Close Browser
diff --git a/src/test/robotframework/settings/Settings.robot b/src/test/robotframework/settings/Settings.robot
index 446ce7a..7fd8eac 100644
--- a/src/test/robotframework/settings/Settings.robot
+++ b/src/test/robotframework/settings/Settings.robot
@@ -17,9 +17,12 @@ Test
Handle Cookie Consent
[Arguments] ${consent click xpath}
+ Reload Page
Comment Consent search causes stack overflow to jbrowser, so tagging tescases using this keyword
Set Tags jbrowser
${count} Get Matching Xpath Count ${consent click xpath}
IF ${count} > 0
+ Capture Page Screenshot
+ Wait Until Element Is Clickable ${consent click xpath} 30s
Click Element ${consent click xpath}
END
\ No newline at end of file
diff --git a/src/test/robotframework/testsuites/UnitTests/AW3Schools.robot b/src/test/robotframework/testsuites/UnitTests/AW3Schools.robot
index dacdea9..06c4b8c 100644
--- a/src/test/robotframework/testsuites/UnitTests/AW3Schools.robot
+++ b/src/test/robotframework/testsuites/UnitTests/AW3Schools.robot
@@ -9,14 +9,14 @@ ${URL Application} http://www.w3schools.com
*** Test Cases ***
Select
[Tags] jbrowser
- Open Browser https://developer.mozilla.org/en/docs/Web/HTML/Element/select#Examples ${browser} mainbrowser
- Wait Until Page Contains Element frame_Basic_select
- Select Frame frame_Basic_select
- Wait Until Page Contains Element xpath://select[@name="choice"]
- Select From List xpath://select[@name="choice"] Third Value
- ${label} Get Selected List Label xpath://select[@name="choice"]
- Should Be Equal ${label} Third Value
- List Selection Should Be xpath://select[@name="choice"] Third Value
+ Open Browser https://interactive-examples.mdn.mozilla.net/pages/tabbed/select.html ${browser} mainbrowser
+ Wait Until Page Contains Element output-iframe
+ Select Frame output-iframe
+ Wait Until Page Contains Element xpath://select[@name="pets"]
+ Select From List xpath://select[@name="pets"] Spider
+ ${label} Get Selected List Label xpath://select[@name="pets"]
+ Should Be Equal ${label} Spider
+ List Selection Should Be xpath://select[@name="pets"] Spider
Multiple Browsers
Open Browser ${URL Application} ${browser} mainbrowser1
diff --git a/src/test/robotframework/testsuites/UnitTests/Google.robot b/src/test/robotframework/testsuites/UnitTests/Google.robot
index 856b9cc..b50cf10 100644
--- a/src/test/robotframework/testsuites/UnitTests/Google.robot
+++ b/src/test/robotframework/testsuites/UnitTests/Google.robot
@@ -10,25 +10,10 @@ Open And Close Google Site
Capture Page Screenshot
Store Web Element In JavaScript
- Wait Until Page Contains Element //*[contains(@class,'gsfi')]
- Execute Javascript window.document.my_element = window.document.getElementsByClassName('gsfi')[0];
+ Wait Until Page Contains Element //*[contains(@class,'gLFyf')]
+ Execute Javascript window.document.my_element = window.document.getElementsByClassName('gLFyf')[0];
${className}= Execute Javascript return window.document.my_element.className;
- Should Contain ${className} gsfi
-
-Search Robotframework Selenium2Library
- Google.Search.Search String Robotframework Selenium2Library Java
-
-Search With JavaScript Locator
- SeleniumLibrary.Add Location Strategy elementByName return window.document.getElementsByName(arguments[0])[0];
- Input Text elementByName:q Robotframework Selenium2Library Java
- Press Key elementByName:q \\13
- Wait Until Element Is Visible xpath://a[contains(.,'MarkusBernhardt')]
- Capture Page Screenshot
-
-Search Without Locator Type
- Input Text q Robotframework Selenium2Library Java
- Press Key q \\13
- Wait Until Element Is Visible //a[contains(.,'MarkusBernhardt')]
+ Should Contain ${className} gLFyf
Get Name Of Active Element With JavaScript
Input Text q Robotframework Selenium2Library
diff --git a/src/test/robotframework/testsuites/UnitTests/WhatAreCookies.robot b/src/test/robotframework/testsuites/UnitTests/WhatAreCookies.robot
index 7b120d6..3e6c99e 100644
--- a/src/test/robotframework/testsuites/UnitTests/WhatAreCookies.robot
+++ b/src/test/robotframework/testsuites/UnitTests/WhatAreCookies.robot
@@ -6,7 +6,7 @@ Library String
*** Test Cases ***
Cookies
Open Browser http://www.whatarecookies.com/cookietest.asp ${browser} mainbrowser
- Handle Cookie Consent cookieconsent_btn
+ Handle Cookie Consent xpath://*[@id="cookieconsent_btn"]
${all_cookies} Get Cookies
${first cookie name} Split String ${all_cookies} =
${test} Get Cookie Value ${first cookie name}[0]