java selenium (十三) 智能等待页面加载完成

我们经常会碰到用selenium操作页面上某个元素的时候, 需要等待页面加载完成后, 才能操作。  否则页面上的元素不存在,会抛出异常。  

或者碰到AJAX异步加载,我们需要等待元素加载完成后, 才能操作 

selenium 中提供了非常简单,智能的方法,来判断元素是否存在.

 

阅读目录

实例要求 

实例:set_timeout.html 下面的html 代码,  点击click 按钮5秒后, 页面上会出现一个红色的div快, 我们需要写一段自动化脚本智能的去判断这个div是否存在, 然后把这个div 然后高亮。

 

<html>
    <head>
        <title>Set Timeout</title>
        <style>
            .red_box {background-color: red; width = 20%; height: 100px; border: none;}
        </style>
        <script>
            function show_div(){
                setTimeout("create_div()", 5000);
            }
  
            function create_div(){
                d = document.createElement('div');
                d.className = "red_box";
                document.body.appendChild(d);
            }
        </script>
    </head>
    <body>
        <button id = "b" onclick = "show_div()">click</button>
    </body>
</html>

 

隐式等待

        WebDriver driver = new FirefoxDriver();
        driver.get("file:///C:/Users/Tank/Desktop/set_timeout.html");    
        
        driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
        WebElement element = driver.findElement(By.cssSelector(".red_box"));      
        ((JavascriptExecutor)driver).executeScript("arguments[0].style.border = \"5px solid yellow\"",element);  

其中

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

意思是, 总共等待10秒, 如果10秒后,元素还不存在,就会抛出异常  org.openqa.selenium.NoSuchElementException

 

显式等待

显式等待 使用ExpectedConditions类中自带方法, 可以进行显试等待的判断。 

显式等待可以自定义等待的条件,用于更加复杂的页面等待条件

 

等待的条件

WebDriver方法

页面元素是否在页面上可用和可被单击

elementToBeClickable(By locator)

页面元素处于被选中状态

elementToBeSelected(WebElement element)

页面元素在页面中存在

presenceOfElementLocated(By locator)

在页面元素中是否包含特定的文本

textToBePresentInElement(By locator)

页面元素值

textToBePresentInElementValue(By locator, java.lang.String text)

标题 (title)

titleContains(java.lang.String title)

 

 

 

 

 

 

 

 

 

 

 

只有满足显式等待的条件满足,测试代码才会继续向后执行后续的测试逻辑

如果超过设定的最大显式等待时间阈值, 这测试程序会抛出异常。 

 

    public static void testWait2(WebDriver driver)
    {
        driver.get("E:\\StashFolder\\huoli_28@hotmail.com\\Stash\\Tank-MoneyProject\\浦东软件园培训中心\\我的教材\\Selenium Webdriver\\set_timeout.html");    
        
        WebDriverWait wait = new WebDriverWait(driver, 20);
        wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(".red_box")));
        WebElement element = driver.findElement(By.cssSelector(".red_box"));      
        ((JavascriptExecutor)driver).executeScript("arguments[0].style.border = \"5px solid yellow\"",element);  
    }

 

转载于:https://www.cnblogs.com/TankXiao/p/5246557.html

<think>好的,我需要回答用户关于如何在Java中使用Selenium实现鼠标悬停后点击的方法。首先,我得回忆一下Selenium的相关知识,尤其是处理鼠标操作的部分。 根据用户提供的引用,特别是引用[1]、[3]、[4],似乎Actions类是用来处理鼠标事件的关键。比如引用[3]中的Python代码用了ActionChains,而Java中对应的应该是Actions类。用户问的是Java,所以我要确保给出的代码示例是Java版本的。 首先,用户可能需要先导入必要的包,比如org.openqa.selenium.interactions.Actions。然后找到目标元素,使用Actions的moveToElement方法模拟悬停,再执行perform()完成悬停后,可能需要等待一下让元素显示,接着找到需要点击的元素并点击。 需要注意的是,有时候悬停后出现的元素可能需要时间加载,所以添加一个等待,比如Thread.sleep(),或者更智能的显式等待。不过用户提供的引用中用了time.sleep(1.5),所以在Java里可能用Thread.sleep(1500),不过最好建议使用显式等待,但为了简单可能先给出sleep的例子。 另外,引用[4]提到用JS直接点击,这可能是一种替代方法,特别是在元素难以定位时。不过用户可能更想知道标准的Actions方法,所以应该优先介绍,然后提到JS的方法作为备选。 步骤大概是:初始化驱动,找到悬停元素,创建Actions对象,执行悬停,等待,找到点击元素并点击。同时,代码示例需要符合Java语法,比如使用WebDriver和Junit的注解。 需要检查是否有遗漏的步骤,比如确保元素可见或存在,可能需要等待。另外,异常处理是否需要提及?可能用户只需要基础教程,所以暂时不深入。 最后,生成相关问题时要围绕Selenium的鼠标操作,比如其他事件处理、优化方法或异常处理。</think>在Java中使用Selenium实现鼠标悬停后点击操作,主要依赖`Actions`类完成。以下是具体步骤和代码示例: --- ### 一、实现步骤 1. **导入相关包** ```java import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; ``` 2. **定位悬停元素** 通过XPath、CSS选择器等方式定位需要悬停的元素: ```java WebElement hoverElement = driver.findElement(By.xpath("悬停元素的XPath")); ``` 3. **执行悬停操作** 使用`Actions`类的`moveToElement()`方法模拟悬停,并通过`perform()`触发操作: ```java Actions actions = new Actions(driver); actions.moveToElement(hoverElement).perform(); ``` 4. **等待悬停效果加载** 添加短暂等待确保动态内容显示(推荐显式等待,此处简化示例): ```java Thread.sleep(1500); // 单位:毫秒 ``` 5. **定位并点击目标元素** 找到悬停后出现的子元素并执行点击: ```java WebElement clickElement = driver.findElement(By.xpath("待点击元素的XPath")); clickElement.click(); ``` --- ### 二、完整代码示例 ```java import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.interactions.Actions; public class HoverAndClickDemo { @Test public void testHoverClick() throws InterruptedException { WebDriver driver = new ChromeDriver(); driver.get("目标页面URL"); // 定位悬停元素 WebElement hoverElement = driver.findElement(By.xpath("//a[@class='menu']")); // 创建Actions对象并悬停 Actions actions = new Actions(driver); actions.moveToElement(hoverElement).perform(); // 等待子菜单加载 Thread.sleep(1000); // 定位并点击子元素 WebElement subElement = driver.findElement(By.xpath("//div[@class='submenu']/button")); subElement.click(); driver.quit(); } } ``` --- ### 三、关键优化点 1. **显式等待替代硬性等待** 建议使用`WebDriverWait`避免因加载时间不确定导致失败: ```java new WebDriverWait(driver, Duration.ofSeconds(10)) .until(ExpectedConditions.visibilityOf(subElement)); ``` 2. **处理动态生成元素** 若悬停后内容通过JavaScript动态生成,可能需要结合`JavascriptExecutor`直接操作DOM[^4]。 3. **异常处理** 添加`try-catch`块处理元素未找到或操作超时问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值