2015-05-12 4 views
1

Selenium: Мне нужно выбрать значение из раскрывающегося списка, которое зависит от значения, выбранного в другом раскрывающемся списке.Selenium: выберите значение из раскрывающегося списка, которое зависит от значения, выбранного в другом раскрывающемся списке

Ex: У меня есть два выпадающих списка 1 и 2. Значение, которое должно быть заполнено в 2, зависит от 1. Когда я выбираю значение в выпадающем списке 1, страница обновляется, а значение в 2 заполняется. Я должен выбрать значение в раскрывающемся списке 2.

Получать ошибку Element is no longer attached to DOM.

Я пробовал использовать wait.until((ExpectedCondition<Boolean>) new ExpectedCondition<Boolean>(), но это мне не помогает. Такая же проблема возникает.

Я пробовал использовать WebElement и Select, но ни один из них не помог. Может ли кто-нибудь помочь мне разобраться в решении?

JavascriptExecutor executor2 = (JavascriptExecutor)driver; 
executor2.executeScript("arguments[0].click();", <elementname>); 
waitFor(3000); 

Select <objectname1>= new Select(driver.findElement(By.id("<ID_for_drop_down_1>"))); 
selectCourse.selectByVisibleText("<valuetobeselected>"); 
waitFor(2000); 

Select <objectname2>= new Select(driver.findElement(By.id("ID_for_drop_down_2"))); 
selectCourse.selectByVisibleText("<valuetobeselected>"); 
waitFor(2000); 

Я использую waitFor(2000) определенная функция для ожидания указанного TimePeriod.

+0

Не могли бы вы добавить рабочий образец вашего кода? – MeanGreen

+0

Отредактировано сообщение и добавлен образец кода. – Abhinav

+0

Возможно ли получить источник страницы в качестве примера, мы не можем проверить, есть ли ошибка. – Dude

ответ

1

Эти функции вам нужны. Это поможет вам, поэтому тестовые примеры не сбой из-за изменения страницы во время тестирования. Такая популяция выделенного тега.

public void selectByValue(final By by, final String value){ 
    act(by, 3, new Callable<Boolean>() { 
     public Boolean call() { 
     Boolean found = Boolean.FALSE; 

     wait.until(ExpectedConditions.refreshed(ExpectedConditions.elementToBeClickable(by))); 

     Select select = new Select(driver.findElement(by)); 

     select.selectByValue(value); 
     found = Boolean.TRUE; // FOUND IT 

     return found; 
     } 
    }); 
    } 

private void act(By by, int tryLimit, boolean mode, Callable<Boolean> method){ 

    boolean unfound = true; 
    int tries = 0; 
    while (unfound && tries < tryLimit) { 
     tries += 1; 
     try { 
     wait.until(ExpectedConditions.refreshed(ExpectedConditions.visibilityOfElementLocated(by))); 
     unfound = !method.call(); // FOUND IT, this is negated since it feel more intuitive if the call method returns true for success 
     } catch (StaleElementReferenceException ser) { 
     logger.error("ERROR: Stale element exception. "); 
     unfound = true; 
     } catch (NoSuchElementException nse) { 
     logger.error("ERROR: No such element exception. \nError: "+nse); 
     unfound = true; 
     } catch (Exception e) { 
     logger.error(e.getMessage()); 
     } 
    } 

    if(unfound) 
     Assert.assertTrue(false,"Failed to locate element"); 
    } 
+0

В чем проблема с рекомендуемыми функциями? –

1

Element no longer attached... чаще всего появляется, если страница обновлена, и вы пытаетесь выполнить любую операцию над ранее созданным объектом webElement. Здесь страница может быть обновлена ​​при выборе первого раскрывающегося списка и выглядит так, как будто вы выполняете операцию выбора на первом выпадающем веб-элементе вместо второго.

Select dropDown1= new Select(driver.findElement(By.id("<ID_for_drop_down_1>"))); 
dropDown1.selectByVisibleText("<valuetobeselected>"); // Should be dropdown1 
waitFor(2000); 
// Page might be refreshed here 
Select dropDown2= new Select(driver.findElement(By.id("ID_for_drop_down_2"))); 
dropDown2.selectByVisibleText("<valuetobeselected>"); // use dropdwon2 not dropdown1 

Для получения более подробной информации: Random "Element is no longer attached to the DOM" StaleElementReferenceException

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

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