Как найти веб-элемент с атрибутом «флажок» в списке дочерних WebElements через Selenium с помощью Katalon Studio - PullRequest
0 голосов
/ 21 марта 2019

У меня есть переключатели, которые, когда выбрана любая из них, получают атрибут 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-кода, на этот раз с включенным первым переключателем.Как вы можете видеть, второй переключатель больше не имеет атрибута «флажок».

HTML2

Ответы [ 3 ]

0 голосов
/ 21 марта 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)
}
0 голосов
/ 21 марта 2019

Для извлечения 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]")));
    
  • * 1018 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]")));
    
0 голосов
/ 21 марта 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

EDIT

 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");
                }
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...