Selenium基础总结

selenium

selenium 是一个 web 的自动化测试工具 ,我这里主要用它进行爬虫,因为传统的requests只能爬去静态网页的内容,而很多内容需要进入网页加载后才能显示,例如处理弹窗等等。

安装

安装库:

pip install selenium

安装 webdriver :

webdriver 相当于一个浏览器的内核。各大浏览器都可以下载。

Chrome 的下载地址:

https://sites.google.com/a/chromium.org/chromedriver/

or

http://chromedriver.storage.googleapis.com/index.html

注意 webdriver需要和对应的浏览器版本以及selenium版本对应

Webdriver版本 支持的Chrome版本
v2.41 v67-69
v2.40 v66-68
v2.39 v66-68
v2.38 v65-67
v2.37 v64-66
v2.36 v63-65
v2.35 v62-64
v2.34 v61-63
v2.33 v60-62

然后讲下载的 webdriver 放在python的根目录即可。

启动

普通启动

from selenium import webdriver

browser = webdriver.Chrome()
browser.get('http://www.baidu.com/')

Headless启动

即无形启动,官方文档中介绍,mac和linux环境要求chrome版本是59+,而windows版本的chrome要求是60+,同时chromedriver要求2.30+版本。

from selenium import webdriver


chrome_options = webdriver.ChromeOptions()
# 使用headless无界面浏览器模式
chrome_options.add_argument('--headless') //增加无界面选项
chrome_options.add_argument('--disable-gpu') //如果不加这个选项,有时定位会出现问题

# 启动浏览器,获取网页源代码
browser = webdriver.Chrome(chrome_options=chrome_options)
mainUrl = "https://www.taobao.com/"
browser.get(mainUrl)
print(f"browser text = {browser.page_source}")
browser.quit()

元素定位

  • id定位:find_element_by_id()

  • name定位:find_element_by_name()

  • class定位:find_element_by_class_name()

  • link定位:find_element_by_link_text()

  • partial link定位:find_element_by_partial_link_text()

  • tag定位:find_element_by_tag_name()

  • xpath定位:find_element_by_xpath()

  • css定位:find_element_by_css_selector()

#coding=utf-8
from selenium import webdriver
browser=webdriver.Firefox()
browser.get("http://www.baidu.com")
#########百度输入框的定位方式##########
#通过id方式定位
browser.find_element_by_id("kw").send_keys("selenium")
#通过name方式定位
browser.find_element_by_name("wd").send_keys("selenium")
#通过tag name方式定位
browser.find_element_by_tag_name("input").send_keys("selenium")
#通过partial link定位
browser.find_element_by_partial_link_text("教务").send_keys("selenium")
#通过class name方式定位
browser.find_element_by_class_name("s_ipt").send_keys("selenium")
#通过CSS方式定位
browser.find_element_by_css_selector("#kw").send_keys("selenium")
#通过xpath方式定位
browser.find_element_by_xpath("//input[@id='kw']").send_keys("selenium")
############################################
browser.find_element_by_id("su").click()
time.sleep(3)
browser.quit()

xpath定位

XPath 是一门在 XML 文档中查找信息的语言。

个人认为xpath定位方法比较全能。

  • 选取节点
表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
选取当前节点的父节点。
@ 选取属性。
路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点。
/bookstore 选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性。

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

路径表达式 结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()❤️] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang=‘eng’] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。
  • 选取未知节点

XPath 通配符可用来选取未知的 XML 元素。

通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。
路径表达式 结果
/bookstore/* 选取 bookstore 元素的所有子元素。
//* 选取文档中的所有元素。
//title[@*] 选取所有带有属性的 title 元素。
  • 选取若干路径
路径表达式 结果
//book/title | //book/price 选取 book 元素的所有 title 和 price 元素。
//title | //price 选取文档中的所有 title 和 price 元素。
/bookstore/book/title | //price 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

当class含有空格

#前面加(.)空格地方用点(.)来代替
self.driver.find_element_by_css_selector('.dtb-style-1.table-dragColumns').click()

等待

强制等待

sleep()

隐性等待

在一个时间范围内智能等待

# -*- coding: utf-8 -*-
from selenium import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(30)  # 隐性等待,最长等30秒
driver.get('http://baidu.com')

print(driver.current_url)
driver.quit()

显性等待

就是每隔几秒看看加载完没有

方法略

浏览器的控制

设置浏览器大小

browser.maximize_window() #最大化

browser.minimize_window() #最小化

browser.set_window_size(480, 800) #设置浏览器宽480、高800显示

浏览器前进后退

browser.forword()  #前进
 
browser.back() #后退

操作对象的几种方法

  • click——点击对象
  • send_keys——在对象上模拟按键输入
  • clear——清除对象的内容,如果可以的话
  • submit——提交对象的内容,如果可以的话
  • text——用于获取元素的文本信息

控制键盘

要想调用键盘按键操作需要引入 keys 包

from selenium.webdriver.common.keys import Keys
send_keys(Keys.TAB) # TAB
send_keys(Keys.ENTER) # 回车

#ctrl+a 全选输入框内容 
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')

#ctrl+x 剪切输入框内容 
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')

控制鼠标

引入方法

from selenium.webdriver.common.action_chains import ActionChains

ActionChains 常用方法:

perform()  #执行所有ActionChains 中存储的行为;
click()          #单机鼠标右箭
context_click()  #右击;
double_click()   #双击;
drag_and_drop()  #拖动;
move_to_element()  #鼠标悬停。

实例:

#定位到要双击的元素
qqq =driver.find_element_by_xpath("xxx") 
#对定位到的元素执行鼠标双击操作 
ActionChains(driver).double_click(qqq).perform()
   
    
#定位元素的原位置 
element = driver.find_element_by_name("source") 
#定位元素要移动到的目标位置 
target = driver.find_element_by_name("target")
#执行元素的移动操作 
ActionChains(driver).drag_and_drop(element, target).perform()      

定位到新页面

有时候点击进入一个新页面,需要利用窗口话柄定位到新的页面。

browser.switch_to.window(browser.window_handles[1])

定位下拉框

定位select类型下拉框

from selenium.webdriver.support.ui import Select
# 通过index进行选择
Select(driver.find_element_by_name("form:j_idt163")).select_by_index(1) 
# 通过value进行选择
Select(driver.find_element_by_name("form:j_idt163")).select_by_value("中风险")
# 通过选项文字进行选择
Select(driver.find_element_by_name("form:j_idt163")).select_by_visible_text("低风险")

selenium的拓展——appium

手机app自动化,也是十分强大,后期需要再研究。

发布了8 篇原创文章 · 获赞 12 · 访问量 6038

猜你喜欢

转载自blog.csdn.net/weixin_43631579/article/details/105240221