为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Selenium 监控网页并知道何时出现新的 html 元素?

如何使用 Selenium 监控网页并知道何时出现新的 html 元素?

慕尼黑8549860 2022-06-23 16:44:59
我有一个网页,有时会动态添加新元素,例如:<span class="chat_message">| New Login</span>将上述代码添加到我的页面时如何捕获?我的代码试验:WebDriver driver = new ChromeDriver () ; driver.get("http://www.example.com") ;// code to monitor the new span
查看完整描述

3 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

请使用下面的代码片段。如果没有找到匹配的元素而不是异常,findElements 将返回一个空列表,但是我已经完成了异常处理。


import java.awt.AWTException;

import org.openqa.selenium.By;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.chrome.ChromeDriver;

import org.testng.annotations.Test;


public class Testing {

       public static WebDriver driver;


       @Test

       public void test() throws InterruptedException, AWTException {

              WebDriver driver = new ChromeDriver();

              driver.get("http://www.example.com");

              Boolean isPresent = driver.findElements(By.xpath("//span[@class='chat_message']")).size() > 0;

              try {

                     if (isPresent == true) {

                            System.out.println("New Login is added to my page");

                     } else {

                            System.out.println("New Login is not added to my page");

                     }

              } catch (Exception e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

              }

       }

}

如果至少找到一个元素,则返回 true,如果不存在则返回 false。

如果它符合您的期望,请接受答案并进行投票。提前致谢。


查看完整回答
反对 回复 2022-06-23
?
largeQ

TA贡献2039条经验 获得超7个赞

当您提到您需要捕获元素时,用例归结为使用ExpectedConditions诱导WebDriverWait,以便您可以提取任何元素属性:visibilityOfElementLocated(By locator)


内部HTML

类属性

外层HTML

在这些情况下,最好的选择是创建如下函数:


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();

笔记:


由于元素是动态元素,您需要诱导WebDriverWait。

由于您需要捕获元素visibilityOfElementLocated非常适合。

有时您需要将代码行包装在一个try-catch {}块中,并在出现异常的情况下优雅地处理并TimeoutException继续您的下一步。


查看完整回答
反对 回复 2022-06-23
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

如果您知道该元素的定位器 - 有一个“while”循环,其中包含 afindElement()并捕获NoSuchElementException. 如果该元素不存在,您将捕获异常,暂停一段时间(尽管如此sleep),然后开始一个新的循环周期。如果没有抛出异常,则元素存在;将您的 while 控制变量更改为true,然后继续。

我建议有一个计数器循环运行了多少次,如果它达到某个阈值 - 打破它,出现错误/异常 - 这样你就不会陷入无限循环。

恭喜 - 您刚刚WebDriverWait使用presenceOfElementLocated()ExpectedConditions 实施。您可以使用它(香草硒版本),或坚持使用本土解决方案,这将为您提供更精细的控制和决策树 - 但需要更多编码。


如果你没有具体的元素,只是想看看页面本身什么时候发生变化,算法是一样的,但是:在开始循环之前,先获取页面源。在它的体内,再次得到它;如果两者不同,那就是你的突破条件。
这种方法虽然会受到页面中最轻微的变化的影响。


查看完整回答
反对 回复 2022-06-23
  • 3 回答
  • 0 关注
  • 607 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号