selenium 添加事件

本文介绍了一个使用Selenium WebDriver与Firefox浏览器进行网页自动化测试的例子。通过创建一个简单的Java程序,演示了如何打开百度网站,输入搜索关键词并触发搜索,同时记录操作过程中的关键信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于Eclipse Java EE IDE for Web Developers.
Version: Mars.2 Release (4.5.2)

新建test4.java

package ST;

import org.openqa.selenium.*;
import org.openqa.selenium.WebDriver.*;
import org.openqa.selenium.firefox.*;

public class test4 {
    public static void main(String[] args)
    {
        WebDriver driver = new FirefoxDriver();
        org.openqa.selenium.support.events.EventFiringWebDriver
        eventDriver = new org.openqa.selenium.support.events.EventFiringWebDriver(driver);
        //注册事件
        eventDriver.register(new MyWebDriverListener());
        
        //打开百度页面,输入selenium,点击搜索
        eventDriver.navigate().to("http://www.baidu.com");
        eventDriver.findElement(By.id("kw")).sendKeys("selenium");
        eventDriver.findElement(By.id("su")).click();
        
        //写一个异常
        try{
            eventDriver.findElement(By.id("XXXX"));
        }catch(Exception e){}
    }
}

新建 MyWebDriverListener .java 文件


package ST;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.events.WebDriverEventListener;

public class MyWebDriverListener implements WebDriverEventListener{

	@Override
	public void afterChangeValueOf(WebElement arg0, WebDriver arg1) {
		// TODO Auto-generated method stub
		System.out.println("更改 后的值为"+arg0.getAttribute("value"));
		
		
	}

	@Override
	public void afterClickOn(WebElement arg0, WebDriver arg1) {
		// TODO Auto-generated method stub
		try{
			Thread.sleep(4000);
		}catch(InterruptedException e){
			e.printStackTrace();
		}
		
		System.out.println("单击的页面元素后的URL为:" + arg1.getCurrentUrl() );
	}

	@Override
	public void afterFindBy(By arg0, WebElement arg1, WebDriver arg2) {
		// TODO Auto-generated method stub
		System.out.println("找到元素,其条件为"+arg0.toString());
		
	}

	@Override
	public void afterNavigateBack(WebDriver arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void afterNavigateForward(WebDriver arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void afterNavigateRefresh(WebDriver arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void afterNavigateTo(String arg0, WebDriver arg1) {
		// TODO Auto-generated method stub
		System.out.println("页面发生跳转后的URL为:"+arg1.getCurrentUrl());
		
	}

	@Override
	public void afterScript(String arg0, WebDriver arg1) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void beforeChangeValueOf(WebElement arg0, WebDriver arg1) {
		// TODO Auto-generated method stub
		System.out.println("更改前的值为:"+arg0.getAttribute("value"));
		
	}

	@Override
	public void beforeClickOn(WebElement arg0, WebDriver arg1) {
		// TODO Auto-generated method stub
		System.out.println("要单击的页面元素为:" + arg0.getAttribute("value"));
		
	}

	@Override
	public void beforeFindBy(By arg0, WebElement arg1, WebDriver arg2) {
		// TODO Auto-generated method stub
		System.out.println("查找元素时的条件为:"+arg0.toString());
		
	}

	@Override
	public void beforeNavigateBack(WebDriver arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void beforeNavigateForward(WebDriver arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void beforeNavigateRefresh(WebDriver arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void beforeNavigateTo(String arg0, WebDriver arg1) {
		// TODO Auto-generated method stub
		System.out.println("页面发生跳转前的URL为:"+arg1.getCurrentUrl());
	}

	@Override
	public void beforeScript(String arg0, WebDriver arg1) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onException(Throwable arg0, WebDriver arg1) {
		// TODO Auto-generated method stub
		java.util.Date currentTime = new java.util.Date();
		java.text.SimpleDateFormat  formatter = new java.text.SimpleDateFormat("yyyy_MM_dd_hh_mm_ss");
		String dateString = formatter.format(currentTime);
		java.io.File scrFile = ((org.openqa.selenium.TakesScreenshot)arg1).getScreenshotAs(org.openqa.selenium.OutputType.FILE);
		try{
			java.io.File screenshot = new java.io.File("D:\\"+dateString+".png");
			org.apache.commons.io.FileUtils.copyFile(scrFile,screenshot);
		}catch(java.io.IOException e){
			e.printStackTrace();		
		}
		System.out.println("Error:" + arg0.getMessage());
		System.out.println("Picture in:"+ "D:\\"+dateString+".png");
		}

}




<think>我们正在使用Golang和Selenium进行Web自动化,需要添加Cookie。根据Selenium的文档,我们可以使用`AddCookie`方法。在Golang中,我们可以使用`github.com/tebeka/selenium`包。 步骤: 1. 首先,我们需要创建一个Cookie对象,该对象应包含名称、值、路径、域等(可选字段有路径、域、过期时间、安全标志、HTTPOnly标志等)。 2. 然后,使用WebDriver的`AddCookie`方法添加这个Cookie。 注意:在添加Cookie之前,通常需要先访问一个页面(比如目标域),因为浏览器需要上下文(域)来设置Cookie。 示例代码: ```go package main import ( "fmt" "time" "github.com/tebeka/selenium" ) func main() { // 设置Selenium WebDriver caps := selenium.Capabilities{"browserName": "chrome"} wd, err := selenium.NewRemote(caps, "") if err != nil { panic(err) } defer wd.Quit() // 先导航到一个页面(例如目标网站的主页) err = wd.Get("https://example.com") if err != nil { panic(err) } // 创建一个Cookie cookie := &selenium.Cookie{ Name: "test_cookie", Value: "12345", Path: "/", // 可选 Domain: "example.com", // 可选,如果为空则默认为当前页面的域 Secure: false, // 可选 Expiry: uint(time.Now().Add(24 * time.Hour).Unix()), // 可选,Unix时间戳 } // 添加Cookie err = wd.AddCookie(cookie) if err != nil { panic(err) } // 验证Cookie是否添加成功(可选) cookies, err := wd.GetCookies() if err != nil { panic(err) } for _, c := range cookies { fmt.Printf("Cookie: %s=%s\n", c.Name, c.Value) } } ``` 注意: - 确保你使用的`selenium`包是最新的,或者至少支持`AddCookie`方法。 - 在添加Cookie之前,必须已经导航到某个页面(通常是目标域下的页面),否则可能会出错,因为浏览器需要知道Cookie应该关联到哪个域。 - 如果添加Cookie后需要立即生效,可以刷新页面或者继续后续操作。 引用[1]:Selenium 是一个用于自动化 Web 浏览器的工具,适用于爬取动态网页。下面是一个使用 Python 和 Selenium 爬取动态网页的示例。假设我们要爬取一个加载动态内容的网页,并提取其中的一些数据。[^1](这里虽然引用的是Python示例,但原理相同) 相关问题: 1. 在Golang Selenium中如何删除Cookie? 2. 如何设置Cookie的HTTPOnly和Secure标志? 3. 使用Selenium添加Cookie时出现无效域错误怎么办?</think>### 使用 Golang 和 Selenium 添加 Cookie 的示例 在 Golang 中使用 Selenium 添加 Cookie 的步骤如下: ```go package main import ( "fmt" "time" "github.com/tebeka/selenium" ) func main() { // 1. 初始化 WebDriver caps := selenium.Capabilities{"browserName": "chrome"} wd, err := selenium.NewRemote(caps, "http://localhost:4444/wd/hub") if err != nil { panic(err) } defer wd.Quit() // 2. 导航到目标网站(必须先访问域名才能设置其 Cookie) err = wd.Get("https://example.com") if err != nil { panic(err) } // 3. 创建 Cookie 对象 cookie := &selenium.Cookie{ Name: "session_token", // Cookie 名称 Value: "abc123xyz", // Cookie 值 Path: "/", // 生效路径 Domain: "example.com", // 域名 Secure: true, // 仅 HTTPS Expiry: uint(time.Now().Add(24*time.Hour).Unix()), // 过期时间 } // 4. 添加 Cookie err = wd.AddCookie(cookie) if err != nil { panic(fmt.Sprintf("添加 Cookie 失败: %v", err)) } // 5. 验证 Cookie(可选) cookies, err := wd.GetCookies() if err != nil { panic(err) } fmt.Println("当前 Cookies:") for _, c := range cookies { fmt.Printf("- %s: %s\n", c.Name, c.Value) } } ``` ### 关键说明: 1. **必须先在目标域名**:添加 Cookie 前需先访问目标域名(通过 `wd.Get()`),否则会报 `invalid cookie domain` 错误 2. **Cookie 参数**: - `Domain` 必须与当前访问的域名匹配 - `Expiry` 使用 Unix 时间戳 - `Secure` 设置为 `true` 表示仅通过 HTTPS 传输 3. **Selenium 服务器**:确保 Selenium 服务器正在运行(默认地址 `http://localhost:4444`) ### 常见问题解决: 1. **无效域名错误**: ```go // 错误示例:未先访问域名 wd.AddCookie(cookie) // 错误: invalid cookie domain // 正确做法:先导航到目标网站 wd.Get("https://example.com") wd.AddCookie(cookie) ``` 2. **Cookie 未生效**: - 检查域名和路径是否匹配当前页面 - 刷新页面使 Cookie 生效:`wd.Refresh()` 3. **过期时间设置**: ```go // 设置 1 天后过期 expiry := time.Now().Add(24 * time.Hour).Unix() cookie := &selenium.Cookie{Expiry: uint(expiry)} ``` Selenium 的 Cookie 操作遵循标准 HTTP Cookie 协议,在自动化测试和爬虫中常用于维持登录状态[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值