无法找到使用Webdriver通过ajax生成的表元素

无法找到使用Webdriver通过ajax生成的表元素,ajax,selenium,xpath,webdriver,testng,Ajax,Selenium,Xpath,Webdriver,Testng,我是新的Webdriver,我不能让你知道网站名称和凭据,因为这是一个正在进行的项目,我的公司。 我被一个地方卡住了,在那个网站的一个页面上,有一个在运行时通过ajax生成的表,表中的所有数据也在运行时生成,表中有一个元素,xpath为html/body/main/section[2]/div/div/div/div[2]/table/tbody/tr[1]/td[1]/a,但当我试图使用webdriver查找这个元素时,webdriver无法定位元素,我收到一条错误消息 org.openqa.

我是新的Webdriver,我不能让你知道网站名称和凭据,因为这是一个正在进行的项目,我的公司。 我被一个地方卡住了,在那个网站的一个页面上,有一个在运行时通过ajax生成的表,表中的所有数据也在运行时生成,表中有一个元素,xpath为html/body/main/section[2]/div/div/div/div[2]/table/tbody/tr[1]/td[1]/a,但当我试图使用webdriver查找这个元素时,webdriver无法定位元素,我收到一条错误消息

org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"xpath","selector":"html/body/main/section[2]/div/div/div[2]/table/tbody/tr[1]/td[1]/a"}
Command duration or timeout: 50.10 seconds
Capabilities [{platform=XP, acceptSslCerts=true, javascriptEnabled=true, browserName=firefox, rotatable=false, locationContextEnabled=true, version=14.0.1, cssSelectorsEnabled=true, databaseEnabled=true, handlesAlerts=true, browserConnectionEnabled=true, nativeEvents=false, webStorageEnabled=true, applicationCacheEnabled=true, takesScreenshot=true}]
我的代码是

 Assert.assertEquals(FrameWorkBase.driver.findElement(By.xpath("html/body/main/section[2]/div/div/div[2]/table/tbody/tr[1]/td[1]/a")).getText(),24514);
当我在firebug中输入上述xpath时,它正在定位元素,这意味着xpath是正确的

请帮帮我。
谢谢

如果表是由ajax生成的,也许您应该实现某种waitForElement而不是简单的findElement?在我的测试中,我编写了一个等待jQuery准备就绪的方法,它工作得非常好。我怀疑您出现异常的原因是,当您试图查找元素时,该元素根本不存在

你也可以先尝试只获取更高级别的元素,然后再进行更深入的工作。这样,您就可以知道缺少了什么元素,并了解需要什么样的等待。

两件事: 1.尝试对元素进行显式等待,结果是..为元素调用此方法。。阅读

xpath html/body/main/section[2]/div/div/div[2]/table/tbody/tr[1]/td[1]/a看起来有点脆弱,因为它是绝对的。试着找到一个唯一的标识符,一个id对于其中一个元素来说是最好的,然后找到通往元素的路。
我在这个语句之前花了50秒的隐式等待,我认为这足够让元素加载了。是的,应该是这样,但是它仍然不能让你达到你要去的地方。我建议你可以尝试一些东西,也许会让你走得更远。我想这是因为这个表在嵌套的div中,我不能通过webdriver直接访问它,不是吗?
public WebElement waitForElementToBeVisible(WebDriver driver, By by){

    WebDriverWait wait = new WebDriverWait(driver, 30);
    WebElement element = wait.until(ExpectedConditions.elementToBeClickable(by));
    return element;
}