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

时间:2014-01-04 19:48:02

标签: selenium xpath selenium-webdriver junit4 browser-automation

环境: Eclipse - Java - Junit - firefox webdriver

屏幕截图网址:https://www.dropbox.com/s/26fl2l1y1mkpxiz/Screenshot%202014-01-06%2001.52.43.png

我正在尝试测试网页但无法找到元素(看起来像一个按钮)。 Firebug xpath是:.//*[@id='DERIVED_REGFRM1_LINK_ADD_ENRL$118$']

使用相同的Xpath,它可以正常使用selenium IDE(通过录制)。

它的HTML代码是:

< td valign="top" align="left" (bracket)

&LT; div id =“win0divDERIVED_REGFRM1_LINK_ADD_ENRL $ 118 $” &LT; span class =“SSSBUTTON_CONFIRMLINK”title =“注册类”(括号)

 <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>

我已经尝试过我的发现By.xpath,id等。 例如:driver.findElement(By.xpath("//*[@id='DERIVED_REGFRM1_LINK_ADD_ENRL$118$'] ")).click();

什么是正确的解决方案?

6 个答案:

答案 0 :(得分:2)

尝试使用CSS

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

答案 1 :(得分:1)

Webdriver正在搜索它时,页面对象未加载。尝试找到失败的步骤,并在它之前放置一个隐式等待/睡眠。

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

  1. 确定测试失败的步骤。
  2. 在步骤前放置等待/睡眠,即...... 20秒(方式绰绰有余)。
  3. 再次执行测试。
  4. 如果测试现在通过,Webdriver会在完全加载之前搜索页面对象。

答案 2 :(得分:0)

我认为这可能是因为您尝试查找的元素在驱动程序搜索时不会出现在页面上。解决方案之一是定义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);
  }
}

答案 3 :(得分:0)

  

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

虽然不是最佳方法,但另一种可能的解决方案是尝试使用SeleniumIDE手动记录单击该按钮的脚本。

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

答案 4 :(得分:0)

从给出的错误中复制 xpath ,并在要测试的Web门户的inspect元素上找到它,如果找到该元素,则从inspect复制该特定元素路径元素字段并将其粘贴到正在使用的工具的特定步骤上。例如;刀,硒等。

enter image description here

答案 5 :(得分:-1)

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")