Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WebDriver Selenium API:在XPath中标识WebElement_Api_Selenium_Webdriver_Selenium Webdriver - Fatal编程技术网

WebDriver Selenium API:在XPath中标识WebElement

WebDriver Selenium API:在XPath中标识WebElement,api,selenium,webdriver,selenium-webdriver,Api,Selenium,Webdriver,Selenium Webdriver,我最近开始使用Selenium,我决定只使用Selenium 2/WebDriver。 在我的测试代码中,我经常在不知道它在页面中的位置的情况下到达 我想让代码在给定WebElement的情况下,构造一个XPath表达式来唯一地选择它 Selenium的FireFox记录器插件可以做到这一点;我想要的是在Selenium 2中实现它的代码 我可以通过使用WebElement的findElement和findElement来自己编写这样的代码,以找到我们的孩子,但是快速(通过.xpath反复调用似

我最近开始使用Selenium,我决定只使用Selenium 2/WebDriver。 在我的测试代码中,我经常在不知道它在页面中的位置的情况下到达

我想让代码在给定WebElement的情况下,构造一个XPath表达式来唯一地选择它

Selenium的FireFox记录器插件可以做到这一点;我想要的是在Selenium 2中实现它的代码

我可以通过使用
WebElement
findElement
findElement
来自己编写这样的代码,以找到我们的孩子,但是快速(通过.xpath反复调用
似乎不好)和完整(例如,由于名称空间的原因)是不寻常的

(建议改用CSS选择器——我没意见。)


有人帮过我吗?最好的方法是什么?

这很简单:顺便说一句,css是一条路要走;xpath只能作为最后手段使用。解释css定位器的深度远远超过我在这里提供的空间

最好的方法:如果您使用firefox下载firebug,那么您可以查看html。按cmd+Shift+c,它将使用元素荧光灯为您打开。找到你的html元素,也许它看起来像这样

<input type="submit" tabindex="110" value="Post Your Answer" id="submit-button">
请注意,我们将标记名放在第一个“input”之后,在括号“input[id='submit-button']”中加上某种唯一标识符。在大多数情况下,这将覆盖您使用的所有css定位器的75%。另外25%需要我在页面顶部的链接中介绍一些更棘手的东西

您可能会问“除了id之外,我还可以使用什么类型的唯一标识符”,这里介绍了:

祝你一路顺风

编辑

首先,祝你好运找到你的元素……如果你需要,你可以通过部分定位文本来搜索元素,比如输入[id*='submit']。当您使用部分文本作为定位器的一部分时,使用它对于动态生成的元素很有帮助,因为定位器在元素之间没有变化


你提到了在html树上行走,也许我第一次读这个问题时没有看到。我认为你抓住了眼前的问题。不建议在html树上行走,因为这会使您的测试对html更改更加脆弱。从长远来看,这也会使您的代码不可读。一般来说,如果您的id丢失或无法预测,我建议您与proj联系。关于让开发人员编写真正可以自动化的代码的管理(例如:在关键元素上实现标识符)。从长远来看,这实际上将为您和开发人员节省大量的精力,并且还将提高测试的速度和可靠性。

这非常简单:顺便说一句,css是一种可行的方法;xpath只能作为最后手段使用。解释css定位器的深度远远超过我在这里提供的空间

最好的方法:如果您使用firefox下载firebug,那么您可以查看html。按cmd+Shift+c,它将使用元素荧光灯为您打开。找到你的html元素,也许它看起来像这样

<input type="submit" tabindex="110" value="Post Your Answer" id="submit-button">
请注意,我们将标记名放在第一个“input”之后,在括号“input[id='submit-button']”中加上某种唯一标识符。在大多数情况下,这将覆盖您使用的所有css定位器的75%。另外25%需要我在页面顶部的链接中介绍一些更棘手的东西

您可能会问“除了id之外,我还可以使用什么类型的唯一标识符”,这里介绍了:

祝你一路顺风

编辑

首先,祝你好运找到你的元素……如果你需要,你可以通过部分定位文本来搜索元素,比如输入[id*='submit']。当您使用部分文本作为定位器的一部分时,使用它对于动态生成的元素很有帮助,因为定位器在元素之间没有变化


你提到了在html树上行走,也许我第一次读这个问题时没有看到。我认为你抓住了眼前的问题。不建议在html树上行走,因为这会使您的测试对html更改更加脆弱。从长远来看,这也会使您的代码不可读。一般来说,如果您的id丢失或无法预测,我建议您与proj联系。关于让开发人员编写真正可以自动化的代码的管理(例如:在关键元素上实现标识符)。从长远来看,这实际上将为您和开发人员节省大量精力,也将提高测试的速度和可靠性。

也许这会有所帮助:我正在测试一个动态生成id的网站,因此id会一直变化。为了获取他们的xpath并使用它,我使用以下函数:

    /**
 * Gets the absolute xPath for elements with dynamic ids.
 * 
 * @param driver - the current WebDriver instance
 * @param element - the element for which the xPath will be found
 * @return the absolute xPath for this element
 */
public static String getElementXPath(WebDriver driver, WebElement element) {
    return (String)((JavascriptExecutor)driver).executeScript(
            "gPt=function(c)" +
            "{" +
            "if(c.id!=='')" +
            "{return c.tagName + '[@id=\"'+c.id+'\"]'}" +
            "if(c===document.body)" +
            "{return c.tagName}" +
            "var a=0;" +
            "var e=c.parentNode.childNodes;" +
            "for(var b=0;b<e.length;b++)" +
            "{var d=e[b];" +
            "if(d===c)" +
            "{return gPt(c.parentNode)+'/'+c.tagName+'['+(a+1)+']'}" +
            "if(d.nodeType===1&&d.tagName===c.tagName)" +
            "{a++}" +
            "}" +
            "};" +
            "return gPt(arguments[0]);", element);
}
/**
*获取具有动态ID的元素的绝对xPath。
* 
*@param driver-当前WebDriver实例
*@param element-将为其找到xPath的元素
*@返回此元素的绝对xPath
*/
公共静态字符串getElementXPath(WebDriver驱动程序,WebElement元素){
返回(字符串)((JavascriptExecutor)驱动程序).executeScript(
“gPt=功能(c)”+
"{" +
“如果(c.id!=”“+
“{返回c.tagName+'[@id=\''+c.id+'\'\']'}”+
“如果(c==文档正文)”+
“{返回c.tagName}”+
“变量a=0;”+
“var e=c.parentNode.childNodes;”+

“对于(var b=0;b这可能会有所帮助:我正在测试一个动态生成id的网站,因此id会一直更改。为了获取xpath并使用它,我使用以下函数:

    /**
 * Gets the absolute xPath for elements with dynamic ids.
 * 
 * @param driver - the current WebDriver instance
 * @param element - the element for which the xPath will be found
 * @return the absolute xPath for this element
 */
public static String getElementXPath(WebDriver driver, WebElement element) {
    return (String)((JavascriptExecutor)driver).executeScript(
            "gPt=function(c)" +
            "{" +
            "if(c.id!=='')" +
            "{return c.tagName + '[@id=\"'+c.id+'\"]'}" +
            "if(c===document.body)" +
            "{return c.tagName}" +
            "var a=0;" +
            "var e=c.parentNode.childNodes;" +
            "for(var b=0;b<e.length;b++)" +
            "{var d=e[b];" +
            "if(d===c)" +
            "{return gPt(c.parentNode)+'/'+c.tagName+'['+(a+1)+']'}" +
            "if(d.nodeType===1&&d.tagName===c.tagName)" +
            "{a++}" +
            "}" +
            "};" +
            "return gPt(arguments[0]);", element);
}
/**
*获取具有动态ID的元素的绝对xPath。
* 
*@param driver-当前WebDriver实例
*@param element-将为其找到xPath的元素
*@返回此元素的绝对xPath
*/
公共静态字符串getElementXP