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 结合 ExpectedCondition 是 ExplicitWait 可以实现的方式之一。
您可以在 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 代码