人工智能-Selenium

时间:2023-03-09 09:10:12
人工智能-Selenium

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE、Mozilla Firefox、Mozilla Suite等。

这个工具的主要功能包括:

测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建衰退测试检验软件功能和用户需求。支持自动录制动作和自动生成。Net、Java、Perl等不同语言的测试脚本。Selenium 是ThoughtWorks专门为Web应用程序编写的一个验收测试工具。

Selenium对网页的控制是基于各种前端元素的,在使用过程中,对于元素的定位是基础,只有准去抓取到对应元素才能进行后续的自动化控制。

Chrome安装过程:

在chrome浏览器的设置中,查看chrome的版本号,根据 : http://chromedriver.storage.googleapis.com/index.html下载chrome驱动(chromedriver.exe)

把下载并解压成功的驱动放在:   C:\Users\lenovo\AppData\Local\Google\Chrome\Application(chrome浏览器 安装目录中)

并配置环境变量:C:\Users\lenovo\AppData\Local\Google\Chrome\Application

Chrome例:

# 导报
from selenium import webdriver
import time
import requests
# 建立浏览器对象 指定浏览器
browser = webdriver.Chrome()
# 使用浏览器访问网站
browser.get('http://www.baidu.com')
# 向文本框填充文本
browser.find_element_by_id("kw").send_keys('男神鹏')
time.sleep(1)
# 模拟点击
browser.find_element_by_id("su").click()
time.sleep(5)
# 匹配多个节点 声明是样式选择器
# elist = browser.find_elements('css selector','h3')
elist = browser.find_elements_by_class_name('t')
text_str = elist[0].text
# print(elist[0].text)
# 点击链接
browser.find_element_by_link_text(text_str).click()
# browser.find_element_by_id("su").click()
# 暂停
time.sleep(50)
# 自动关闭浏览器
browser.quit()

Firefox 安装过程:

在Firefox浏览器的设置中,查看Firefox的版本号,根据 : https://github.com/mozilla/geckodriver/releases下载chrome驱动

(geckodriver.exe)

把下载并解压成功的驱动放在  :   D:\Mozilla Firefox(Firefox浏览器 安装目录中)

并配置环境变量:D:\Mozilla Firefox

Firefox例:

# 导报
from selenium import webdriver
import time
import requests
# 建立浏览器对象 指定浏览器
browser = webdriver.Firefox()
# 使用浏览器访问网站
browser.get('http://www.baidu.com')
# 向文本框填充文本
browser.find_element_by_id("kw").send_keys('https://www.cnblogs.com/chengdongzi/')
time.sleep(1)
# 模拟点击
browser.find_element_by_id("su").click()
time.sleep(5)
# 匹配多个节点 声明是样式选择器
# elist = browser.find_elements('css selector','h3')
elist = browser.find_elements_by_class_name('t')
text_str = elist[0].text
# print(elist[0].text)
# 点击链接
browser.find_element_by_link_text(text_str).click()
# browser.find_element_by_id("su").click()
# 暂停
time.sleep(50)
# 自动关闭浏览器
browser.quit()

总结:

xpath定位

xpath也分几种不同类型的定位方法。

一种是绝对路径定位。这种定位方式是利用html标签名的层级关系来定位元素的绝对路径,一般从<html>标签开始依次往下进行查找。

如百度搜索框的绝对路径xpath定位可以是这样的:

find_element_by_xpath("/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input")

还有一种是利用元素属性来进行xpath定位

例:搜索框利用id和name定位

find_element_by_xpath("//input[@id='kw']")

find_element_by_xpath("//*[@name='wd']")

其中的标签名input也可以用*来代替,而且只要是在该标签内,任意属性都可以,比如搜索框的maxlength属性:

find_element_by_xpath("//input[@maxlength='255']")

比如查找搜索框的时候发现其上级元素form又唯一的id方便定位,就可以先查找到form元素然后依次往下写路径:

find_element_by_xpath("//form[@id='form']/span/input")

这种定位方式的使用过程中,如果元素的单个属性无法确定其唯一性,可以用and连接多个属性去确定。

find_element_by_css_selector()

CSS属性定位

CSS属性定位可以比较灵活地选择控件的任意属性,定位方式也会比xpath快。

同样是那个百度搜索的例子,可以试一下:

driver.find_element_by_css_selector(".s_ipt").send_keys("selenium")

driver.find_element_by_css_selector("#su").click()

如果有css基础的话就应该可以看懂,一般class是用.标记,id是用#标记,标签名直接写具体标签名就好了。

css定位里面也可以通过属性或者组合方式定位:

driver.find_element_by_css_selector("input[autocomplete='off']").send_keys("Python")

driver.find_element_by_css_selector("span.bg.s_btn_wr>input#su").click()

具体说一下百度一下那个按钮的组合定位方式,这样写的定位顺序是这样的,先定位到一个class名为bg s_btn_wr的span标签,在这个标签下面有一个id为su的input标签,这样就定位到了。

值得注意的是,在css里面下级标签元素用>连接,如果class里面有空格,空格用.进行连接。

find_element_by_tag_name ()

通过标签名去定位的方式一般是这样的:find_element_by_tag_name("input")

可见仅仅通过标签名去定位时,一般一种标签在一个页面里面会出现不止一次甚至大量出现,这种定位方式的作用不是很大,所以用的也就比较少。

find_element_by_link_text()

find_element_by_partial_link_text()

这两种定位方式是专门用于定位超链接的,也就是对应html页面中的<a>标签,括号里传的值就是a标签中的超链接文字,两者的区别在于一个是完整的超链接文字,一个是可以只写部分超链接文字。

比如点击百度首页中右上角的新闻超链接,可以这样去定位:

driver.find_element_by_link_text("新闻").click()

driver.find_element_by_partial_link_text("闻").click()

By定位

find_element(By.ID,"kw")

find_element(By.NAME,"wd")

find_element(By.CLASS_NAME,"s_ipt")

find_element(By.TAG_NAME,"input")

find_element(By.LINK_TEXT,u"新闻")

find_element(By.PARTIAL_LINK_TEXT,u"新")

find_element(By.XPATH,"//*[@class='bg s_btn']")

find_element(By.CSS_SELECTOR,"span.bg s_btn_wr>input#su")

上面这些使用的前提是需要导入By类:from selenium.webdriver.common.by import By

最简单粗暴却失传已久的8种定位

driver.find_element("name","wd").send_keys("Selenium2")

driver.find_element("id","su").click()

by_id -> find_element("id","")

by_xpath -> find_element("xpath","")

by_link_text -> find_element("link text","")

by_partial_text -> find_element("partial link text","")

by_name -> find_element("name","")

by_tag_name -> find_element("tag name","")

by_class_name -> find_element("class name","")

by_css_selector -> find_element("css selector","")

elements复数定位

在上面的例举的八中基本定位方式种,都有对应的复数形式,分别是下面这些:

id复数定位find_elements_by_id()

name复数定位find_elements_by_name()

class复数定位find_elements_by_class_name()

tag复数定位find_elements_by_tag_name()

link复数定位find_elements_by_link_text()

partial_link复数定位find_elements_by_partial_link_text()

xpath复数定位find_elements_by_xpath()

css复数定位find_elements_by_css_selector()

这些复数定位方式每次取到的都是具有相同类型属性的一组元素,所以返回的是一个list队列,我们也可以利用这个去定位单个的元素。比如百度首页种,右上角有新闻、视频、地图、贴吧等一些链接,我们通过f12查看源码可以发现,这些链接都有共同的class, class="mnav"。