贝宝沙盒无法找到密码字段

时间:2018-08-29 17:11:34

标签: selenium paypal-sandbox htmlunit-driver

我当前正在使用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 :(得分:0)

正如我之前提到的,这里存在多个问题:

  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所定位元素的可见性:电子邮件(以500 MILLISECONDS间隔尝试10秒)