如何刷新Selenium中的DOM树,以便显示新生成的元素?

时间:2019-05-23 08:33:18

标签: java selenium selenium-webdriver dom selenium-chromedriver

我想获取一个DOM元素,该元素在页面加载时不存在,但随后使用脚本添加。确切的情况如下:

  1. 我加载了https://www.binance.com/de/trade/pro/XRP_BTC
  2. 我点击“ TradingView”按钮
  3. 我在“技术指标”按钮上选择“随机RSI”。

(所有这些步骤都由驱动程序本身使用click()或机器人通过按键和鼠标操作来处理)

选择了随机RSI后,无需添加页面刷新即可添加新的DOM元素。我正在寻找具有类名<span>的{​​{1}}元素,这些元素是在添加“随机RSI”后生成的。

致电"pane-legend-item-value-wrap"给我0个结果。我认为那是由于驱动程序页面源仍然是第一次立即加载页面后的源。有没有一种方法可以刷新页面源或DOM树而无需重新加载整个页面

我尝试了隐式和显式等待,但仍未成功,并出现以下错误:

  

线程“主”中的异常org.openqa.selenium.TimeoutException:预期条件失败:等待By.className所定位的任何元素的存在:方格-传奇-物品-价值-换行(尝试15秒)间隔为500毫秒)

这是相关代码:

driver.findElements(By.className("pane-legend-item-value-wrap"))
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();
        }

    }
}

2 个答案:

答案 0 :(得分:1)

找不到元素的原因是因为它们位于“ 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();

答案 1 :(得分:-1)

  

是否可以刷新该页面源或DOM树?

再次致电get(),或使用navigate().refresh()