首页 > 解决方案 > 如何使用 Katalon Studio 通过 Selenium 在子 WebElements 列表中找到具有“checked”属性的 webelement

问题描述

I have radio buttons that when either radio button is selected, it gets a checkedattribute.

这是 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
        }
    }
}

这是我用于将 a 转换WebElement为 a的辅助方法TestObject

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

帮助xpathWebElement

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

标签: seleniumxpathcss-selectorswebdriverwaitkatalon-studio

解决方案


我能够通过更改为来解决此(".//*")问题(".//*[@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)
}

推荐阅读