更新
我试图在这个网站上登录:
不幸的是,我没有成功。这是我的代码:
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()方法。
感谢。
答案 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();
...
}