自动化爬虫selenium + appium 笔记

简介

Selenium自动化浏览器,它主要用于自动化Web应用程序以进行测试,但当然不仅限于此

Selenium得到了一些最大的浏览器供应商的支持,这些供应商采取(或正在采取)将Selenium作为其浏览器本机部分的步骤。它也是无数其他浏览器自动化工具,API和框架的核心技术。

说白了Selenium本身是被用来进行测试的,而不是用来作为爬虫的,但是现在很多用来作为爬虫的实现,因为爬虫本身是需要通过页面中的元素定位来获取数据,而Selenium正好提供了爬虫所需要的基本功能。

pom文件引入依赖

	<dependency>
		<groupId>org.seleniumhq.selenium</groupId>
		<artifactId>selenium-java</artifactId>
		<version>3.141.59</version>
	</dependency>

使用

我们想要使用Selenium来操控浏览器,第一步就应该先要获得浏览器的驱动

  • 火狐浏览器与selenium的兼容最好,不需要任何的额外驱动就可以直接相连
	// 创建一个Firefox的实例
	WebDriver driver = new FirefoxDriver();
	// 用这个实例来访问百度
	driver.get("http://www.baidu.com");
	// 查找元素,根据id
    WebElement searchBox = driver.findElement(By.id("kw"));
    // 发送内容
    searchBox.sendKeys("csdn");
    // 根据id查找button按钮
    WebElement searchButton = driver.findElement(By.id("su"));
    // 点击提交
    searchButton.submit();
    TimeUnit.SECONDS.sleep(10)
    // 关闭浏览器
    driver.quit();

上面我们通过id来快速定位我们需要找到的元素,并发送了内容进行搜索,而我们这些元素的id是怎么知道的呢,这就需要在编写代码之前分析我们要操控的页面元素,在火狐浏览器打开我们要分析的页面,按键盘中的F12即可弹出开发者工具来进行分析,可以通过下面图片中左上角的框框快速定位元素查看。

在这里插入图片描述
如果我们想要使用谷歌浏览器,则需要我们去下载额外的可执行文件
下载地址:Chormedriver可执行文件

对于上面的程序只需要增加一条语句并修改驱动的实例,就可以通过谷歌浏览器来访问了。

	System.setProperty("webdriver.chrome.driver","E:\\selenium\\chromedriver.exe");
	WebDriver driver = new ChromeDriver();

定位元素

通过上面简短的介绍我们知道,想要获取到数据,我们就必须先要定位到元素,而定位元素在一开始练习的时候确实不好定位,导致一直获取不到,所以我们要多练习定位元素。

而定位元素Senlenium提供了多种方法定位,

	<div id="coolestWidgetEvah">...</div>
	WebElement element = driver.findElement(By.id("coolestWidgetEvah"));
  • 通过class定位,在没有id的情况下我们只能通过其他的方式来定位元素,而class是可以重复的,所以一定要注意获取的元素是否正确,通常缩小到一定范围之内再通过class的方式来定位元素,或者使用list接收以后,确定第几个元素是我们要使用的。
	<div class="cheese">
		<span>Cheddar</span>
	</div>
	<div class="cheese">
		<span>Gouda</span>
	</div>
	List<WebElement> cheeses = driver.findElements(By.className("cheese"));
  • 通过css选择器(cssSelector)定位,因为class在一个元素上可以写多个来进行美化,所以我们也可以通过多个class来定位,可以看到,id前面需要加#,元素前面加空格,class使用 . 进行区分
	<div id="food">
		<span class="dairy">milk</span>
		<span class="dairy aged">cheese</span>
	</div>
	WebElement cheese = driver.findElement(By.cssSelector("#food span.dairy.aged"));
  • 通过tagName定位,这一种也是获取的大量的标签元素,通常是我们想要获取页面上所有的a标签中的链接,或者某个页面上的列表中所有的元素,除了这种方式还有很多,灵活运用就可以,并不是一定要通过tagName来获取所有的a标签,这里只是举例子。
	<a href="..."></a>
	WebElement linkA = driver.findElement(By.tagName("a"));
	if(!linkA.isEmpty()){
		for(WebElement link : link){
			System.out.println("链接地址 => " + link.getAttribute("href"))
		}
	}
  • 通过name定位,一般input元素是有name属性的,我们就可以通过name属性来定位元素
	<input name="cheese" type="text"/>
	WebElement cheese = driver.findElement(By.name("cheese"));
  • 通过链接文字定位元素,这种是确定链接中的文字以后我们就可以通过这种方式定位元素。
	<a href="http://www.google.com/search?q=cheese">cheese</a>>
	WebElement cheese = driver.findElement(By.linkText("cheese"));
  • 通过链接的模糊查询(部分文字)定位元素,这种方式获取的是所有带有我们写入的文字元素。
	<a href="http://www.google.com/search?q=cheese">search for cheese</a>
	WebElement cheese = driver.findElement(By.partialLinkText("cheese"));
  • 通过xpath定位元素,下面返回的是从根节点开始全局查找所有的input框。

	<input type="text" name="example" />
	List<WebElement> inputs = driver.findElements(By.xpath("//input"));

例子

定位到元素以后,需要获取其中的数据,这些方法我们可以在官方的api中可以找到

  • Selenium官方API

  • 假如我们已经获取到了我们要的元素,想要其中的文本内容

	WebElement element = driver.findElement(By.id("elementID"));
	System.out.println("获取到的内容为 => " + element.getText());
  • 我们获取到下拉多选后,进行点击每一个选项,使用click()方法
	WebElement select = driver.findElement(By.tagName("select"));
	List<WebElement> allOptions = select.findElements(By.tagName("option"));
	for (WebElement option : allOptions) {
	    System.out.println(String.format("Value is: %s", option.getAttribute("value")));
	    option.click();
	}
  • 当点击跳转网页后,当前的控制权还处于在主网页,并没有跳转到新的网页上,这时你就不能处理新网页中的元素,必须把控制权也跳转过去才可以
	WebDriver driver = new ChromeDriver();
	// 先获取主网页的控制句柄存储起来
	String indexHandle = driver.getWindowHandle();
	。。。处理逻辑省略
	// 当跳转页面后,获取所有的控制句柄存储在set集合中
	Set<String> handles = driver.getWindowHandles();
	// 循环判断所有句柄,把控制权交给新网页的句柄
    for(String handle : handles){
        if(!indexHandle.equals(handle)){
            driver.switchTo().window(handle);
        }
    }
    。。。。。省略的其他逻辑
    // 关闭当前页面
    driver.close()
    // 跳回主页面
    driver.switchTo().window(indexHandle)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值