如何使用Katalon Studio在Selenium中找到在子WebElement列表中具有“已检查”属性的网络元素

时间:2019-03-21 15:57:19

标签: selenium xpath css-selectors webdriverwait 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的另一张图片,这次选中了第一个单选按钮。如您所见,第二个单选按钮不再具有“选中”属性。

HTML2

3 个答案:

答案 0 :(得分:0)

尝试使用此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");
                }
            }

答案 1 :(得分:0)

我能够通过将(".//*")更改为(".//*[@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)
}

答案 2 :(得分:0)

要检索当前checked WebElement ,可以使用以下Locator Strategies之一:

  • 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]")));