Перейти к содержимому

Marisya

Регистрация: 19 дек 2011
Offline Активность: 14 мая 2021 22:41
-----

#102047 Selenium webdriver

Написано Marisya 12 марта 2012 - 10:28

public void login(){

public final static String baseUrl= "http://192.168.0.143...3/mediawiki/?";

driver.get(baseUrl + "index.php?title=Special:UserLogin&returnto=Special:UserLogout");
driver.findElement(By.id("wpName1")).sendKeys("Login");
driver.findElement(By.id("wpPassword1")).sendKeys("pass");
driver.findElement(By.id("wpLoginattempt")).click();
}
Только в этом случае константа остается в самом методе, что плохо.
Стоит вынести в родительский класс, некий Parent и ссылаться так:
public void login(){

driver.get(Parent.baseUrl + "index.php?title=Special:UserLogin&returnto=Special:UserLogout");
driver.findElement(By.id("wpName1")).sendKeys("Login");
driver.findElement(By.id("wpPassword1")).sendKeys("pass");
driver.findElement(By.id("wpLoginattempt")).click();
  • 1


#101234 Борьба со "StaleElementReferenceException: Element is no longer at

Написано Marisya 17 февраля 2012 - 13:28

Есть код (описывает выбор значения в выпадающем списке):
new Select( driver.findElement( By.name( "folderList" ) )).selectByVisibleText( folderName );

При выполнении выпадает ошибка:
org.openqa.selenium.StaleElementReferenceException: Element is no longer attached to the DOM

Причем если разнести вот так:
WebElement folderList = driver.findElement( By.name( "folderList" ) );
new Select( folderList ).selectByVisibleText( folderName ); 
То становится понятно, что ошибка обнаруживается только тогда, когда мы начинаем работать с элементом (выбирать в списке какие-то значения).

На текущий момент проблему решили созданием ожидания:
Boolean until = new WebDriverWait( login.getDriver(), 30 ).until( new ExpectedCondition<Boolean>()
        {
            public Boolean apply( WebDriver webDriver )
            {
                try
                {
                    new Select( driver.findElement( By.name( "folderList" ) )).selectByVisibleText( folderName ); 
                }
                catch( StaleElementReferenceException e )
                {
                    log.debug( "Select failed! Try again..." );
                    return false;
                }
                log.debug( "test found!" );
                return true;
            }
        } );

Хотелось бы вытащить эту "ожидалку" в отдельный метод (какой-нибудь "waitElementExist"), который поможет работать с AJAX'ом (будет ждять до тех пор, пока объект не окажется в DOM'е), а для этого надо отделелить "driver.findElement( By.name( "folderList" ))" - сделать его не завернутым в Select. Т.е. в итоге получить конструкцию вида:
driver.findElement( By.name( "folderList" ) ).click()
Т.е. штуку, которой все равно с каким элементом она работает - выпадающий список или что-то еще.

Можете посоветовать как так разделить? Как будет выглядеть этот хитрый метод?
  • 2