Невозможно выполнить действие щелчка по кнопке переключения в селене C# - PullRequest
0 голосов
/ 06 мая 2020

При попытке автоматизировать мое приложение на одной из веб-страниц есть три кнопки переключения, и мне нужно выбрать то же самое.

Под кодом HTML:

 <div class="row">
                        <div class="col-md-12 ">
                            <label class="control-label dl-padding-top-5" for="consentToBureau">Do you give consent for Capitec to do a credit bureau enquiry?</label>
                            <span class="pull-right dl-padding-top-5">
                                <label class="dl-switch">
                                    <input type="checkbox" checked="checked" value="false" name="consentToBureau" id="BureauConcentInput" required="" onchange="hideErrorById('BureauConcent')" class="dl-border-red">
                                    <span class="dl-slider dl-round"></span>
                                </label>
                            </span>
                            <span class="col-md-12 dl-error-msg dl-top-border-red" id="BureauConcentError">Tick to accept the Bureau Concent</span>
                        </div>
                    </div>


                    <div class="row">
                        <div class="col-md-12">
                            <label class="control-label dl-padding-top-5" for="acceptTerms">Do you accept these terms of use?</label>
                            <span class="pull-right dl-padding-top-5">
                                <label class="dl-switch">
                                    <input type="checkbox" checked="checked" name="acceptTerms" id="TermsAndConditionsInput" required="" onchange="hideErrorById('TermsAndConditions')" class="dl-border-red">
                                    <span class="dl-slider dl-round"></span>
                                </label>
                            </span>
                            <span class="col-md-12 dl-error-msg dl-top-border-red" id="TermsAndConditionsError" style="">Tick to accept the term of use</span>
                        </div>
                    </div>

                    <div class="row">
                        <div class="col-md-12">
                            <label class="control-label dl-padding-top-5">Salary paid into Capitec account?</label>
                            <span class="pull-right dl-padding-top-5">
                                <label class="dl-switch">
                                    <input type="checkbox" name="CapitecClient" id="isCapitecClientInput" required="" onchange="hideError(this)">
                                    <span class="dl-slider dl-round"></span>
                                </label>
                            </span>
                        </div>
                    </div> 

Щелчок на каждой кнопке переключения приземляется на span class = "pull-right dl-padding-top-5", но этот класс аналогичен для всех трех кнопок переключения. Но каждая кнопка переключения имеет уникальный атрибут 'for' и идентификатор.

Ниже приведен код, который был испробован, но выдает ошибку, так как не удается найти элемент.

IWebElement Toggle = driver.FindElement(By.CssSelector("input[id='BureauConcentInput']>span[class='dl-slider dl-round']"));
            Toggle.Click();
(or)
            IWebElement Toggle = driver.FindElement(By.XPath("//*[@id='BureauConcentInput']/span"));
            Toggle.Click();

Пожалуйста, предложите правильный способ найти элемент.

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Когда вы наводите курсор на элемент в инструментах браузера, видите ли вы какой-либо видимый / выделенный элемент? Если нет, то это первое указание на то, что Selenium также не сможет его найти.

Ваш XPath искал дочерний элемент span для элемента с идентификатором «BureauConcentInput», однако диапазон был родственник (например, он находился на том же уровне дерева документа, что и элемент). Есть несколько способов добраться до диапазона, но вот два:

//input[@id='BureauConcentInput']/..//span
//input[@id='BureauConcentInput']/following-sibling::span

Без необходимости видеть страницу или знать, к какой структуре пользовательского интерфейса принадлежат переключатели (dl-slider), этот ответ будет моим Лучшее предположение, поскольку диапазон не кажется мне интерактивным элементом в его текущем состоянии:

driver.FindElement(By.XPath("//input[@id='BureauConcentInput']/ancestor::span")).Click();

Обновление:

Похоже, что ваша панель навигации нижнего колонтитула внизу страница находится над флажком, который нужно установить. Вы можете сначала попытаться перейти к элементу, а затем щелкнуть. Проверьте размер окна - это тоже может быть проблемой.

Вот метод расширения для Scroll:

public static IWebElement Scroll(this IWebElement element)
{
    IWebDriver driver = ((IWrapsDriver)element).WrappedDriver;
    string script = "const elementRect = arguments[0].getBoundingClientRect();" +
                    "const absoluteElementTop = elementRect.top + window.pageYOffset;" +
                    "const middle = absoluteElementTop - (window.innerHeight / 2);" +
                    "window.scrollTo(0, middle);";
    ((IJavaScriptExecutor)driver).ExecuteScript(script, element);
    return element;
}

Вы можете использовать его прямо перед Click () - например, driver.FindElement().Scroll().Click();

Если это не сработает, ваш следующий вариант - использовать метод scrollIntoView () js:

public static void ScrollIntoView(this IWebElement driver, string xpath)
{
    ((IJavaScriptExecutor)driver).ExecuteScript($"document.evaluate(\"{xpath}\", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.scrollIntoView()");
}

Вам нужно будет использовать его в отдельной строке - например, driver.ScrollIntoView("insert xpath here");

0 голосов
/ 06 мая 2020

Вы можете сделать что-то вроде следующего:

driver.FindElement(By.Id("BureauConcentInput")).Click();
driver.FindElement(By.Id("isCapitecClientInput")).Click();
driver.FindElement(By.Id("TermsAndConditionsInput")).Click();

Единственный вопрос, который я хотел вам задать, - все ли флажки не отмечены для начала? Если некоторые из них отмечены, вам понадобится другой метод для определения текущего состояния, чтобы, если вы хотите установить флажок «Положения и условия», и он уже был отмечен, вы не просто сняли его.

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