it-roy-ru.com

Как установить флажки с помощью веб-драйвера Selenium Java?

Как я могу проверить флажки, используя id/xpath. Есть ли какой-либо метод, подобный для выбора по visibletext для выпадающего списка.

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

Любая помощь будет оценена. 

Пример раздела HTML приведен ниже:

<tbody> 
<tr> 
    <td> 
        <span class="120927"> 
        <input id="ctl00_CM_ctl01_chkOptions_0" type="checkbox" name="ctl00$CM$ctl01$chkOptions$0"/> 
        <label for="ctl00_CM_ctl01_chkOptions_0">housingmoves</label> 
        </span> 
    </td> 
</tr> 
<tr>
    <td>
        <span class="120928"> 
        <input id="ctl00_CM_ctl01_chkOptions_1" type="checkbox" name="ctl00$CM$ctl01$chkOptions$1"/> 
        <label for="ctl00_CM_ctl01_chkOptions_1">Seaside & Country Homes</label> 
        </span> 
    </td> 
</tr> 
</tbody> 
36
Manish Dwivedi

Выбор флажка аналогичен нажатию кнопки. 

driver.findElement(By.id("idOfTheElement")).click(); 

сделаю.

Однако вы также можете увидеть, установлен ли флажок. Следующий фрагмент проверяет, установлен ли флажок или нет. Если он не выбран, он выбирает.

if ( !driver.findElement(By.id("idOfTheElement")).isSelected() )
{
     driver.findElement(By.id("idOfTheElement")).click();
}
61
Code Enthusiastic

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

Хитрость с флажками заключается в отправке клавиши пробела вместо использования click (нужно только в IE), как в C #:

if (driver.Capabilities.BrowserName.Equals(“internet Explorer"))
    driver.findElement(By.id("idOfTheElement").SendKeys(Keys.Space);
else
    driver.findElement(By.id("idOfTheElement").Click();
23
Scott Crowe

Если вы хотите нажать на все флажки одновременно, такой метод будет делать:

private void ClickAllCheckboxes()
{
    foreach (IWebElement e in driver.FindElements(By.xpath("//input[@type='checkbox']")))
    {
        if(!e.Selected)
            e.Click();
    }
}
3
Tedesco

Решение для C #

try
{
    IWebElement TargetElement = driver.FindElement(By.XPath(xPathVal));
    if (!TargetElement.Selected)
    {                    
        TargetElement.SendKeys(Keys.Space);
    }
}
catch (Exception e)
{
}
3
Arnab

Чтобы установить флажок «Приморские и загородные дома», используйте этот XPath:

//label[text()='Seaside & Country Homes']/preceding-sibling::input[@type='checkbox']

Чтобы установить флажок для «жилищных переездов», используйте этот XPath:

//label[text()='housingmoves']/preceding-sibling::input[@type='checkbox']

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

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

//table/descendant::span/input[@type='checkbox']
2
Arran

Вы можете использовать следующий код:

List<WebElement> checkbox = driver.findElements(By.name("vehicle"));
        ((WebElement) checkbox.get(0)).click();

мой HTML-код был следующим:

<.input type="checkbox" name="vehicle" value="Bike">I have a bike<br />
<.input type="checkbox" name="vehicle" value="Car">I have a car <br />
1
Maria

Это должно помочь -

IWebElement elementToClick = driver.findElement(By.xpath(""//input[contains(@id, 'lstCategory_0')]"));
elementToClick.Click();

Вы также можете передать идентификатор . Если вы хотите что-то вроде видимого текста, вы можете " найти элемент " по имени, если у них есть имена.

1
some_other_guy

Решение с использованием WebDriver и C # приведено ниже. Основная идея заключается в том, чтобы получить идентификатор флажка из атрибута меток «for» и использовать его для идентификации флажка. 

Код также устанавливает состояние флажка, только если его необходимо изменить. 

public void SetCheckboxStatus(string value, bool toCheck)
{
    //get the label containing the checkbox state
    IWebElement labelElement = this.Driver.FindElement(By.XPath(string.Format("//label[.='{0}']",value)));
    string checkboxId = labelElement.GetAttribute("for");

    IWebElement checkbox = this.Driver.FindElement(By.Id(checkboxId));

    if (toCheck != checkbox.Selected)
    {
        checkbox.Click();
    }
}
1
Faiz

Шаг 1: Предполагается, что здесь используется локатор объектов - XPath. Итак, извлеките XPath для этих двух флажков.

String housingmoves="//label[contains(text(),'housingmoves')]/preceding-sibling::input";
String season_country_homes="//label[contains(text(),'Seaside & Country Homes')]/preceding-sibling::input";

Шаг 2:

Выполнить Нажмите на флажки

driver.findElement(By.xpath(housingmoves)).click();
driver.findElement(By.xpath(season_country_homes)).click();
0
user3487861

Я пытался с различным подходом, но ничего не получалось. Я продолжал получать "Cannot click element" или ElementNotVisibleException. Я смог найти вход, но не смог его проверить. Теперь я нажимаю на элемент div, который содержит флажок, и он работает со следующим HTML (CSS основан на начальной загрузке).

 @foreach (var item in Model)
            {
                <tr>
                    <td>
                        <div id="@item.Id" class="checkbox">
                            <label><input type="checkbox" class="selectone" value="@item.Id"></label>
                        </div>
                    </td>
                    <td val="@item.Id">
                        @item.Detail
                    </td>
                    <td>
                        <div>@item.Desc
                        </div>
                    </td>
                    <td>
                        @Html.ActionLink("Edit", "Create", new { EditId = item.Id })
                    </td>
                </tr>
            }

Это код для WebDriver

var table = driver.FindElement(By.TagName("table"));
            var tds = table.FindElements(By.TagName("td"));
            var itemTds = tds.Where(t => t.Text == itemtocheck);
            foreach (var td in itemTds)
            {
                var CheckBoxTd = tds[tds.IndexOf(td) - 1];
                var val = td.GetAttribute("val");
                CheckBoxTd.FindElement(By.Id(val)).Click();
            }

В этом подходе я даю идентификатор элемента в качестве идентификатора для div, а также добавляю атрибут для td с этим идентификатором. Как только я нахожу тд элемента, который нужно проверить, я могу найти div перед этим тд и щелкнуть по нему. Мы также можем использовать запрос xpath, который поддерживает ранее (вот пример http://learn-automation.com/how-to-write-dynamic-xpath-in-Selenium/ ).

0
messed-up

Может быть, хорошая отправная точка:

isChecked  = driver.findElement((By.id("idOftheElement"))).getAttribute("name");
if(!isChecked.contains("chkOptions$1"))
{
    driver.FindElement(By.Id("idOfTheElement")).Click();
}
0
Milky

Для частичного совпадения:

getDriver().findElement(By.cssSelector("<tag name>[id*='id pattern to look for']")).click();
0
RCR

Вот версия ответа Скотта Кроу на C #. Я обнаружил, что и IEDriver, и ChromeDriver ответили на отправку Key.Space вместо того, чтобы нажимать на флажок. 

if (((RemoteWebDriver)driver).Capabilities.BrowserName == "firefox")
        {
            // Firefox
            driver.FindElement(By.Id("idOfTheElement")).Click();
        }
        else
        {
            // Chrome and IE
            driver.FindElement(By.Id("idOfTheElement")).SendKeys(Keys.Space);
        }

Спасибо Скотту за то, что он направил меня в правильном направлении. 

0
dmeehan

Здесь ниже код сначала получит все флажки, присутствующие на странице, а затем отменит выбор всех флажков. 

List<WebElement> allCheckbox = driver.findElements(By
    .xpath("//input[@type='checkbox']"));

for (WebElement ele : allCheckbox) {
    if (ele.isSelected()) {
        ele.click();
    }
}
0
Puneet Ghildiyal

Выполнение этого подхода фактически переключит флажок; .isSelected() в Java/Selenium2, очевидно, всегда возвращает false [по крайней мере с версиями Java/Selenium/Firefox, с которыми я тестировал].

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

0
Dave

Я обнаружил, что иногда JavaScript не позволяет мне установить флажок, потому что он работал с элементом по событию onchange.

И это предложение помогает мне разрешить проблему:

driver.findElement(By.xpath(".//*[@id='theID']")).sendKeys(Keys.SPACE);
0
ra1x

Чтобы установить флажок, используйте класс "WebElement". Для работы с выпадающим списком используйте класс "Select".

0
Khan