selenium+java入门demo

简介: selenium+java入门demo

看到这里,我就不介绍太多的selenium是什么了(jar包:https://download.csdn.net/download/qq_40374604/10807974

需要的jar包和常见问题在个人分类的其他文章中

demo中有phantomjs,无浏览器访问,相关文章请看个人博客爬虫分类

另外(访问像微博https://weibo.com/这样的网站,用到...driver.findElement(By.className("list_title_s"));//查找这个class,让程序等待需要的内容加载完成...)(第二篇代码)

package net.domain;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.TimeUnit;
 
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
 
public class SeleniumDynamicWeb {
  public static void main(String[] args) {
    Search();
    //System.setProperty("phantomjs.binary.path", "tools\\phantomjs.exe");//无浏览器访问
    System.setProperty("webdriver.chrome.driver", "tools\\chromedriver.exe");// chromedriver服务地址
    WebDriver driver = new ChromeDriver(); // 新建一个WebDriver 的对象,但是new
                        // 的是FirefoxDriver的驱动
    driver.get("http://www.baidu.com");// 打开指定的网站
    driver.findElement(By.id("kw")).sendKeys(
        new String[] { "rodert_wang csdn" });// 找到kw元素的id,然后输入hello
    driver.findElement(By.id("su")).click(); // 点击按扭
    try {
      /**
       * WebDriver自带了一个智能等待的方法。
       * dr.manage().timeouts().implicitlyWait(arg0, arg1);
       * Arg0:等待的时间长度,int 类型 ; Arg1:等待时间的单位 TimeUnit.SECONDS 一般用秒作为单位。
       */
      driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
    } catch (Exception e) {
      e.printStackTrace();
    }
    /**
     * dr.quit()和dr.close()都可以退出浏览器,简单的说一下两者的区别:第一个close,
     * 如果打开了多个页面是关不干净的,它只关闭当前的一个页面。第二个quit,
     * 是退出了所有Webdriver所有的窗口,退的非常干净,所以推荐使用quit最为一个case退出的方法。
     */
    driver.quit();// 退出浏览器
    liulanqi();
  }
 
  private static void liulanqi() {
    /**
     * 操作浏览器 1、浏览器窗口最大化 2、浏览器前进 3、浏览器后退 4、浏览器刷新 5、浏览器切换窗口
     * 
     * @author https://me.csdn.net/qq_40374604
     *
     */
    String url = "https://blog.csdn.net/qq_40374604/article/details/83996505";
    System.setProperty("webdriver.chrome.driver", "tools\\chromedriver.exe");
    WebDriver driver = new ChromeDriver();
    driver.get(url);
    // 1
    driver.manage().window().maximize();
    driver.findElement(By.linkText("rodert_wang")).click();
    driver.navigate().refresh();// 刷新页面
    driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
    driver.navigate().back();// 回退
    driver.navigate().forward();// 前进
    driver.quit();
  }
 
  private static void Search() {
    /**
     * 获取http://www.com页面中,所有</a>标签"href"属性值
     * 包含英文单词“place”的URL,并将结果保存到“d://logSelenim.log”文件中。
     * 
     * @author https://me.csdn.net/qq_40374604
     *
     */
    String url = "https://me.csdn.net/qq_40374604";
    System.setProperty("webdriver.chrome.driver", "tools\\chromedriver.exe");
    File file = new File("d://logSelenim.log");
    if (!(file.exists())) {
      try {
        file.createNewFile();
      } catch (IOException e) {
        System.out.println("创建文件失败");
        e.printStackTrace();
      }
    }
    WebDriver driver = new ChromeDriver();
    driver.get(url);
    List<WebElement> aList = driver.findElements(By.tagName("a"));
    FileOutputStream fs;
    try {
      fs = new FileOutputStream(file);
      for (WebElement a : aList) {
        String urlStr = a.getAttribute("href");
        System.out.println(urlStr);
        if (urlStr.contains("qq_40374604/article")) {
          urlStr += "\r\n";
          fs.write(urlStr.getBytes());
        }
      }
    } catch (Exception e) {
      System.out.println("文件写入失败");
      e.printStackTrace();
    }finally{
      driver.quit();
    }
 
  }
}
package cn.server;
 
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.concurrent.TimeUnit;
 
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
 
import com.google.gson.JsonArray;
 
public class ModelSelenium {
  public static String Search(String url) throws InterruptedException {
    /**
     * 基于selenium
     * 
     * @author wangshiyu
     */
    System.setProperty("webdriver.chrome.driver", "tools\\chromedriver.exe");// chromedriver服务地址
    WebDriver driver = new ChromeDriver();// 新建一个WebDriver 的对象,但是new
    // System.setProperty("phantomjs.binary.path", "tools\\phantomjs.exe");
    // WebDriver driver = new PhantomJSDriver();
    driver.get(url);
    driver.manage().timeouts().implicitlyWait(8, TimeUnit.SECONDS);
    driver.findElement(By.className("list_title_s"));//查找这个class,让程序等待内容加载
    String pageSource = driver.getPageSource();
    driver.manage().window().maximize();
    Thread.sleep(1000);
    getLink(pageSource, url);
    System.out.println(pageSource);
    // driver.quit();
    return pageSource;
  }
 
  public static JsonArray getLink(String html, String baseUri) {
    JsonArray seedsJsonArray = new JsonArray();
    Document doc = Jsoup.parse(html, baseUri);
    Elements links = doc.select("a[href]");
    Elements media = doc.select("[src]");
    for (Element element : links) {
      String hrefString = element.attr("abs:href");
      if (hrefString.length() > 5) {
        seedsJsonArray.add(hrefString.toString());
      }
    }
    for (Element element : media) {
      String srcString = element.attr("abs:src");
      if (srcString.length() > 5) {
        seedsJsonArray.add(element.attr("abs:src").toString());
      }
    }
    System.out.println("#######" + seedsJsonArray);
    return seedsJsonArray;
  }
 
  @SuppressWarnings("finally")
  public static String getAbsoluteURL(String baseURI, String relativePath) {
    String abURL = null;
    try {
      URI base = new URI(baseURI);// 基本网页URI
      URI abs = base.resolve(relativePath);// 解析于上述网页的相对URL,得到绝对URI
      URL absURL = abs.toURL();// 转成URL
      abURL = absURL.toString();
    } catch (MalformedURLException e) {
      e.printStackTrace();
    } catch (URISyntaxException e) {
      e.printStackTrace();
    } finally {
      return abURL;
    }
  }
 
  public static void main(String[] args) {
    try {
      String url = "https://weibo.com/";
      Search(url);
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}

目录
相关文章
|
9天前
|
Java 数据库连接 API
2025 更新必看:Java 编程基础入门级超级完整版指南
本教程为2025更新版Java编程基础入门指南,涵盖开发环境搭建(SDKMAN!管理JDK、VS Code配置)、Java 17+新特性(文本块、Switch表达式增强、Record类)、面向对象编程(接口默认方法、抽象类与模板方法)、集合框架深度应用(Stream API高级操作、并发集合)、模式匹配与密封类等。还包括学生成绩管理系统实战项目,涉及Maven构建、Lombok简化代码、JDBC数据库操作及JavaFX界面开发。同时提供JUnit测试、日志框架使用技巧及进阶学习资源推荐,助你掌握Java核心技术并迈向高级开发。
71 5
|
2月前
|
存储 安全 Java
【Java并发】【原子类】适合初学体质的原子类入门
什么是CAS? 说到原子类,首先就要说到CAS: CAS(Compare and Swap) 是一种无锁的原子操作,用于实现多线程环境下的安全数据更新。 CAS(Compare and Swap) 的
71 15
【Java并发】【原子类】适合初学体质的原子类入门
|
4月前
|
存储 监控 Java
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
261 60
【Java并发】【线程池】带你从0-1入门线程池
|
2月前
|
缓存 安全 Java
【Java并发】【ConcurrentHashMap】适合初学体质的ConcurrentHashMap入门
ConcurrentHashMap是Java中线程安全的哈希表实现,支持高并发读写操作。相比Hashtable,它通过分段锁(JDK1.7)或CAS+synchronized(JDK1.8)实现更细粒度锁控制,提升性能与安全性。本文详细介绍其构造方法、添加/获取/删除元素等常用操作,并对比JDK1.7和1.8的区别,帮助开发者深入理解与使用ConcurrentHashMap。欢迎关注,了解更多!
108 5
【Java并发】【ConcurrentHashMap】适合初学体质的ConcurrentHashMap入门
|
2月前
|
Java
【源码】【Java并发】【LinkedBlockingQueue】适合中学体质的LinkedBlockingQueue入门
前言 有了前文对简单实用的学习 【Java并发】【LinkedBlockingQueue】适合初学体质的LinkedBlockingQueue入门 聪明的你,一定会想知道更多。哈哈哈哈哈,下面主播就...
55 6
【源码】【Java并发】【LinkedBlockingQueue】适合中学体质的LinkedBlockingQueue入门
|
2月前
|
安全 Java
【Java并发】【ArrayBlockingQueue】适合初学体质的ArrayBlockingQueue入门
什么是ArrayBlockingQueue ArrayBlockingQueue是 Java 并发编程中一个基于数组实现的有界阻塞队列,属于 java.util.concurrent 包,实现了 Bl...
65 6
【Java并发】【ArrayBlockingQueue】适合初学体质的ArrayBlockingQueue入门
|
2月前
|
监控 Java API
【Java并发】【ReentrantLock】适合初学体质的ReentrantLock入门
前言 什么是ReentrantLock? ReentrantLock 是 Java 并发包 (java.util.concurrent.locks) 中的一个类,它实现了 Lock 接口,提供了与
112 10
【Java并发】【ReentrantLock】适合初学体质的ReentrantLock入门
|
2月前
|
安全 Java
【Java并发】【LinkedBlockingQueue】适合初学体质的LinkedBlockingQueue入门
前言 你是否在线程池工具类里看到过它的身影? 你是否会好奇LinkedBlockingQueue是啥呢? 没有关系,小手手点上关注,跟上主播的节奏。 什么是LinkedBlockingQueue? ...
59 1
【Java并发】【LinkedBlockingQueue】适合初学体质的LinkedBlockingQueue入门
|
3月前
|
设计模式 存储 安全
【Java并发】【AQS】适合初学者体质的AQS入门
AQS这是灰常重要的哈,很多JUC下的框架的核心,那都是我们的AQS,所以这里,我们直接开始先研究AQS。 那说到研究AQS,那我们应该,使用开始说起🤓 入门 什么是AQS? AQS(Abst
97 8
【Java并发】【AQS】适合初学者体质的AQS入门
|
3月前
|
缓存 安全 Java
【Java并发】【synchronized】适合初学者体质入门的synchronized
欢迎来到我的Java线程同步入门指南!我不是外包员工,梦想是写高端CRUD。2025年我正在沉淀中,博客更新速度加快,欢迎点赞、收藏、关注。 本文介绍Java中的`synchronized`关键字,适合初学者。`synchronized`用于确保多个线程访问共享资源时不会发生冲突,避免竞态条件、保证内存可见性、防止原子性破坏及协调多线程有序访问。
101 8
【Java并发】【synchronized】适合初学者体质入门的synchronized

热门文章

最新文章