Явное ожидание двух элементов с использованием оператора OR в Selenium - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь найти один из 2 элементов в селене (java). Если кто-то найден, то на него нужно нажать. Следующее не работает;

WebDriverWait wait5 = new WebDriverWait(driver, 5);                     
wait5.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@data-period='R6M'] || //span[@title='FYTD']"))).click();   

Ответы [ 2 ]

1 голос
/ 15 января 2020

xpath является недействительным или является единственным |

wait5.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@data-period='R6M'] | //span[@title='FYTD']"))).click();

Вы также можете использовать ExpectedConditions.or для этого

wait5.until(ExpectedConditions.or(
    ExpectedConditions.elementToBeClickable(By.xpath("//a[@data-period='R6M']")),
    ExpectedConditions.elementToBeClickable(By.xpath("//span[@title='FYTD']"))));

Чтобы получить WebElement из одно из двух условий, вы можете создать свою собственную реализацию

public ExpectedCondition<WebElement> customCondition(By... locators) {
    @Override
    public WebElement apply(WebDriver d) {
        for (By locator in locators) {
            return ExpectedConditions.elementToBeClickable(locator).apply(d);
        }
    }
}

WebElement element = wait4.until(customCondition(By.xpath("//a[@data-period='R6M']"), By.xpath("//span[@title='FYTD']")));
0 голосов
/ 15 января 2020

Чтобы вызвать WebDriverWait для любого из 2 элементов, использующих Селен клиента, вы можете использовать следующую Стратегию локатора :

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.or(
    ExpectedConditions.elementToBeClickable(By.xpath("//a[@data-period='R6M']")),
    ExpectedConditions.elementToBeClickable(By.xpath("//span[@title='FYTD']"))
)); 

Ссылка

Соответствующее обсуждение можно найти по адресу:

...