我为selenuim测试用例编写的函数遇到问题...当我在Web元素ID(#AmountToggle)上运行jQuery时,它将显示所有属性。我要验证一个(“ lastChild”):
但是当我运行这段代码时:
driver.FindElement(By.CssSelector(“#AmountToggle”))。GetAttribute(“ lastChild”)
它返回空值吗?!
这是为什么,如何获得该属性的正确值?
答案 0 :(得分:0)
因此,看起来“ lastChild”是属性,而不是属性。尽管我不能肯定您上面的内容。
区别在于,属性将在直接html中显示为某些内容,例如:
<a href="#" id="MyLink">Link</a>
其中href和id是属性。如果lastChild没有像上面的示例那样出现在html中,则不会将其视为属性。
首先尝试在javascript控制台中比较这两个:
$("#AmountToggle").attr("lastChild")
$("#AmountToggle").prop("lastChild")
当Selenium遇到问题时,以下是一种变通方法。这种逻辑将使您可以轻松地在iframe中查找内容,还可以使用伪选择器查找元素:
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查找元素,然后为DOM中的该元素生成一个显式XPath,并返回该XPath。使用显式XPath,然后可以告诉Selenium使用XPath查找元素。
看来last-child的值本身就是一个元素。如果是这样,您可以在示例中使用以下方法:
driver.FindElement(By.XPath(GetFullyQualifiedXPathToElement("$(#AmountToggle).prop('lastChild')[0]", true)));
请注意三件事。首先是我在JQuery中使用了“ prop”。如果那是正确的调用,则将其更改为“ attr”。另外,请注意[0]索引。这将以常规javascript DOM元素的形式返回JQuery元素的值,这是上述方法所使用的值。最后要注意的是传入的cssSelector值。您可以仅向此方法传递选择器,例如“ #SomeElementId> div”,也可以传递完整的JQuery,例如“ $('#SomeElementId> div” ')”。