Выберите элементы один за другим в раскрывающемся списке с Selenium Webdriver

Я пытаюсь выбрать элементы в "Категория" по одному на этой странице с помощью:

WebElement category = new WebDriverWait(driver, 10)
                .until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector("tr[__gwt_row='" + rowIndex + "'] > td > div")))
                .get(3);

        category.click();
        category.findElement(By.tagName("select")).sendKeys("Businesses");
        category.click();
        category.findElement(By.tagName("select")).sendKeys("Contacts");

Бросив это: "устаревшая ссылка на элемент: элемент не прикреплен к документу страницы"

Может быть, существует какой-то другой способ сделать это?

UPD: это работает, если я делаю это:

 WebElement categoryBusinesses = new WebDriverWait(driver, 10)
                .until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector("tr[__gwt_row='" + rowIndex + "'] > td > div")))
                .get(3);

        categoryBusinesses.findElement(By.tagName("select")).sendKeys("Businesses");

 WebElement categoryContacts = new WebDriverWait(driver, 10)
                .until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector("tr[__gwt_row='" + rowIndex + "'] > td > div")))
                .get(3);

        categoryContacts.findElement(By.tagName("select")).sendKeys("Contacts");

Но так ли это?

UPD2: я тоже пробовал это:

 WebElement element = categoryBusinesses.findElement(By.tagName("select"));
        Select category = new Select(element);
        category.selectByIndex(0);
        category.selectByIndex(1);

Но это не работает.

2 ответа

Решение

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

Я обычно делаю функции из таких вещей, чтобы их можно было многократно использовать.

public static void GetCategoriesFromRow(int row)
{
    By locator = By.cssSelector("table[__gwtcellbasedwidgetimpldispatchingfocus] tr[__gwt_row='" + row + "'] select");
    for (int i = 0; i < new Select(driver.findElement(locator)).getOptions().size(); i++)
    {
        new Select(driver.findElement(locator)).selectByIndex(i);
        System.out.println(new Select(driver.findElement(locator)).getFirstSelectedOption().getText());
    }
}

Вы называете это как

driver.get("http://samples.gwtproject.org/samples/Showcase/Showcase.html#!CwCellTable");
new WebDriverWait(driver, 10)
        .until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("table[__gwtcellbasedwidgetimpldispatchingfocus]")));
GetCategoriesFromRow(0);

Попробуй это:

WebElement element = categoryBusinesses.findElement(By.xpath("//*[@id="gwt-debug-contentPanel"]/div[2]/div/div[2]/div/div[3]/div/div/div/table/tbody/tr[1]/td/table/tbody[1]/tr[1]/td[4]/div/select"));
        Select category = new Select(element);
        category.selectByIndex(0);
        category.selectByIndex(1);

Это должно работать.

Другие вопросы по тегам