Java 如何在katalon studio中将WebElement转换为TestObject?

Java 如何在katalon studio中将WebElement转换为TestObject?,java,selenium-webdriver,groovy,automated-tests,katalon-studio,Java,Selenium Webdriver,Groovy,Automated Tests,Katalon Studio,我有WebElement,我必须使用groovy脚本在katalon中将其转换为Testobject 比如说 List<WebElement> WEs = WebUI.executeJavaScript("return document.querySelector('#email').parentElement", []) List WEs=WebUI.executeJavaScript(“return document.querySelector(“#emai

我有WebElement,我必须使用groovy脚本在katalon中将其转换为Testobject

比如说

List<WebElement> WEs = WebUI.executeJavaScript("return document.querySelector('#email').parentElement", [])
List WEs=WebUI.executeJavaScript(“return document.querySelector(“#email”).parentElement”,[])
现在我想将WEs[0]转换为Katalon接受的TestObject


如果您对此有什么想法,请告诉我。

没有直接的方法将WebElements转换为TestObjects。根据,您可以创建一个函数来获取web元素的xpath

protected String getXPathFromElement(RemoteWebElement element) {
    String elementDescription = element.toString();
    return elementDescription.substring(elementDescription.lastIndexOf("-> xpath: ") + 10, elementDescription.lastIndexOf("]"));
}
然后使用给定的xpath创建一个新的测试对象:

protected TestObject fromElement(RemoteWebElement element) {
    TestObject testObject = new TestObject();
    testObject.addProperty("xpath", ConditionType.EQUALS, getXPathFromElement(element));
    return testObject;
}

注:

对于其他方法(测试对象->WebElement),使用


为了从任何WebElement创建测试对象,我开发了如下函数

public static String WebElementXPath(WebElement element) {
    if (element.tagName.toUpperCase() == 'HTML')    return '/html';
    if (element.tagName.toUpperCase() == 'BODY')      return '/html/body';


    // calculate position among siblings
    int position = 0;
    // Gets all siblings of that element.
    List<WebElement> siblings = WebUI.executeJavaScript("return arguments[0].parentNode.childNodes", [element])
    WebElement innerSibs
    //List<WebElement> siblings = element.parentNode.childNodes;

    WebElement sibling
    def type,response
    for(int i=0;i<siblings.size();i++){
        type = WebUI.executeJavaScript("return arguments[0].nodeType", [siblings[i]])
        if (type == null){
            continue;
        }
        if(type!=1){
            continue;
        }
        sibling = siblings[i];
        // Check Siblink with our element if match then recursively call for its parent element.
        if (sibling == element) {
            innerSibs = WebUI.executeJavaScript("return arguments[0].parentElement", Arrays.asList(sibling))
            if(innerSibs==null){
                return ""
            }
            response = functions.WebElementXPath(innerSibs)
            return response+'/'+element.tagName+'['+(position+1)+']';

        }

        // if it is a siblink & element-node then only increments position.
        type = WebUI.executeJavaScript("return arguments[0].nodeType", [sibling])
        if (type == 1 && sibling.tagName == element.tagName)            position++;

    }
}
注意:“框架”文件夹是我们在关键字文件夹中创建的,然后我们创建了“功能”关键字


我希望这可能会帮助其他开发人员。

我认为element.toString()不会每次都返回xpath,我已经尝试过,但没有得到xpath。我正在使用以下代码获取web元素
WebElement元素=WebUI.executeJavaScript(“return document.querySelector('.text center img'),[])字符串元素description=element.toString();println(elementDescription.substring(elementDescription.lastIndexOf(“->xpath:”)+10,elementDescription.lastIndexOf(“])
如果我做错了,请告诉我。示例中的
元素是由css定位器选择的。是否需要使用WebUI.executeJavaScript()来选择元素?使用css或xpath更简单。是的,有时我需要使用WebUI.executeJavaScript()获取元素,然后我需要将这些元素转换为TestObject。请为您的答案提供更多详细信息。尽可能地举例说明。没有解释的单行答案很难理解。
public static String WebElementXPath(WebElement element) {
    if (element.tagName.toUpperCase() == 'HTML')    return '/html';
    if (element.tagName.toUpperCase() == 'BODY')      return '/html/body';


    // calculate position among siblings
    int position = 0;
    // Gets all siblings of that element.
    List<WebElement> siblings = WebUI.executeJavaScript("return arguments[0].parentNode.childNodes", [element])
    WebElement innerSibs
    //List<WebElement> siblings = element.parentNode.childNodes;

    WebElement sibling
    def type,response
    for(int i=0;i<siblings.size();i++){
        type = WebUI.executeJavaScript("return arguments[0].nodeType", [siblings[i]])
        if (type == null){
            continue;
        }
        if(type!=1){
            continue;
        }
        sibling = siblings[i];
        // Check Siblink with our element if match then recursively call for its parent element.
        if (sibling == element) {
            innerSibs = WebUI.executeJavaScript("return arguments[0].parentElement", Arrays.asList(sibling))
            if(innerSibs==null){
                return ""
            }
            response = functions.WebElementXPath(innerSibs)
            return response+'/'+element.tagName+'['+(position+1)+']';

        }

        // if it is a siblink & element-node then only increments position.
        type = WebUI.executeJavaScript("return arguments[0].nodeType", [sibling])
        if (type == 1 && sibling.tagName == element.tagName)            position++;

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