首页 文章

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

提问于
浏览
2

环境: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)

<div id =“win0divDERIVED_REGFRM1_LINK_ADD_ENRL $ 118 $”<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();

什么是正确的解决方案?

5 回答

  • 0

    当Webdriver正在搜索它时,它是 possible the page object has not loaded . 尝试找到失败的步骤,并在它之前放置一个隐式等待/睡眠 .

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

    • 确定测试失败的步骤 .

    • 在步骤前放置等待/睡眠,即...... 20秒(方式绰绰有余) .

    • 再次执行测试 .

    • 如果测试现在通过,则Webdriver在完全加载之前搜索页面对象 .

  • 1

    尝试使用CSS

    WebElement element = new WebDriverWait(driver,30).until(ExpectedConditions.elementToBeClickable(By.cssSelector("a[id*='DERIVED_REGFRM1_LINK_ADD_ENRL'][class='SSSBUTTON_CONFIRMLINK']")));
    
  • 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);
      }
    }
    
  • 2

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

    虽然这是 not the best approach ,但另一种可能的解决方案是尝试使用SeleniumIDE手动记录单击该按钮的脚本 .

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

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

相关问题