Selenium(上)

野见

关注

阅读 30

2022-04-24

Selenium是一个用于Web应用程序测试的工具。

Selenium WebDriver 原理:

Selenium Client Library:

Selenium自动化测试人员可以使用Java、Ruby、Python、C#等语言,利用它们提供的库来编写脚本。

JSON Wire Protocol Over HTTP Client:

JSON Wire Protocol是在HTTP服务器之间传输信息的REST风格的API。每个浏览器驱动程序(如FirefoxDriver、ChromeDriver等)都有它们各自的HTTP服务器。

Browser Drivers:

不同的浏览器都包含一个单独的浏览器驱动程序。浏览器驱动程序与相应的浏览器通信。当浏览器驱动程序接收到任何指令时,将在相应的浏览器中执行,响应信息将以HTTP的形式返回。

Browsers:

Selenium支持多种浏览器,如Firefox、Chrome、IE、Safari等。


  

(如果进不去谷歌商店)淘宝镜像 -- chromedriver -- 下载的版本要和浏览器的版本相匹配

 1.配置到环境变量path中  

2.移动放到代码里面


selemium的基本使用

from selenium import webdriver

使用selenium中webdriver的这样一个模块

webdriver -- 获取浏览器的对象

# 入门案例
from selenium import webdriver
import time

# webdriver-获取浏览器的对象
driver = webdriver.Chrome("chromedriver.exe")

# 准备一个网址
url = "https://www.baidu.com/"

driver.get(url)

time.sleep(5)
# 回收资源
driver.quit()


 获取元素的方式

  • id : find_element_by_id
  • name : find_element_by_name
  • class_name : find_element_by_class_name
  • tag_name :find_element_by_tag_name

# 查找元素(标签,标记,节点)  通过id
driver.find_element_by_id("kw").send_keys("美女")
driver.find_element_by_id("su").click()
# 通过name查找元素
driver.find_element_by_name("wd").send_keys("帅哥")
driver.find_element_by_name("su").click()  # 百度一下没有name,无法用name查找
driver.find_element_by_id("su").click()
# 通过class name 查找
driver.find_element_by_class_name("s_ipt").send_keys("美女")
driver.find_element_by_id("su").click()

用超链接(a标签):link_text,partial_link_text(部分定位)

# 定位a标签 -- link_test,partial_link_test(部分定位)
driver.find_element_by_link_text("hao123").click()
driver.find_element_by_partial_link_text("hao12").click()

 


 获取元素的方式-css选择器

# 通过CSS选择器的方式定位
driver.find_element_by_css_selector("#kw").send_keys("美女")    #id前缀是#
driver.find_element_by_css_selector(".s_ipt").send_keys("美女")  #class name就是.前缀了
driver.find_element_by_css_selector("[name = wd]").send_keys("美女")
driver.find_element_by_css_selector("[value = 百度一下]").click()


 获取元素的方式-xpath

xpath = xml path

  • 通过Chrome的调试工具,获得特定元素的xpath
    1. 修改得到的xpath表达式
    2. 通过 chrome的 xpath helper 扩展插件 匹配查看
# 通过xpath - xml path  ml-标记语言
# xml- extensive language 可拓展标记语言  html- 超文本标记语言
driver.find_element_by_xpath("//*[@id='sw']").send_keys("美女")
driver.find_element_by_xpath("//*[@id='su']").click()

推荐使用Chrom插件XPath Helper,用该插件预览xpath所提取的内容 

打开和关闭xpath helper的快捷键都是:ctrl + shift + x

打开之后页面上方有一个黑色的窗体,左边显示query,右边显示result

按住ctrl + shift ,然后移动鼠标就可以选择页面上的元素,还是非常方便的

被选中的元素会显示不同的颜色,query窗口中显示的就是xpath的值,选完以后放开ctrl 和shift键就可以了。

xpath helper除了可以获取页面元素的xpath地址,也可以验证用户自己写的xpath地址是否正确。query窗口可以手动输入和修改xpath地址。

如何判断输入的地址是正确的呢:

1、result窗口有显示对应的内容,而不是null

2、页面中对应的元素会变成黄色

复合以上两点,说明xpath写对了。


元素的其他操作

  • 元素操作

    1. clear() 清除文本
    2. send_keys() 模拟输入
    3. click() 单击元素
  • 元素属性获取

    1. size

      返回元素大小

    2. text

      获取元素的文本

    3. get_attribute()

      获取属性值

    4. is_display()

      判断元素是否可见

                     5. is_enabled()

                        判断元素是否可用

# 元素操作
from selenium import webdriver
import time

# webdriver-获取浏览器的对象
driver = webdriver.Chrome("chromedriver.exe")

# 准备一个网址
# https://www.baidu.com/
url = "https://www.baidu.com/"

driver.get(url)

driver.find_element_by_id("kw").send_keys("python")
time.sleep(3)
# 清除输入的文字
driver.find_element_by_id("kw").clear()

driver.find_element_by_id("kw").send_keys("美女")
driver.find_element_by_id("su").click()

# 打印元素的大小
print(driver.find_element_by_id("kw").size)
print(driver.find_element_by_id("kw").text)
print(driver.find_element_by_id("kw").is_enabled())
print(driver.find_element_by_id("kw").is_displayed())
print(driver.find_element_by_xpath("//*[text() = '新闻']").get_attribute("href"))

time.sleep(5)
# 回收资源
driver.quit()

   

 


浏览器的其他操作

  • 浏览器操作(方法)

    1. maximize_window() 最大化浏览器
    2. set_window_size(width,height) 设置浏览器宽、高(像素点)
    3. set_window_position(x,y) 设置浏览器位置,浏览器左上角相对于屏幕左上角位置
    4. back() 后退
    5. forward() 前进
    6. refresh() 刷新
    7. close() 关闭当前页面
    8. quit() 关闭浏览器
  • 浏览器信息(属性)

    1. title 获取页面title
    2. current_url 获取当前页面URL
# 最大化浏览器
driver.maximize_window()
# 设置浏览器的大小 1920*1080
driver.set_window_size(800,600)
# 设置浏览器的位置
driver.set_window_position(200,200)
# 浏览器后退
driver.back()
time.sleep(2)
# 浏览器前进
driver.forward()
time.sleep(2)
# 刷新浏览器
driver.refresh()
time.sleep(2)
# 关闭当前页面
driver.close()
time.sleep(5)
# 关闭浏览器
driver.quit()
print(driver.title)
print(driver.current_url)

完整代码:

# 浏览器的操作
from selenium import webdriver
import time

# webdriver-获取浏览器的对象
driver = webdriver.Chrome("chromedriver.exe")

# 准备一个网址
# https://www.baidu.com/
url = "https://www.baidu.com/"

driver.get(url)

# 最大化浏览器
driver.maximize_window()

# 设置浏览器的大小 1920*1080
# driver.set_window_size(800,600)
# 设置浏览器的位置
# driver.set_window_position(200,200)

print(driver.title)
print(driver.current_url)

driver.find_element_by_id("kw").send_keys("美女")
driver.find_element_by_id("su").click()
time.sleep(2)
print(driver.title)
print(driver.current_url)

# 浏览器后退
driver.back()
time.sleep(2)
# 浏览器前进
driver.forward()
time.sleep(2)
# 刷新浏览器
driver.refresh()
time.sleep(2)
print(driver.title)
print(driver.current_url)

driver.back()
driver.find_element_by_xpath("//*[text() = 'hao123']").click()
time.sleep(2)
# 关闭当前页面
driver.close()
time.sleep(5)
# 关闭浏览器
driver.quit()

等待

页面加载时间比代码执行时间慢,在翻页的时候或者加载新页面的时候,需要进行页面等待。不一定网页打开,所有的元素都在页面中了。 如果马上去找,可能出错。

强制等待:

time.sleep(sec)

1. 显式等待

1.导包

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import  expected_conditions as EC
from selenium.webdriver.common.by import By
# 2.显示等待:--导包
# 等待某个元素加载完成,每隔0.5s去检查一次,最多等待5s时间
WebDriverWait(driver,5).until(EC.presence_of_element_located(By.ID,"1"))
  • 每隔一定时间不断尝试查找元素
  • 找到了就返回
  • 如果超过指定时间还没找到就报错

        注意

  1. 此方法知道即可,相对麻烦
  2. 后面会用隐式等待代替

2. 隐式等待

# 3.隐式等待:
driver.implicitly_wait(5)
driver.find_element_by_id("1").click()

精彩评论(0)

0 0 举报