У меня есть тумблер, на который я хочу нажать, в зависимости от состояния переключателя.

Если это "span.switch-right", я хочу сделать:

findElement(By.cssSelector("span.switch-left")).click();

Если это "span.switch-left", я хочу сделать:

findElement(By.cssSelector("span.switch-right")).click();

HTML:

<div tabindex="0" class="has-switch switch-on switch-animate">
    <div>
        <span class="switch-left">ON</span>
        <label for="profile_isProfileSharedWithNearby">&nbsp;</label>
        <span class="switch-right">OFF</span>
        <input id="profile_isProfileSharedWithNearby" name="profile[isProfileSharedWithNearby]" class="form-control-borderless hide" value="1" checked="checked" type="checkbox">
    </div>
</div>
2
ratsstack 25 Фев 2015 в 02:15

3 ответа

Лучший ответ

Вы, вероятно, захотите попробовать Fluent Wait. Это дает вам возможность дождаться элемента, минуя некоторые типы исключений, и опросить DOM через определенный период времени и убедиться, существует ли он или нет.

By by = By.cssSelector("span.switch-left");
// Waiting 30 seconds for an element to be present on the page, checking
// for its presence once every 5 seconds.
FluentWait<WebDriver> wait = new FluentWait<WebDriver>(driver)
        .withTimeout(30, SECONDS)
        .pollingEvery(5, SECONDS)
        .ignoring(NoSuchElementException.class);

WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
    public WebElement apply(WebDriver driver) {
        return driver.findElement(by);
    }
});

foo.click();

Взято из здесь

Изменить Предлагаемое решение после запутанного (;-)) обсуждения

//*[@tabindex='0'][contains(@class,'switch-off')]
2
Saifur 25 Фев 2015 в 01:00

Вы можете проверить состояние переключателя по следующему коду и можете выключить его на

List<WebElement> switchElement = driver.findElements(By
            .cssSelector("div.has-switch.switch-on.switch-animate"));
    System.out.println(switchElement.size() + " : Switch Size");
    // Check its on, if its on then switch it off
    if (switchElement.size() != 0) {

        switchElement.get(0)
                .findElement(By.cssSelector("span.switch-left")).click();

    } else
        System.out.println("Switch  is already off");
1
Juhi Saxena 25 Фев 2015 в 09:54

Предполагая, что текст надежен, вы можете использовать для этого селектор xpath:

findElement(By.xpath("//span[contains(@class, 'switch-') and contains(text(), 'OFF')]")).click();

При этом всегда будет щелкать переключатель OFF.

3
Richard 24 Фев 2015 в 23:49