Skip to content

授人以渔‐自定义修改你的代码

Ricarda Thompson edited this page Mar 15, 2024 · 4 revisions

SeleniumUtil-封装的工具类

  • sleep(int seconds)
    单位是秒,已经做了异常捕获,在代码中可以直接使用
  • initDriver()
    初始化驱动程序,默认会初始化:CHROME_DRIVER,ACTIONS和WAIT,后续会讲解这三个变量
  • SeleniumUtil.getWait(150)
    设置程序等待某元素的时间,单位是秒,默认给的是150,即等待元素150秒,如果150秒后还未出现,程序会抛异常

Constant-常量类

  • CHROME_DRIVER
    浏览器的驱动程序,默认使用了Chrome,所以用了这个名字,如果有人想用其他的浏览器,例如Edge或FireFox,自行修改即可(换了浏览器对应的驱动也要改)
  • ACTIONS
    执行的动作,本项目中一般使用操作鼠标(悬停),或者是按键盘的某些键达到某些效果
  • WAIT
    此常量表示的是等待时间,一般用法如下:
    WAIT.until(ExpectedConditions.presenceOfElementLocated(By.className("list-pagination-box")));
    以上代码的例子为等待class名为list-pagination-box的元素出现,presenceOfElementLocated方法的意思是等待这个元素在Dom树中出现
    换句话说这个元素出现了就立即通过,但此元素有可能在页面上还不可见
    
    WAIT.until(ExpectedConditions.elementToBeClickable(By.className("list-pagination-box")));
    以上代码的例子为等待class名为list-pagination-box的元素是否是可以点击的
    换句话说这个元素不仅出现而且可以点击的状态,才会通过
    

寻找页面上的元素

  • WebElement element = CHROME_DRIVER.findElement()【寻找单个元素】
这个方法会返回一个WebElement对象,如果找到多个,它会返回多个元素的第一个元素,我将返回的对象命名为了element

如果想要点击这个元素:element.click()

如果这个元素是个输入文本框,想要在这个元素发消息:element.sendkeys("你要发送的消息")

如果想要寻找这个元素的子元素: element.findElement(表达式),需要注意的是
由于页面可能会发生变化,有可能获取的元素和你页面看到的不一致

  • List elements = CHROME_DRIVER.findElements(表达式)【寻找多个元素】
    其实就是将上面的findElement方法加一个 s 即可,就会返回所有匹配的元素

选择元素的表达式

选择的方式有很多,这里推荐xpath与cssSelector
其他的还有例如:根据className,id,或者tag的选取方式,可以自行拓展

  • By.xpath
    xpath语法:https://www.cnblogs.com/wu-wu/p/11642992.html
    快速入门://表示的选取所有元素,./表示的选取当前节点的元素,比如你已经获取了某个元素,要在这个元素中查找就需要使用点杠选择
    如果自己写了一个表达式,怎么快速验证?
    使用Charome的xpath插件:xpathHelper 使用方式如下:
    image

  • 以上的例子中,搜索框的元素是<button class="btn btn-search xh-highlight" ka="search_box_index">搜索</button>
    所以表达式是://button[@class="btn btn-search"],即选取页面下所有的button元素,class名为btn btn-search的元素
    由于当前页面只有搜索按钮的属性是这个,所以就匹配到了,匹配到的元素,会变为黄色,可以用这样的方式,判断自己的表达式有没有效


  • 偷懒的方法:可以右键你要选择的元素,复制xpath、seletor等
    image

注意:直接复制的方式可能会只定位到某一个元素,如果页面发生细微的改变,就会导致表达式失效,所以仍然建议有能力的可以自己写表达式,最大程度的保证兼容性

同样,xpath如果不满足的情况可以使用seletor选择方式,具体根据自己需要即可


目前能想到的就这么多了,如果在使用的过程中碰到问题,欢迎提issue,有问题看到必回,感谢大家的支持