无法单击Paypal按钮继续使用Selenium

时间:2018-03-22 17:46:41

标签: java selenium button

我的代码首先登录PayPal,然后登录eBay并导航到付费页面,然后使用PayPal结账。最后的“继续”按钮我无法点击/提交。我试过xpath,id和class。我甚至尝试发送TAB 7x直到继续按钮,然后发送回车,但这不起作用。

我找到了这个讨论,但我不确定如何让它适合我。 PayPal Sandbox checkout 'continue button' - Unable to locate element: - C# WebDriver

以下是我正在尝试的PayPal代码和页面的屏幕截图。 screenshot

    //Chrome WebDriver specific
    System.setProperty("webdriver.chrome.driver", "C:\\automation\\drivers\\chromedriver.exe");
    WebDriver driver = new ChromeDriver();
    driver.manage().window().maximize(); //maximise webpage
    WebDriverWait wait = new WebDriverWait(driver, 20);

    //navigate to Paypal
    driver.get("https://www.paypal.com/uk/signin");

    //wait 2.5s for the page to load
    try {
        Thread.sleep(2500);
    }
    catch (Exception e) {
        e.printStackTrace();
    }

    WebElement paypalEmail = driver.findElement(By.id("email"));
    paypalEmail.sendKeys("******");

    //wait 2.5s for the page to load
    try {
        Thread.sleep(2500);
    }
    catch (Exception e) {
        e.printStackTrace();
    }

    WebElement paypalSubmit = driver.findElement(By.id("btnNext"));
    paypalSubmit.click();

    String URL = ("https://www.paypal.com/uk/signin");
    driver.get(URL);
    WebElement form2 = driver.findElement(By.cssSelector(".main form"));
    WebElement username = form2.findElement(By.id("password"));
    username.sendKeys("******");

    WebElement paypalSubmit2 = driver.findElement(By.id("btnLogin"));
    paypalSubmit2.click();

    //navigate to Ebay
    driver.get("https://signin.ebay.co.uk/ws/eBayISAPI.dll?SignIn&ru=https%3A%2F%2Fwww.ebay.com%2F");

    // Enter user name , password and click on Signin button
    WebElement form = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#mainCnt #SignInForm")));

    form.findElement(By.cssSelector("input[type=text][placeholder='Email or username']")).sendKeys("******");
    form.findElement(By.cssSelector("input[type=password]")).sendKeys("******");

    form.findElement(By.id("sgnBt")).click();

    driver.get("http://cgi3.ebay.co.uk/ws/eBayISAPI.dll?OneTimePayPalPayment");

    //WebElement Pay =
    driver.findElement(By.xpath("//input[@value='Pay']")).click();

    WebDriverWait wait2 = new WebDriverWait(driver, 15);
    wait2.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id=\"confirmButtonTop\"]")));
    driver.findElement(By.xpath("//*[contains(@id,'confirmButtonTop')]")).click();
}
}

3 个答案:

答案 0 :(得分:1)

根据您提供的截图,下列其中一项应该可以点击“继续”按钮:

方法1:

  WebElement paypalSubmit = driver.findElement(By.xpath("//input[@data-test-id='continueButton']"));
  paypalSubmit.click();

方法2:

By paypalButton=By.xpath("//input[@data-test-id='continueButton']"));
WebElement element=driver.findElement(paypalButton);    
JavascriptExecutor js = (JavascriptExecutor) driver;  
js.executeScript("arguments[0].scrollIntoView(true);",element);
js.executeScript("arguments[0].click();", element);

如果您觉得按钮需要滚动到底部以便点击,请尝试第二种方法。

如果上面没有工作,可以使用另外一个xpath:

//input[@value='Continue' and @id='confirmButtonTop']

答案 1 :(得分:1)

根据我的经验,paypal喜欢使用iFrame。如果你的情况确实如此,这意味着除非你告诉webdriver切换帧上下文,否则无论你的xpath / css选择器如何,你都无法使用paypal表单。

您可以获取当前使用此代码加载的所有可用框架的列表:

String[] handles = driver.getWindowHandles()

您的实际页面将始终是返回的数组中的第0个索引。如果paypal是你唯一的iFrame,那么你可以定位第1个索引。这是一个可能的解决方案:

String mainPageHandle = handles[0];
String paypalHandle = handles[1];

driver.switchTo().window(paypalHandle);
// Do paypal interactions

driver.switchTo().window(mainPageHandle);
// Back to the main page

肯定有更强大的方法来处理这个问题,如果您的网页不幸有多个iFrame,那么您可能需要做更多工作来验证哪个句柄是哪个,例如测试是否包含您知道的元素的存在内。通常,帧每次都会以相同的顺序加载。作为解决此问题的黄金途径,这将让您进出iFrame来执行工作。

答案 2 :(得分:0)

有时传统的click()不起作用。在这种情况下,请尝试使用Javascript Executor单击,如下所示。

确保导入此课程

org.openqa.selenium.JavascriptExecutor

并使用此代替click();

JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].click();", driver.findElement(By.xpath(“//input[@data-test-id='continueButton']”)));

试试这个并告诉我这是否适合您。