Я хочу получить элемент DOM, который не существует при загрузке страницы, но добавляется впоследствии с помощью скрипта.Точный сценарий выглядит следующим образом:
- Я загружаю https://www.binance.com/de/trade/pro/XRP_BTC
- Я нажимаю кнопку «TradingView»
- Я выбираю «Стохастический 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);
}
}