我有两个像这样的xpath,我将附加来自方法参数的变量。
XPath 1:
.//tr/td/a[contains(text(),"+projectName+")]/../../td[contains(text(),"+softwareName+")]/../td/div/button[@data-original-title='View Details']
XPath 2:
.//tr/td/a[contains(text(),"+projectName+")]/../../td/div/button[@data-original-title='Delete Project']
我正在使用这些xpaths来点击一个元素。当我运行它时,我收到XPath2的错误,说xpath无效。
所以,我通过在变量projectName之前放置单引号来修改XPath2,就像这样。
.//tr/td/a[contains(text(),'"+projectName+"')]/../../td/div/button[@data-original-title='Delete Project']
当我运行它时,它成功执行。我不知道为什么第一个xpath没有引号执行,但第二个xpath失败了。
EDIT1:
示例代码:
clickElement(getXPathofAddButton(softwareName));
clickElement是一种具有
的通用方法driver.findElement(By.xpath()).click();
这是getXPathofAddButton(softwareName)的代码,我在其中提供softwareName并返回xpath。在这里,我没有使用单引号,它运行正常。
public By getXPathofAddButton(String value)
{
try{
if(value!=null)
{
return By.xpath(".//tr/td[contains(text(),"+ value + ")]/../td/div/button[@data-original-title='Add Project']");
}
}
catch(ElementNotFoundException e)
{
e.printStackTrace();
}
return By.xpath("");
}
不仅如此,我几乎所有方法都没有使用单引号。但是,对于下面的方法我得到了错误。
clickElement(getXPathofDeleteProjectButton(projectName2));
同上面......
public By getXPathofDeleteProjectButton(String projectName)
{
try{
if(projectName!=null)
return By.xpath(".//tr/td/a[contains(text(),'"+projectName+"')]/../../td/div/button[@data-original-title='Delete Project']");
}
catch (ElementNotFoundException e)
{
e.printStackTrace();
}
return By.xpath("");
}
答案 0 :(得分:0)
xpath定位器需要用于比较文本的xpath中的字符串,所以当你将字符串发送到xpath时,用单引号将它包围起来告诉它这是需要比较的文本
a[contains(text(), 'projectName')]
在xpath2中你实际上是
a[contains(text(), projectName)]
您没有说明要比较的字符串是什么,只有未识别的变量projectName
。
答案 1 :(得分:0)
您应该尝试以这种方式避免使用字符串连接构造路径表达式 - 如果您无法验证变量的内容,它会让您对注入攻击持开放态度。
我不了解Selenium,但大多数XPath处理器允许您编写包含变量引用的表达式,例如
//tr/td[contains(., $projectName)]/../..
然后单独绑定变量
setParameter('projectName', 'myProject')
如果你能这样做,那就更加健壮和安全。