JAVA Selenium WebElement 覆盖 click() 方法

Posted

技术标签:

【中文标题】JAVA Selenium WebElement 覆盖 click() 方法【英文标题】:JAVA Selenium WebElement overriding click() method 【发布时间】:2018-02-07 18:58:50 【问题描述】:

override WebElement click() 添加一些 wait 功能是否是一种好习惯,因为在某些页面中我需要单击按钮,而在某些情况下按钮尚未加载,所以我添加了等待以检查元素是否可见。

所以我的问题是: 是创建abstract class 来实现 WebElement 并覆盖 click() 方法以添加一些等待功能更好,还是仅在特定情况下进行简单等待更好页面?

【问题讨论】:

添加带有超时的等待总是好的。您需要它们来使您的测试跨平台更加可靠。 在某些页面中,如果按钮没有完全加载,那么您应该在点击按钮之前提供explicit wait 【参考方案1】:

根据文档Document Object Model (DOM) Level 2 html Specificationclick() 方法不接受任何参数,不返回任何值并且不报告任何例外

所以,很明显我们一开始就不能覆盖click() 方法。

但是您始终可以编写自定义用户函数来单击WebElement 以及某些类型的等待。在这些情况下,Selenium 的内置 Explicit Wait 即 WebDriverWait 可以帮助我们。


显式等待

根据documentation,ExplicitWait 是您为WebDriver 实例定义、配置和实现的代码块,以等待满足特定条件,然后再继续执行下一行代码。有一些方法可以帮助我们实现 ExplicitWait,它只会在需要的时候等待。 WebDriverWait 结合 ExpectedConditionExplicitWait 可以实现的方式之一。

您可以在 discussion 中找到关于 ExplicitWait 的详细讨论。

【讨论】:

【参考方案2】:

我认为您无法做到这一点,因为 WebElement 是一个接口而不是一个类(或抽象类)。

但是,如果您愿意,您可以实现自己的点击方法,等待然后点击。

public void waitAndClick(By identifer)
    WebDriverWait wait = new WebDriverWait(driver, 30);
    WebElement elem = wait.until(ExpectedConditions.presenceOfElementLocated(identifer));
    elem.click();

【讨论】:

【参考方案3】:

这不是正确的做法,等待可能出现的问题

1- 对于每个点击事件,它都会等待一段时间。

2- 无论您给出的等待时间如何,都可能在页面完全加载之前结束(它适用于某些页面,而其他页面则失败)

相反,您首先找到该元素并继续执行,请参阅以下问题了解更多详细信息

WebDriver: check if an element exists?

Selenium WebDriver - Test if element is present

【讨论】:

以上是关于JAVA Selenium WebElement 覆盖 click() 方法的主要内容,如果未能解决你的问题,请参考以下文章

JAVA Selenium WebElement 覆盖 click() 方法

如何在 Selenium 中获取 WebElement 的 HTML 代码

Java的selenium代码随笔

如何将WebElement转换为selenium / Java中'if'语句的字符串

Java的selenium代码随笔

selenium.webdriver.remote.webelement.WebElement解析