Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Клик на элементам в AJAX приложении. Варианты решения

dom
jquery
ajax
javascript
java
Теги: #<Tag:0x00007f7b64e2c1d8> #<Tag:0x00007f7b64e2c098> #<Tag:0x00007f7b64e2bf08> #<Tag:0x00007f7b64e2bda0> #<Tag:0x00007f7b64e2baa8>

(Michael Popov) #1

Помогите решить задачку: Имеем Ajax jQuery приложение, http://prntscr.com/fbgyzd нужно сделать клик по кнопке Save, кнопка Save есть в каждой вкладке (Lenders, Lender group и тд.) и если я правильнопонимаю они всегда присутствую в DOM. Класс кнопки меняется в зависимости от наведения курсора, до наведения когда наводишь курсор становиться Судя по всему кнопка не видима до наведения курсора. Привязываться к id элемента мне нельзя (нужны гибкие локаторы), по Xpath он находит, но видимо кликает на первый найденый поэтому не работает, а находить все и кликать на второй , например, тоже нельзя). Я реализовал это через JavaScript:

WebElement saveBtn = driver.findElement(By.xpath("//*[contains(text(), 'Save')]"));
executor.executeScript("arguments[0].click();", saveBtn ); 

Но мне тоже сказали что так не совсем правильно, и нужно искать ещё способы) Подскажите может есть ещё пути решения?
ПС: когда спросил в какую сторону копать? показали вот такой пример кода:

public String getDescendantComponentId(String parentId, String componentQuery) {
		String cmpId;
		Throwable cause = null;
		try {
			cmpId = (String) driver.executeAsyncScript(
					"var id=arguments[0],q=arguments[1],cb=arguments[2],f=function()" +
							"{var cmp=Ext.getCmp(id).down(q);cmp?cb(cmp.id):window.setTimeout(f,50);};" +
							"window.setTimeout(f,50);",
					parentId, componentQuery
			);
		} catch (TimeoutException e) {
			cmpId = null;
			cause = e;
		}
		if (cmpId == null) {
			throw new NotFoundException(parentId + " doesn't seem to have descendant matching " + componentQuery, cause);
		}
		return cmpId;
	}

(Dmitrii Demin) #2

Если id будут статичными и наглядными, то как раз привязка к ним и будет гибкой. Если же id рандомные и/или генерируются, то беда-печаль…


(Michael Popov) #3

[quote=“Michael_Popov, post:1, topic:13978”]
}
[/quote] в данном случае генерируются


(Yaroslav Pernerovskyy) #4

У вас вся задачка сводится к нахождению локатора кнопки в зависимости от выбранной вкладки. От нее и пляшите. Найдите сначала активную вкладку, а от нее уже ищите кнопку сейв.


(Дмитрий Кравчук) #5

Я вижу два решения вашей задачи:

Можно собрать в список все кнопки содержащие текст “Save”. А потом отфильтровать средствами java

webElementList.stream().filter(WebElement::isDisplayed).collect(Collectors.toList());

В отфильтрованном списке должен быть только один элемент, который видим на текущей вкладке.

А можно воспользоваться js.

WebElement saveBtn= (WebElement) ((JavascriptExecutor) driver).executeScript("return this.$(\"span:contains('Save'):visible\").get(0)");

В js я не силен, могу ошибаться.

UPD Ковычки экранировал, а то идея ругается.