Так что похоже, что lastChild - это свойство, а не атрибут. Хотя я не могу утверждать это наверняка с тем, что у вас есть выше.
Разница в том, что атрибут будет отображаться как нечто в прямом html, например:
<a href="#" id="MyLink">Link</a>
Где href и id являются атрибутами. Если lastChild не появится в html, как в приведенных выше примерах, он не будет считаться атрибутом.
Сначала попробуйте сравнить эти два в консоли javascript:
$("#AmountToggle").attr("lastChild")
$("#AmountToggle").prop("lastChild")
Следующее является обходным решением, если у вас есть проблемы с поиском вещей в Selenium. Эта логика позволит вам легко находить вещи внутри фреймов, а также использовать псевдоселекторы для поиска элементов:
public static string GetFullyQualifiedXPathToElement(string cssSelector, bool isFullJQuery = false, bool noWarn = false)
{
if (cssSelector.Contains("$(") && !isFullJQuery) {
isFullJQuery = true;
}
string finder_method = @"
function getPathTo(element) {
if(typeof element == 'undefined') return '';
if (element.tagName == 'HTML')
return '/HTML[1]';
if (element===document.body)
return '/HTML[1]/BODY[1]';
var ix= 0;
var siblings = element.parentNode.childNodes;
for (var i= 0; i< siblings.length; i++) {
var sibling= siblings[i];
if (sibling===element)
return getPathTo(element.parentNode)+'/'+element.tagName+'['+(ix+1)+']';
if (sibling.nodeType===1 && sibling.tagName===element.tagName)
ix++;
}
}
";
if(isFullJQuery) {
cssSelector = cssSelector.TrimEnd(';');
}
string executable = isFullJQuery ? string.Format("{0} return getPathTo({1}[0]);", finder_method, cssSelector) : string.Format("{0} return getPathTo($('{1}')[0]);", finder_method, cssSelector.Replace("'", "\""));
string xpath = string.Empty;
try {
xpath = BaseTest.Driver.ExecuteJavaScript<string>(executable);
} catch (Exception e) {
if (!noWarn) {
//Warn about failure with custom message.
}
}
if (!noWarn && string.IsNullOrEmpty(xpath)) {
//Warn about failure with custom message.
//string.Format("Supplied cssSelector did not point to an element. Selector is \"{0}\".", cssSelector);
}
return xpath;
}
Этот метод использует Jquery, который имеет более широкие возможности поиска с использованием CssSelectors (например, псевдо-селекторов) и находит вещи 100% времени при наличии хорошего поискового запроса. Этот метод использует JQuery для поиска элемента, а затем генерирует явный XPath для этого элемента в DOM, возвращая этот XPath. Используя явный XPath, вы можете указать Selenium найти элемент с помощью XPath.
Похоже, значение last-child является самим элементом. Если это правда, вот как вы можете использовать это в вашем примере:
driver.FindElement(By.XPath(GetFullyQualifiedXPathToElement("$(#AmountToggle).prop('lastChild')[0]", true)));
Обратите внимание на три вещи здесь. Во-первых, я использовал «prop» в JQuery. Измените это на "attr", если это был правильный вызов. Также обратите внимание на индекс [0]. Это вернет значение элемента JQuery в виде обычного элемента DOM javascript, который использует метод, описанный выше. Последнее, на что следует обратить внимание, - это переданное значение cssSelector. Вы можете передать этому методу только селектор, например, "#SomeElementId> div", или передать полный JQuery, например, "$ ('# SomeElementId> div». «)».