PayPal Sandbox не может найти поле пароля - PullRequest
0 голосов
/ 29 августа 2018

В настоящее время я использую HtmlUnitDriver, и хотя я могу установить имя пользователя, я получаю сообщение об ошибке, что Selenium не может найти поле пароля. Я использую JavascriptExecutor, чтобы установить эти значения в форме песочницы PayPal, но я все еще не могу пройти шаг пароля.

HtmlUnitDriver driver = new HtmlUnitDriver(BrowserVersion.CHROME)
JavascriptExecutor executor = (JavascriptExecutor)driver

        driver.setJavascriptEnabled(true)
        driver.get(url)
        log.debug "setting username"
        Thread.sleep(5000)
        if(driver.findElement(By.xpath("//*[@id='email']")).displayed){
            executor.executeScript("document.getElementById('email').value = 'email';")
            log.debug "Username was set"

        } else {
            log.debug "We never set the username!"
        }

        if(driver.findElement(By.xpath("//*[@id='password']")).displayed){
            executor.executeScript("document.getElementById('password').value='password';")

        } else {
            log.debug "We never set the password."
        }

Я понимаю, что я сплю там, и это плохая практика для тестирования Selenium, но я в значительной степени здесь сообразителен. В этом случае URL-адрес является ссылкой для экспресс-оплаты, которая выглядит примерно так: https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=#################

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 31 августа 2018

Как я упоминал ранее, здесь есть несколько проблем:

  1. Когда я загружаю начальную страницу, я вижу этот интерфейс: enter image description here

    Как видите, кнопка пароля действительно невидима. Поэтому, если мы не нажмем кнопку Далее , нет никаких шансов, что этот скрипт будет работать.

    Таким образом, для достижения какого-либо прогресса необходимо добавить следующее:

    driver.findElement(By.id("btnNext")).submit()
    
  2. Однако, к сожалению, я не могу заставить эту кнопку правильно щелкнуть с помощью HtmlUnitDriver. Кажется, кнопка нажата, но ничего не происходит, поэтому поле Пароль остается скрытым. Однако, как только я переключаюсь на ChromeDriver, это больше не проблема, и тот же код работает. Поэтому я предполагаю, что вы столкнулись с одним из ограничений HtmlUnitDriver и должны использовать драйвер Chrome или Gecko.

  3. Наконец, несколько изменений в коде сделают его более надежным и быстрым. Вот финальная версия, которая работает для «настоящих» браузеров (Chrome или Gecko):

        WebDriver driver = new ChromeDriver()
        WebDriverWait wait = new WebDriverWait(driver, 10)
    
        driver.get(url)
    
        // The following line waits for email field to appear. It's more economical and reliable than Thread.sleep
        WebElement email = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("email")))
        log.debug "setting username"
        email.sendKeys("email@gmail.com")
        log.debug "Username was set " + email.getAttribute("value")
    
        driver.findElement(By.id("btnNext")).submit()
    
        // Here again using the same method to verify when password becomes visible         
        WebElement password = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("password")))
        log.debug "setting password"
        password.sendKeys("password")
        log.debug "Password was set " + password.getAttribute("value")
    

(примечание: я написал этот код на Java, так что я надеюсь, что я перевел все правильно, но если я не стесняюсь это исправить)

Результат этого скрипта выглядит в Chrome следующим образом: enter image description here

С HtmlUnitDriver скрипт выдаст ошибку:

org.openqa.selenium.TimeoutException: ожидаемое условие не выполнено: ожидание видимости элемента, обнаруженного By.id: электронная почта (попытка в течение 10 секунд с интервалом 500 МИЛЛИСЕКОНД)

...