如何在selenium RC中的java上使用Pattern.compile中的变量

时间:2014-10-14 12:37:38

标签: java html selenium selenium-webdriver

我需要比较当前日期对应的字段中的日期。 在selenium中非常简单地解决了:

<tr>
    <td>storeExpression</td>
    <td>javascript{var date = new Date();date.getDate()+' '+date.getMonth();}</td>
    <td>t_date</td>
</tr>
<tr>
    <td>storeExpression</td>
    <td>javascript{var date = new Date();(date.getDate() -1)+' 'date.getMonth();}</td>
    <td>y_date</td>
</tr>
<tr>
    <td>assertText</td>
    <td>//div[@id='a-articles-container']/a[3]/span[2]/span[2]/span[2]</td>
    <td>regexp:(${t_date}*)|(${y_date}*)</td>
</tr>

但是当我在java中导出html代码时,我得到了非法的重复:Pattern.compile("(${t_date}*)|(${y_date}*)")

我的java代码如下所示:

Calendar c = Calendar.getInstance();

String t_date = c.get(c.DAY_OF_MONTH) + " " + c.get(c.MONTH);
String y_date = (c.get(c.DAY_OF_MONTH)-1) + " " + c.get(c.MONTH);

assertTrue(Pattern.compile("(${t_date}*)|(${y_date}*)").matcher(driver.findElement(By.xpath("//div[@id='a-articles-container']/a[5]/span[2]/span[2]/span[2]")).getText()).find());

我可以将文本与变量y_date进行比较

assertTrue(Pattern.compile(y_date).matcher(driver.findElement(By.xpath("//div[@id='a-articles-container']/a[5]/span[2]/span[2]/span[2]")).getText()).find());

或t_date

 assertTrue(Pattern.compile(t_date).matcher(driver.findElement(By.xpath("//div[@id='a-articles-container']/a[5]/span[2]/span[2]/span[2]")).getText()).find());

但不能同时使用两者!

如何在模式中使用“或”运算符来比较解释变量是否为文本?

1 个答案:

答案 0 :(得分:1)

Java不支持像Ruby,PHP等String Interpolation,所以你不能写&#34; $ {variable}&#34;期待它的运作。在你的情况下发生的是$ {t_date}保留在该表单中,而Pattern.compile正试图将其解释为正则表达式,而{和}是保留字符。

然而String.format使用像%s这样的占位符可以作为一个很好的替代品。

我相信你想要的是以下内容。

assertTrue(Pattern.compile(String.format("(%s*)|(%s*)", t_date, y_date))
        .matcher(driver.findElement(By.xpath("//div[@id='a-articles-container']/a[5]/span[2]/span[2]/span[2]")).getText()).find());