2017-05-25 23 views
2

必須在文本框中輸入文本,列表會自動擴展,並且需要選擇第一個項目。但由於例外而失敗; OpenQA.Selenium.NoSuchElementException。我嘗試使用wait.Until(),但面臨同樣的錯誤。OpenQA.Selenium.NoSuchElementException - C#Selenium

​​

try 
{ 
    IWebElement cityList = driver.FindElement(By.XPath("value")); 
    MouseClick(driver, cityList); 
} 
catch (OpenQA.Selenium.NoSuchElementException ex) 
{ 
    IWebElement cityList = driver.FindElement(By.XPath("value")); 
    MouseClick(driver, cityList); 
} 

編輯

HTML代碼:

<input name="ctl00$cphmain$txtCity" type="text" maxlength="50" id="ctl00_cphmain_txtCity" class="mandsearchtxtbox" onkeypress="javascript:return ValidateInputAlphabeticValuesOnly(event);" onblur="javascript:return checkItemMsg(this)" style="width:180px;" autocomplete="off"> 
<div class="AutoExtenderHighlight">AMANDOLUWA</div> 

代碼與wait.Until()

WebDriverWait wait1 = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); 
    wait.Until<IWebElement>((d) => 
     { 
      try 
      { 
       return d.FindElement(By.XPath("//*[@id='citydiv']/div")); 
       MouseClick(driver, driver.FindElement(By.XPath("//*[@id='citydiv']/div"))); 
      } 
      catch (OpenQA.Selenium.NoSuchElementException ex) 
      { 
       return null; 
       MouseClick(driver, driver.FindElement(By.XPath("//*[@id='citydiv']/div"))); 
      } 
     }); 

編輯2

爲WebDriverException(按鈕)HTML代碼

HTML code

+0

請添加您試過的代碼以及相關的html。 – Guy

+0

添加了html和代碼。我不確定wait.until()代碼是否正確。 –

回答

2

根據您發佈的ID的HTML是ctl00_cphmain_txtCity,不citydiv

您的wait.Until實現將返回IWebElementnull,它將永遠達不到MouseClick方法。它還會檢查元素是否存在,不可見。

如果你想自己的實現,你可以像

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); 
IWebElement option = wait.Until<IWebElement>((d) => 
{ 
    try 
    { 
     IWebElement element = d.FindElement(By.XPath("//*[@id='ctl00_cphmain_txtCity']/div")); 
     if (element.Displayed) 
     { 
      return element; 
     } 
    } 
    catch (NoSuchElementException) { } 
    catch (StaleElementReferenceException) { } 

    return null; 
}); 

option.Click(); 

東西雖然你用我的指揮官內置的功能,您可以使用內置的expected conditions

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); 
IWebElement element = wait.Until(ExpectedConditions.ElementIsVisible(By.XPath("//*[@id='ctl00_cphmain_txtCity']/div"))); 
element.Click(); 

+0

第二個代碼工作。謝謝:) –

+0

此外,ctl00_cphmain_txtCity是文本框的ID,而citydiv是自動擴展程序列表的ID。因此,使用後者的ID。 –

+0

關於等待的另一個疑問。如果10秒後引發超時異常會怎麼樣?如果由於超時而失敗,它將不會進入try塊。 –