首页 > 其他 > 详细

selenium模块

时间:2019-04-22 17:14:32      阅读:157      评论:0      收藏:0      [点我收藏+]

安装

1.导入selenium模块
2.安装与浏览器版本对应的自动化测试工具 谷歌浏览器从ChromeDriver网站中找

基本使用

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options # 导入自定义配置模块


# 创建配置对象
chrome_options = Options()
# chrome_options.add_argument(‘window-size=1920x3000‘) #指定浏览器分辨率
chrome_options.add_argument(--disable-gpu) #谷歌文档提到需要加上这个属性来规避bug
chrome_options.add_argument(--hide-scrollbars) #隐藏滚动条, 应对一些特殊页面
chrome_options.add_argument(blink-settings=imagesEnabled=false) #不加载图片, 可以提升速度
# chrome_options.add_argument(‘--headless‘) #浏览器不提供可视化页面. linux下如果系统如果无界面不加这条会启动失败
chrome_options.add_experimental_option(excludeSwitches, [enable-automation])#取消浏览器驱动提示

#如果将浏览器驱动的路径设置到环境变量,可以不用传参数
#options 表示配置项
driver = Chrome(options=chrome_options)
driver.get(https://sports.qq.com/nba/) #访问腾讯体育
text = driver.page_source #获取页面的源代码 可以从中获取数据
print(text)

解析数据

# selenium提供了很多用于解析数据的函数

from selenium.webdriver import Chrome

driver = Chrome()
driver.get(http://www.baidu.com) #访问百度

tag = driver.find_element_by_class_name(index-logo-src) #通过类名拿到标签
# tag = driver.find_element_by_css_selector(‘.index-logo-src‘)

#标签的相关内容
print(tag.text)  #标签内容
print(tag.parent) #得到的是driver对象,不是父标签
print(tag.get_attribute(src))#拿到标签中src属性
print(tag.tag_name) #标签名

#一些特别的查找方式

#根据连接的文本查找
tag1 = driver.find_element_by_link_text(学术) #文本完全匹配
tag2 = driver.find_element_by_partial_link_text() #文本部分匹配

tag3 = driver.find_element_by_name(tj_trhao123) #属性名name=tj_trhao123
tag4 = driver.find_element_by_tag_name(body) #标签名称为body

#所有方法都带有s的版本,用来获取查找所有匹配,返回一个列表
res = driver.find_elements_by_class_name("mnav")
print(res)

#嵌套查找
tag5 = driver.find_element_by_class_name("tools")
tag6 = tag5.find_element_by_css_selector("#mHolder")

#与显示相关的属性
tag7 = driver.find_element_by_class_name("index-logo-src")
print(tag7.location) #位置信息
print(tag7.size)  #大小信息

#打开浏览器10s后自动关闭
import time
time.sleep(10)
driver.close()

#注意:通过class查找,driver.find_element_by_class_name() ()里面只能有一个值,不能存在空格隔开的多个值

等待元素加载

#完成百度搜索,先搜索redvelvet 1s 后搜索wendy

from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver = Chrome()
driver.get(https://www.baidu.com)

#隐式等待
driver.implicitly_wait(10)  #当要查找的某个元素不存在时 会等一会查找一次(轮询)直到找到该元素 如果超时,则会报错

#找到输入框
key_input = driver.find_element_by_id(kw)

#发送搜索信息
key_input.send_keys(redvelvet)

#回车
key_input.send_keys(Keys.ENTER)

#显示等待 明确等待某一个元素 满足某个条件
#等到页面上出现一个id为content_left 的元素为止,最长等待时间为10s
WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,content_left)))

#获取搜索结果 如果直接获取元素,可能因为页面没有加载完毕 导致获取失败,需要完成等待元素加载的操作
div = driver.find_element_by_id(content_left)
print(div)

import time
time.sleep(1)

key_input = driver.find_element_by_id(kw)
key_input.clear() #清空输入框
key_input.send_keys(wendy)
key_input.send_keys(Keys.ENTER)

动作链

from selenium.webdriver import Chrome
#创建动作链对象要导入的模块
from  selenium.webdriver import ActionChains

driver = Chrome()
driver.get("http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")

#隐式加载
driver.implicitly_wait(5)

#切换fream 页面分了好几个fream 我们要切换到标签所在的fream
driver.switch_to.frame("iframeResult")

#获取要拖动的标签
tag = driver.find_element_by_id(draggable)
#要拖动标签的位置
print(tag.location)

#获取目标位置标签
tag2 = driver.find_element_by_id(droppable)
#目标标签的位置
print(tag2.location)

#创建一个动作对象
asc = ActionChains(driver)

#x移动的距离
# dis = tag2.location[‘x‘] - tag.location[‘x‘]
# asc.click_and_hold(tag).perform()   #点击并且按住,perform表示执行这一动作
# asc.move_to_element(tag2).perform() #移动到指定标签位置
# asc.release().perform() #松手
#上述方式 线性移动 几乎瞬移 很容易被判断为机器人(程序)

#解决方法
asc.click_and_hold(tag).perform()
#循环逐渐移动
while tag.location[x] < tag2.location[x]:
    ActionChains(driver).move_by_offset(1,0).perform()  #每次朝x移动1
asc.release().perform()

#==============================================================================
#切换到当前fream的父辈fream
driver.switch_to.parent_frame()
#拿到父辈fream中的标签
driver.find_element_by_id(textareaCode)

补充

from selenium.webdriver import Chrome


driver = Chrome()
driver.get("https://www.baidu.com")

#1.执行js
driver.execute_script("alert(‘小电影‘)")

#2.导航前进后退
driver.get("https://www.baidu.com")
driver.get("https://www.qq.com")
driver.get("https://www.sina.com")

driver.back() #后退
driver.forward() #前进

#3.切换选项卡
#创建选项卡
driver.execute_script(window.open())
#切换到指定选项卡
driver.switch_to.window(driver.window_handles[1])
#在新的选项卡中加载下面页面
driver.get(https://www.qq.com)
#再次切换选型卡
driver.switch_to.window(driver.window_handles[0])

案例:爬取天猫汽车

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
import time

# 创建配置对象
chrome_options = Options()
# chrome_options.add_argument(‘window-size=1920x3000‘) #指定浏览器分辨率
chrome_options.add_argument(--disable-gpu) #谷歌文档提到需要加上这个属性来规避bug
# chrome_options.add_argument(‘--hide-scrollbars‘) #隐藏滚动条, 应对一些特殊页面
chrome_options.add_argument(blink-settings=imagesEnabled=false) #不加载图片, 可以提升速度

driver = webdriver.Chrome(options=chrome_options)
driver.get("https://pages.tmall.com/wow/car/act/zhizu")
driver.implicitly_wait(10)

# 天猫汽车是懒加载 需要滑动屏幕显示出对应数据再获取

# 这种方式 无法预知到底要按多少次下
# for i in range(1000):
#     driver.find_element_by_tag_name("body").send_keys(Keys.DOWN)

#平滑到底部 加载所有数据到页面 滑动速度太快,无法加载完善
#scrollTo可以把内容滚动到指定的坐标 ({})里面包含top和behavior两个参数
#document.body.clientHeight 获取页面高度
# driver.execute_script("""
# window.scrollTo({
#     top: document.body.clientHeight,
#     behavior:‘smooth‘
#     })
# """)

# 慢慢滑动
# 执行js获取总高度
height = driver.execute_script("return document.body.clientHeight")
# 已经滑动的距离
dis = 0
while dis < height:
    driver.execute_script("""
    window.scrollTo({
        top: %s,
        behavior: "smooth"
    });""" % dis)
    dis += 200
    #防止均匀加速
    time.sleep(0.2)

# 获取页头 四个推荐数据
big_div = driver.find_element_by_class_name("zebra-car-goods-1x1")
item_div = big_div.find_element_by_css_selector("div")
res = item_div.find_elements_by_css_selector(".item")
for i in res:
    print(i.find_element_by_tag_name("a").get_attribute("href"))
    print(i.find_element_by_css_selector(".img").get_attribute("src"))
    print(i.find_element_by_css_selector(".info .title").text)
    infos = i.find_elements_by_css_selector(".interest")
    print([k.text for k in infos])

# 获取汽车列表
sections = driver.find_elements_by_class_name("zebra-car-goods-1x2")
for s in sections:
    bloks = s.find_elements_by_css_selector(".block")
    for b in bloks:
        print(b.find_element_by_css_selector("a").get_attribute("href"))
        print(b.find_element_by_css_selector(".main").get_attribute("src"))
        print(b.find_element_by_css_selector(".title").text)
        infos = b.find_elements_by_css_selector(".interest")
        print([k.text for k in infos])
driver.close()

 

selenium模块

原文:https://www.cnblogs.com/lizeqian1994/p/10751172.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!