Selenium C # - атрибут веб-элемента присутствует, но не может быть найден? - PullRequest
0 голосов
/ 07 марта 2019

Возникла проблема с функцией, которую я написал для тестового примера selenuim ... Когда я запускаю jquery для идентификатора веб-элемента (#AmountToggle), он отображает все атрибуты. Я хочу проверить это ("lastChild"):

enter image description here

но когда я запускаю этот код:

driver.FindElement (By.CssSelector ( "# AmountToggle")). GetAttribute ( "LastChild")

возвращаемое значение null?!

enter image description here

Почему это так и как я могу получить правильное значение этого атрибута?

1 Ответ

0 голосов
/ 12 марта 2019

Так что похоже, что 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». «)».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...