Как отправить форму с помощью Selenium на Java

Я использую Selenium WebDriver для автоматизации системы. Язык - Java. Я сделал большинство вещей, но застрял в одном месте. Мне нужно отправить форму, содержащую поля имени пользователя, пароля и повторного ввода пароля. Но когда я заполняю их (используя селен) и нажимаю кнопку «Создать учетную запись», это не сработало.

Here is the code,

    System.setProperty("webdriver.chrome.driver", "./ChromeDriver/chromedriver.exe");

    WebDriver driver = new ChromeDriver();
    driver.get("URL Here");

    WebElement element9 = driver.findElement(By.id("accountname"));
    element9.sendKeys(username);

    WebElement element10 = driver.findElement(By.id("password"));
    element10.sendKeys(password);

    WebElement element12 = driver.findElement(By.id("reenter_password"));
    element12.sendKeys(password);

I used these methods to submit the form. But none of them worked.

    element12.sendKeys(Keys.ENTER); //method 1

    WebElement element11 = driver.findElement(By.linkText("Complete Sign-up"));
    element11.click(); //method 2

    ((JavascriptExecutor)driver).executeScript("javascript:CompleteCreateAccount();"); //method 3

    WebElement element13 = driver.findElement(By.xpath("//a[@id='createAccountButton']/span"));
    element13.click(); //method 4

    element13.submit(); //method 5

    JavascriptExecutor executor = (JavascriptExecutor)driver;
    executor.executeScript("arguments[0].click();", element13); //method 6

Form HTML got from Inspect Element,

<div class = "leftcol">
<div id = "error_display" style = "display: none;"></div>
    <div class = "checkout_content_box" id = "cart_area">
        <form id = "create_account" name = "create_account" action = "" onsubmit = "CompleteCreateAccount(); return false; " method = "POST">
            <input type = "hidden" name = "lt" id = "lt" value = "0">
            <div id = "account_form_box">
                <div class = "join_form">
                    <div class = "form_row">
                        <div class = "form_area">
                            <label for = "accountname">Create a Steam account name</label>
                            <input type = "text" maxlength = "64" name = "accountname" id = "accountname" onchange = "CheckAccountNameAvailability();">
                        </div>
                        <div class = "form_notes">
                            <br>
                            <span class = "input_note"><a href = "javascript:CheckAccountNameAvailability();">Check availability</a></span>
                            <span id = "accountname_availability" style = "display: none;"></span>
                        </div>
                    <div style = "clear: left;"></div>
                </div>
                <div id = "form_row_choose_suggested_name" class = "form_row" style = "display: none;">
                    <div class = "form_area">
                        <label for = "choose_accountname">Available account names</label><br>
                        <select id = "choose_accountname" name = "choose_accountname" size = "3" onchange = "UpdateAccountName( this.value );">
                            <option id = "suggested_name_1"></option>
                            <option id = "suggested_name_2"></option>
                            <option id = "suggested_name_3"></option>
                        </select>
                    </div>
                    <div class = "form_notes">
                        <br>
                        <span class = "choose_accountname_description">Select one or try again with another name of your choice</span>
                    </div>
                    <div style = "clear: left;"></div>
                </div>
                <div class = "rule"></div>
                <div class = "form_row">
                    <div class = "form_area">
                        <label for = "password">Choose a password</label>
                        <input type = "password" maxlength = "64" name = "password" id = "password" onkeyup = "CheckPasswordStrength()" autocomplete = "off">
                    </div>
                    <div class = "form_notes">
                        <div id = "password_tag" class = "password_tag">&nbsp;</div>
                    </div>
                    <div style = "clear: left;"></div>
                </div>
                <div class = "form_row">
                    <div class = "form_area">
                        <label class = "reenter_row" for = "reenter_password">Re-enter password</label>
                        <input type = "password" maxlength = "64" name = "reenter_password" id = "reenter_password" onkeyup = "ReenterPasswordChange()" autocomplete = "off">
                    </div>
                    <div class = "form_notes">
                        <br>
                        <div id = "reenter_tag" class = "password_tag">&nbsp;</div>
                    </div>
                    <div style = "clear: left;"></div>
                </div>
                <div class = "rule"></div>

                <div class = "form_row">
                    <div id = "priv_and_sub">
                        <a id = "createAccountButton" class = "btnv6_blue_hoverfade btn_medium" href = "javascript:CompleteCreateAccount();" style = "float: right;">
                            <span>Complete Sign-up</span>
                        </a>

                        <div style = "clear: right;"></div>
                    </div>
                    <div id = "ssa_submit">
                    </div>
                </div>
            </div>
        </div>
    </form>
</div>

And also I need to say when I click Create Account button manually it is working. But using selenium It is not working and pass this message

The account name you have chosen is not available. Please choose another name. The password you entered is not allowed. Please select a different password, with at least 8 characters.

But username and passwords are okay. Nothing wrong. Because when I click it manually It is working with that username and password.

@MosheSlavin Я не знаю, что есть много элементов, я только что добавил только эти поля. Нужно ли мне добавлять целые элементы HTML-формы?

H Athukorala 23.12.2018 11:13

@MosheSlavin Я добавил целые HTML-элементы. Вы можете проверить?

H Athukorala 23.12.2018 11:19

@BaruchG. Но я вижу, что в эти поля вводятся имя пользователя и пароли.

H Athukorala 23.12.2018 11:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
5 712
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

У меня были подобные проблемы в прошлом, иногда помогает сосредоточиться на другом элементе, а затем щелкнуть ...

Я бы начал с попытки фокус на <div id = "ssa_submit"></div>.

Обновлено:

Вы говорите, что вручную это работает, поэтому я вам посоветую использовать Action вот так:

Actions action = new Actions(driver);
WebElement btnElement=driver.findElement(By.xpath("//a[@id='createAccountButton']"));
action.doubleClick(btnElement).build().perform();

Но может быть, у вас действительно ошибка в системе ...

Обновлено еще раз:

Лучшая практика в Selenium - использовать WebDriverWait с ExpectedConditions:

WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
wait.until(ExpectedConditions.elementToBeClickable(By.id("createAccountButton")));

См. Ожидаемые условия и WebDriverWait.

Я думаю, это должно сработать!

Надеюсь, это тебе поможет.

Выдает ошибку Element <div id = "ssa_submit">...</div> is not clickable at point

H Athukorala 23.12.2018 11:27

Нет, сэр. Это тоже не работает. Но спасибо, что помогли мне.

H Athukorala 23.12.2018 11:42

Вы видели, как мышь двигается к кнопке и щелкает? и это все еще не помогло? это странно

Moshe Slavin 23.12.2018 11:53

@HansanaAthukorala, у тебя +1 от меня! это загадка! ;)

Moshe Slavin 23.12.2018 11:56

Я обновил последнюю часть вопроса. Вы можете это проверить?

H Athukorala 23.12.2018 11:57

Да, я тоже не могу понять, что происходит.

H Athukorala 23.12.2018 11:57

Вместо того, чтобы щелкнуть By.xpath("//a[@id='createAccountButton']/span") и отправить форму, щелкните поле имени пользователя, пароля или подтверждения пароля и нажмите ввод.

 System.setProperty("webdriver.chrome.driver", "./ChromeDriver/chromedriver.exe");

 WebDriver driver = new ChromeDriver();
 driver.get("URL Here");

 WebElement element9 = driver.findElement(By.id("accountname"));
 element9.sendKeys(username);

 WebElement element10 = driver.findElement(By.id("password"));
 element10.sendKeys(password);

 WebElement element12 = driver.findElement(By.id("reenter_password"));
 element12.sendKeys(password);

 element12.click();
 element12.submit();

Я уже исправил проблему. Но спасибо за ответ.

H Athukorala 24.12.2018 00:50

Другие вопросы по теме