Selenium WebDriver: прокручивайте пользовательскую полосу прокрутки, пока она не достигнет нужного элемента - PullRequest
0 голосов
/ 19 мая 2018

Я пытаюсь автоматизировать веб-приложение WhatsApp.Div контактов имеет собственную полосу прокрутки.Группа, которую я должен опубликовать, не отображается на веб-странице и поэтому не может быть нажата.Как я могу прокрутить до этой перикулярной группы?Я пробовал следующий код, но он не работает.

 @Test
 void begin(){
    openBrowser();
    driver.get("https://web.whatsapp.com/");
    sleep(10000);
    WebElement scroll = driver.findElement(By.id("pane-side")); // locator of contacts div.
    ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", scroll);
    //Thread.sleep(500); 
    //WebElement groupName = driver.findElement(By.xpath("//span[text()='Word of the day']")); //locator of group
        }

enter image description here

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Попробуйте что-нибудь подобное?(Твик для вашего проекта!)

while (true) {
            try {
                WebElement backgroundDivInsideScrollingPane = driver.findElement(By.xpath("//div[@id='idOfAnElementInTheScrollingPane']"));
                backgroundDivInsideScrollingPane.sendKeys(Keys.PAGE_DOWN);

                WebElement elementToBeFound = driver.findElement(By.xpath("//myElementLocatorHere"));
                break;
            } catch (Exception ignored) {
                // Exception because element can't be found yet - Ignore!
            }
        }
0 голосов
/ 19 мая 2018

Вспомогательный класс для пользовательской полосы прокрутки:

public class ScrollHelper {

    private static String VeticalScrollScript = "arguments[0].scrollTop = arguments[1]";
    private static String HorizonScrollScript = "arguments[0].scrollLeft = arguments[1]";
    private JavascriptExecutor jsExecutor;

    public ScrollHelper() {
        this.jsExecutor = (JavascriptExecutor) driver;
    }

    public ScrollHelper asHorizon(scrollTarget, scrollContext) {
        if(isPresentHorizonScrollBar(scrollContext)) {
            int offset = scrollTarget.getLocation().getX() - 
                         scrollContext.getLocation().getX();
            this.jsExecutor.executeScript(HorizonScrollScript, scrollContext, offset);
        }
        return this;
    }

    public ScrollHelper asVertical(scrollTarget, scrollContext) {
        if(this.isPresentVerticalScrollBar(scrollContext)) {
            int offset = scrollTarget.getLocation().getY() - 
                         scrollContext.getLocation().getY();
            this.jsExecutor.executeScript(VeticalScrollScript, scrollContext, offset);
        }
        return this;
    }

    private boolean isPresentHorizonScrollBar(WebElement scrollContext) {
        String script = "return arguments[0].scrollWidth > arguments[0].clientWidth;";
        return (Boolean) (this.jsExecutor.executeScript(script, scrollContext));
    }

    private boolean isPresentVerticalScrollBar(WebElement scrollContext) {
        String script = "return arguments[0].scrollHeight > arguments[0].clientHeight;";
        return (Boolean) (this.jsExecutor.executeScript(script, scrollContext));
    }
}

Для вашего случая:

ScrollHelper scroll = new ScrollHelper(driver);

scroll.asVertical(
    scrollTarget, // the group
    scrollContext // the element who owns the custom scroll bar
); 

В нижнем случае scrollContext - это pre, выделенный зеленой линией, А не его родитель <div class="post-text"> или другой элемент.Вам нужно найти правильный элемент, которому принадлежит пользовательская полоса прокрутки, в качестве значения для scrollContext.

Чтобы найти правильный scrollContext, нужно увидеть, что элемент имеет стиль CSS over-flow, если снять флажокфлажок перед over-flow, вы заметите, что полоса прокрутки исчезнет, ​​и вернитесь, когда отметите ее.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...