Выбор элементов из выпадающего списка "div" - Selenium - PullRequest
0 голосов
/ 27 мая 2019

У меня выпадающий список "div", а не "select". Так что моя функция работает хорошо везде, кроме dropdows, которые открываются не с места выпадающего меню, а сверху (потому что выпадающий список находится внизу страницы), чтобы предотвратить ... прокрутку страницы, я полагаю? Возможно, проблема в том, что он открывается слишком быстро или слишком медленно или что-то еще, поэтому функция обычно щелкает не нужный элемент, а один из ближайших к нему. В основном это работает так, если элемент не находится в начале выпадающего списка, поэтому он прокручивается до элемента. Любые предложения, что можно сделать?

Лучший способ, который я нашел, - это использовать действия, разбивая перемещение на элемент и щелкая мышью на 2 строки (работает намного хуже, если писать в 1 строку). Кстати, «waitVisibilityOfElement (By)» - это функция с ожиданием ожидающего состояния веб-драйвером

public void selectFromDropdown(By by) {
        Log.debug("selecting from dropdown by" + by);
        waitVisibilityOfElement(by);
        Actions actions = new Actions(wrappedWebDriver);
       actions.moveToElement(wrappedWebDriver.findElement(by)).perform();
        Log.debug("clicking dropdown item");
        wrappedWebDriver.findElement(by).click();
}

Я ожидаю, что нужно щелкнуть нужный элемент, но обычно он щелкает по другому

Хорошо, с некоторой помощью я пришел к окончательному решению, которое является лучшим способом выбора выпадающих фильтров без использования каких-либо функций .sleep (), если другие простые способы вам не подходят.

public void selectFromDropdown(By by) {
        Log.debug("selecting from dropdown by" + by);
        WebElement eleV = wrappedWebDriver.findElement(by);

        waitVisibilityOfElement(by);

        JavascriptExecutor js = (JavascriptExecutor) wrappedWebDriver;
        js.executeScript("arguments[0].scrollIntoView();", eleV);

        Actions actions = new Actions(wrappedWebDriver);
        actions.moveToElement(wrappedWebDriver.findElement(by)).perform();
        Log.debug("clicking dropdown item");
        wrappedWebDriver.findElement(by).click();
    }

Ответы [ 3 ]

0 голосов
/ 28 мая 2019

Вы пытались добавить ожидание флота перед щелчком?Это может быть полезно.Также было бы здорово, если бы вы могли поделиться информацией о DOM в этом вопросе?Это пример для Java, но я думаю, что это может помочь вам и в js.

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
    .withTimeout(30, SECONDS)
    .pollingEvery(5, SECONDS)
    .ignoring(NoSuchElementException.class);
0 голосов
/ 28 мая 2019

Вы пытались прокрутить до ожидаемого значения элемента, прежде чем навести на него курсор мыши и щелкнуть. Надеюсь, что следующий код может помочь:

public void selectFromDropdown(By by) {
    Log.debug("selecting from dropdown by" + by);
    var eleValue = wrappedWebDriver.findElement(by);
    Log.debug("Scroll to element");
    browser.executeScript("arguments[0].scrollIntoView();", eleValue);
    waitVisibilityOfElement(by);
    Actions actions = new Actions(wrappedWebDriver);
    actions.moveToElement(eleValue).perform();
    Log.debug("clicking dropdown item");
    eleValue.click();
}
0 голосов
/ 28 мая 2019

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

Вы можете попробовать это

driver.findElement(By.xpath("THE VALUE FROM DROPDOWN")).click();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...