Find an element by text and get xpath - selenium webdriver junit

后端 未结 11 721
情深已故
情深已故 2020-12-03 04:17

I have a table with 9 rows and 6 columns in my webpage. I want to search for a text \"MakeGoodDisabled-Programwise_09_44_38_461(n)\" and get the xpath of the cell. I have us

11条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-03 04:39

    JavaScript fnction's to generate XPath

    XPath/locator is a way of addressing an element by navigating through the Tree structure.

    Absolute XPath (/): /html/body/div[5]/div[4]

    WebElement XPath:

    function WebElement_XPath(element) {
        if (element.tagName == 'HTML')    return '/html';
        if (element===document.body)      return '/html/body';
    
        // calculate position among siblings
        var position = 0;
        // Gets all siblings of that element.
        var siblings = element.parentNode.childNodes;
        for (var i = 0; i < siblings.length; i++) {
            var sibling = siblings[i];
            // Check Siblink with our element if match then recursively call for its parent element.
            if (sibling === element)  return WebElement_XPath(element.parentNode)+'/'+element.tagName+'['+(position+1)+']';
    
           // if it is a siblink & element-node then only increments position. 
            var type = sibling.nodeType;
            if (type === 1 && sibling.tagName === element.tagName)            position++;
        }
    }
    

    MouseEvent XPath:

    var eventXPath = '';
    function MouseEvent_XPath(e) {      
        event = e.target || e.srcElement ||e.originalTarget;
    
        for ( var xpathEle = ''; event && event.nodeType == 1; event = event.parentNode ) {
            if ( event.tagName == 'HTML' || event.tagName == 'html' ) {
                eventXPath = '//html'+xpathEle;         break;
            }     
            if ( event.tagName == 'BODY' || event.tagName == 'body' ) {
                eventXPath = '//html/body'+xpathEle;    break;
            }     
    
            // calculate position among siblings
            var position = 0;
            // Gets all siblings of that event.
            var siblings = event.parentNode.children;
            for (var i = 0; i < siblings.length; i++) {
                var sibling = siblings[i];
            // Check Sibling with our event if match then recursively call for its parent event.
                if (sibling === event)  xpathEle = "/"+event.tagName+'['+(position+1)+']'+xpathEle;
    
               // if it is a sibling with same tagName then only increments position. 
                if (sibling.tagName === event.tagName)            position++;
            }
        }
    }
    

    Relative xpath (//): //div[@id=’social-media’]/ul/li[3]/a

    //Element.TagName[@id="idvalue" and @class="classValue" and text()="innerHTML data"] OR you can use .(dot), . is an alias for text(), [.="innerHTML data"] if you know the content you are looking for is somewhere inside the specified tag, you can use this

    Example run in console:

    var xpath  = "//div[@id='answer-32201731' and @data-answerid='32201731']";
    var element = document.evaluate(xpath, window.document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue;
    element.style.setProperty( 'outline', "3px solid blue","important");
    

提交回复
热议问题