2012-03-08 2 views
9

Я искал решение для этого, но безрезультатно. У меня есть кнопка, которую я нажимаю, иногда требуется много времени, чтобы возвращать данные, а драйвер отключается и просто убивает приложение, которое я предполагаю.Selenium Webdriver wait on element click?

Я пытаюсь использовать класс WebDriverWait для выполнения этого, но метод Click() недоступен в том, как я его использую.

WebDriverWait wait = new WebDriverWait(browser, new TimeSpan(0, 5, 0)); 

bool clicked = wait.Until<bool>((elem) => 
{ 
    elem.Click(); //Doesn't Work 
    return true; 
}); 

Метод ImplicitlyWait() только для ожидания элементов для загрузки, но это раз на Click(), поэтому он не может даже смотреть на элемент.

Метод SetScriptTimeout() работает только с выполнением javascript, чего я не делаю.

Кто-нибудь знает, как это сделать?

ответ

5

В дополнение к решению prestomanifesto я могу предложить менее идеальное решение, которое я реализовал для решения этой проблемы. Оказывается, это бросает исключение - No Response и т. Д. - поэтому я просто окружил его в попытке поймать, а затем подождал, пока всплывающее окно закроется, что, похоже, работает нормально.

Вы можете заменить все, что хотите, в своем цикле, просто не забудьте поставить счетчик, чтобы он не зацикливался навсегда.

try 
{ 
    element.Click(); 
} 
catch 
{ 
    cnt++; 
    do 
    { 
     //wait for whatever 
     cnt++; 
     Thread.Sleep(1000); 
     // Wait for 30 seconds for popup to close 
    } while (!string.IsNullOrEmpty(browser.CurrentWindowHandle) && cnt < 30); 
} 
+0

Я изо всех сил пытаюсь найти лучшее решение, я разместил здесь, если вы можете посмотреть на него http://stackoverflow.com/questions/12967008/webdriverwait-or-implicitlywait-or-explictlywait-nothing-works –

0

Я использую этот скрипт:

private static void waitUntilScriptFoundAndExecute(String script) { 
    int tries = 0; 
    boolean found = false; 
    do { 
     tries++; 
     try { 
     driver.executeScript(script); 
     found = true; 
     } catch (NoSuchElementException nse) { 
     System.out.println("Wait for script NSE (" + tries + ")"); 
     } catch (WebDriverException wde) { 
     System.out.println("Wait for script WDE (" + tries + ")"); 
     } catch (Exception e) { 
     System.out.println("Wait for script E (" + tries + ")"); 
     } 

     // Waiting 
     if (!found) { 
     System.out.println("Wait for script Not found (" + tries + ")"); 
     waiting(SCRIPT_WAITING_INTERVAL); 
     } 
    } while (!found && tries < MAX_SCRIPT_WAIT_TRIES); 

    if (!found) { 
     System.out.println("Script aborted: " + script); 
    } 
    } 
+0

Это не сработает для того, что я делаю, в то время как это полезно для поиска сценария. Благодарю. В конечном итоге я нашел решение и опубликую его, как только смогу. Новые пользователи не могут сразу ответить на свое решение. – hacket

+0

Я на той же доске, как у исправить? Можете ли вы поделиться? Измените ур вопрос a паст ур решения. –

5

Вместо Click вы можете попробовать использовать SendKeys. В отличие от Click, SendKeys не дожидается завершения загрузки страницы перед возобновлением выполнения кода. Таким образом, вы можете сделать что-то вроде этого:

WebDriverWait wait = new WebDriverWait(browser, new TimeSpan(0, 5, 0)); 

elem.SendKeys(Keys.Enter);  
wait.Until<bool>((_driver) => 
{   
    //Check here if results have loaded yet 
    return true; 
}); 

Как примечание стороны, я уверен, что Until берет в IWebBrowser в качестве входных данных, а не как элемент, поэтому вы не можете нажать на elem.

+0

Это хорошее решение, к сожалению, отправка этого элемента не работает. Не знаю, почему ... – hacket

+0

У меня это случается слишком часто, особенно когда клик вызывает событие jQuery. В этом случае я использую 'ExecuteScript' для выполнения щелчка, например:' driver.ExecuteScript ("$ (arguments [0]). Click()", elem); 'Рад, что вы нашли обходной путь пока. – prestomanifesto

10

попробовать это:

WebDriverWait wait = new WebDriverWait(driver , 1000) ; 
wait.until(ExcepctedConditions.elementToBeClickable(ById("element")); 

Элемент может быть ID любого элемента, присутствующего на следующей странице вы перенаправлены. Когда страница загружается полностью, она начнет выполнение вашего кода.

+0

проблема заключается в том, что при обработке элемента element.click() он приостанавливается и ждет около 30 секунд для возврата метода .click(). Если это не так, выбрасывает исключение. – hacket

0

RepeatUntil метод расширения с помощью LINQ лямбда-выражения

Скопируйте этот код в ваш проект:

public static class SeleniumExtensionMethods 
    { 
     public static IWebElement RepeatUntil<T>(this T obj, 
      Func<T, IEnumerable<IWebElement>> func, 
       Func<IWebElement, bool> compare, 
        int MaxRetry = 20) 
     { 
      //call function to get elements 
      var eles = func(obj); 
      IWebElement element = null; 
      while (element == null && MaxRetry > 0) 
      { 
       MaxRetry-=1; 
       //call the iterator 
       element = IterateCollection(compare, eles); 
       if (element == null) 
       { 
        Thread.Sleep(500); 
        //get new collection of elements 
        eles = func(obj); 
       } 
      }; 

      return element; 
     } 

     private static IWebElement IterateCollection(
      Func<IWebElement, bool> compare, 
      IEnumerable<IWebElement> eles){ 
      IWebElement element = null; 
      eles.ToList().ForEach(
       ele => 
       { 
        //call the comparator 
        var found = compare(ele); 
        if (found) element = ele; 
       }); 
      return element; 
     } 
    } 

вызвать его, используя следующий синтаксис:

// You can change PageObjectType to IWebDriver or IWebElement so that 
// cb is of any type. 
var element = cb.RepeatUntil<MyPageObjectType>(
    //This is the first function to provide the elements 
    p => p.FindElements(By.ClassName("TreeNode")), 
    //This is the comparator 
    ele => ele.Text == nodeText && ele.Location.Y>YLocation); 

Примечание: В пример выше, мы проходим в PageObjectType, но вы можете изменить это на b e типа IWebDriver или событие IWebElement. Все параметры типа позволяют использовать это как метод расширения для указанного вами типа.

Обратите внимание на гибкость метода расширения в том, что вызывающий может определить коллекцию, а также компаратор.

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