2015-04-02 133 views
1

我寫了一段代碼登錄到一個正常工作的應用程序。現在我必須點擊一個添加按鈕,並且我已經通過Id,XPathClassName嘗試過,但它只是給了我找不到的元素的例外。我以爲我應該申請一個明確的等待,但它也沒有工作。請檢查我的代碼如下:元素未找到 - 硒

public static void Login() 

{ 
    Browser.Url = "http://example.com"; 
    _username = Browser.FindElement(By.Id("UserName")); 
    var password = Browser.FindElement(By.Id("Password")); 
    var loginbtn = Browser.FindElement(By.ClassName("btn-primary")); 

    _username.SendKeys("admin"); 
    password.SendKeys("123"); 
    loginbtn.Click(); 

    var supplierTab = Browser.FindElement(By.Id("mainSupplier")); 
    supplierTab.Click(); 

    WebDriverWait wait = new WebDriverWait(Browser, TimeSpan.FromSeconds(20)); 
    IWebElement myDynamicElement = wait.Until<IWebElement>((d) => 
    { 
     try 
     { 
      return d.FindElement(By.Id("btnAddSupplier_SupplierForm")); 
     } 
     catch 
     { 
      return null; 
     } 
    }); 

    var addbtn = Browser.FindElement(By.Id("btnAddSupplier_SupplierForm")); 
    addbtn.Click(); 

} 

這總是會給出找不到元素的第二行代碼的例外。

下面是HTML:

enter image description here

+0

'var addbtn = Browser.FindElement(By.Id(「btnAddSupplier_SupplierForm」));' 在這行代碼中出現錯誤。 – asma 2015-04-02 05:09:17

+0

那麼,等20秒再超時? – Saifur 2015-04-02 05:11:05

+0

是的,它等待,然後顯示超時。 – asma 2015-04-02 05:11:40

回答

0

請嘗試以下

public static void Login() 

{ 
    Browser.Url = "http://example.com"; 
    _username = Browser.FindElement(By.Id("UserName")); 
    var password = Browser.FindElement(By.Id("Password")); 
    var loginbtn = Browser.FindElement(By.ClassName("btn-primary")); 

    _username.SendKeys("admin"); 
    password.SendKeys("123"); 
    loginbtn.Click(); 

    //I think you have mentioned the iframe exist and assuming the element is inside the iframe do the following. If not skip the SwitchTo() part 


    //you can use name, css to identify the iframe 
    Browser.SwitchTo().Frame(Browser.FindElement(By.XPath("xpath for the iframe"))); 

    var supplierTab = Browser.FindElement(By.Id("mainSupplier")); 
    supplierTab.Click(); 

    WebDriverWait wait = new WebDriverWait(Browser, TimeSpan.FromSeconds(20)); 
    IWebElement myDynamicElement = wait.Until<IWebElement>((d) => 
    { 
     return d.FindElement(By.Id("btnAddSupplier_SupplierForm")); 
    }); 

    //if you think the id is not unique try using xpath or css 
    //even though you added an explicit wait you never used it 
    myDynamicElement.Click(); 

} 
+0

讓我試試這個。 ? – asma 2015-04-02 05:53:52

+0

沒有運氣,再次超時異常;( – asma 2015-04-02 05:55:20

+0

是否有可能提供更多的(實際)'html'使用[要點](https://gist.github.com/)如果你想 – Saifur 2015-04-02 05:56:58

0

有時候元素將在源代碼中存在的,但將不可見的硒進行點擊操作。試試下面的代碼會等到元素可見:

WebDriverWait wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(20)); 
IWebElement element = wait.Until(
ExpectedConditions.ElementIsVisible(By.Id("btnAddSupplier_SupplierForm"))); 
element.Click(); 
0

不知道這會有所幫助,但嘗試調用這個函數,你點擊Add按鈕之前:

void waitForPageLoad(WebDriver driver) 
    { 
     ExpectedCondition<Boolean> pageLoadCondition = new ExpectedCondition<Boolean>() { 
      public Boolean apply(WebDriver driver) { 
       return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete"); 
      } 
     }; 
     wait.until(pageLoadCondition); 
    } 
0

拋出NoSuchElementException當使用的定位機構在dom中不可用時。

如果您的預期條件在時間限制內未能成立,則會引發TimeoutException。預期條件可以是任何東西,(存在,可見性,屬性值等)。

首先你想知道你使用的元素的定位機制是否在dom中找不到。這是手動查找的好方法。

  1. 打開瀏覽器並導航到頁面。
  2. 打開chrome開發工具,然後單擊控制檯選項卡。
  3. 在文本框中鍵入$ x(「// * [@ id ='btnAddSupplier_SupplierForm']」)並按回車。這將運行一個xpath查詢,基本上你正在尋找具有值爲「btnAddSupplier_SupplierForm」的id屬性的任何元素。
  4. 如果一個元素出現在控制檯中,並且是正確的元素,那麼很可能您正試圖在dom完成加載之前在dom中查找元素。如果控制檯中沒有出現任何元素,那麼你的定位器很糟糕。

請報告您的發現。