Выберите элементы один за другим в раскрывающемся списке с 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);
Это должно работать.