51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1983|回复: 2
打印 上一主题 下一主题

Selenium 网页爬虫开发基础(Java)

[复制链接]
  • TA的每日心情
    奋斗
    2021-8-16 14:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2018-3-12 16:26:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    Selenium是一个多平台的Web应用程序测试的工具,支持包括IE、Mozilla Firefox、Google Chrome等。
    他可以模拟人的操作,如点击,输入,键盘操作等。适合于抓取由JavaScript生成的页面或其他需要
    互动的页面。
    Anyway, Selenium是模拟人执行浏览器一个自动化工具。
    本文介绍的是Java平台下,如何用Selenium,与网站交互并爬取相关内容

    Selenium Project有四个:Selenium WebDriver、Selenium Grid(已废弃)、Selenium IDE、Selenium
    Remote Control。本文使用的是WebDriver Project,其中IDE Project是可视化类型的,适合于非开发
    性自动化。
    一、准备

    1、开发准备

      基础Java开发环境不做赘述,Selenium官方网址:–>seleniumhq官网 <– 这上面有很多资料,纯
    英文的。但不必太纠结,国内中文资料很多,而且十分够用,可自行百度。这里给大家推荐按一个:
    自动化测试
      在官网Download页面,找到如下图所示的下载内容即可。不得不说的是,这个网站偶尔会无法访
    问,可能是被墙了。在公司访问基本都没出过问题,因为是比利时节点。
      为了方便大家,我在网盘上也给大家分享了,链接如下:http://pan.baidu.com/s/1c1KDNI4 密码:rxnh
    官网下载页面

    2、引入Jar

      解压出来的Jar包应该是这样的,lib文件夹中还有更多的。为了方便管理,可以将Jar放入的User
    库,项目需要就统一加入。
    Lib下包众多,作者比较好奇每个包具体功能,想在项目中直接只加入合适的包。这个我查了一下,
    没找到,如果有了解也可以告诉我。

    文件夹

      创建User库的方法是:Windows–>Preferences–>User libraries下 先New,再分别add Jar即可。
    在需要的项目上,右击buildpath配置进去即可。
    Eclipse配置

    若使用构建工具,相关dependency 如下
    1. --Gradle--
    2. dependencies {
    3. compile("org.seleniumhq.selenium:selenium-java");
    4. }
    5. --Maven--
    6. <dependency>
    7. <groupId>org.seleniumhq.selenium</groupId>
    8. <artifactId>selenium-java</artifactId>
    9. <version>3.4.0</version>
    10. </dependency>
    复制代码
    OK,当你完成以上时候,项目的准备就基本完成了。下面就是具体功能Coding的部分。

    二、小试牛刀

    1、Selenium大致实现思路

    配置相关参数           驱动以及浏览器位置等等
    系统根据配置加载Drive驱动    此时自动化操作的浏览器打开
    Drive加载URL          访问URL页面
    操作Drive对浏览器执行操作    执行已设定操作

      相关代码粘贴如下,代码提供了三种浏览器的执行方案,分别是IE(速度很慢)、FIrefox、
    Chrome。需要注意的是Chrome在win下只支持32-bit,并且drive的驱动与浏览器版本是相关的,
    向下不兼容。
    1.    /**
    2.      * Get WebDriver
    3.      * @param url
    4.      * @return driver
    5.      */
    6.     public static WebDriver getWebDriver(String url) {
    7.         //Use IE. u need to set drive path and capabilities
    8. /*          System.setProperty("webdriver.ie.driver", "D:/drive/IEDriverServer.exe");
    9.             DesiredCapabilities ieCapabilities = DesiredCapabilities.internetExplorer();
    10.             ieCapabilities.setCapability(InternetExplorerDriver
    11.                             .INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS,true);
    12.             WebDriver driver = new InternetExplorerDriver();*/

    13.         //Use Firefox.need set property and install path;
    14. /*          System.setProperty("webdriver.gecko.driver", "D:/drive/geckodriver.exe");
    15.             System.setProperty("webdriver.firefox.bin", "C:\\Program Files\\Mozilla Firefox\\firefox.exe");
    16.             WebDriver driver = new FirefoxDriver();*/

    17.         //Use Chrome ,but support 32-bit only
    18.         System.setProperty("webdriver.chrome.driver", "D:/drive/chromedriver.exe");
    19.         WebDriver driver = new ChromeDriver();
    20.         driver.get(url);
    21.         return driver;
    22.     }
    复制代码
    2、操作浏览器

      以抓取百度为例,用户浏览器打开后。Selenium根据关键字找到输入框,并点击搜索,并将
    最终结果输入。注意:下面这段代码可能有问题,因为点击搜索后页面需要加载后才会出现结果。
    所以应该有判断加载结果出来后再抓取结果的过程,这里为简便就只是线程sleep了2秒钟。
    1.   //get input box
    2.         WebElement keyword = driver.findElement(By.id("kw"));
    3.         //enter keyword
    4.         keyword.sendKeys("selenium");
    5.         //get search button and click it
    6.         WebElement searchBtn = driver.findElement(By.id("su"));
    7.         searchBtn.click();
    8.         Thread.sleep(2000);//waiting for the result
    9.         //get result and print out cyclical--搜索结果是h3标签class=“t”,故以此为条件
    10.         List<WebElement> titles = driver.findElements(By.cssSelector("h3.t"));
    11.         for(WebElement title:titles){
    12.             WebElement webTitle=title.findElement(By.tagName("a"));
    13.             System.err.println("webTitle:"+webTitle+":"+webTitle.getText());
    14.         }
    复制代码
    三、Selenium基本操作

    1、元素定位(按推荐指数排列,后三个没用过)
    1. //id 定位
    2.     WebElement  webElement = driver.findElement(By.id(“id的值”));
    3.     //name定位
    4.     WebElement  webElement = driver.findElement(By.name(“name的值”));
    5.     //TagName 标签名称定位
    6.     WebElement  webElement = driver.findElement(By.tagName(“标签名称”));
    7.     //Class 名称定位
    8.     WebElement  webElement = driver.findElement(By.className(“class属性”));
    9.     //css 方式定位
    10.     WebElement  webElement = driver.findElement(By.cssSelector(“css表达式”));
    11.     //链接的全部文字定位
    12.     WebElement  webElement = driver.findElement(By.linkText(“链接的全部文字”));
    13.     //链接的部分文字定位
    14.     WebElement  webElement = driver.findElement(By.partialLinkText(“链接的部分文字”));
    15.     //xpath 方式定位
    16.     WebElement  webElement = driver.findElement(By.xpath(“xpath表达式”));
    复制代码
    2、元素简单操作
    1. // 点击
    2.    webElement .click();
    3.    // 输入
    4.    webElement .sendKeys("hello selenium");
    5.    // 获取属性
    6.    webElement .getAttribute("value");
    复制代码
    3、元素等待

    显示等待
      设定等待的条件,满足条件测试代码才会继续向后执行,如案例中,等待百度的搜索结果。需
    要注意的是,如果超过设定的最大显式等待时间阈值, 这测试程序会抛出异常。Selenium预设了一
    些,可以直接调用ExpectedConditions下的。如果没有,可以自己实现接口。以下是两种演示:
    1. //等待10s,出现id为kw元素出现后才继续执行
    2.    new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.id("kw")));
    3.        //等待验证码,当验证码拥有某些值时候才可以继续
    4.         try {
    5.             new WebDriverWait(driver, 500).until(new ExpectedCondition<Boolean>(){
    6.                     public Boolean apply(WebDriver d){
    7.                         return d.findElement(By.id("yzm_img"))
    8.                                             .getAttribute("src")
    9.                                             .contains("base64");
    10.                         }
    11.                     });
    12.     } catch (Exception e) {
    13.     }
    复制代码
    隐式等待
      隐式等待方式(implicitlyWait)脚本在查找元素时的最大等待时间:
        // 其中second为等待的秒数
        driver.manage().timeouts().implicitlyWait(second, TimeUnit.SECONDS);   
    1
    2
    4、iframe切换

      定位元素最好的方法就是id,如果id确定,元素很容易找到。之前开发中就遇到过一个很复杂的
    页面,点击提交表单后弹出一个iframe,显示报表信息。由于元素拥有id,所以想着很容易找到报表
    中数据。用IE一直没问题,可是生产部署时要调整至Chrome浏览器,就是找不到,Always IN ERRO
    R!最后查到的原因就是iframe,所以需要注意的,不同浏览器可能会出现iframe问题。

    //swith to dialog frame that named "dialog-body"
    driver.switchTo().frame("dialog-body");
    // 回到主窗口
    driver.switchTo().defaultContent();

    5、浏览器操作
    1. // 最大化
    2.    driver.manage().window().maximize();
    3.    //跳转至Page
    4.    driver.navigate().to("Page");
    5.    // 刷新
    6.    driver.navigate().refresh();
    7.    // 浏览器退出...这里需要留意quit和close的区别,一般默认quit
    8.    driver.quit();
    复制代码
    当然,这些只是一些比较基本的操作,推荐一个比较完整的博客,可以去看看,我就不再造轮子了
    :操作手册

     以上就是Selenium抓取的基本内容,利用Selenium做Webservice接口,将验证码抓给用户填写并
    完成整个操作,将会在Selenium实现交互式WebService中和大家介绍,谢谢


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-27 11:12 , Processed in 0.071756 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表