2016-06-23 3 views
0

У меня есть проблема, когда я не могу нажать на тип входного = «радио» с помощью id="same-supplier-no":Невозможно нажать на тип ввода = «радио», который находится внутри метки HTML?

<label for="same-supplier-no" ng-class="{checked: !ctrl.energyModel.BillViewModel.SameSupplier}" class=""> 

    <input type="radio" id="same-supplier-no" name="same-supplier" ng-model="ctrl.energyModel.BillViewModel.SameSupplier" ng-value="false" ng-change="ctrl.sameSupplierValueChanged(); ctrl.analyticsProvider.sendVirtualPageView('SameSupplierNo')" class="ng-pristine ng-untouched ng-valid" value="false"> 

    <span></span>No 

</label> 

В Селен, когда я делаю:

driver.findElement(By.id("same-supplier-no")).click(); 

он говорит, что «элемент не виден» , В HTML есть предыдущие радиокнопки, на которых есть метки, и у них есть идентификаторы для ярлыков (этого нет). Я просто ссылаюсь на идентификатор метки и нажимаю на него, и это работает. Но у этого нет идентификатора для метки, и я хочу избежать использования xpath, однако, если у меня нет выбора, тогда я просто выберу через xpath/css.

Я также пробовал через имя локатора i.e. By.className («тот же поставщик»); и использование цикла For и оператора if для хранения типа input = radio element все равно не работает.

Вопрос: почему я не могу нажать тип ввода = «радио», почему в Selenium не видно? Это потому, что он вложен внутри метки? Если да, то кто-нибудь знает, как я могу щелкнуть его с помощью идентификатора или просто перейти к элементу?

спасибо.

Примечание: Я использую Java 7 для Selenium.

ответ

2

Из чата я мог бы попробовать некоторые вещи на сайте вы используете. radio никогда не становится видимым. В результате этого невозможно использовать метод click().

label который содержит это radio видно только. Это означает, что вы можете просто использовать click() на этой этикетке.

driver.findElement(By.cssSelector("label[for='same-supplier-no']")).click(); 

Или, если вы действительно хотите, чтобы найти элемент, используя radio можно использовать xpath.

driver.findElement(By.xpath("//*[@id='same-supplier-no']/parent::label")).click(); 
+0

или driver.findElement (By.xpath ("// div [@ class = 'ответные метки]/label [2]")). Click(); –

+0

Спасибо RemcoW, я знаю об этом. Я использовал метки для других радиокниг на странице. Однако, вопрос был в том, почему я не смог добраться до идентификатора radioButtons. Кажется, вы ответили на него. Исправьте меня, если я ошибаюсь: radioButtons не установлен на видимый, поэтому, когда на него вызывается метод click(), потому что элемент не установлен на видимый, он не может найти его, чтобы щелкнуть его, поэтому он не работает. Оба findElement, которые вы предоставили, работают. Я смог сделать это, используя xpath раньше, но второй findElement очень хорош. Можете ли вы объяснить «::», это ссылка на тег CSS? – DesignAndCode

+0

@DesignAndCode Вы почти правы. Он может найти элемент, даже если он не отображается. Проблема в том, что селен не может щелкнуть по нему, если он не виден. Что касается '::', то это позволяет дать конкретное имя тега элемента, который вы ищете. В этом случае он будет искать любой элемент с идентификатором «тот же самый поставщик-нет», который имеет «метку» в качестве родителя. – RemcoW

0

использовать действия, чтобы нажать на звукозаписывающей компании и после этого использования:

Actions actions = new Actions(driver); 
       IWebElement menuHoverLink = driver.findElement(By.XPath("//label[@for='same-supplier-no']")); 
       actions.moveToElement(menuHoverLink); 
       actions.click(); 
       actions.perform(); 

driver.findElement(By.id("same-supplier-no")).click(); 
+0

Что вы подразумеваете под действием действия, чтобы нажать на ярлык? Вы имеете в виду два .click()? Один для метки, а затем один для идентификатора? Но пользователь не делает два клика? – DesignAndCode

+0

Он наводил указатель на элемент, чтобы быть видимым –

+0

Я собираюсь попробовать его сейчас и опубликовать результаты, как вы узнали, что это «зависание», которое сделало его невидимым? – DesignAndCode

0

После нажатия на «найти почтовый индекс» кнопку, добавьте ниже две строки кода -

WebDriverWait wait = new WebDriverWait(driver,10); 
wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath(".//*[@id='same-supplier-question']/div/div/label[2]/span")))); 

Это работает в моем конце ... Вы можете изменить XPath от абсолютного к относительный ....

+0

Спасибо Punkaaj. Я уже знал, как щелкнуть() через xpath, однако я хотел знать, почему я не мог перейти непосредственно к ID без использования xpath. Почему это не было «видимым» для селена. @RemcoW ответил на это, и его решение намного чище, чем наличие множества дочерних элементов после ID в Xpath. Не очень подходит для ремонтопригодности каркаса. – DesignAndCode