2011-05-24 50 views
0

我使用的代码硒2: ““()的SendKeys一些错误代码driver.findElement By.name(” 用户名)( “”);”

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

登录到网站。有时它会工作,有时也不会给出的错误是在线程“主要” org.openqa.selenium.NoSuchElementException

例外: 找不到元素: {“方法”:“名“,”selector“:”username“}

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

回答

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

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

+0

AJ77说什么。 Webdriver非常快速地浏览网页,通常需要使用isXPresent(x)或isVisible(x)来确保页面正确加载。 – 2011-05-24 07:53:02

+0

是的,我认为你是正确的.thx – lok4u 2011-05-25 01:51:33

1

还有就是要解决这个问题最简单的办法:

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

它会处理所有NoSuchElementExceptions只是想refind的元素。

+0

driver.manage()。timeouts()。implicitlyWait(new TimeSpan(0,0,10)); – lisak 2011-06-06 15:56:35

1

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

String strTemp = driver.PageSource; 

你会看到源代码不加载整个页面。