executeJavaScript не возвращает должное значение, возвращаемое JavaScript-кодом на деле

java
selenium
selenide
javascript
Теги: #<Tag:0x00007f7b61bf8b58> #<Tag:0x00007f7b61bf8a18> #<Tag:0x00007f7b61bf8838> #<Tag:0x00007f7b61bf86f8>

(Юра Куськов) #1

Написал JavaScript который возвращает элемент:

document.querySelector("main.message__body")

далее так: executeJavaScript("document.querySelector('main.message__body')") И возвращается null.


(Vasiliy Rakshin) #2

А попробуйте добавить .toString();


(Юра Куськов) #3

не помогло


(Vasiliy Rakshin) #4

А попробуте добавить тогда сюда .text
По идее, если у элемента есть текст, то он должен его вывести.
Ну и кавычки должны же быть двойные… Надо их экранировать.


(Dema W) #5

@sevnight

надо добавить return
executeJavaScript(“return document.querySelector(‘main.message__body’)”)


(Юра Куськов) #7

return на удивление помог) а вы знаете как вернуть SelenideElement, чтобы дальше можно было с ним работать?)


(Ugin Berets) #8

А что именно вы хотите с ним сделать?


(Юра Куськов) #9

с помощью String.fromat() я формирую вот такой js и применяю.

return document.evaluate("//main[contains(@class,'message__body') and contains(.,'Куплю')]//li[contains(.,'Кол-во')]/p[@class='list__value']", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.innerHTML.match(/40(.|,)8/);

как видите, я проверяю что в нужном месте отображается нужное число. заморочено так из-за того что разделителем может быть и запятая и точка. конечно смотря на этот длинный код формирования скрипта и его не работы, я начинаю думать что сделать через or дубль с двумя разделителями не такая плохая идея была)

Стало просто интересно как вернуть Element с которым можно работать с помощью Selenide или Selenium. думаю узнав это все проблемы решатся


(Alexandr D.) #10

Лично я использую jQuery.

На C# возвращается IWebElement, думаю что по аналогии должно быть и на Java, вернётся интерфейс WebElement.

Такой код:

var ele = $(arguments[0]);
return ele;

Если не сработает, то всегда можно попробовать вернуть чистый элемент:

var ele = $(arguments[0])[0];
return ele;

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

var ele = document.createElement("script");
ele.src = "https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.min.js";
var head = document.getElementsByTagName("head")[0];
head.appendChild(ele);