То, что я пытаюсь сделать, это нажать (или выключить) любой из флажков на моей странице. Как вы можете видеть из HTML, каждый элемент флажка будет иметь уникальный идентификатор, но когда я пытаюсь щелкнуть по нему, я получаю исключение «Элемент не найден». Я перепробовал все стандартные локаторы (тоже нет iframe) - я могу найти элемент checkbox, но я просто не могу щелкнуть по нему.
Пожалуйста, просмотрите следующий HTML:
<div class="form-horizontal">
<div class="row">
<div class="col-sm-3">
<label for="Url_option1">Option 1</label>
</div>
<div class="col-sm-1">
<input type="checkbox" data-yesno-name="Url_option1" class="url-field-toggle">
<span class="glyphicon clickable glyphicon-remove" id="toggle_undefined"></span>
<input id="Url_url_option1" name="Url.url_option1" type="hidden" value="no">
</div>
<div class="col-sm-3">
<label for="Url_option2">Option 2</label>
</div>
<div class="col-sm-1">
<input type="checkbox" data-yesno-name="Url_option2" class="url-field-toggle">
<span class="glyphicon clickable glyphicon-remove" id="toggle_undefined"></span>
<input id="Url_translation_c" name="Url.option2" type="hidden" value="no">
</div>
<div class="col-sm-3">
<label for="Url_option3">Option 3</label>
</div>
<div class="col-sm-1">
<input type="checkbox" data-yesno-name="Url_option3" class="url-field-toggle">
<span class="glyphicon clickable glyphicon-remove" id="toggle_undefined"></span>
<input id="Url_option3" name="Url.option3" type="hidden" value="no">
</div>
</div>
<div class="row">
<div class="col-sm-12">
</div>
</div>
<div class="row">
<div class="col-sm-3">
<label for="Url_option4">Option 4</label>
</div>
<div class="col-sm-1">
<input type="checkbox" data-yesno-name="Url_option4" class="url-field-toggle">
<span class="glyphicon clickable glyphicon-remove" id="toggle_undefined"></span>
<input id="Url_option4" name="Url.option4" type="hidden" value="no">
</div>
<div class="col-sm-3">
<label for="Url_option5">Option 5</label>
</div>
<div class="col-sm-1">
<input type="checkbox" data-yesno-name="Url_option5" class="url-field-toggle">
<span class="glyphicon clickable glyphicon-remove" id="toggle_undefined"></span>
<input id="Url_option5" name="Url.option5" type="hidden" value="no">
</div>
<div class="col-sm-3">
<label for="Url_option6">Option 6</label>
</div>
<div class="col-sm-1">
<input type="checkbox" data-yesno-name="Url_option6" class="url-field-toggle">
<span class="glyphicon clickable glyphicon-remove" id="toggle_undefined"></span>
<input id="Url_option6" name="Url.option6" type="hidden" value="no">
</div>
</div>
</div>
Единственный способ, которым я могу нажать на любой из элементов флажка, - найти следующий элемент:
<span class="glyphicon clickable glyphicon-remove" id="toggle_undefined"></span>
Использование локатора XPath:
i.e //*[@id="toggle_undefined"]
В этом случае вызывается событие click, но оно, очевидно, будет щелкать только первый элемент (или флажок в этом случае) на странице (у меня более 20 флажков на странице).
На основании приведенного выше HTML-кода, допустим, я хотел включить второй элемент флажка во второй строке. Вот код для этого элемента флажка:
<div class="col-sm-3">
<label for="Url_option5">Option 5</label>
</div>
<div class="col-sm-1">
<input type="checkbox" data-yesno-name="Url_option5" class="url-field-toggle">
<span class="glyphicon clickable glyphicon-remove" id="toggle_undefined"></span>
<input id="Url_option5" name="Url.option5" type="hidden" value="no">
</div>
Основываясь на информации выше, я могу только установить флажок, найдя и нажав на следующий элемент:
<span class="glyphicon clickable glyphicon-remove" id="toggle_undefined"></span>
Как я должен создать уникальный локатор XPath для этого элемента, который я мог бы использовать, чтобы щелкнуть по любому из флажков на моей странице?
4 ответа
Так как вам нужно нажать на SPAN, например,
<span class="glyphicon clickable glyphicon-remove" id="toggle_undefined"></span>
И на нем нет уникальных идентификаторов / атрибутов, нам нужно найти правильный, используя один из окружающих элементов.
Вероятно, я бы использовал поиск SPAN по относительной метке, например,
<label for="Url_option1">Option 1</label>
Вы можете использовать XPath как
//label[.='Option 3']//following::span[@id='toggle_undefined']
То, что это делает, находит LABEL, который содержит желаемую строку, «Option 3», а затем находит первый SPAN, который следует с идентификатором «toggle_undefined».
Если бы это был я, я бы обернул это в функцию и передал бы имя опции, которую я хотел щелкнуть, например
public void Toggle(string optionName)
{
Driver.Value.FindElement(By.XPath($"//label[.='{optionName}']//following::span[@id='toggle_undefined']")).Click();
}
И назовите это как
Toggle("Option 3");
Чтобы получить ввод с флажком типа просто используйте css селектор ниже.
Элемент:
<input type="checkbox" data-yesno-name="Url_Transaction_Out" class="url-field-toggle" style="" checked="checked"><span class="glyphicon clickable glyphicon-ok" id="toggle_undefined">
Css Selector:
input[data-yesno-name='Url_Transaction_Out']
Код:
driver.FindElement(By.CssSelector("input[data-yesno-name='Url_Transaction_Out']")).Click();
Для проверки и выбора:
IWebElement checkbox = driver.FindElement(By.CssSelector("input[data-yesno-name='Url_Transaction_Out']"));
if(!checkbox.IsSelected())
{
checkbox.Click();
}
Для этого используйте следующий CSS-селектор:
.url-field-toggle[data-yesno-name='Url_Transaction_Out']
Код:
driver.FindElement(By.CssSelector("url-field-toggle[data-yesno-name='Url_Transaction_Out']")).Click();
Надеюсь, это вам поможет!
В соответствии с HTML , которым вы поделились, чтобы вызвать click()
на желаемом флажке , вы можете использовать любое из следующих решений:
CssSelector
:driver.FindElement(By.CssSelector("label[for=Url_Transaction_Out]")).Click();
XPath
:driver.FindElement(By.XPath("//label[@for='Url_Transaction_Out']")).Click();
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.