带有 Find Element 命令的字符串变量 Java

String Variable with Find Element Commands Java

提问人:Jonathan 提问时间:3/6/2018 最后编辑:Jonathan 更新时间:3/6/2018 访问量:1319

问:

您好,以下所有代码都在这里工作。

String content = FileUtils.readFileToString(new File("C:\\PayrollSync\\prepayroll.txt"));
        String [] Arrayclients = content.split("\n");
        // begin for loop
        for(String client : Arrayclients) { 

        PP_OBJ_CycleData.verifysearch(driver);
        PP_OBJ_CycleData.searchbox(driver).clear();         
        PP_OBJ_CycleData.searchbox(driver).sendKeys(client);
        PP_OBJ_CycleData.searchbox(driver).sendKeys(Keys.BACK_SPACE);
        Thread.sleep(4000);

        //WebElement dropdown = driver.findElement(By.xpath(".//*[@title="+client+"]"));
        //dropdown.click();
        //driver.findElement(By.xpath(".//*[(text(),"+client+"]")).click();
        driver.findElement(By.xpath("//*[contains(text(),"+client+")]")).click();;
         Thread.sleep(2000);

        PP_OBJ_CycleData.practitioner(driver).click();

问题: driver.findElements 没有工作,例如:

//WebElement dropdown = driver.findElement(By.xpath(".//*[@title="+client+"]"));
        //dropdown.click();
        //driver.findElement(By.xpath(".//*[(text(),"+client+"]")).click();
        driver.findElement(By.xpath("//*[contains(text(),"+client+")]")).click();;
         Thread.sleep(2000);

我的失败跟踪说找不到元素 By.xpath(“//*[contains(text(),”+client+“)]”))。但是,当我转到下一页时,我正在等待该元素可见。我的等待在下面。

 Wait<WebDriver> wait = new FluentWait<WebDriver>(driver).withTimeout(20, TimeUnit.SECONDS);
           element = driver.findElement(By.id("toolbarQuickSearch"));

           wait.until(ExpectedConditions.or(
                ExpectedConditions.visibilityOf(element),
                ExpectedConditions.elementToBeClickable(element)
            ));

我可以看到的问题,如果在包含字符串的变量输入到搜索字段并且字符串名称可见之后,selenium找不到要单击的字符串名称,例如下面:

enter image description here

我可以把它放进去,它会一直点击它:

driver.findElement(By.xpath("//*[text()='midrfrate']"]"));

但是,如果我做这样的事情,它就找不到它:

 driver.findElement(By.xpath(".//*[(text(),"+client+"]")).click();
  driver.findElement(By.xpath("//[contains(text(),"+client+")]")).click();

请帮帮我,我已经尝试了以下方法,但没有成功: 如何在 XPath 中使用变量?

java selenium xpath selenium-webdriver chrome-web-driver

评论

0赞 Pivoman 3/6/2018
我认为你缺少引号。你有,它大喊大叫driver.findElement(By.xpath("//*[contains(text(),"+client+")]")).click();driver.findElement(By.xpath("//*[contains(text(),'"+client+"')]")).click();
0赞 Jonathan 3/6/2018
我会试试这个一分钟
0赞 Jonathan 3/6/2018
当我使用上述内容时,我从堆栈跟踪中收到了此消息...找不到元素:{“method”:“xpath”,“selector”:“//*[contains(text(),'midrfrate ')]”}
0赞 Pivoman 3/6/2018
好吧,你的客户端变量中有空格。试试这个driver.findElement(By.xpath("//*[contains(text(),'"+client.trim()+"')]")).click();
0赞 Jonathan 3/6/2018
我会,但空格来自(eclipse中的堆栈跟踪消息,它将其余部分放在另一行上)因此是空格

答:

1赞 Guy 3/6/2018 #1

字符串等于".//*[(text(), " + client + "]"".//*[(text(), midrfrate]"

您需要将变量放在撇号中

".//*[contains(text(), '" + client + "']"

评论

0赞 Jonathan 3/6/2018
我会试试这个一分钟
0赞 Jonathan 3/6/2018
这不起作用,因为这是堆栈跟踪错误.....org.openqa.selenium.InvalidSelectorException:无效的选择器:由于以下错误,无法找到具有 xpath 表达式 .//*[(text(), 'midrfrate '] 的元素: SyntaxError:无法对“Document”执行“evaluate”:字符串 './/*[(text(), 'midrfrate ']' 不是有效的 XPath 表达式。
0赞 Jonathan 3/6/2018
这就是我在日食中所拥有的......driver.findElement(By.xpath(“.//*[(text(), '” + client + “']”)).click();
0赞 Guy 3/6/2018
@Jonathan丢失了。contains
0赞 Guy 3/6/2018
@Jonathan 末尾也有一个空格'midrfrate '
1赞 Pivoman 3/6/2018 #2

你的xpath:

driver.findElement(By.xpath("//*[contains(text(),"+client+")]")).click();:

  1. 应包含撇号

  2. 包含块中的文本应包含精确的字符串(客户端变量“midrfrate”中有尾随空格)。

最终的 xpath 是:

driver.findElement(By.xpath("//*[contains(text(),'"+client.trim()+"')]")).click();

其中 trim() 方法从客户端变量中删除前导和尾随空格。