提到的两个xpath有什么问题?

时间:2016-02-01 15:19:39

标签: xml selenium xpath selenium-webdriver

我有两个像这样的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("");
    }

2 个答案:

答案 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')

如果你能这样做,那就更加健壮和安全。