如何在selenium webdriver中的同一页面上加载新数据后找到页面元素

时间:2014-08-26 06:51:59

标签: java selenium

我正在尝试复制html页面的表格数据,该页面是在点击“获取表格”后加载到同一页面上的。上一页的按钮。但是,由于页面网址没有改变,我得到的例外是“没有这样的元素'当试图在新加载的页面上找到新元素时。以下是我尝试的代码:

 package com.test.selenium;

 import java.util.List;

 import org.junit.runner.RunWith;
 import org.junit.runners.Suite;
 import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.WebElement;
 import org.openqa.selenium.chrome.ChromeDriver;
 import org.openqa.selenium.firefox.FirefoxDriver;
 import org.openqa.selenium.support.ui.ExpectedConditions;
 import org.openqa.selenium.support.ui.Select;
 import org.openqa.selenium.support.ui.WebDriverWait;

 import junit.framework.Test;
 import junit.framework.TestSuite;

 public class Example1{

    public static void main(String[] args) {

    System.setProperty("webdriver.chrome.driver", "D:\\Java Stuff\\Selenium Tutorial\\chromedriver.exe");
    WebDriver driver = new ChromeDriver();
    driver.get("http://www.oanda.com/currency/table");

    WebElement date = driver.findElement(By.name("date"));
    date.sendKeys("12/04/10");

    WebElement date_frmt = driver.findElement(By.name("date_fmt"));
    date_frmt.sendKeys("yy/mm/dd");

    WebElement curr = driver.findElement(By.name("exch"));
    curr.sendKeys("US Dollar.USD");

    Select sel = new Select(driver.findElement(By.name("Currency")));
    sel.deselectAll();
    List lsize = sel.getOptions();
    int count = lsize.size();

    for(int j=0;j<count;j++)
    {
        String lvalue = sel.getOptions().get(j).getText();
        sel.selectByVisibleText(lvalue);
    }

    WebElement crr = driver.findElement(By.name("dest"));
    crr.click();


    driver.getCurrentUrl();

    String table = driver.findElement(By.id("converter_table")).getText();
    System.out.println(table);


}
}

2 个答案:

答案 0 :(得分:1)

根据异常,似乎元素不存在于页面上,或者你的xpath错误。你为什么用xpath?!尝试css选择器(它们更强大和稳定)=)例如。

driver.findElement(By.css("#converter_table"));

P.S。如果你想验证你的选择器是否正确(无论是xpath还是css),请在浏览器中使用dev控制台(例如,在控制台中输入$(&#34;#converter_table&#34;),如果元素存在(并且这个id)名称中没有类型)然后您将看到此选择器将返回的内容))。对于xpath,请使用$ x(&#34; xpath&#34;)

<强>更新 我认为简单的解决方案是添加一些等待元素的方法,一段时间。下面是C#中的示例代码(使用wait方法测试)

        private IWebDriver driver;
        [SetUp]
        public void SetUp()
        {
            // Here i just create browser as you (firefox, chrome etc);
            driver = CreateBrowser("http://www.oanda.com/currency/table");
        }

        [TearDown]
        public void TearDown()
        {
            driver.Dispose();
        }

        [Test]
        public void PortTest()
        {
            var dateElement = driver.FindElement(By.Name("date"));
            dateElement.SendKeys("12/04/10");

            var dateFrmt = driver.FindElement(By.Name("date_fmt"));
            dateFrmt.SendKeys("yy/mm/dd");

            var curr = driver.FindElement(By.Name("exch"));
            curr.SendKeys("US Dollar.USD");

            var crr = driver.FindElement(By.Name("dest"));
            crr.Click();
            WaitUntilLoad();
            var table = driver.FindElement(By.Id("converter_table"));
            Console.Write("the text is " + table.Text);
        }

        public void WaitUntilLoad()
        {
            int repetitionCount = 0;
            bool isLoaded = false;
            while (!isLoaded)
            {
                var table = driver.FindElements(By.Id("converter_table")).Count;
                if (table > 0 )
                    isLoaded = true;
                Thread.Sleep(250);
                repetitionCount++;
                Console.WriteLine("Searching again for element");
                if (repetitionCount > 25) break;
            }
        }

答案 1 :(得分:0)

你得到NoSuchElement,因为你的xpath似乎错了

WebElement myDynamicElement = (new WebDriverWait(driver, 10)) .until(ExpectedConditions.presenceOfElementLocated(By.xpath(".//*[@id='content_section']/table")));

String table = driver.findElement(By.xpath(".//*[@id='content_section']/table")).getText();