Оба приведенных выше ответа страдают от одной и той же проблемы. Возвращая завершенный XPath с вызванной функцией .toLowerCase()
, любой XPath, содержащий идентификатор с заглавной буквой, не будет работать.
Пример: //div[@id="deviceblock-1111"]
не будет работать с тегом <div id="deviceBlock-1111">
Однако вы можете просто удалить вызов .toLowerCase()
из возврата, но в итоге XPath будет выглядеть так: //DIV[@id="deviceBlock-1111"]/DIV[2]/SELECT[1]/OPTION[5]
Чтобы решить эту проблему, используйте функцию ниже.
public String GetElementXPath(WebElement element, WebDriver driver)
{
return (String) ((JavascriptExecutor) driver).executeScript(
"getXPath=function(node)" +
"{" +
"if (node.id !== '')" +
"{" +
"return '//' + node.tagName.toLowerCase() + '[@id=\"' + node.id + '\"]'" +
"}" +
"if (node === document.body)" +
"{" +
"return node.tagName.toLowerCase()" +
"}" +
"var nodeCount = 0;" +
"var childNodes = node.parentNode.childNodes;" +
"for (var i=0; i<childNodes.length; i++)" +
"{" +
"var currentNode = childNodes[i];" +
"if (currentNode === node)" +
"{" +
"return getXPath(node.parentNode) +
'/' + node.tagName.toLowerCase() +
'[' + (nodeCount+1) + ']'" +
"}" +
"if (currentNode.nodeType === 1 && " +
"currentNode.tagName.toLowerCase() === node.tagName.toLowerCase())" +
"{" +
"nodeCount++" +
"}" +
"}" +
"};" +
"return getXPath(arguments[0]);", element);
}
Это вернет правильно отформатированный, уникальный XPath из вашего WebElement.
//div[@id="deviceBlock-1111"]/div[2]/select[1]/option[5]