Selenium HTMLUnitDriver无法登录

时间:2018-03-20 01:52:35

标签: selenium htmlunit

更新

我试图在这个网站上登录:

Salesforce Trailhead

不幸的是,我没有成功。这是我的代码:

WebDriver driver = new HtmlUnitDriver();

driver.get("https://trailhead.salesforce.com/en/home");
System.out.println(driver.getTitle());

WebElement btnLogin = driver.findElement(By.xpath("//*[@id=\"main-wrapper\"]/header/div[1]/div[2]/span[2]/div/span/button"));
System.out.println(btnLogin);

driver.quit();

我正在尝试从标题中获取“登录”按钮但是,我找不到“元素”这是我收到的异常消息:

  

线程“main”中的异常org.openqa.selenium.NoSuchElementException:   无法使用定位节点   // * [@ ID = “主包装”] /报头/ DIV 1 / DIV [2] /跨度[2] / DIV /跨度/按钮

我正试图从下面测试答案但是,我没有成功。我想更好地理解WebDriverWait的工作方式和until()方法。

感谢。

2 个答案:

答案 0 :(得分:1)

在这个WebPage中,开发人员非常友好地将特殊的(HTML5)属性添加到HTML中以用于测试目的,称为“数据测试”。您可以使用CSS选择器借助此属性在Selenium代码中找到Webelements。因此,不需要复杂的Xpath选择器,并且没有必要像@Buaban建议的那样迭代按钮。

我测试了以下C#代码并设法点击登录按钮。

 IWebElement btnLogin = Driver.FindElement(By.CssSelector("button[data-test=header-login]"));

 btnLogin.Click();

我认为你使用的是Java,然后就是:

 WebElement btnLogin = driver.findElement(By.cssSelector("button[data-test=header-login]"));

 btnLogin.click();

对于更稳定的解决方案,您必须使用显式等待:

WebDriverWait wait = new WebDriverWait(driver, 20);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.css(""button[data-test=header-login]"")));

Selenium将尝试每500毫秒找到一个按钮,最多20秒。在找到按钮或直到20秒后,将忽略NoSuchElementExceptions。如果在20秒后未找到该按钮,则将抛出超时异常。

答案 1 :(得分:0)

问题是有多个登录按钮。您的代码等待第一个按钮可见。不幸的是,它没有赢。所以Selenium等到超时。
我建议通过遍历所有saleforce登录按钮创建一个方法来查找正确的按钮,并检查属性isDisplayed()。如果是,请使用按钮。请参阅下面的示例。

private WebElement findLoginButton(WebDriver d, By by) {
    List<WebElement> elements = d.findElements(by);
    for (Iterator<WebElement> e = elements.iterator(); e.hasNext();) {
        WebElement item = e.next();
        if(item.isDisplayed())
                return item;
    }
    return null;
}

@Test
public void testSaleforce() {
    WebDriver driver = new HtmlUnitDriver();
    driver.get("https://trailhead.salesforce.com/en/home");
    System.out.println(driver.getTitle());
    WebElement btnLogin = driver.findElement(By.xpath("//*[@data-react-class='auth/LoginModalBtn']"));
    System.out.println(btnLogin);
    btnLogin.click();
    WebDriverWait wait = new WebDriverWait(driver,10);
    WebElement btnLoginSalesforce = wait.until((WebDriver d) -> findLoginButton(d,By.cssSelector(".th-modal-btn__salesforce")));
    btnLoginSalesforce.click();
    ...
}