Как найти веб-элемент с атрибутом 'checked' в списке дочерних веб-элементов через Selenium с помощью Katalon Studio

У меня есть переключатели, которые при выборе любого переключателя получают атрибут checked.

Вот как выглядит HTML:

HTML

Моя реализация получения потомка с атрибутом checked:

public TestObject getCheckedTestObjectFromParent(String parentID){
    WebDriver driver = DriverFactory.getWebDriver()
    WebElement parentWebElement = driver.findElement(By.id(parentID))

    List<WebElement> children = parentWebElement.findElements(By.xpath(".//*"))
    println(children.size())
    for(int i = 0; i < children.size(); i++){
        TestObject childTestObject = getTestObjectFromWebElement(children[i])
        if(WebUI.verifyElementHasAttribute(childTestObject, 'checked', 10, FailureHandling.OPTIONAL)){
            return childTestObject
        }
    }
}

Это вспомогательный метод, который я использую для преобразования WebElement в TestObject:

public TestObject getTestObjectFromWebElement(WebElement element) {
        TestObject object = new TestObject()
        object.addProperty("xpath", ConditionType.CONTAINS, getXPathFromElement(element))
        return object
    }

Помощник для получения xpath от WebElement:

protected String getXPathFromElement(WebElement element) {
        String elementDescription = element.toString();
        return elementDescription.substring(elementDescription.lastIndexOf("-> xpath: ") + 10, elementDescription.lastIndexOf("]"));
    }

Мне что-то здесь не хватает или что-то не так с преобразованием WebElement -> TestObject? Также возможно ли это с использованием только TestObject или только WebElement? Если бы я мог получить дочерний TestObjects, содержащий определенные атрибуты, от родительского TestObject, тогда мне не нужно было бы создавать беспорядок, используя WebElements.

Изменить

Еще одно изображение HTML, на этот раз с отмеченным первым переключателем. Как видите, второй переключатель больше не имеет атрибута «checked».

HTML2


person street_jesus    schedule 21.03.2019    source источник
comment
@DebanjanB Я спросил об этом, я пытаюсь получить TestObject с атрибутом: 'checked', как вы можете видеть из предоставленного мной HTML, только 1 радиокнопка имеет атрибут 'checked' за раз, и это единственный Я хочу получить.   -  person street_jesus    schedule 21.03.2019
comment
Возможно, клиенты Selenium-Java не имеют TestObject, который хорошо поддерживается в Katalon. Отсюда встречный вопрос.   -  person DebanjanB    schedule 21.03.2019
comment
@DebanjanB На самом деле я использую Katalon Studio, и причина, по которой я использую WebElement, заключается в том, что я не смог найти способ получить дочерние элементы с помощью TestObjects и, следовательно, необходимость в обратном преобразовании в TestObjects, как только у меня будет WebElement, который мне нужен   -  person street_jesus    schedule 21.03.2019
comment
Если я правильно понял ваш вопрос, вы пытаетесь получить TestObject, который имеет атрибут checked, специфичный для Katalon. Если вам достаточно получить соответствующий WebElement, обновите вопрос, и я могу составить ответ на этот вопрос.   -  person DebanjanB    schedule 21.03.2019
comment
@DebanjanB - это именно то, что мне нужно, я хочу получить проверенный в данный момент WebElement, обратите внимание, что это может быть любой из двух переключателей.   -  person street_jesus    schedule 21.03.2019


Ответы (3)


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

  • cssSelector:

    WebElement elem = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("div.a-toggle.a-toggle--anycase#config-src-laserunits  div[id^='config-src-laserunits-']>input.a-toggle__radio[checked]")));
    
  • xpath:

    WebElement elem = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='a-toggle a-toggle--anycase' and @id='config-src-laserunits']//div[starts-with(@id, 'config-src-laserunits-')]/input[@class='a-toggle__radio' and @checked]")));
    
person DebanjanB    schedule 21.03.2019

Я смог исправить это, изменив (".//*") на (".//*[@checked='checked']")

 parentWebElement.findElement(By.xpath(".//*[@checked='checked']")

найдет элемент с атрибутом checked = 'checked'

Обратите внимание, что список больше не нужен, поскольку одновременно может быть установлен только 1 переключатель.

Реализация

public TestObject getCheckedTestObjectFromParent(String parentID){
    WebDriver driver = DriverFactory.getWebDriver()
    WebElement parentWebElement = driver.findElement(By.id(parentID))

    //there is only 1 checked child at a time, so there is no need for a list
    WebElement checkedChild = parentWebElement.findElement(By.xpath(".//*[@checked='checked']"))

    //convert the WebElement to a TestObject and return
    return getTestObjectFromWebElement(checkedChild)
}
person street_jesus    schedule 21.03.2019

Попробуйте этот Xpath

"//input[@id='config-src-laserunits-wavnmradio' and @checked='checked']"

Пример:

List<WebElement> children = driver.findElements(By.xpath("//input[@id='config-src-laserunits-wavnmradio' and @checked='checked']"))

Он должен вернуть размер 1

ИЗМЕНИТЬ

 List<WebElement> children = driver.findElements(By.xpath("//input[@id='config-src-laserunits-wavnmradio']"));
            for (int i=0;i<children.size();i++)
            {
                if(children.get(i).getAttribute("checked")!=null)
                {
                    System.out.println("radio button is checked");
                }
            }
person KunduK    schedule 21.03.2019
comment
это не сработает, поскольку 'config-src-laserunits-wavnmradio' не всегда будет иметь атрибут 'checked', если выбран 'config-src-laserunits-freqthzradio', тогда у него будет атрибут 'checked' - person street_jesus; 21.03.2019
comment
поэтому два поля ввода, которые у меня есть, одно из них может иметь атрибут 'checked' одновременно, и это тот, который я пытаюсь получить. - person street_jesus; 21.03.2019
comment
за чем ты ухаживаешь? Можете ли вы уточнить. Моя первоначальная мысль, что вам нужен выбранный радио xpath. - person KunduK; 21.03.2019
comment
Код предназначен только для этого. Он вернет размер 1 вместо радиокнопки 2. - person KunduK; 21.03.2019
comment
Извините, если я что-то неправильно понял. - person KunduK; 21.03.2019
comment
Я пытаюсь установить переключатель, который в настоящее время отмечен, тот, который отмечен, будет иметь атрибут «проверено». Мой родительский div: 'config-src-laserunits' имеет 2 дочерних div, каждый из которых содержит переключатель, я просматриваю дочерние элементы, чтобы иметь возможность получить элемент с атрибутом 'checked', но, похоже, он не работает - person street_jesus; 21.03.2019
comment
Если вы попробуете мой xpath и зададите условие children.size () = 1, это также подтвердится. - person KunduK; 21.03.2019
comment
он не будет, потому что он будет проверять только 1 из переключателей, а не оба, а тот, который он будет проверять, может иметь атрибут 'checked' или он может не - person street_jesus; 21.03.2019
comment
Я не думаю, что вы понимаете то, что я говорю, есть 2 переключателя, другой - 'config-src-laserunits-freqthzradio', когда одна из этих кнопок выбрана, у нее будет отмеченный атрибут, в противном случае это атрибута не будет, я пытаюсь найти тот, у которого есть проверенный атрибут - person street_jesus; 21.03.2019
comment
Посмотрите на второй добавленный мной HTML-код, вы поймете, о чем я говорю. - person street_jesus; 21.03.2019
comment
@Zymeriath: Думаю, это то, что вам нужно. Можете проверить мой обновленный ответ. - person KunduK; 21.03.2019
comment
Я исправил это, изменив (.//*) на (.//*[@checked='checked ']) - person street_jesus; 21.03.2019
comment
Если вы видите мой отредактированный ответ, это лучший способ сделать это. - person KunduK; 21.03.2019