#java #selenium #junit
#java #селен #junit
Вопрос:
У меня есть таблица с 4 строками и столбцами. Я сравниваю имя параметров в первом столбце с моим ключом параметра HasMap, и если оно совпадает, тогда я должен нажать на значок «шестеренка» в четвертом столбце в той же строке. Похоже, я потерял ссылку на строку во время обработки второго параметра. Инициализируйте HashMap и добавьте для него параметры:
Map <String, String> parameters = new HashMap<>();
parameters.put("param1”, "value1”);
parameters.put("param2”, "value2”);
Код метода:
public void setOptionalPluginParameters (Map <String, String> parameters) {
Map <String, String> sorted_parameters = new TreeMap<String, String>(parameters);
List <WebElement> table_rows = driver.findElements(By.className("x-grid3-row"));
for (WebElement table_row : table_rows) {
String table_parameter_name = table_row.findElement(By.cssSelector("div.x-grid3-col-2")).getText();
for (String key : sorted_parameters.keySet())
{
if (table_parameter_name.equals(key)) {
String parameter_value = sorted_parameters.get(key);
System.out.println("Hash value: " parameter_value " By Hash Key: " key);
WebElement gear = table_row.findElement(By.cssSelector("div.x-grid3-col-5 i.fa-gear"));
gear.click(); // <------error here during processing second parameter-------->
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("value")));
driver.findElement(By.id("value")).clear();
driver.findElement(By.id("value")).sendKeys(parameter_value);
driver.findElement(By.cssSelector("button[type='submit']")).click();
break;
}
}
}
Результат: org.openqa.selenium.StaleElementReferenceException: устаревшая ссылка на элемент: элемент не прикреплен к документу страницы
Я перепробовал множество подходов к ее решению, но безуспешно:
- Thread.sleep();
- попробуйте-поймайте;
- попробуйте поймать в цикле;
- Найденный элемент снова в цикле;
- driver.navigate().refresh();
Ответ №1:
устаревший элемент происходит при изменении документа (HTML). итак, в вашем случае у вас есть действие щелчка внутри цикла for. Это изменяет HTML-документ.
Это изменяет ссылку на все элементы, поэтому вам нужно повторно идентифицировать все элементы. используйте приведенное ниже решение
public void setOptionalPluginParameters (Map <String, String> parameters) {
Map <String, String> sorted_parameters = new TreeMap<String, String>(parameters);
List <WebElement> table_rows = driver.findElements(By.className("x-grid3-row"));
WebElement table_row;
int count=0;
while (count!=table_rows.size()) {
table_row = table_rows.get(count);
count =1;
String table_parameter_name = table_row.findElement(By.cssSelector("div.x-grid3-col-2")).getText();
for (String key : sorted_parameters.keySet())
{
if (table_parameter_name.equals(key)) {
String parameter_value = sorted_parameters.get(key);
System.out.println("Hash value: " parameter_value " By Hash Key: " key);
WebElement gear = table_row.findElement(By.cssSelector("div.x-grid3-col-5 i.fa-gear"));
gear.click(); // <------error here during processing second parameter-------->
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("value")));
driver.findElement(By.id("value")).clear();
driver.findElement(By.id("value")).sendKeys(parameter_value);
driver.findElement(By.cssSelector("button[type='submit']")).click();
table_rows = driver.findElements(By.className("x-grid3-row"));
break;
}
table_rows = driver.findElements(By.className("x-grid3-row"));
}
}
Комментарии:
1. Я попробовал ваш подход. «org.openqa.selenium. Исключение StaleElementReferenceException: устаревшая ссылка на элемент: элемент не прикреплен к документу страницы» проблема возникла в строке кода «gear.click ()». Я также добавляю try-catch, а затем это произошло в блоке catch. Хорошо работает с первым параметром, но не удалось со вторым.
2. не могли бы вы добавить wait, пока для этого механизма не появится интерактивность?
3. вы использовали код как есть? просто перепроверьте
4. не вносите никаких изменений
5. Большое вам спасибо, это работает. Добавлено «Thread.sleep (3000)» перед «gear.click» и «table_rows = driver.findElements (By.className («x-grid3-row»));», небольшое изменение для моих нужд Я удалил «break», потому что иногда это приводит к сбоям.
Ответ №2:
Это связано с тем, что ваш элемент был временно недоступен или удален из структуры DOM.
Это решение, которое я обычно использую, когда сталкиваюсь с этой проблемой. Попробуйте загрузить элемент во второй раз:
try {
# find element in here
WebElement gear = table_row.findElement(By.cssSelector("div.x-grid3-col-5 i.fa-gear"));
gear.click();
}catch(StaleElementReferenceException e){
# repeat a gain when it catch the error
WebElement gear = table_row.findElement(By.cssSelector("div.x-grid3-col-5 i.fa-gear"));
gear.click();
}
Комментарии:
1. Я попробовал ваше решение, ошибка произошла снова, в блоке catch (первая строка — WebElement gear).
2. Список <WebElement> table_rows = driver.findElements(По.className(«x-grid3-row»));
3. Проверьте элемент списка. Может быть проблема не из-за элемента gear. Может быть table_row, что временно удалено из DOM.