From fa1802acb03122303e653836158c8ad71777bfb5 Mon Sep 17 00:00:00 2001 From: Tim Jacomb Date: Sat, 27 Dec 2025 17:42:00 +0000 Subject: [PATCH 01/10] Test credentials cards PR again --- pom.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pom.xml b/pom.xml index 9be7959e5..19d23deeb 100644 --- a/pom.xml +++ b/pom.xml @@ -492,6 +492,10 @@ and -Djdk.net.URLClassPath.disableClassPathURLCheck=true + + + target/credentials.hpi + @@ -765,6 +769,12 @@ and ${jenkins.version} war + + org.jenkins-ci.plugins + credentials + 1480.v21f5196e9673 + hpi + ${project.build.directory} true From f21ec33ece3216e368a0496c830870be98503ddb Mon Sep 17 00:00:00 2001 From: Tim Jacomb <21194782+timja@users.noreply.github.com> Date: Sat, 27 Dec 2025 21:42:59 +0000 Subject: [PATCH 02/10] Update pom.xml --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 19d23deeb..ec4ba208b 100644 --- a/pom.xml +++ b/pom.xml @@ -772,7 +772,7 @@ and org.jenkins-ci.plugins credentials - 1480.v21f5196e9673 + 1481.vb_8944f95db_e8 hpi From 9b7ba771a5b08bdd455ef705f2d11684a684ed4d Mon Sep 17 00:00:00 2001 From: Tim Jacomb <21194782+timja@users.noreply.github.com> Date: Sun, 4 Jan 2026 22:28:07 +0000 Subject: [PATCH 03/10] Update pom.xml --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ec4ba208b..d50e53fd0 100644 --- a/pom.xml +++ b/pom.xml @@ -772,7 +772,7 @@ and org.jenkins-ci.plugins credentials - 1481.vb_8944f95db_e8 + 1537.vce7650548554 hpi From f8a6f700ae1620002985541d6aa45cbba039af0d Mon Sep 17 00:00:00 2001 From: Tim Jacomb Date: Sat, 10 Jan 2026 22:12:43 +0000 Subject: [PATCH 04/10] Adapt credentials test to dialog --- .../credentials/AbstractCredentialsTest.java | 2 +- .../plugins/credentials/Credential.java | 2 +- .../plugins/credentials/CredentialsPage.java | 33 ++++++++++++++----- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/AbstractCredentialsTest.java b/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/AbstractCredentialsTest.java index f758cc754..f77a4b9ac 100644 --- a/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/AbstractCredentialsTest.java +++ b/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/AbstractCredentialsTest.java @@ -126,7 +126,7 @@ private void navigateToCreateCredentials() { tryCredentialsClick(); waitFor(by.href("/user/" + CREATED_USER + "/credentials/store/user")).click(); waitFor(by.href("domain/_")).click(); - waitFor(by.href("newCredentials")).click(); + waitFor(by.button("Add Credentials")).click(); waitFor(by.name("_.id")); } diff --git a/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/Credential.java b/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/Credential.java index eddf49240..514bdcacb 100644 --- a/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/Credential.java +++ b/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/Credential.java @@ -33,7 +33,7 @@ public void add() { we.click(); // wait for the form to be removed from the UI waitFor(driver).until(ExpectedConditions.invisibilityOf(dialog)); - // the notification bar can place itslef over other elements + // the notification bar can place itself over other elements // so wait for it to be added and then disappear waitFor(waitFor(By.id("notification-bar"))).until(bar -> !bar.isDisplayed()); } diff --git a/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/CredentialsPage.java b/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/CredentialsPage.java index f60d26f84..824d4ee24 100644 --- a/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/CredentialsPage.java +++ b/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/CredentialsPage.java @@ -11,6 +11,7 @@ import org.jenkinsci.test.acceptance.po.Folder; import org.jenkinsci.test.acceptance.po.Jenkins; import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; public class CredentialsPage extends ConfigurablePageObject { public final Control addButton = control(by.xpath("//select[contains(@class, 'setting-input dropdownList')] | " @@ -22,26 +23,39 @@ public class CredentialsPage extends ConfigurablePageObject { * Create a new Credential */ public CredentialsPage(Jenkins j, String domainName) { - super(j, j.url("credentials/store/system/domain/" + domainName + "/newCredentials")); + super(j, j.url("credentials/store/system/domain/" + domainName)); } /** * Create a new Credential scoped to a Folder */ public CredentialsPage(Folder f, String domainName) { - super(f, f.url("credentials/store/folder/domain/" + domainName + "/newCredentials")); + super(f, f.url("credentials/store/folder/domain/" + domainName)); } /** * Create a new personal Credential */ public CredentialsPage(Jenkins j, String domainName, String userName) { - super(j, j.url(String.format("user/%s/credentials/store/user/domain/%s/newCredentials", userName, domainName))); + super(j, j.url(String.format("user/%s/credentials/store/user/domain/%s", userName, domainName))); } public T add(Class type) { - addButton.selectDropdownMenuAlt(type); - String path = find(by.name("credentials")).getAttribute("path"); + WebElement radio = findCaption(type, caption -> { + for (WebElement webElement : all(by.css(".jenkins-choice-list__item__label"))) { + if (webElement.getText().equals(caption)) { + webElement.click(); + return webElement.findElement(by.xpath("./../input")); + } + } + return null; + }); + + String path = radio.getAttribute("path"); + + WebElement nextButton = find(by.id("cr-dialog-next")); + nextButton.click(); + return newInstance(type, this, path); } @@ -56,7 +70,7 @@ public void setConfigUrl(String url) throws MalformedURLException { } public void create() { - find(by.name("Submit")).click(); + find(by.id("cr-dialog-submit")).click(); assertThat(driver, not(hasContent("This page expects a form submission"))); } @@ -72,9 +86,10 @@ public void delete() { @Override public WebDriver open() { WebDriver wd = super.open(); - // wait for default form fields to be present to avoid possible race - // condition when changing credentials type too fast (happens rarely) - waitFor(by.name("_.id")); + + clickButton("Add Credentials"); + // Selenium will execute the next step before the options have loaded if we don't wait for them + waitFor(by.css(".jenkins-choice-list__item__label")); return wd; } From 5897f623ad28af9420e72e9d00f63d57dad22a29 Mon Sep 17 00:00:00 2001 From: Tim Jacomb <21194782+timja@users.noreply.github.com> Date: Sun, 11 Jan 2026 11:10:34 +0000 Subject: [PATCH 05/10] Update pom.xml --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3ce110fe1..e8de21864 100644 --- a/pom.xml +++ b/pom.xml @@ -772,7 +772,7 @@ and org.jenkins-ci.plugins credentials - 1537.vce7650548554 + 1560.v4fe9e4e90c65 hpi From fb95cb0be45c0db0de017261f0dd0dcf3aa0f943 Mon Sep 17 00:00:00 2001 From: Tim Jacomb Date: Sun, 11 Jan 2026 12:28:20 +0000 Subject: [PATCH 06/10] Move sticky elements out of the way --- .../test/acceptance/plugins/credentials/CredentialsPage.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/CredentialsPage.java b/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/CredentialsPage.java index 824d4ee24..dfca558b1 100644 --- a/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/CredentialsPage.java +++ b/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/CredentialsPage.java @@ -10,6 +10,7 @@ import org.jenkinsci.test.acceptance.po.Control; import org.jenkinsci.test.acceptance.po.Folder; import org.jenkinsci.test.acceptance.po.Jenkins; +import org.jenkinsci.test.acceptance.selenium.Scroller; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; @@ -55,6 +56,8 @@ public T add(Class type) { WebElement nextButton = find(by.id("cr-dialog-next")); nextButton.click(); + waitFor(by.id("cr-dialog-submit")); + new Scroller(driver).disableStickyElements(); return newInstance(type, this, path); } From dc2544b9198d2730788ae577c2c3e4600add71dc Mon Sep 17 00:00:00 2001 From: Tim Jacomb <21194782+timja@users.noreply.github.com> Date: Sun, 11 Jan 2026 18:22:36 +0000 Subject: [PATCH 07/10] Update pom.xml --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e8de21864..055196ee7 100644 --- a/pom.xml +++ b/pom.xml @@ -772,7 +772,7 @@ and org.jenkins-ci.plugins credentials - 1560.v4fe9e4e90c65 + 1561.v172b_32e210ef hpi From 18f9f09ba559f413dc5b83f61ce07c70c82dc52c Mon Sep 17 00:00:00 2001 From: Tim Jacomb Date: Mon, 12 Jan 2026 10:36:32 +0000 Subject: [PATCH 08/10] FixeS --- .../plugins/credentials/Credential.java | 2 +- .../ssh_credentials/SshCredentialDialog.java | 15 ------- .../SshPrivateKeyCredential.java | 1 + .../plugins/ssh_slaves/SshSlaveLauncher.java | 40 ++++++++++++++----- .../selenium/disable-sticky-elements.js | 9 +++++ .../java/plugins/SshSlavesPluginTest.java | 5 +-- 6 files changed, 44 insertions(+), 28 deletions(-) diff --git a/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/Credential.java b/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/Credential.java index 514bdcacb..be89f7de9 100644 --- a/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/Credential.java +++ b/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/Credential.java @@ -29,7 +29,7 @@ protected Credential(PageArea area, String relativePath) { */ public void add() { WebElement dialog = find(by.id("credentials-dialog-form")); - WebElement we = find(submitButton()); + WebElement we = find(by.id("cr-dialog-submit")); we.click(); // wait for the form to be removed from the UI waitFor(driver).until(ExpectedConditions.invisibilityOf(dialog)); diff --git a/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_credentials/SshCredentialDialog.java b/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_credentials/SshCredentialDialog.java index 95c4533e7..b1a083348 100644 --- a/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_credentials/SshCredentialDialog.java +++ b/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_credentials/SshCredentialDialog.java @@ -16,19 +16,4 @@ public class SshCredentialDialog extends BaseStandardCredentials { public SshCredentialDialog(PageObject context, String path) { super(context, path); } - - /** - * Selects the credential type and bind the controls to the page area. - */ - public T select(Class type) { - - findCaption(type, new Resolver() { - @Override - protected void resolve(String caption) { - kind.select(caption); - } - }); - - return newInstance(type, getPage(), getPath()); - } } diff --git a/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_credentials/SshPrivateKeyCredential.java b/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_credentials/SshPrivateKeyCredential.java index a45688c5c..401d7b643 100644 --- a/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_credentials/SshPrivateKeyCredential.java +++ b/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_credentials/SshPrivateKeyCredential.java @@ -6,6 +6,7 @@ import org.jenkinsci.test.acceptance.po.Describable; import org.jenkinsci.test.acceptance.po.PageAreaImpl; import org.jenkinsci.test.acceptance.po.PageObject; +import org.jenkinsci.test.acceptance.selenium.Scroller; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; diff --git a/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_slaves/SshSlaveLauncher.java b/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_slaves/SshSlaveLauncher.java index 540dd04b7..cdb5edaeb 100644 --- a/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_slaves/SshSlaveLauncher.java +++ b/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_slaves/SshSlaveLauncher.java @@ -4,6 +4,8 @@ import edu.umd.cs.findbugs.annotations.CheckForNull; import java.time.Duration; +import org.jenkinsci.test.acceptance.plugins.credentials.BaseStandardCredentials; +import org.jenkinsci.test.acceptance.plugins.credentials.Credential; import org.jenkinsci.test.acceptance.plugins.credentials.UserPwdCredential; import org.jenkinsci.test.acceptance.plugins.ssh_credentials.SshCredentialDialog; import org.jenkinsci.test.acceptance.plugins.ssh_credentials.SshPrivateKeyCredential; @@ -11,7 +13,9 @@ import org.jenkinsci.test.acceptance.po.Control; import org.jenkinsci.test.acceptance.po.Describable; import org.jenkinsci.test.acceptance.po.PageObject; +import org.jenkinsci.test.acceptance.selenium.Scroller; import org.jenkinsci.test.acceptance.selenium.UselessFileDetectorReplacement; +import org.openqa.selenium.WebElement; /** * @author Kohsuke Kawaguchi @@ -32,14 +36,33 @@ public SshSlaveLauncher(PageObject context, String path) { super(context, path); } - public SshCredentialDialog addCredential() { + public T addCredential(Class type) { find(by.button("Add")).click(); find(by.css(".jenkins-dropdown")) - .findElement(by.button("Jenkins Credentials Provider")) + .findElement(by.button("Global")) .click(); - return new SshCredentialDialog(getPage(), "/credentials"); + // Selenium will execute the next step before the options have loaded if we don't wait for them + waitFor(by.css(".jenkins-choice-list__item__label")); + + WebElement radio = findCaption(type, caption -> { + for (WebElement webElement : all(by.css(".jenkins-choice-list__item__label"))) { + if (webElement.getText().equals(caption)) { + webElement.click(); + return webElement.findElement(by.xpath("./../input")); + } + } + return null; + }); + + String path = radio.getAttribute("path"); + + WebElement nextButton = find(by.id("cr-dialog-next")); + nextButton.click(); + waitFor(by.id("cr-dialog-submit")); + new Scroller(driver).disableStickyElements(); + return newInstance(type, getPage(), path); } public void setJavaPath(String jvmPath) { @@ -55,6 +78,8 @@ public SshSlaveLauncher port(int port) { } private void ensureAdvancedOpen() { + new Scroller(driver).disableStickyElements(); + control("advanced-button").click(); } @@ -66,8 +91,7 @@ private void ensureAdvancedOpen() { * @return the SshSlaveLauncher to be configured */ public SshSlaveLauncher pwdCredentials(String username, String password) { - final SshCredentialDialog dia = this.addCredential(); - final UserPwdCredential cred = dia.select(UserPwdCredential.class); + final UserPwdCredential cred = this.addCredential(UserPwdCredential.class); cred.username.set(username); cred.password.set(password); // credentials are identified by their id. Set username as id so it can be found by it @@ -86,8 +110,7 @@ public SshSlaveLauncher pwdCredentials(String username, String password) { * @return the SshSlaveLauncher to be configured */ public SshSlaveLauncher pwdCredentials(String username, String password, String id) { - final SshCredentialDialog dia = this.addCredential(); - final UserPwdCredential cred = dia.select(UserPwdCredential.class); + final UserPwdCredential cred = this.addCredential(UserPwdCredential.class); cred.username.set(username); cred.password.set(password); // credentials are identified by their id. @@ -105,8 +128,7 @@ public SshSlaveLauncher pwdCredentials(String username, String password, String * @return the SshSlaveLauncher to be configured */ public SshSlaveLauncher keyCredentials(String username, String key, @CheckForNull String passphrase) { - final SshCredentialDialog dia = this.addCredential(); - final SshPrivateKeyCredential cred = dia.select(SshPrivateKeyCredential.class); + final SshPrivateKeyCredential cred = this.addCredential(SshPrivateKeyCredential.class); cred.username.set(username); if (passphrase != null) { cred.passphrase.set(passphrase); diff --git a/src/main/resources/org/jenkinsci/test/acceptance/selenium/disable-sticky-elements.js b/src/main/resources/org/jenkinsci/test/acceptance/selenium/disable-sticky-elements.js index 525c2f3f1..0edca164f 100644 --- a/src/main/resources/org/jenkinsci/test/acceptance/selenium/disable-sticky-elements.js +++ b/src/main/resources/org/jenkinsci/test/acceptance/selenium/disable-sticky-elements.js @@ -7,6 +7,15 @@ const bottomAppBar = document.getElementById("bottom-sticker"); // https://github.com/jenkinsci/jenkins/commit/6481e78d20a0c689859058da5a029489e8b5072c introduced a shadow on a different div!? const bottomShadow = document.querySelector(".jenkins-bottom-app-bar__shadow") +document.querySelectorAll(".bottom-sticker-inner") + .forEach(element => { + // there can be multiple bottom stickers (e.g. in a dialog) but there's no class on the actual element + const bottomSticker = element.parentNode + if (bottomSticker) { + bottomSticker.style.position = "relative"; + } + }) + if (header) { header.style.position = "relative"; } diff --git a/src/test/java/plugins/SshSlavesPluginTest.java b/src/test/java/plugins/SshSlavesPluginTest.java index aa7ed5f69..ba8e3fbb1 100644 --- a/src/test/java/plugins/SshSlavesPluginTest.java +++ b/src/test/java/plugins/SshSlavesPluginTest.java @@ -96,14 +96,13 @@ public void newAgent() { // ignore } - SshCredentialDialog f = l.addCredential(); + SshPrivateKeyCredential sc = l.addCredential(SshPrivateKeyCredential.class); { - SshPrivateKeyCredential sc = f.select(SshPrivateKeyCredential.class); sc.description.set(description); sc.username.set(username); sc.selectEnterDirectly().privateKey.set(privateKey); + sc.add(); } - f.add(); l.credentialsId.select(String.format("%s (%s)", username, description)); } From 74e6fe0c3f071a592ec09bc4e7aa2283d9e62dc0 Mon Sep 17 00:00:00 2001 From: Tim Jacomb Date: Tue, 13 Jan 2026 08:19:17 +0000 Subject: [PATCH 09/10] Fixes --- .../acceptance/junit/WithCredentials.java | 39 +++++++------------ .../ssh_credentials/SshCredentialDialog.java | 1 - .../SshPrivateKeyCredential.java | 1 - .../plugins/ssh_slaves/SshSlaveLauncher.java | 6 +-- .../selenium/disable-sticky-elements.js | 5 +++ .../java/plugins/SshSlavesPluginTest.java | 1 - 6 files changed, 20 insertions(+), 33 deletions(-) diff --git a/src/main/java/org/jenkinsci/test/acceptance/junit/WithCredentials.java b/src/main/java/org/jenkinsci/test/acceptance/junit/WithCredentials.java index 7a6027930..110c300e4 100644 --- a/src/main/java/org/jenkinsci/test/acceptance/junit/WithCredentials.java +++ b/src/main/java/org/jenkinsci/test/acceptance/junit/WithCredentials.java @@ -15,7 +15,6 @@ import org.jenkinsci.test.acceptance.plugins.credentials.UserPwdCredential; import org.jenkinsci.test.acceptance.plugins.ssh_credentials.SshPrivateKeyCredential; import org.jenkinsci.test.acceptance.po.Jenkins; -import org.junit.AssumptionViolatedException; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; @@ -107,19 +106,13 @@ private boolean enterCredentials(WithCredentials wp) { * @param sshKeyPath path to the ssh key */ private void addSshUsernamePrivateKeyCredentials(String username, String sshKeyPath, String id) { - try { - CredentialsPage cp = new CredentialsPage(jenkins, ManagedCredentials.DEFAULT_DOMAIN); - cp.open(); - SshPrivateKeyCredential sc = cp.add(SshPrivateKeyCredential.class); - sc.username.set(username); - sc.selectEnterDirectly() - .privateKey - .set(resource(sshKeyPath).asText()); - maybeSetId(sc, id); - cp.create(); - } catch (Exception ex) { - throw new AssumptionViolatedException("@WithCredentials requires credentials@2.0.7.", ex); - } + CredentialsPage cp = new CredentialsPage(jenkins, ManagedCredentials.DEFAULT_DOMAIN); + cp.open(); + SshPrivateKeyCredential sc = cp.add(SshPrivateKeyCredential.class); + sc.username.set(username); + sc.selectEnterDirectly().privateKey.set(resource(sshKeyPath).asText()); + maybeSetId(sc, id); + cp.create(); } /** @@ -128,17 +121,13 @@ private void addSshUsernamePrivateKeyCredentials(String username, String sshKeyP * @param password password */ private void addUsernamePasswordCredentials(String username, String password, String id) { - try { - CredentialsPage c = new CredentialsPage(jenkins, ManagedCredentials.DEFAULT_DOMAIN); - c.open(); - final UserPwdCredential upc = c.add(UserPwdCredential.class); - upc.username.set(username); - upc.password.set(password); - maybeSetId(upc, id); - c.create(); - } catch (Exception ex) { - throw new AssumptionViolatedException("@WithCredentials requires credentials@2.0.7.", ex); - } + CredentialsPage c = new CredentialsPage(jenkins, ManagedCredentials.DEFAULT_DOMAIN); + c.open(); + final UserPwdCredential upc = c.add(UserPwdCredential.class); + upc.username.set(username); + upc.password.set(password); + maybeSetId(upc, id); + c.create(); } private void maybeSetId(BaseStandardCredentials creds, String id) { diff --git a/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_credentials/SshCredentialDialog.java b/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_credentials/SshCredentialDialog.java index b1a083348..2394742ec 100644 --- a/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_credentials/SshCredentialDialog.java +++ b/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_credentials/SshCredentialDialog.java @@ -1,7 +1,6 @@ package org.jenkinsci.test.acceptance.plugins.ssh_credentials; import org.jenkinsci.test.acceptance.plugins.credentials.BaseStandardCredentials; -import org.jenkinsci.test.acceptance.plugins.credentials.Credential; import org.jenkinsci.test.acceptance.po.Control; import org.jenkinsci.test.acceptance.po.PageObject; diff --git a/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_credentials/SshPrivateKeyCredential.java b/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_credentials/SshPrivateKeyCredential.java index 401d7b643..a45688c5c 100644 --- a/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_credentials/SshPrivateKeyCredential.java +++ b/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_credentials/SshPrivateKeyCredential.java @@ -6,7 +6,6 @@ import org.jenkinsci.test.acceptance.po.Describable; import org.jenkinsci.test.acceptance.po.PageAreaImpl; import org.jenkinsci.test.acceptance.po.PageObject; -import org.jenkinsci.test.acceptance.selenium.Scroller; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; diff --git a/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_slaves/SshSlaveLauncher.java b/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_slaves/SshSlaveLauncher.java index cdb5edaeb..4a68fd357 100644 --- a/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_slaves/SshSlaveLauncher.java +++ b/src/main/java/org/jenkinsci/test/acceptance/plugins/ssh_slaves/SshSlaveLauncher.java @@ -4,10 +4,8 @@ import edu.umd.cs.findbugs.annotations.CheckForNull; import java.time.Duration; -import org.jenkinsci.test.acceptance.plugins.credentials.BaseStandardCredentials; import org.jenkinsci.test.acceptance.plugins.credentials.Credential; import org.jenkinsci.test.acceptance.plugins.credentials.UserPwdCredential; -import org.jenkinsci.test.acceptance.plugins.ssh_credentials.SshCredentialDialog; import org.jenkinsci.test.acceptance.plugins.ssh_credentials.SshPrivateKeyCredential; import org.jenkinsci.test.acceptance.po.ComputerLauncher; import org.jenkinsci.test.acceptance.po.Control; @@ -39,9 +37,7 @@ public SshSlaveLauncher(PageObject context, String path) { public T addCredential(Class type) { find(by.button("Add")).click(); - find(by.css(".jenkins-dropdown")) - .findElement(by.button("Global")) - .click(); + find(by.css(".jenkins-dropdown")).findElement(by.button("Global")).click(); // Selenium will execute the next step before the options have loaded if we don't wait for them waitFor(by.css(".jenkins-choice-list__item__label")); diff --git a/src/main/resources/org/jenkinsci/test/acceptance/selenium/disable-sticky-elements.js b/src/main/resources/org/jenkinsci/test/acceptance/selenium/disable-sticky-elements.js index 0edca164f..51766d73c 100644 --- a/src/main/resources/org/jenkinsci/test/acceptance/selenium/disable-sticky-elements.js +++ b/src/main/resources/org/jenkinsci/test/acceptance/selenium/disable-sticky-elements.js @@ -16,6 +16,11 @@ document.querySelectorAll(".bottom-sticker-inner") } }) +document.querySelectorAll(".jenkins-bottom-app-bar__shadow") + .forEach(element => { + element.style.position = "initial"; + }) + if (header) { header.style.position = "relative"; } diff --git a/src/test/java/plugins/SshSlavesPluginTest.java b/src/test/java/plugins/SshSlavesPluginTest.java index ba8e3fbb1..c75bc37bc 100644 --- a/src/test/java/plugins/SshSlavesPluginTest.java +++ b/src/test/java/plugins/SshSlavesPluginTest.java @@ -41,7 +41,6 @@ import org.jenkinsci.test.acceptance.junit.WithPlugins; import org.jenkinsci.test.acceptance.plugins.credentials.CredentialsPage; import org.jenkinsci.test.acceptance.plugins.credentials.ManagedCredentials; -import org.jenkinsci.test.acceptance.plugins.ssh_credentials.SshCredentialDialog; import org.jenkinsci.test.acceptance.plugins.ssh_credentials.SshPrivateKeyCredential; import org.jenkinsci.test.acceptance.plugins.ssh_slaves.SshSlaveLauncher; import org.jenkinsci.test.acceptance.po.Control; From f2342a21a1e5c6a40f695ff0e1d987db2089d76a Mon Sep 17 00:00:00 2001 From: Tim Jacomb Date: Wed, 14 Jan 2026 22:26:28 +0000 Subject: [PATCH 10/10] Try this --- .../acceptance/plugins/credentials/AbstractCredentialsTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/AbstractCredentialsTest.java b/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/AbstractCredentialsTest.java index f77a4b9ac..b46ae527d 100644 --- a/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/AbstractCredentialsTest.java +++ b/src/main/java/org/jenkinsci/test/acceptance/plugins/credentials/AbstractCredentialsTest.java @@ -110,6 +110,7 @@ protected T createCredentials( SshPrivateKeyCredential castedCred = (SshPrivateKeyCredential) cred; castedCred.description.set(CRED_DSCR); if (scope != null) { + waitFor(by.option(scope)); castedCred.scope.select(scope); } castedCred.username.set(CRED_USER);