十五、selenium的使用

1、什么是selenium

  Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏。

2、PhantomJS的介绍

  PhantomJS 是一个基于Webkit的“无界面”(headless)浏览器,它会把网站加载到内存并执行页面上的 JavaScript。下载地址

3、Chromedriver的介绍

  Chromedriver 也是一个能够被selenium驱动的浏览器,但是PhantomJS的区别在于它是有界面的。下载地址

4、driver的安装

  • 操作系统 (浏览器) 浏览器的driver 三者要版本相符
  • pip insatll selenium

5、简单使用

	from selenium import webdriver
	driver = webdriver.Chrome(chromedriver_path)
	driver.get(url)
	driver.quit()

程序实例:

import time
from selenium import webdriver

driver = webdriver.Chrome(executable_path='/home/worker/Desktop/driver/chromedriver')
driver.get("https://www.baidu.com/")

driver.find_element_by_id('kw').send_keys('python')
driver.find_element_by_id('su').click()

time.sleep(6)
driver.quit()

6、定位的方法

driver.find_element_by_id()
driver.find_element_by_class_name()
driver.find_element_by_css_selector()
driver.find_element_by_link_text() # 根据 链接的文本内容 去定位标签
driver.find_element_by_partial_link_text() # 根据 链接的部分文本内容 定位标签对象
driver.find_element_by_name()
driver.find_element_by_tag_name()
driver.find_element_by_xpath()
# find_elements_... 表示获取全部

程序实例:

from selenium import webdriver

# driver = webdriver.Chrome('/home/worker/Desktop/driver/chromedriver')
driver = webdriver.PhantomJS('/home/worker/Desktop/driver/phantomjs')

driver.get("https://www.douban.com/")

ret1 = driver.find_element_by_id("anony-nav")
print(ret1)

ret2 = driver.find_elements_by_id("anony-nav")
print(ret2)
#输出为:[<selenium.webdriver.remote.webelement.WebElement (session="ea6f94544ac3a56585b2638d352e97f3", element="0.5335773935305805-1")>]

ret3 = driver.find_elements_by_xpath("//*[@id='anony-nav']/h1/a")
print(len(ret3))
#输出为:1

ret4 = driver.find_elements_by_tag_name("h1")
print(len(ret4))
#输出为:1

ret5 = driver.find_elements_by_link_text("下载豆瓣 App")
print(len(ret5))
#输出为:1

ret6 = driver.find_elements_by_partial_link_text("豆瓣")
print(len(ret6))
#输出为:24

driver.save_screenshot('douban.png')

input('sss')
driver.quit()

7、driver的其它的方法或属性

driver.page_source # 查看网页源码
driver.get_cookies() # 获取当前标签页的全部cookies
driver.current_url # 获取当前页面的url
driver.close() #退出当前页面
driver.quit()  #退出浏览器
driver.forward()
driver.back()

8、提取文本内容、属性值

获取文本:element.text # 获取的是element中所有的文本内容!
获取属性值:element.get_attribute(“href”)

如果提取的是链接的url地址,会自动拼接再返回
也可以利用driver.page_source来进行提取

9、获取当前标签页中的所有cookies

driver.get_cookies()
# 利用selenium去登陆,获取cookies,再利用requests携带cookies发送请求获取响应
# 返回字典构成的列表
{cookie['name]:cookie['value'] 
 for cookie in driver.get_cookies()}
#删除一条cookie
driver.delete_cookie("CookieName")
# 删除所有的cookie
driver.delete_all_cookies()

程序实例:

from selenium import webdriver

# 实例化driver,传入chromedriver的路径
driver = webdriver.Chrome('/home/worker/Desktop/driver/chromedriver')
# 访问url
url = 'https://www.baidu.cn'
driver.get(url)


# print(driver.get_cookies())
# cookies_dict = {cookie['name']:cookie['value'] for cookie in driver.get_cookies()}
# print(cookies_dict)


driver.delete_cookie('BIDUPSID')

print({cookie['name']:cookie['value'] for cookie in driver.get_cookies()})

driver.delete_all_cookies()

print(driver.get_cookies())

input('ss')
driver.quit()

10、页面等待

手动等待不断判断页面中某个标签是否出现
强制等待 <time.sleep()>

显式等待
	# 20 表示最长时间 0.5表示刷新频率
	# By.LINK_TEXT == driver.find_element_by_link_text()
	WebDriverWait(driver,20,0.5).until(
	    EC.presence_of_element_located((By.LINK_TEXT, 'CSDN')))  
	print driver.find_element_by_link_text('CSDN').get_attribute('href')
	driver.close() 
隐式等待
	driver.implicitly_wait(20)
	设置js加载时长限制
	图片加载时长限制
	html加载时长限制

11、让selenium控制浏览器执行js代码

driver.execute_script(js_str)

程序实例:

import time
from selenium import webdriver


dirver = webdriver.Chrome("/home/python/Desktop/工具/chromedriver")

dirver.get("https://www.taobao.com")
i = 0
while True:
    i += 1
    js = "window.scrollTo(0,document.body.scrollTop={})".format(500*i)
    dirver.execute_script(js)
    time.sleep(2)
    try:
        element = dirver.find_element_by_xpath("//div[@class='goods-inner']/h3[1]/img[1]")
        print(element.get_attribute('title'))
        break
    except Exception as e:
        print(e)

# print(dirver.page_source)

dirver.quit()



12、switch

# 1. 获取当前所有的窗口的id字符串构成的list
current_windows = driver.window_handles
# 2. 根据窗口列表索引进行切换
driver.switch_to.window(current_windows[1])

# 3. html中如果嵌套html,需要把焦点切换到相应的Html中,才能进行操作
# frame标签 iframe标签的 切入 以及 切出
login_frame = driver.find_element_by_id('login_frame') # 定位frame元素
driver.switch_to.frame(login_frame) # 转向到该frame中

程序实例:

import time
from selenium import webdriver

driver = webdriver.Chrome(executable_path='/home/worker/Desktop/driver/chromedriver')
driver.get("https://www.baidu.com/")

time.sleep(1)
driver.find_element_by_id('kw').send_keys('python')
time.sleep(1)
driver.find_element_by_id('su').click()
time.sleep(1)

# 通过执行js来新开一个标签页
js = 'window.open("https://www.sogou.com");'
driver.execute_script(js)
time.sleep(1)
print(driver.current_url) # 可以根据当前的url来确定此时driver焦点所在哪个标签页!

# 1. 获取当前所有的窗口
windows = driver.window_handles
print(windows)

time.sleep(2)
# 2. 根据窗口索引进行切换
driver.switch_to.window(windows[0])
time.sleep(2)
driver.switch_to.window(windows[1])

time.sleep(6)
driver.quit()

13、chromedriver的无界面(headless)模式

option = webdriver.ChromeOptions()
option.add_argument('--headless') # 开启无界面模式
option.add_argument('--disable-gpu') # 禁用显卡
driver = webdriver.Chrome(executable_path='/home/worker/Desktop/driver/chromedriver',chrome_options=option)
import time
from selenium import webdriver
# 创建一个配置对象
option = webdriver.ChromeOptions()
option.add_argument('--headless')  # 开启无界面模式
option.add_argument('--disable-gpu') # 禁用gpu ,可以解决一些莫名的问题
option.add_argument('--user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36') # 禁用gpu ,可以解决一些莫名的问题
# proxy_str = '115.182.212.169:8080'
# option.add_argument('--proxy-server=https://{}'.format(proxy_str)) # 使用代理ip
# option.set_headless() # 无界面模式的另一种开启模式

driver = webdriver.Chrome('/home/python/Desktop/工具/chromedriver', chrome_options=option)

driver.get('https://mail.qq.com')

print(driver.find_element_by_xpath('//a').get_attribute('href'))
time.sleep(2)
login_frame = driver.find_element_by_id('login_frame')
elements = driver.switch_to_frame(login_frame)

driver.find_element_by_id('u').send_keys('1777888852')
time.sleep(2)
driver.find_element_by_id('p').send_keys('123456789')
time.sleep(1)

driver.find_element_by_id('login_button').click()

input('333')

driver.quit()

猜你喜欢

转载自blog.csdn.net/weixin_42633359/article/details/85011156