Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Selenium监控网页并知道何时出现新的html元素?_Java_Selenium_Selenium Webdriver_Webdriver_Webdriverwait - Fatal编程技术网

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
    ,然后继续执行下一步

可能想查看突变观察员@Lanterry谢谢,但我需要java中的selenium,而不是Jquery和JS。