【问题标题】:Selenium Webdriver unable to get elements in ModalSelenium Webdriver 无法获取 Modal 中的元素
【发布时间】:2017-03-19 03:16:49
【问题描述】:

我正在编写一个 Selenium Webdriver 脚本,它应该点击一个链接,然后弹出这个模态窗口。

当我尝试访问卡号字段 (//input[@id=pan]) 时,我得到 No such element found exception org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"id","selector":"pan"}

这是我没有运气尝试过的代码:

WebElement modal = driver.findElement(By.xpath("//div[@class='ute-pay-now-modalContent']"));
driver.switchTo().frame(modal);
WebElement el =  driver.findElement(By.xpath("//input[@id='pan']"));

也试过这个:

WebElement modal = driver.findElement(By.className("ute-pay-now-modalContent"));
driver.switchTo().frame(modal);
WebElement el =  driver.findElement(By.xpath("//input[@id='pan']"));

也试过这个:

WebDriverWait block = new WebDriverWait(driver,10);
WebElement modal = block.until(ExpectedConditions.visibilityOfElementLocated(By.className("ute-pay-now-modalContent")));
WebElement pan;
pan    = modal.findElement(By.id("pan"));

也试过这个:

driver.switchTo().defaultContent();

也试过这个:

driver.switchTo().activeElement();

有人可以帮我建议如何解决这个问题吗?

【问题讨论】:

  • 您已经定义了modal 变量,但试图切换到model ("modEl" != "modAl")。还要注意divute-pay-now-modalContent 类名不是iframe,所以你不应该使用switchTo().frame()。如果可能,分享页面URL
  • @Andersson:我已经纠正了错字。如果我不能使用 Frame 因为它是 Modal,那么我如何从 Modal 获取输入字段?我还没有运气。这是一个非常常见的场景,Selenium 可能已经以某种我无法找到的方式处理。
  • 你能分享页面URL吗?
  • @Andersson:不知道这会有什么帮助,因为我正在谈论的页面是安全的并且需要登录(无法共享我的凭据)。但是给你:rogers.com/web/totes/#/signin
  • modal = block.until(ExpectedConditions.visibilityOfElementLocated(By.className("ute-pay-now-modalContent"))); modal.findElement(By.id("pan"));共享异常

标签: selenium selenium-webdriver modal-dialog


【解决方案1】:

似乎<div class="ute-pay-‌​now-modalContent"> 包含iframe#sema 和必需的input 字段。试试下面的代码,让我知道结果:

WebDriverWait block = new WebDriverWait(driver,10);
block.until(ExpectedConditions.visibilityOfElementLocated(By.className("ute-pay-now-modalContent")));
driver.switchTo().frame("sema");
WebElement pan;
pan = modal.findElement(By.id("pan"));

【讨论】:

  • 有趣。这似乎在让我获得“pan”元素!您如何了解“sema”框架?因为我对同一模态上的其他元素遇到了同样的问题。是否需要在获取每个元素之前切换框架,或者我应该能够在一次切换后获取 Modal 中的所有元素。
  • 您可以检查input<iframe id="sema"> 的后代。这是嵌入的HTML 文档。要处理iframe 中的元素,您必须先切换到它。如果在处理完input 之后您需要处理iframe 之外的其他元素,您应该切换回主文档driver.switchTo().defaultContent();
  • 啊,太好了!学到了一些新东西。谢谢@Anderson
  • [Obsolete(".NET 绑定中的 ExpectedConditions 实现已弃用,将在未来版本中删除。这部分代码已迁移到 GitHub 上的 DotNetSeleniumExtras 存储库 (github.com/DotNetSeleniumTools/…ExpectedConditions .NET 绑定中的实现已弃用,将在未来版本中删除。这部分代码已迁移到 GitHub 上的 DotNetSeleniumExtras 存储库 (github.com/DotNetSeleniumTools/DotNetSeleniumExtras)")]
  • 因为 ExpectedConditions 被标记为过时并且它正在被移动到另一个库,所以我不得不找到另一个长期解决方案。我没有尝试访问模式,而是简单地使用 Driver.Navigate.GoToUrl(...) 直接导航到内容。使用 Driver.Navigate.Back() 让我回到了之前的内容;但是,可能需要执行多次回拨。
猜你喜欢
  • 2021-07-04
  • 2016-06-19
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 2016-12-10
相关资源
最近更新 更多