【问题标题】:org.openqa.selenium.TimeoutException: Expected condition failed: waiting for all conditions to be validorg.openqa.selenium.TimeoutException:预期条件失败:等待所有条件有效
【发布时间】:2020-10-30 22:38:45
【问题描述】:

我是硒新手,对硒的了解非常有限。在这里,我面临 Internet Explorer 的间歇性超时问题。我曾尝试增加超时时间,但有时仍会失败。
错误堆栈跟踪:

org.openqa.selenium.TimeoutException:预期条件失败:等待所有条件有效:By.xpath 定位的所有元素的可见性:///table[@class='urMatrixLayout urHtmlTableReset']/ /tr//table//tr//td//div//div/span[contains(text(),'Violations')] && 可点击元素:By.xpath: ///table[ @class='urMatrixLayout urHtmlTableReset']//tr//table//tr//td//div//div/span[contains(text(),'Violations')](用 1000 尝试了 120 秒毫秒间隔) 构建信息:版本:'3.141.59',修订:'e82be7d358',时间:'2018-11-14T08:17:03' 系统信息:主机:'WIN-2PRR06VLDC',ip:'xxx.xxx.xx.xx',os.name:'Windows Server 2019',os.arch:'amd64',os.version:'10.0',java .版本:'1.8.0_241' 驱动程序信息:org.openqa.selenium.ie.InternetExplorerDriver 功能 {browserAttachTimeout: 0, browserName: internet explorer, elementScrollBehavior: 0, enableElementCacheCleanup: true, enablePersistentHover: false, ie.browserCommandLineSwitches: , ie.enableFullPageScreenshot: true, ie.ensureCleanSession: true, ie.fileUploadDialogTimeout: 3000, ie.forceCreateProcessApi: false, ie.forceShellWindowsApi: false, ignoreProtectedModeSettings: true, ignoreZoomSetting: true, initialBrowserUrl: , javascriptEnabled: true, nativeEvents: false, pageLoadStrategy: normal, platform: WINDOWS, platformName: WINDOWS, requireWindowFocus: false, unexpectedAlertBehaviour:dismiss, unhandledPromptBehavior:dismiss ,版本:11}

我已经通过以下方式实现了代码

 public static void clickOnElement(By element, String comment, WebDriver driver) {
    WebDriverWait wait = new WebDriverWait(driver, 120);
    wait.pollingEvery(1000, TimeUnit.MILLISECONDS);
    wait.ignoring(NoSuchElementException.class);
    wait.ignoring(StaleElementReferenceException.class);
    wait.until(ExpectedConditions.and(ExpectedConditions.visibilityOfAllElementsLocatedBy(element),
            ExpectedConditions.elementToBeClickable(element)));
    WebElement context = driver.findElement(element);
    wait.until(new ExpectedCondition<Boolean>() {
    @Override
        public Boolean apply(WebDriver driver) {
            return ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete");
        }
    });
    driver.manage().timeouts().pageLoadTimeout(120,TimeUnit.SECONDS);
    context.click();
    log.info("Clicked on element " + comment);
}

任何帮助将不胜感激。提前致谢!!

HTML树:

 `<table cellspacing="0" cellpadding="0" id="WDCC" ct="ML" lsdata=" 
  {0:'WDCC',7:'LINE'}" class="urMatrixLayout urHtmlTableReset" 
  role="presentation" border="0" style="border-collapse:collapse;">
  <tbody class="urLinStd">
  <tr>
     <td ct="MLC" lsdata="{}" id="WDCE" valign="baseline" align="left" 
  class="urLayoutDefault" style="border-collapse:separate;white- 
  space:normal;"><label ct="L" lsdata=" 
  {1:'WDD1',3:'Business\x20Process',4:true,11:'ENDOFLINE',12:true}" 
  id="WDCF" f="WDD1" class="urL" style="text-align:right;line- 
  height:normal;display:inline-block;min-width:100%;white-space:nowrap;"> 
  <span class="urLblReq">*</span>&nbsp;Business Process:</label></td>
     <td ct="MLC" lsdata="{}" id="WDD0" valign="baseline" align="left" 
  class="urLayoutDefault" style="border-collapse:separate;white- 
  space:normal;">
        <span id="WDD1-r" class="urCoB2Whl ">
           <input id="WDD1" ct="CB" lsdata=" 
  {4:true,7:'WDD2',8:'Basis',10:'Basis'}" lsevents="{Select: 
  [{ResponseData:'delta',ClientAction:'submit'},{}]}" type="text" 
  autocomplete="off" tabindex="0" ti="0" class="urEdf2TxtRadius 
  urEdf2TxtEnbl lsEdf3TxtHlpBtn lsEdfLeftBrdRadius urBorderBox" 
  readonly="" value="Basis" role="combobox" style="width:125px;">
           <div id="WDD1-btn" tabindex="-1" ti="-1" class="lsEdf3HlpBtnStd 
  urBorderBox lsEdf2HlpRadius lsEdf3HlpIcon lsEdf3HlpBtn lsEdf3HlpBtnCoB" 
  role="button" style="display:inline-block;"></div>
        </span>
     </td>
  </tr>
  <tr>
     <td ct="MLC" lsdata="{}" id="WDE1" valign="baseline" align="left" 
  class="urLayoutDefault" style="border-collapse:separate;white- 
  space:normal;"><label ct="L" lsdata=" 
  {1:'WDE4',3:'Functional\x20Area',11:'ENDOFLINE',12:true}" id="WDE2" 
  f="WDE4" class="urL" style="text-align:right;line- 
  height:normal;display:inline-block;min-width:100%;white- 
  space:nowrap;">Functional Area:</label></td>
     <td ct="MLC" lsdata="{}" id="WDE3" valign="baseline" align="left" 
  class="urLayoutDefault" style="border-collapse:separate;white- 
  space:normal;">
        <span id="WDE4-r" class="urCoB2Whl ">
           <input id="WDE4" ct="CB" lsdata="{7:'WDE5',10:'Select'}" 
  lsevents="{Select:[{ResponseData:'delta',ClientAction:'submit'},{}]}" 
  type="text" autocomplete="off" tabindex="0" ti="0" 
  class="urEdf2TxtRadius urEdf2TxtEnbl lsEdf3TxtHlpBtn lsEdfLeftBrdRadius 
  urBorderBox" readonly="" value="Select" role="combobox" 
  style="width:125px;">
           <div id="WDE4-btn" tabindex="-1" ti="-1" class="lsEdf3HlpBtnStd 
  urBorderBox lsEdf2HlpRadius lsEdf3HlpIcon lsEdf3HlpBtn lsEdf3HlpBtnCoB" 
  role="button" style="display:inline-block;"></div>
        </span>
     </td>
  </tr>
  </tbody>
  </table>
  </div></div></td></tr></tbody></table></div></div></td></tr></tbody> 
  </table></div></td></tr></tbody></table></td></tr></tbody></table></div> 
  </td></tr></tbody></table></span></span></td></tr></tbody></table></td> 
  </tr>
  <tr>
  <td ct="MLC" lsdata="{}" id="WDE8" valign="bottom" align="left" 
  class="urLayoutPadless" style="border- 
  collapse:separate;width:100%;height:5px;white-space:normal;">
  <div id="WDEA-r">
     <table cellspacing="0" cellpadding="0" id="WDEA" ct="ML" lsdata=" 
   {0:'WDEA',7:'LINE'}" class="urMatrixLayout urHtmlTableReset" 
   role="presentation" border="0" style="border-collapse:collapse;">
        <tbody class="urLinStd">
           <tr>
              <td></td>
           </tr>
        </tbody>
     </table>
    </div>
    </td>
    </tr>
     <tr>
   <td ct="MLC" lsdata="{}" id="WDEC" valign="bottom" align="left" 
    class="urLayoutPadless" style="border- 
    collapse:separate;width:100%;white-space:normal;">
  <table border="0" cellpadding="0" cellspacing="0" id="WDED" ct="TS" 
  lsdata="{2:'100\x25',3:'Choose\x20Tab',6:true,7:false,8:false}" 
  lsevents="{TabSelect:[{ResponseData:'delta',ClientAction:'submit'}, 
   {}],Scroll:[{ResponseData:'delta',EnqueueCardinality:'single'}, 
  {}],Hotkey:[{ResponseData:'delta',ClientAction:'submit'},{}]}" class="" 
  role="presentation" style="width:100%;" tabindex="-1" ti="-1">
  <tbody>
  <tr>
  <td valign="bottom" class="lsTbsPanelCnt">
     <table cellpadding="0" cellspacing="0" border="0" 
   style="width:100%;">
  <tbody>
  <tr>
  <td class="lsTbsPanelLeftBtns" align="left"><a 
    class="lsTbsPgPrevLeftDisp lsTbsBtnIcon" tabindex="-1" ti="-1" 
  id="WDED-prevLeft" style="visibility:hidden;"></a></td>
  <td class="lsTbsPanel2" width="90%">
     <span itn="ITBB" id="WDED-ITBB" tabindex="0" ti="0" 
  style="position:absolute;top:-1000;height:1;"></span>
     <div id="WDED-panel" class="lsTbsOvfl" role="tablist" aria- 
  controls="" style="float:left;">
     <div ct="TSITM" lsdata="{0:'WDEE',2:true,12:'WDEF'}" id="WDEE" 
  class="lsTbsEndMore2Sel" style="visibility: visible;">
        <span class="lsTbsFirst2Sel"></span>
        <span role="tab" id="WDEE-focus" tabindex="0" ti="0" 
  class="urNoUserSelect lsTbsLabel2Sel">
           User Access
           <div class="lsTbsTitleAlign" aria-hidden="true" 
   role="presentation">User Access-</div>
        </span>
     </div>
     <div ct="TSITM" lsdata="{0:'WD01B0',1:1,2:true,12:'WD01B1'}" 
   id="WD01B0" class="lsTbsEndMore2" style="visibility: visible;">
     <span class="lsTbsStartEnd2Sel"></span>
     <span role="tab" id="WD01B0-focus" tabindex="0" ti="0" 
   class="urNoUserSelect lsTbsLabel2">
        Violations
        <div class="lsTbsTitleAlign" aria-hidden="true" 
    role="presentation">Violations-</div>
     </span>`

Xpath : /*//table[@class='urMatrixLayout urHtmlTableReset']//tr//table//tr//td//div//div/span[contains(text(),'Violations') ]

【问题讨论】:

  • wait.until(...) - 等到条件有效或时间到期。如果时间到期,它会抛出TimeoutExceptionnew WebDriverWait(driver, 120); - 超时时间为 120 秒。

标签: java selenium xpath


【解决方案1】:

似乎问题出在此代码wait.until(ExpectedConditions.and(ExpectedConditions.visibilityOfAllElementsLocatedBy(element),ExpectedConditions.elementToBeClickable(element)));

两个条件没有同时得到满额,在达到阈值时间限制后,它会抛出超时异常。

解决方案:

拆分 and 条件以确定导致问题的方法:

wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(element));
wait.until(ExpectedConditions.elementToBeClickable(element));

另一件事是尝试在您的方法中将visibilityOfAllElementsLocatedBy 替换为visibilityOf(element)visibilityOfElementLocated(locator)

wait.until(ExpectedConditions.visibilityOfElementLocated(element));

visibilityOfAllElementsLocatedBy 等到页面上的所有元素 都可见,并且您定位的所有元素可能同时在页面上不可见。此方法用于多元素。

【讨论】:

  • 感谢 Narendra,您的回答帮助我更多地了解这些 API。不过,根据您的建议进行重构后,我仍面临同样的问题。 rg.openqa.selenium.TimeoutException:预期条件失败:等待 By.xpath 定位的元素的可见性:/*//table[@class='urMatrixLayout urHtmlTableReset']//tr//table//tr//td/ /div//div/span[contains(text(),'Violations')](尝试 120 秒,间隔 1000 毫秒)。请在问题中检查我的 Xpath 和 html 树。是不是我提供了错误的路径?
  • @kush,我在您共享的 HTML 树中找不到与您的 xpath 匹配的元素。你是怎么找到这个 xpath 的?让它更具相对性。使用此 xpath //div[@class='lsTbsEndMore2']/span[contains(.,'Violations')] 并告诉我。
【解决方案2】:
  1. /*//table 开始xpath 与从//table 开始相同
  2. 您的 xpath 不正确。如果您查看您的 html,您会看到两个具有 urMatrixLayout urHtmlTableReset 类的表不包含提到的文本
  3. 两个条件检查及时同步,所以此时一切正常
  4. 您可以使用以下路径测试您的代码://div[@id='WDED-panel']//span[contains(text(), 'Violations')]

【讨论】:

    猜你喜欢
    • 2019-08-03
    • 2017-10-17
    • 2019-11-25
    • 2016-05-07
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    相关资源
    最近更新 更多