Selenium 2:代码“driver.findElement(By.name(”username“))。sendKeys(”“);”

时间:2011-05-24 01:49:26

标签: java selenium webdriver

我使用代码

driver.findElement(By.name("username")).sendKeys("name");
driver.findElement(By.name("password")).sendKeys("12345");

登录网站。有时它会工作,有时它不会,给出的错误是

  

线程“main”中的异常   org.openqa.selenium.NoSuchElementException:   无法找到元素:   { “方法”: “姓名”, “选择器”: “用户名”}

问题在于它有时会起作用。我应该使用Byxpath()吗?

4 个答案:

答案 0 :(得分:2)

您可能不会等到元素加载到页面中。在selenium.isElementPresent(locator)或类似命令命令执行之前使用selenium.isVisible(locator)sendKeys是一种很好的做法。

答案 1 :(得分:2)

您可以将WebDriverWait与条件一起使用以等待元素:

public class MyTestClass{

    private static final int MAX_WAIT_TIME_SEC = 60;
    private WebDriverWait wait;
    [...]

    public void setField(String fieldname, String text){
        wait = new WebDriverWait(driver, MAX_WAIT_TIME_SEC);
        wait.until(new NameExpectedCondition(xpath));
        WebElement element = driver.findElement(By.name(fieldname));
        if(element != null){
            element.sendKeys(text);
        }
        [...]
    }

    public void foo()
}

使用NameExpectedCondition:

import org.openqa.selenium.By;

public class NameExpectedCondition implements ExpectedCondition<Boolean> {

private String fieldName;

public NameExpectedCondition(String fieldName)
{
    this.fieldName= fieldName;
}

public Boolean apply(WebDriver d) {
    d.findElement(By.Name(fieldName));
    return Boolean.TRUE;
}

}

请确保您在正确的框架中搜索元素。

答案 2 :(得分:1)

有一种解决此问题的最简单方法:

driver.Manage().Timeouts().ImplicitlyWait(new TimeSpan(0, 0, 10));

它只会尝试重新绑定一个元素来处理所有NoSuchElementExceptions。

答案 3 :(得分:1)

请在发送FindElement之前添加此命令:

String strTemp = driver.PageSource;

您会看到来源未加载整个页面。