Как выбрать элемент (li) в списке (ul) через Selenium WebDriver и C # - тайм-аут при поиске - PullRequest
0 голосов
/ 02 января 2019

Невозможно выбрать элемент списка <li> из несортированного списка <ul>, используя WebDriver. Тайм-аут получен при поиске.

HTML:

   <div class="row">
                <div class="col-xs-12 col-sm-6 col-lg-6">
                    <div class="btn btn-block btn-dropdown-white" data-ng-class="{'has-error': updateFormTemplate.gender.$invalid }" dropdown="">
                        <input id="hdnGender" name="gender" class="form-control ng-pristine ng-untouched ng-valid ng-isolate-scope ng-valid-maxlength" data-ng-model="updateInfo.gender" nl-input="" nl-validation-type="'gender'" nl-required="true" maxlength="1" nl-action-button="update" nl-on-enter-action="update" type="hidden">
                        <button type="button" name="genderButton" class="btn btn-lg form-control ng-pristine ng-valid ng-binding ng-isolate-scope ng-touched" dropdown-toggle="" data-ng-model="updateInfo.gender" nl-input="" nl-validation-hidden="hdnGender" nl-action-button="update" nl-on-enter-action="update" aria-haspopup="true" aria-expanded="false">
                            Ansprache <span class="caret"></span>
                        </button>

                        <ul class="dropdown-menu" role="menu">
                            <li data-ng-click="updateInfo.gender = ''">Gender</li>
                            <li data-ng-click="updateInfo.gender = 'M'" class="">Male</li>
                            <li data-ng-click="updateInfo.gender = 'F'">Female</li>
                        </ul>
                    </div>
                    <div class="display-inline-block inner-top-xxs" data-ng-class="{'has-error': updateFormTemplate.gender.$invalid }">
                        <span data-ng-show="updateFormTemplate.gender.$invalid" class="help-block ng-hide">Please select gender</span>
                    </div>
                </div>
            </div>

Мой код:

IList <IWebElement> dropDownMenues = driver.FindElements(By.ClassName("dropdown-menu")); //Populates all drop down menues
IList<IWebElement> selectedGender = dropDownMenues[1].FindElements(By.TagName("li")); //Populate drop down items
//dropDownMenues[1].Click(); - This code doens't expand the drop down menu
driver.FindElement(By.XPath("/html/body/div[3]/div/div[6]/div/div/div/div[2]/div/div/form/div/div/div[2]/div/div[1]/button")).Click(); //This code opens the drop down
selectedGender[1].Click(); //Here's where I get the timeout

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

Ответы [ 3 ]

0 голосов
/ 04 января 2019

Это также может быть сделано с помощью двух кликов. Сделайте 1-й клик по xpath:

//*[@name='genderButton']

Затем 2-й клик по xpath:

//*[@class='dropdown-menu']/li[2]

P.S: заранее подождать с веб-драйвером, чтобы дать время для загрузки элемента.

0 голосов
/ 10 января 2019

Как оказалось, решение было очень простым, а не то, что приходит на ум ... Все, что мне нужно было сделать, это обновить мой ChromeDriver.exe до последней версии (ему было 8 месяцев)- и я смог найти все элементы, которые вызывали тайм-аут раньше.

Я недавно обновил некоторые пакеты Selenium в моей Visual Studio, что, скорее всего, вызвало эту ситуацию, но не смог вспомнить, что ChromeDriver долженобновляться соответственно.

0 голосов
/ 02 января 2019

Чтобы щелкнуть по любому из <li> элементов в пределах <ul>, поскольку элементы Angular элементов, вы должны заставить WebDriverWait , чтобы требуемый элемент был нажмите и выберите вариант с текстом мужчина , вы можете использовать следующее решение:

new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//button[@class='btn btn-lg form-control ng-pristine ng-valid ng-binding ng-isolate-scope ng-touched' and @name='genderButton']"))).Click();
new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//button[@class='btn btn-lg form-control ng-pristine ng-valid ng-binding ng-isolate-scope ng-touched' and @name='genderButton']/ul//li[contains(@data-ng-click, 'gender') and text()='Male']"))).Click();
...