Java 如何使用Selenium监控网页并知道何时出现新的html元素?
我有一个网页,有时会动态添加新元素,如:Java 如何使用Selenium监控网页并知道何时出现新的html元素?,java,selenium,selenium-webdriver,webdriver,webdriverwait,Java,Selenium,Selenium Webdriver,Webdriver,Webdriverwait,我有一个网页,有时会动态添加新元素,如: <span class="chat_message">| New Login</span> 如果您知道该元素的定位器,那么就有一个“while”循环,该循环中有一个,并捕获NoSuchElementException。如果元素不存在,您将捕获异常,暂停一段时间(尽管sleep),并开始一个新的循环周期。如果没有抛出异常,则元素存在;将while controlling变量更改为true,然后继续 我建议使用一个计数器来计算循环运
<span class="chat_message">| New Login</span>
如果您知道该元素的定位器,那么就有一个“while”循环,该循环中有一个,并捕获
NoSuchElementException
。如果元素不存在,您将捕获异常,暂停一段时间(尽管sleep
),并开始一个新的循环周期。如果没有抛出异常,则元素存在;将while controlling变量更改为true
,然后继续
我建议使用一个计数器来计算循环运行了多少次,如果它达到某个阈值,就会跳出它,出现错误/异常,这样你就不会陷入无限循环
恭喜-您刚刚实现了预期的条件。您可以使用它(香草硒版本),也可以使用自主开发的解决方案,这将为您提供更细粒度的控制和决策树,但需要更多的编码
如果您没有特定的元素,但只想查看页面本身何时更改,那么算法是相同的,但是:在开始循环之前,获取页面源代码。在它的体内,再次得到它;如果两者不同,这就是你的突破状态。
不过,这种方法会受到页面中最轻微更改的影响。请使用下面的代码片段。 如果没有找到匹配的元素,findElements将返回一个空列表,而不是异常。不过,我已经完成了异常处理
import java.awt.AWTException;
导入org.openqa.selenium.By;
导入org.openqa.selenium.WebDriver;
导入org.openqa.selenium.chrome.ChromeDriver;
导入org.testng.annotations.Test;
公共类测试{
公共静态WebDriver;
@试验
public void test()抛出InterruptedException、AWTException{
WebDriver驱动程序=新的ChromeDriver();
驱动程序。获取(“http://www.example.com");
Boolean isPresent=driver.findElements(By.xpath(“//span[@class='chat\u message'])。size()>0;
试一试{
如果(isPresent==true){
System.out.println(“新登录添加到我的页面”);
}否则{
System.out.println(“新登录未添加到我的页面”);
}
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
当您提到需要捕获元素时,用例归结为使用预期条件诱导WebDriverWait,以便您可以提取任何元素属性:
- innerHTML
- 类属性
- 外层TML
public void getElementAttribute()
{
try {
System.out.println(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[@class='chat_message']"))).getAttribute("innerHTML"));
}
catch(Exception TimeoutException) {
System.out.println("Element no found");
}
}
getElementAttribute();
现在,您可以从程序中的任何位置调用此函数,以检查元素的可见性,如下所示:
public void getElementAttribute()
{
try {
System.out.println(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[@class='chat_message']"))).getAttribute("innerHTML"));
}
catch(Exception TimeoutException) {
System.out.println("Element no found");
}
}
getElementAttribute();
注:
- 由于元素是一个动态元素,因此需要对其进行归纳
- 因为您需要捕获元素的可见性,所以定位非常适合
- 有时,您需要在
块中包装代码行,并在出现异常时优雅地处理try catch{}
,然后继续执行下一步TimeoutException