diff --git a/java/src/org/openqa/selenium/federatedcredentialmanagement/FederatedCredentialManagementDialog.java b/java/src/org/openqa/selenium/federatedcredentialmanagement/FederatedCredentialManagementDialog.java
index 45478d1f618f3..0e915b02aef44 100644
--- a/java/src/org/openqa/selenium/federatedcredentialmanagement/FederatedCredentialManagementDialog.java
+++ b/java/src/org/openqa/selenium/federatedcredentialmanagement/FederatedCredentialManagementDialog.java
@@ -29,6 +29,11 @@ public interface FederatedCredentialManagementDialog {
String DIALOG_TYPE_ACCOUNT_LIST = "AccountChooser";
String DIALOG_TYPE_AUTO_REAUTH = "AutoReauthn";
+ String BUTTON_CONFIRM_IDP_LOGIN_CONTINUE = "ConfirmIdpLoginContinue";
+ // The following buttons need an account index.
+ String BUTTON_TERMS_OF_SERVICE = "TermsOfService";
+ String BUTTON_PRIVACY_POLICY = "PrivacyPolicy";
+
/** Closes the dialog as if the user had clicked X. */
void cancelDialog();
@@ -60,4 +65,19 @@ public interface FederatedCredentialManagementDialog {
*
If this is an auto reauth dialog, returns the single account that is being signed in.
*/
List getAccounts();
+
+ /**
+ * Clicks a button on the dialog.
+ *
+ * @param button The button to click.
+ */
+ void clickButton(String button);
+
+ /**
+ * Clicks a button on the dialog that requires an account index.
+ *
+ * @param button The button to click.
+ * @param index The account index, if needed by the specified button.
+ */
+ void clickButton(String button, int index);
}
diff --git a/java/src/org/openqa/selenium/remote/FedCmDialogImpl.java b/java/src/org/openqa/selenium/remote/FedCmDialogImpl.java
index 59e832f84e367..9f218f99fbd82 100644
--- a/java/src/org/openqa/selenium/remote/FedCmDialogImpl.java
+++ b/java/src/org/openqa/selenium/remote/FedCmDialogImpl.java
@@ -76,4 +76,15 @@ public List getAccounts() {
}
return accounts;
}
+
+ @Override
+ public void clickButton(String button) {
+ executeMethod.execute(DriverCommand.CLICK_DIALOG, Map.of("dialogButton", button));
+ }
+
+ @Override
+ public void clickButton(String button, int index) {
+ executeMethod.execute(
+ DriverCommand.CLICK_DIALOG, Map.of("dialogButton", button, "index", index));
+ }
}
diff --git a/java/test/org/openqa/selenium/federatedcredentialmanagement/FederatedCredentialManagementTest.java b/java/test/org/openqa/selenium/federatedcredentialmanagement/FederatedCredentialManagementTest.java
index ee9a6658cd338..070206c3c7f35 100644
--- a/java/test/org/openqa/selenium/federatedcredentialmanagement/FederatedCredentialManagementTest.java
+++ b/java/test/org/openqa/selenium/federatedcredentialmanagement/FederatedCredentialManagementTest.java
@@ -176,4 +176,33 @@ void testGetAccounts() {
.isEqualTo("https://rp.example/terms_of_service.html");
assertThat(account2.getPrivacyPolicyUrl()).isEqualTo("https://rp.example/privacy_policy.html");
}
+
+ @Test
+ @NotYetImplemented(
+ value = CHROME,
+ reason = "https://github.com/SeleniumHQ/selenium/pull/12096#issuecomment-2017760822")
+ void testClickDialogButton() {
+ fedcmDriver.setDelayEnabled(false);
+ assertNull(fedcmDriver.getFederatedCredentialManagementDialog());
+
+ Object response = triggerFedCm();
+
+ waitForDialog();
+
+ FederatedCredentialManagementDialog dialog =
+ fedcmDriver.getFederatedCredentialManagementDialog();
+
+ assertEquals("Sign in to localhost with localhost", dialog.getTitle());
+ assertEquals("AccountChooser", dialog.getDialogType());
+
+ int windowCount = localDriver.getWindowHandles().size();
+ dialog.clickButton(dialog.BUTTON_PRIVACY_POLICY, 1);
+ WebDriverWait wait = new WebDriverWait(localDriver, Duration.ofSeconds(5));
+ wait.until(driver -> driver.getWindowHandles().size() > windowCount);
+
+ dialog.selectAccount(0);
+
+ response = jsAwareDriver.executeScript("return await promise");
+ assertThat(response).asInstanceOf(MAP).containsEntry("token", "a token");
+ }
}