Как обновить дерево DOM в Selenium, чтобы отображались вновь созданные элементы? - PullRequest
0 голосов
/ 23 мая 2019

Я хочу получить элемент DOM, который не существует при загрузке страницы, но добавляется впоследствии с помощью скрипта.Точный сценарий выглядит следующим образом:

  1. Я загружаю https://www.binance.com/de/trade/pro/XRP_BTC
  2. Я нажимаю кнопку «TradingView»
  3. Я выбираю «Стохастический RSI» наКнопка «Technical Ind».

(Все эти шаги выполняются либо самим драйвером, использующим click(), либо роботом, использующим нажатия клавиш и мыши)

После того, как я выбралВ Stochastic RSI добавлены новые элементы DOM без обновления страницы.Я ищу элементы <span> с именем класса "pane-legend-item-value-wrap", которые генерируются после добавления «Стохастического RSI».

Вызов driver.findElements(By.className("pane-legend-item-value-wrap")) дает мне 0 результатов.Я думаю, это из-за того, что источник страницы драйвера все еще остается тем, кто сразу загрузил страницу в первый раз.Есть ли способ обновить исходный код страницы или дерево DOM без перезагрузки всей страницы ?

Я пробовал это с неявным и явным ожиданием, но безуспешно и со следующей ошибкой:

Исключение в потоке "main" org.openqa.selenium.TimeoutException: ожидаемое условие не выполнено: ожидание наличия каких-либо элементов, обнаруженных By.className: pane-legend-item-value-wrap (пытался для15 секунд с интервалом в 500 миллисекунд)

Это соответствующий код:

public class Main {

    public static void main(String args[]) {

        try {
            Selenium selenium = new Selenium();

            selenium.startChrome();

            for (int i = 0; i < 30000; i++) {

                try {
                    selenium.getChromeDriver().getTitle();
                } catch (WebDriverException e) {
                    i = 30000;
                    continue;
                }
                System.out.println("Current Coin Value: " + selenium.getValueOfCoin() + "$ - " + "StRSI Blue: "
                        + selenium.getBlueStRSI() + " - StRSI Red: " + selenium.getRedStRSI());
                Thread.sleep(200);

            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

public class Selenium {

    private ChromeDriver chromeDriver;
    WebDriverWait wait;
    private Robot robot;

    public Selenium() throws AWTException {

    }

    public void startChrome() throws InterruptedException, AWTException {

        robot = new Robot();
        String pathToChromeDriver = "resources/driver/chromedriver.exe";
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--start-maximized");
        System.setProperty("webdriver.chrome.driver", pathToChromeDriver);
        chromeDriver = new ChromeDriver(options);
        chromeDriver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
        wait = new WebDriverWait(chromeDriver, 15);

        chromeDriver.get("https://www.binance.com/de/trade/pro/XRP_BTC");
        Thread.sleep(200);
        chromeDriver.findElement(By.className("DEMrI")).click();
        Thread.sleep(200);
        chromeDriver.findElements(By.className("csajsa")).get(0).click();
        chromeDriver.findElements(By.className("bEXbyP")).get(6).click();
        chromeDriver.findElements(By.className("bEXbyP")).get(5).click();

        setStochRSI();

        chromeDriver.findElements(By.className("mt9q6r-1")).get(1).click();

    }

    private void setStochRSI() throws AWTException, InterruptedException {

        Thread.sleep(3000);
        robot.mouseMove(650, 250);
        mouseClick();
        robot.keyPress(KeyEvent.VK_S);
        robot.keyRelease(KeyEvent.VK_S);
        robot.keyPress(KeyEvent.VK_T);
        robot.keyRelease(KeyEvent.VK_T);
        Thread.sleep(500);
        robot.mouseMove(500, 310);
        mouseClick();
        robot.mouseMove(877, 205);
        mouseClick();
        robot.mouseMove(1250, 650);
        Thread.sleep(100);
        robot.mouseMove(0, 0);

    }

    public Double getValueOfCoin() {

        return Double.parseDouble(chromeDriver.findElement(By.className("sc-1yysggs-0")).getText().substring(12));

    }

    public Double getBlueStRSI() {

        String value;
        value = wait
                .until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.className("pane-legend-item-value-wrap")))
                .get(9).getText();

        return Double.parseDouble(value);

    }

    public Double getRedStRSI() {

        String value;
        value = wait
                .until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.className("pane-legend-item-value-wrap")))
                .get(19).getText();

        return Double.parseDouble(value);

    }

    public ChromeDriver getChromeDriver() {

        return chromeDriver;

    }

    private void mouseClick() throws InterruptedException {
        robot.mousePress(MouseEvent.BUTTON1_MASK);
        Thread.sleep(50);
        robot.mouseRelease(MouseEvent.BUTTON1_MASK);
    }

}

Ответы [ 2 ]

1 голос
/ 23 мая 2019

причина, по которой вы не можете найти элементы, заключается в том, что они находятся в "iframe".Вы должны сначала переключиться на контекст iframe, а затем нажать.Вот рабочий пример:

    ChromeOptions chromeOptions = new ChromeOptions();

    ChromeDriver driver = new ChromeDriver(chromeOptions);

    driver.get("https://www.binance.com/de/trade/pro/XRP_BTC");

    WebDriverWait wait = new WebDriverWait(driver, 10);

    wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@class='sc-1t2bpae-5 bEXbyP' and contains(text(),'TradingView')]"))).click();
    wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@class='sc-1t2bpae-5 bEXbyP' and contains(text(),'Technical Ind')]"))).click();
    WebElement frameElement = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//iframe[contains(@id, \"tradingview\")]")));
    driver.switchTo().frame(frameElement);
    wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[contains(text(),'Stochastic RSI')]"))).click();

    WebElement element = driver.findElement(By.className("pane-legend-item-value-wrap"));

    driver.quit();
0 голосов
/ 23 мая 2019

Есть ли способ обновить источник страницы или дерево DOM?

снова позвоните get() или используйте navigate().refresh()

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