Selenium C#-Web元素属性存在但找不到?

时间:2019-03-06 22:42:10

标签: c# selenium

我为selenuim测试用例编写的函数遇到问题...当我在Web元素ID(#AmountToggle)上运行jQuery时,它将显示所有属性。我要验证一个(“ lastChild”):

enter image description here

但是当我运行这段代码时:

driver.FindElement(By.CssSelector(“#AmountToggle”))。GetAttribute(“ lastChild”)

它返回空值吗?!

enter image description here

这是为什么,如何获得该属性的正确值?

1 个答案:

答案 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” ')”。