【问题标题】:Selenium Webdriver: IE can't find radio buttons nor checkboxes for using click() on themSelenium Webdriver:IE 找不到单选按钮或复选框以在其上使用 click()
【发布时间】:2015-01-23 21:51:13
【问题描述】:

我正在为基本注册页面构建一个测试套件(它有大量的文本字段 + 一些单选按钮和复选框)。我正在使用 Selenium Webdriver 解决方案,并且测试是用 Java 编写的。虽然测试在 Firefox 和 Chrome 上运行良好,但 Internet Explorer 在单击单选按钮或复选框时往往会遇到问题。所有单选按钮和复选框都定义了 id-s,据我所知,这是在页面上查找元素的最方便的方法,所以当我开始遇到这些问题时,我感到非常惊讶。查找单选按钮的方法如下所示:

public static WebElement rad_Male(WebDriver driver) {
    element = driver.findElement(By.id("male"));
    return element;
}

点击是通过以下方式完成的:

rad_Male(driver).click();

正如我所说,Firefox 和 Chrome 可以轻松单击复选框和单选按钮,但是在 IE 中运行测试时出现以下异常(该元素始终可见,我可以用鼠标单击它):

org.openqa.selenium.ElementNotVisibleException: 无法点击元素

我也尝试过使用显式等待来让元素在访问之前加载,但没有运气 - 一旦函数超时,我就会得到 TimeoutException。我怀疑它与页面设计有关,但不幸的是我无法访问页面源代码,因此我无法更改页面结构以使其更易于测试。 单选按钮放置在许多其他 div 中,我认为还有一个表格用于对齐这个和其他元素,但这看起来并不太复杂。这是单选按钮的代码:

<input type="radio" value="M" name="sex" id="male" tabindex="110">

我想我在一个类似的主题中看到了一些 javascript 点击建议,但在诉诸于此之前,我想确保没有其他方法可以使用 Webdriver 提供的方式使其工作。 我刚刚开始学习 Selenium,我试图在旅途中完成我的工作,同时一直在学习新东西,所以我对这方面的经验还不是很丰富。 如果您想了解更多详细信息,请询问,因为我不确定我是否已经全部包含在内。 提前致谢!

【问题讨论】:

  • 不确定是否有帮助,但 IE 可以访问下拉菜单并从中选择项目。
  • 您是否使用开发者工具在 IE 下检查过此页面的这些元素?在这个页面上按 F12,它会带来一个工具窗口(类似于 Firefox 上的 FireBug),然后检查 Web 结构。可能是这些元素在 IE 下的渲染方式不同,并且没有分配给它们的 id,或者这些 id 与 Firefox/Chrome 上的不同?
  • 您好,感谢您的回答!我刚刚注意到上面帖子中单选按钮的 html 代码不可见,所以我做了一些调整,您现在应该在原始帖子中看到它。我在 IE 和 Firefox 上检查了代码,两个浏览器之间的唯一区别是属性的顺序(这是 IE 中的样子):
  • 请同时发布此元素的父级(外部 html)的 html 代码 - 甚至可能是祖父级(2 或 3 级以上)。在某些事件(例如 onmouseover 等)上触发的任何父项中是否有任何 javascript 代码?

标签: java html internet-explorer webdriver


【解决方案1】:

在单击元素之前尝试使用它,也许 IE 有点慢:

 WebDriverWait wait = new WebDriverWait(driver, 5);
 wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(anId)));

【讨论】:

  • 我尝试了您的解决方案 - 它导致等待超时。还有另一个有趣的细节——我在 Firefox 和 Chrome 中也得到了相同的结果。这意味着这些元素永远不会以可以被 wait.until 条件检测到的方式“可见”(尽管可以在页面上清楚地看到它们)。尽管如此,Firefox 和 Chrome 还是设法检索到它们,而 IE 却没有。我想我们可以把这个话题缩小到如何在 IE 中检索到这样的“隐藏”元素......谢谢你的贡献!
  • 你也可以试试 elementToBeClickable 代替 visibilityOfElement
  • 对不起,已经尝试过了,但它以同样的方式超时。
【解决方案2】:

根据您收到的错误,我认为 selenium 正在尝试单击元素,即单选按钮,该元素可能尚不可见。

要解决此问题,请尝试在 rad_Male 方法中添加显式等待,如下所示(假设“元素”是“WebElement 类”的引用):

    public static WebElement rad_Male(WebDriver driver) {
        //waiting 30 seconds for the element to be visible
        element = new WebDriverWait(driver, 30).until(ExpectedConditions.visibilityOfElementLocated(By.id("male")));
        return element;
    }

然后,用它像这样点击按钮:

    element = rad_Male(driver); //Fetching the value returned by rad_Male method
    if(element!= null)
        element.click();
    else
        System.out.println("Element is not visible");

【讨论】:

  • 您好,感谢您的贡献!我已经尝试过使用显式等待,正如arisalexis 在之前的评论中所建议的那样。这会导致等待函数超时。但是,我喜欢您用来查看的检查,如果元素存在,我想我会将它添加到我的代码中,这样如果 Selenium 无法检索元素,我可以将测试值设置为“失败”。
【解决方案3】:

再次嗨,感谢所有回复的人!我的一个朋友看过这个问题,并设法弄清楚是什么原因造成的。单选按钮实际上以下列方式包含在另一个 div 中:

<div class="radio" id="uniform-male">
    <span>
        <input type="radio" value="M" name="sex" id="male" tabindex="110">
    </span>
</div>

看起来这个父 div“uniform-male”隐藏了这个按钮,因为 Selenium 能够点击这个 div,结果,它下面的单选按钮被点击了。 我想我应该第一手发布单选按钮的代码以及它的父元素的一些代码,因此调试它会更容易。

再次感谢您在这个问题上提供的所有帮助,谢谢!

【讨论】:

  • 我的 IEDriverServer 更新到 2.45 后也遇到了这个问题。你介意我问一下你用的是什么选择器吗?
  • 我现在手头没有我的代码,但我很确定我调用了 findElement(By.id("uniform-male")) 并单击它。我希望它对你有用......
  • 这对我有用但是你如何获得复选框的状态(即确定它是否被选中?)
  • 在当前情况下,我没有进行任何状态检查,但我认为以下讨论可能会对您有所帮助:stackoverflow.com/questions/8187772/…
  • 谢谢....该链接适用于未包含在 div 中的复选框...当复选框包含在 div 中时会出现问题。由于您用于单击复选框的选择器实际上并不是复选框本身(它是包装 div),因此无法使用相同的选择器获取复选框状态
猜你喜欢
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 2021-05-20
  • 2017-06-03
  • 2015-09-20
  • 1970-01-01
相关资源
最近更新 更多