2012-04-05 3 views
1

Я использую веб-драйвер Selenium 2.0. Иногда мой скрипт прерывается, когда я пытаюсь найти что-то на своей странице. Он выдает исключение:Поиск элемента по идентификатору не работает в Selenium 2.0 Webdriver

Невозможно найти элемент: {"method": "id", "selector": "username"};

часть моего кода:

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 

WebElement userName = driver.findElement(By.id("username")); 
userName.clear(); 
userName.sendKeys("admin"); 

Она проходит успешно, иногда с тем же кодом. Я не понимаю, что происходит.

ответ

4

Иногда это происходит из-за того, что страница загружается медленнее, чем вы ожидали. Я делаю обход, применяя свой собственный помощник-обертку. Это выглядит следующим образом:

private WebElement foundElement; 

public WebElement find(By by){ 
    for (int milis=0; milis<3000; milis=milis+200){ 
     try{ 
     foundElement = driver.findElement(by); 

     }catch(Exception e){ 
     Thread.sleep(200); 
     } 

    } 
    return foundElement; 
} 

А позже в коде:

WebElement userName = find(By.id("username")); 

Этот подход будет пытаться найти его, и если он не найден, сон в течение 200 миллисекунд и повторите попытку. Если он не найден за 3 секунды (редактируется), он сработает (вам, вероятно, придется сказать в методе, что он выбрасывает исключение)

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

+0

Спасибо. Позвольте мне попробовать ваш подход. Позволит вам знать, как все работает. – user1315920

+0

Спасибо. Это сработало!! – user1315920

+0

Использование плавного ожидания, как показано Хари Редди, если оно значительно превосходит этот вид явного ожидания. –

3

лучшее решение для вашей проблемы, делая ожидание водителя до нагрузки идентификатора элемента в браузере с помощью WebDriverWait Object -

new WebDriverWait(driver, 10).until(new ExpectedCondition<Boolean>() { 

     public Boolean apply(WebDriver arg0) { 

      WebElement element = driver.findElement(By.id("username")); 


      return element.isDisplayed(); 
     } 
    }); 

Это гарантирует, что водитель прекращает проверки, если идентификатор элемент имеет загружен. Если он не загружается в течение 10 секунд, будет выбрано timedOutException.

+0

Для тех, кто может быть заинтересован: в объекте C# WebDriverWait входит в пакет Selenium.Support NuGet .. – MegaMilivoje

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