Selenium Webdriver自动化-无法使用xpath查找元素

Selenium Webdriver自动化-无法使用xpath查找元素,selenium,xpath,selenium-webdriver,junit4,browser-automation,Selenium,Xpath,Selenium Webdriver,Junit4,Browser Automation,环境: Eclipse-Java-Junit-firefoxwebdriver 屏幕截图url: 我试图测试一个网页,但找不到元素(看起来像一个按钮)。 Firebug xpath是://*[@id='DERIVED\u REGFRM1\u LINK\u ADD\u ENRL$118$”] 使用相同的Xpath,它可以正确地与selenium IDE一起工作(通过记录) 它的html代码是: <td valign="top" align="left"> <div id=

环境: Eclipse-Java-Junit-firefoxwebdriver

屏幕截图url:

我试图测试一个网页,但找不到元素(看起来像一个按钮)。 Firebug xpath是:
//*[@id='DERIVED\u REGFRM1\u LINK\u ADD\u ENRL$118$”]


使用相同的Xpath,它可以正确地与selenium IDE一起工作(通过记录)

它的html代码是:

<td valign="top" align="left">
    <div id="win0divDERIVED_REGFRM1_LINK_ADD_ENRL$118$">
        <span class="SSSBUTTON_CONFIRMLINK" title="Enroll in Classes">
            <a id="DERIVED_REGFRM1_LINK_ADD_ENRL$118$" class="SSSBUTTON_CONFIRMLINK" 
            href="javascript:submitAction_win0(document.win0,
    'DERIVED_REGFRM1_LINK_ADD_ENRL$118$');" 
    tabindex="192" ptlinktgt="pt_peoplecode" 
    name="DERIVED_REGFRM1_LINK_ADD_ENRL$118$">Proceed to Step 2 of 3</a>
        </span>
    </div>
</td>

我已经通过.xpath、id等尝试了我的查找。 例如:
driver.findelelement(By.xpath(“/*[@id='DERIVED\u REGFRM1\u LINK\u ADD\u ENRL$118$”))。单击()


正确的解决方案是什么?

我认为可能是因为您试图查找的元素在驱动程序搜索它时不在页面上。解决方案之一是定义pageLoadTimeout。您可以使用以下代码行执行此操作:

driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS); 
如果页面加载时间较长,则应增加时间。 我用来确保驱动程序在页面加载时等待的第二件事(特别是当某些脚本动态加载内容时)是自定义waitForPageLoaded函数,它应该在webdriver打开特定页面或单击执行页面打开操作的按钮/链接后调用

函数示例:

public void waitForPageLoaded(WebDriver driver) {

 ExpectedCondition<Boolean> expectation = new ExpectedCondition<Boolean>() {
    public Boolean apply(WebDriver driver) {
      return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete");
    }
  };

 Wait<WebDriver> wait = new WebDriverWait(driver,30);
  try {
          wait.until(expectation);
  } catch(Throwable error) {
          assertFalse("Timeout waiting for Page Load Request to complete.",true);
  }
}
public void waitForPageLoaded(WebDriver驱动程序){
ExpectedCondition expectation=新的ExpectedCondition(){
公共布尔应用(WebDriver驱动程序){
return((JavascriptExecutor)driver.executeScript(“return document.readyState”).equals(“complete”);
}
};
Wait Wait=newwebdriverwait(驱动程序,30);
试一试{
等待,直到(期望);
}捕获(可丢弃错误){
assertFalse(“等待页面加载请求完成的超时”,true);
}
}
尝试使用CSS

WebElement element = new WebDriverWait(driver,30).until(ExpectedConditions.elementToBeClickable(By.cssSelector("a[id*='DERIVED_REGFRM1_LINK_ADD_ENRL'][class='SSSBUTTON_CONFIRMLINK']")));

在Webdriver搜索页面对象时,页面对象可能尚未加载。尝试定位失败的步骤,并在其前面放置一个隐式等待/睡眠

如果Webdriver能够在您知道页面加载问题后找到页面对象

  • 确定测试失败的步骤
  • 在步骤之前等待/睡眠,即。。。20秒(远远不够)
  • 再次执行测试
  • 如果测试现在通过,Webdriver会在页面对象完全加载之前搜索它

  • 您好,谢谢您的帮助,但我已经使用了60秒thread.sleep,也使用了您的方式,但它不起作用。我试图找到该页面上的5-6个元素,但它也不工作…我需要它在紧急情况下完成。错误:无法定位元素

    尽管这不是最好的方法,但另一种可能的解决方案是尝试使用硒脲手动记录点击该按钮的脚本

    如果您能够在播放时单击该按钮,只需复制文本块并将其实现到webdriver脚本中。鉴于它们完全相同,您的问题应该得到解决

    #

    driver1.find_element_by_id("ContentPlaceHolder1_txtLifeAssuredName").send_keys("62221889")
            driver1.find_element_by_id("ContentPlaceHolder1_txtLifeAssuredName").clear()
            driver1.find_element_by_id("ContentPlaceHolder1_txtLifeAssuredName").send_keys("Bob Tan")
    
    复制给定错误中的xpath,并在您正在测试的web门户的inspect元素上找到它,如果找到该元素,则从inspect元素字段复制该特定元素路径,并将其粘贴到您正在使用的特定step-on工具上。如;卡塔隆、塞莱纳姆等


    这是公共页面吗?如果是的话,请你指一下好吗?请将错误(stacktrace)添加到您的问题中好吗?可能是selenium试图在元素出现在页面上之前查找该元素。您是否尝试添加等待?我对使用id有一些疑问。您是否确定id始终相同且不会动态更改(例如,与ExtJS应用程序类似)?使用相同的Xpath时,它可以正确地与selenium IDE一起工作(通过录制)@Ittiel:这是一个私人页面,堆栈跟踪显示元素未找到错误。@Evgeniy:我使用了thread.sleep(20000),但它仍然不工作。嗨,谢谢你的帮助,但我已经使用了60秒thread.sleep,也使用了你的方式,但它不工作。我试图找到该页面上的5-6个元素,但它也不工作…我需要它在紧急情况下完成。错误:无法找到elementHi,感谢您的帮助,但我已经使用了60秒thread.sleep,也使用了您的方式,但它不起作用。我试图找到该页面上的5-6个元素,但它也不工作…我需要它在紧急情况下完成。错误:找不到元素该元素是否在iframe中?在这种情况下,您需要在找到框架之前切换到该框架。虽然我找到了框架关键字,但在它的html页面中找不到任何关键字iframe。如果该框架有名称,请使用以下代码切换到它WebDriverWait waitForFrame=new WebDriverWait(driver,30)。直到(ExpectedConditions.frametobeavailable和switchtoit(“框架名称”)); 否则,使用Driver.switchTo().frame(elem)查找框架,就像使用任何可用选择器和开关的任何其他元素一样;如果页面是动态构造的,您可能仍然需要使用这样的等待。这与页面加载等待不同。嗨,谢谢你的帮助,但我已经使用了60秒thread.sleep,也使用了你的方式,但它不起作用。我试图找到该页面上的5-6个元素,但它也不工作…我需要它在紧急情况下完成。错误:找不到元素这看起来不像是支持者的答案。请添加适当的解释和格式以便于阅读。