2015-04-02 2 views
1

Я написал фрагмент кода для входа в приложение, которое работает нормально. Теперь мне нужно нажать кнопку «Добавить», и я попробовал ее с помощью Id, XPath, ClassName, но это просто дает мне исключение, что элемент не найден. Я думал, что должен применить явное ожидание, но это также не сработало. Пожалуйста, проверьте мой код ниже:Элемент не найден - Selenium

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

+0

Итак, он ждет '20s', а затем перерыв? – Saifur

+0

Да, он ждет, а затем показывает тайм-аут. – asma

ответ

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

+0

Не повезло, снова исключение таймаута ( – asma

+0

Возможно ли предоставить больше (актуальных) 'html'? Используйте [gist] (https://gist.github.com/), если вы хотите – Saifur

0

Иногда элемент будет существующий в исходном коде, но не будет виден Селен, чтобы выполнить операцию щелчка , Попробуйте следующий код, который будет ждать, пока элемент не виден:

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

Не уверен, если это поможет, но попробуйте вызвать эту функцию, прежде чем нажать на кнопку Добавить:

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.

Исключение времени ожидания, когда ваше ожидаемое условие не может быть истинным в течение срока. Ожидаемым условием может быть что угодно, (существует, видимость, значение атрибута и т. Д.).

Сначала вы хотите выяснить, действительно ли используемый вами механизм определения элемента не найден в dom. Вот хороший способ узнать вручную.

  1. Открыть хром и перейти на страницу.
  2. Откройте утилиту chrome dev и нажмите на вкладку консоли.
  3. В текстовом поле введите $ x ("// * [@ id = 'btnAddSupplier_SupplierForm']") и нажмите enter. Это запустит запрос xpath, в основном вы ищете любой элемент с атрибутом id со значением «btnAddSupplier_SupplierForm».
  4. Если элемент отображается в консоли и является правильным элементом, то, вероятно, вы пытаетесь найти элемент в dom до того, как dom закончит загрузку. Если в консоли не появляется элемент, у вас есть плохой локатор.

Просьба сообщить о своих выводах.

Смежные вопросы