Extension-метод для Instance. Читает любое свойство или атрибут элемента через JS. Применяется когда нужно получить одно конкретное значение, не писать каждый раз полный EvaluateScript.
Код метода
public static string JsGet(this Instance instance, string jsSelector, string property)
{
string json = instance.ActiveTab.MainDocument.EvaluateScript($@"
var el = {jsSelector};
if (!el) return null;
var props = {{}};
for (var i = 0; i < el.attributes.length; i++) {{
props[el.attributes[i].name] = el.attributes[i].value;
}}
props['innerText'] = el.innerText;
props['innerHTML'] = el.innerHTML;
props['textContent'] = el.textContent;
props['value'] = el.value;
props['checked'] = el.checked !== undefined ? String(el.checked) : undefined;
props['tagName'] = el.tagName;
Object.keys(props).forEach(function(k) {{
if (props[k] === undefined) delete props[k];
}});
return JSON.stringify(props);
");
if (json == null)
throw new Exception("Элемент не найден: " + jsSelector);
var dict = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
if (!dict.TryGetValue(property, out var value))
throw new Exception(
"У элемента '" + jsSelector + "' нет свойства '" + property + "'.\n" +
"Доступные: " + json
);
return value;
}Параметры
jsSelector— JS-выражение, которое возвращает элемент (не строку, не.value, не.innerHTML— сам элемент)property— что прочитать: HTML-атрибут по имени, или одно из DOM-свойств:innerText,innerHTML,textContent,value,checked,tagName
Примеры
// Open shadow DOM
string text = instance.JsGet(
"document.querySelector('#shadow-host-open').shadowRoot.querySelector('#shadow-open-btn')",
"innerHTML"
);
// Closed shadow DOM
string val = instance.JsGet(
"window.__closedShadowRoot.querySelector('#shadow-closed-input')",
"value"
);
// Обычный элемент
string href = instance.JsGet(
"document.querySelector('a.btn')",
"href"
);
project.SendInfoToLog(text);
project.SendInfoToLog(val);
project.SendInfoToLog(href);Когда исключение
- Элемент не найден →
"Элемент не найден: ..."+ jsSelector - Свойство не существует → список всех доступных свойств в JSON