Selenium:即使在应用 Wait 后表单也不可见

Posted

技术标签:

【中文标题】Selenium:即使在应用 Wait 后表单也不可见【英文标题】:Selenium: Form is not visible even after Wait is applied 【发布时间】:2019-06-26 07:10:27 【问题描述】:

我正在使用具有局部视图的 MVC 应用程序练习 Selenium。

当页面被渲染时,我看到显示的表单:

 <form action="/MyScreen/SaveData?Length=20" data-ajax="true" data-ajax-complete="handleComplete" data-ajax-failure="CheckError" data-ajax-loading="#loader" data-ajax-method="POST" data-ajax-mode="replace" data-ajax-update="#partialPlaceHolder" id="TicketDetailForm" method="post" novalidate="novalidate">

    <div id="partialPlaceHolder" style="width:100%;">

       <div id="Ticket-Details"></div>

    </div>

</form>

这个表单有一个我需要点击的按钮。

我正在使用 Wait 来确保在单击按钮之前显示表单:

WebDriverWait wait = new WebDriverWait(driver, 20); 
WebElement ticketForm = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("TicketDetailForm")));

boolean isForm = ticketForm.isDisplayed();

执行上述代码时,出现以下错误:

预期条件失败:等待定位元素的可见性 by By.id: TicketDetailForm。

我修改了代码以逐步获取元素,并且能够找到呈现 Button 的表单和占位符。

我正在使用 Wait 来定位表单的内容:

List<WebElement> forms = renderBody.findElements(By.tagName("form"));
WebElement placeHolder = forms.get(0).findElement(By.xpath("//div[@id='partialPlaceHolder']"));

WebElement ticketDetail = placeHolder.findElement(By.xpath("//div[@id='Ticket_Details']"));

我找不到 ticketDetail `WebElement

那可能是什么?

【问题讨论】:

【参考方案1】:

您可以通过检查其元素列表大小来检查表单部分视图是否显示,然后在列表大小> 0时单击要单击的按钮 例如:

boolean partialViewDisplayed = false;
List<WebElement> partialViewElement= driver.findElements(By.id("Ticket-Details"));
while(!partialViewDisplayed)
    if(partialViewElement.size()>0)
        //Mark the boolean partialViewDisplayed true
        partialViewDisplayed = true;
    

//Perform the further operations from here

【讨论】:

当我使用tagName 作为定位器时,我能够看到表单,但是,表单内部还有其他内容来自未使用Wait 呈现的局部视图。我相应地更新了代码 你能分享一下你需要检查它是否显示的内容的div结构吗?但是,我使用的逻辑也可以应用于此,您只需将表单的 xpath/id 替换为您需要检查其是否显示的内容。 所以只是为了确认,你需要等到&lt;div id="Ticket-Details"&gt;&lt;/div&gt;被显示出来? 我已经编辑了我的答案。请立即检查并告诉我它是否有效 isDisplayed 永远不会更改为 true

以上是关于Selenium:即使在应用 Wait 后表单也不可见的主要内容,如果未能解决你的问题,请参考以下文章

即使在运行迁移后,Django Programming 错误列也不存在

即使在使用 view.setNeedsDisplay() 刷新视图后,.isHidden 属性也不反映对视图的更改

地理定位即使在设备上也不起作用

即使在 selenium ruby​​ 脚本完成后如何让浏览器保持打开状态

selenium.wait()、selenium.wait(2000) 和 Thread.sleep(2000) 有啥区别? [复制]

Unity:即使在播放器设置中未选中 x86 后,此版本也不符合 Google Play 64 位要求错误