将变量放入find.By通过CSS,但出现错误:Selenium / Java的“属性值必须为常数”

时间:2019-05-22 17:46:17

标签: java selenium selenium-webdriver webdriver

我正在尝试将变量放入CSS选择器中,但出现错误。我有3个类:Flight(在这里有选择器的位置,并且出现错误,代码来自此处)和TestCase2(在这里使用本地化元素对其进行测试)。这是有错误的代码

    
    private String day;
    @FindBy(css = "button.datepicker-cal-date[data-day='"+ day +"']")
    private WebElement selectDay;
   
    public WebElement getSelectDay(String day){return selectDay;} 
    
    
    public void clickOnSelectDay(String day){
        System.out.println("Click on select day on the data picker");
        getSelectDay(day).click();

    }

我希望能够单击特定的日期,即要在TC2类中放入变量的日期。

不好意思,请问我。

2 个答案:

答案 0 :(得分:0)

@FindBy不允许您在运行时进行计算。作为注释,它会在脚本开始之前运行。

要在@FindBy中使用变量

在这种情况下这无济于事,但将来可能会派上用场。关键是在您的字符串上使用final标签。因此,必须为其分配一些东西。

public final String cMonday= "button.datepicker-cal-date[data-day='Monday']";
@FindBy(css = cMonday)
public WebElement dayOfWeekMonday;

作为一种习惯,我以定位符的类型开头该变量,对于CSS来说是'c',对于xpath是'x',这样我就不会感到困惑。

根据您的情况...

使用列表<>,然后从访问方法中选择合适的一个

首先,创建所有按钮的列表:

@FindBy(css = "button.datepicker-cal-date")
private List<WebElement> dayOfTheWeekButtons;

然后,通过您的方法选择合适的一个:

public void clickOnSelectDay(String day){
    for(WebElement dayName : dayOfTheWeekButtons) {
        if(day.equals(dayName.getAttribute("data-day")) {
            System.out.println("Click on select day on the data picker: " + day);
            dayName.click();
            break;
        }
    }
    fail();
}

代码可能需要一些调整,但是您应该了解一下。从“数据日”列表中保存的名称列表中,循环浏览直至找到正确的值,然后可以单击它。

答案 1 :(得分:-1)

我听说的FindByFindBys是它们仅接受无法修改的字符串,即final字符串,因为final关键字阻止将来分配给该变量。我不确定,但是您可以按照下面提到的方式尝试。

private final String dayCSS1="button.datepicker-cal-date[data-day='";
private final String dayCSS2="']";
private final String day;
@FindBy(css = dayCSS1 + day + dayCSS2)
private WebElement selectDay;