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()Т.е. штуку, которой все равно с каким элементом она работает - выпадающий список или что-то еще.
Можете посоветовать как так разделить? Как будет выглядеть этот хитрый метод?