2011-05-24 48 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; 

你會看到源代碼不加載整個頁面。