• Java调试谷歌PC浏览器,控制操作网页



    1、引入依赖,导入jar太多了        

           
                org.seleniumhq.selenium
                selenium-java
                2.25.0
           

           
                org.seleniumhq.selenium
                selenium-server
                2.25.0
           

    2、下载驱动


    查看谷歌浏览器版本:
    设置里    或者   访问:chrome://version/
    结果:106.0.5249.119 (正式版本) (64 位)
    下载控制驱动,打开
    http://chromedriver.storage.googleapis.com/index.html
    找到对应版本的驱动
    我的版本对应  106.0.5249.61
    不确定就进去文件夹,里面有notes.txt文件。
    **************************************************************************
    ---------ChromeDriver 106.0.5249.61 (2022-09-28)---------
    Supports Chrome version 106
    **************************************************************************
    然后放到谷歌同目录下,防止后续忘记放哪里了

    3、测试代码:


        public static void main(String[] args) {
            System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe");//驱动路径
            ChromeOptions options=new ChromeOptions();
            options.addArguments("user-data-dir=D:/tmp/User Data");//用户数据文件夹,随便设置,不能没有
            WebDriver driver = new ChromeDriver(options);
            driver.get("https://www.baidu.com/");
        }

    运行main可以直接启动谷歌浏览器,并打开百度。

    4、后续教程


    https://blog.csdn.net/scratlc/article/details/62044040?app_version=5.9.0&code=app_1562916241&csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%2262044040%22%2C%22source%22%3A%22qq_43319748%22%7D&uLinkId=usr1mkqgl919blen&utm_source=app

    代码参考

    公共方法规范接口,仿js方法

    1. package com.example;
    2. import org.openqa.selenium.WebElement;
    3. import java.util.List;
    4. public interface CommonServiceApi {
    5. /** 通过id获取元素 **/
    6. WebElement getElementById(String id);
    7. /** 从w的子元素开始查找,通过id获取元素 **/
    8. WebElement getElementById(WebElement w, String id);
    9. /** 通过class获取元素 **/
    10. List getElementsByClassName(String className);
    11. /** 从w的子元素开始查找,通过class获取元素 **/
    12. List getElementsByClassName(WebElement w, String className);
    13. /** 通过<标签名>获取元素列表 **/
    14. List getElementsByTagName(String tagName);
    15. /** 从w的子元素开始查找,通过<标签名>获取元素列表 **/
    16. List getElementsByTagName(WebElement w, String tagName);
    17. /** 通过name获取元素 **/
    18. WebElement getElementsByName(String name);
    19. /** 从w的子元素开始查找,通过name获取元素 **/
    20. WebElement getElementsByName(WebElement w, String name);
    21. /** 通过指定路径获取元素 **/
    22. WebElement getElementByXpath(String path);
    23. /** 从w的子元素开始查找,通过指定路径获取元素 **/
    24. WebElement getElementByXpath(WebElement w, String path);
    25. /** 从列表中获取第一个元素,没有就返回null **/
    26. T getFirstElement(List list);
    27. /** 获取当前元素的父元素 **/
    28. WebElement getParentElement(WebElement w);
    29. /** 设置input类型元素的value **/
    30. void setInputValue(WebElement w, String string);
    31. /** 比较当前元素的文本值和目标值 **/
    32. boolean equalsText(WebElement w, String text);
    33. /** 比较当前元素指定的属性值和目标值 **/
    34. boolean equalsAttribute(WebElement w, String name, String value);
    35. }

    公共配置抽象类: 实现公共方法,提供子类启动入口

    1. package com.example;
    2. import org.openqa.selenium.*;
    3. import org.openqa.selenium.chrome.ChromeDriver;
    4. import org.openqa.selenium.chrome.ChromeOptions;
    5. import java.text.SimpleDateFormat;
    6. import java.util.Date;
    7. import java.util.List;
    8. public abstract class WebCommonService implements CommonServiceApi{
    9. public SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
    10. public String path;
    11. public String url;
    12. public WebDriver driver;
    13. public WebCommonService(){
    14. init();
    15. }
    16. /**
    17. * 初始化
    18. */
    19. public void init(){
    20. System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe");
    21. ChromeOptions options=new ChromeOptions();
    22. options.addArguments("user-data-dir=D:/tmp/User Data");
    23. driver = new ChromeDriver(options);
    24. }
    25. /**
    26. * 入口
    27. */
    28. public abstract void start();
    29. /**
    30. * **************************************************************************
    31. * **************************************************************************
    32. *
    33. * 通用函数
    34. *
    35. * **************************************************************************
    36. * **************************************************************************
    37. */
    38. public void log(Object string){
    39. System.out.println("["+sf.format(new Date())+"]:"+string);
    40. }
    41. public void _wait(long SSS){
    42. try {
    43. Thread.sleep(SSS);
    44. } catch (InterruptedException e) {
    45. e.printStackTrace();
    46. }
    47. }
    48. public boolean isEmpty(Object o){
    49. if(o==null)return true;
    50. if(o instanceof String){
    51. return "".equals(o);
    52. }else{
    53. return false;
    54. }
    55. }
    56. /**
    57. * **************************************************************************
    58. * **************************************************************************
    59. *
    60. * 元素api操作
    61. *
    62. * **************************************************************************
    63. * **************************************************************************
    64. */
    65. public WebElement getElementById(String id){
    66. return driver.findElement(By.id(id));
    67. }
    68. public List getElementsByClassName(String className){
    69. return driver.findElements(By.className(className));
    70. }
    71. public List getElementsByTagName(String tagName){
    72. return driver.findElements(By.tagName(tagName));
    73. }
    74. public WebElement getElementsByName(String name){
    75. return driver.findElement(By.name(name));
    76. }
    77. public WebElement getElementById(WebElement w,String id){
    78. return w.findElement(By.id(id));
    79. }
    80. public List getElementsByClassName(WebElement w,String className){
    81. return w.findElements(By.className(className));
    82. }
    83. public List getElementsByTagName(WebElement w,String tagName){
    84. return w.findElements(By.tagName(tagName));
    85. }
    86. public WebElement getElementsByName(WebElement w,String name){
    87. return w.findElement(By.name(name));
    88. }
    89. public T getFirstElement(List list){
    90. if(list==null||list.size()<1)return null;
    91. return list.get(0);
    92. }
    93. public WebElement getElementByXpath(String path){
    94. return driver.findElement(By.xpath(path));
    95. }
    96. public WebElement getElementByXpath(WebElement w,String path){
    97. return w.findElement(By.xpath(path));
    98. }
    99. public WebElement getParentElement(WebElement w){
    100. return getElementByXpath(w,"..");
    101. }
    102. public void setInputValue(WebElement w,String string){
    103. if(isEmpty(string)){
    104. ((JavascriptExecutor)driver).executeScript("arguments[0].value=arguments[1]", w, "");
    105. }else {
    106. ((JavascriptExecutor)driver).executeScript("arguments[0].value=arguments[1]", w, string);
    107. }
    108. //这两个操作是用来触发vue的数据刷新机制
    109. w.sendKeys(Keys.SPACE);
    110. if(!equalsText(w,string)){//按一下空格键,发现输入框内容发生变化,删除输入的空格,没变化说明没添加上空格,不用删除
    111. w.sendKeys(Keys.BACK_SPACE);
    112. }
    113. }
    114. public boolean equalsText(WebElement w,String text){
    115. return w!=null&&text.equals(w.getText());
    116. }
    117. public boolean equalsAttribute(WebElement w,String name,String value){
    118. return w!=null&&value.equals(w.getAttribute(name));
    119. }
    120. }

    实现一个脚本类

    1. package com.example.test;
    2. import com.example.WebCommonService;
    3. import org.openqa.selenium.WebElement;
    4. import java.util.List;
    5. public class TestScript extends WebCommonService {
    6. @Override
    7. public void start() {
    8. driver.get("http://localhost:81/index2.html");
    9. //点击素材实用
    10. List list= getElementsByClassName("el-menu-item");
    11. for(WebElement w:list){
    12. WebElement span=getFirstElement(getElementsByTagName(w,"span"));
    13. if(equalsText(span,"素材实用")){
    14. w.click();
    15. break;
    16. }
    17. }
    18. list.clear();
    19. //切换iframe
    20. list= getElementsByClassName("el-tab-pane");
    21. for(WebElement w:list){
    22. if(!equalsAttribute(w,"aria-hidden","true")){
    23. WebElement frame=getFirstElement(getElementsByTagName(w,"iframe"));
    24. driver.switchTo().frame(frame);
    25. break;
    26. }
    27. }
    28. list.clear();
    29. //打开编辑模式
    30. WebElement switchButton=getFirstElement(getElementsByClassName("el-switch"));
    31. if(switchButton!=null){
    32. switchButton.click();
    33. }
    34. //打开微博热榜编辑页面
    35. list= getElementsByClassName("a1");
    36. for(WebElement w:list){
    37. if(equalsText(w,"微博热榜")){
    38. w.click();
    39. }
    40. }
    41. list.clear();
    42. //把 微博热榜 改为 微博微博
    43. WebElement dialogBody=getFirstElement(getElementsByClassName("el-dialog__body"));
    44. WebElement titleInput=getFirstElement(getElementsByTagName(dialogBody,"input"));
    45. setInputValue(titleInput,"微博热榜");
    46. _wait(1000);
    47. //保存
    48. list=getElementsByClassName(getParentElement(dialogBody),"el-button--primary");
    49. for(WebElement w:list){
    50. WebElement span=getFirstElement(getElementsByTagName(w,"span"));
    51. if(equalsText(span,"保存") ){
    52. w.click();
    53. break;
    54. }
    55. }
    56. list.clear();
    57. //处理二次确认弹窗
    58. WebElement confirm=getFirstElement(getElementsByClassName("el-message-box__wrapper"));
    59. list=getElementsByTagName(confirm,"button");
    60. for(WebElement w:list){
    61. WebElement span=getFirstElement(getElementsByTagName(w,"span"));
    62. if(equalsText(span,"确定")){
    63. w.click();
    64. break;
    65. }
    66. }
    67. //关闭
    68. list=getElementsByClassName(getParentElement(dialogBody),"el-button--default");
    69. for(WebElement w:list){
    70. WebElement span=getFirstElement(getElementsByTagName(w,"span"));
    71. if(equalsText(span,"取 消")){
    72. w.click();
    73. break;
    74. }
    75. }
    76. list.clear();
    77. }
    78. public static void main(String[] args) {
    79. new TestScript().start();
    80. }
    81. }

  • 相关阅读:
    leetcode-28. 实现 strStr()-20220829-KMP算法
    Java中常用的一些业务校验
    acunetix wvs网站漏洞扫描 XSS CSOR处理
    Layui快速入门之第二节布局容器(固定宽度与完整宽度)
    CNC 3D浮雕 Aspire 11.55 Crack
    Chiitoitsu
    systemd
    如何将数据库某列的值(如日期)作为表格的列名
    软件测试工程师如何对算法做测试?
    导数的定义和介绍
  • 原文地址:https://blog.csdn.net/qq_43319748/article/details/127724786