python+selenium 用法详解

版权声明:转载请注明出处 https://blog.csdn.net/qq_42019406/article/details/82147377

1.selenium是一个用于网络应用程序测试的工具
2. 安装

 >>pip install selenium

  下载chromedriver驱动,这里要注意chrome浏览器与chromedriver的版本要一致,否则运行selenium会报错。

 chromedriver版本----------支持的Chrome版本
v2.30----------------------------v58-60
v2.29----------------------------v56-58
v2.28----------------------------v55-57
v2.27----------------------------v54-56
v2.26----------------------------v53-55
v2.25----------------------------v53-55
v2.24----------------------------v52-54
v2.23----------------------------v51-53
v2.22----------------------------v49-52
v2.21----------------------------v46-50
v2.20----------------------------v43-48
v2.19----------------------------v43-47
v2.18----------------------------v43-46
v2.17----------------------------v42-43
v2.13----------------------------v42-45
v2.15----------------------------v40-43
v2.14----------------------------v39-42
v2.13----------------------------v38-41
v2.12----------------------------v36-40
v2.11----------------------------v36-40
v2.10----------------------------v33-36
v2.9------------------------------v31-34
v2.8------------------------------v30-33
v2.7------------------------------v30-33
v2.6------------------------------v29-32
v2.5------------------------------v29-32
v2.4------------------------------v29-32

3.打开浏览器

# !/usr/bin/python
from selenium import webdriver
import time
dr = webdriver.Chrome()  ##定义要打开的浏览器
dr.get('http://www.baidu.com') ## get(url)请求的url
time.sleep(3)
dr.set_window_size(1000,1000)  ###设置浏览器的尺寸
# dr.maximize_window()  ##浏览器最大化
# dr.set_window_position(1000,500) ###定义浏览器出现的位置
print(dr.title)  ##title 获取请求页面的标题  一般用来做断言
print(dr.current_url) ##获取请求页面的url   一般用来做断言
time.sleep(3)
dr.get('http://www.www.baidu.com')
time.sleep(3)
dr.back()  ##返回上一次的页面
time.sleep(3)
dr.forward() ##前进到第二次打开的页面
time.sleep(3)
dr.close()  ##close关闭浏览器
            ##quit关闭浏览器,又断开跟webdriver的连接

结果如下:
这里写图片描述

3.1. selenium 定位方式
3.1.1 使用id属性定位

# !/usr/bin/python
from selenium import webdriver
import time
dr = webdriver.Chrome()
dr.get('http://www.baidu.com')
time.sleep(3)
dr.find_element_by_id('kw').send_keys('python') #id:指的是元素的id属性,每一个元素的id都是唯一的,通过id的定位方式是最准确的
time.sleep(2)
dr.find_element_by_id('su').click()#模拟用户的操作:1.输入(send_keys(内容))2.点击(click())3.清空(clear())
time.sleep(3)
dr.close()

3.1.2 使用class属性定位

# class_name   指的是class属性,如果class属性是唯一的话,可以用来定位元素,
#                                  如果不唯一,一般用clas属性定位一组元素
# !/usr/bin/python
from selenium import webdriver
import time
dr = webdriver.Chrome()
dr.get('https://www.baidu.com')
time.sleep(3)
dr.find_element_by_class_name('s_ipt').send_keys('python')
time.sleep(2)
dr.find_element_by_class_name('su').click()
time.sleep(3)
dr.close()

3.1.3 使用xpath属性定位

# Xpath 路径 xpath 指的是元素在xml文件中的路径   通过路径的方式进行定位 可以在F12中复制xpayh路径
# !/usr/bin/python
from selenium import webdriver
import time
dr = webdriver.Chrome()
dr.get('http://www.baidu.com')
time.sleep(3)
dr.find_element_by_xpath('//*[@id="kw"]').send_keys('python')
time.sleep(2)
dr.find_element_by_xpath('//*[@id="su"]').click()
time.sleep(3)
dr.close()

3.1.4 使用tag-name属性定位

###tag_name 指的是通过元素的标签去定位
###元素的标签一般都不唯一,通常用来定位一组元素,定位一组元素是要用find_elements_by_tag_name,需要带S
# !/usr/bin/python
from selenium import webdriver
import time
dr = webdriver.Chrome()
dr.get('http://www.baidu.com')
time.sleep(3)
dr.find_element_by_tag_name('area')##不加s是用来定位单个的
dr.close()

3.1.5 使用name属性定位

###name指的是元素的name属性,通常是唯一的
# !/usr/bin/python
from selenium import webdriver
import time
dr = webdriver.Chrome()
dr.get('http://www.baidu.com')
time.sleep(3)
dr.find_element_by_name('wd').send_keys('python')##不加s是用来定位单个的
dr.find_element_by_id('su').click()
dr.close()

3.1.6 使用css路径定位

#css指的是元素在中的路径
# !/usr/bin/python
from selenium import webdriver
import time
dr = webdriver.Firefox()
dr.get('http://www.baidu.com')
time.sleep(3)
dr.find_element_by_css_selector('#kw').send_keys('python')##不加s是用来定位单个的
dr.find_element_by_css_selector('#su').click()
time.sleep(3)
dr.close()

3.1.7 使用text文本信息定位

###text,指的是元素的文本信息
# !/usr/bin/python
from selenium import webdriver
import time
dr = webdriver.Firefox()
dr.get('http://www.baidu.com')
time.sleep(3)
dr.find_element_by_link_text('hao123').click()##不加s是用来定位单个的
time.sleep(3)
dr.close()

3.1.8 通过partial_link_text模糊定位

# !/usr/bin/python
from selenium import webdriver
import time
dr = webdriver.Firefox()
dr.get('http://www.baidu.com')
time.sleep(3)
dr.find_element_by_partial_link_text('hao')###通过文本信息迷糊匹配
time.sleep(3)
dr.close()

3.2 定位一组元素

#定位一组元素   中心思想就是定位多个元素,选取自己想要的
# !/usr/bin/python
from selenium import webdriver
dr = webdriver.Firefox()
dr.get('http://www.baidu.com')
res=dr.find_elements_by_tag_name('a')###只要class属性是mnav的,全部获取到放到res列表中
for i in res:
    if i.get_attribute('text') == '视频':  ####获取某个属性的值
        i.click()
        break
dr.close()

3.3层级定位

###层级定位   中心思想:先定位大范围的元素,在从大范围中定位想要的
# !/usr/bin/python
from selenium import webdriver
dr = webdriver.Firefox()
dr.get('http://www.baidu.com')
res=dr.find_element_by_id('u1').find_elements_by_tag_name('a')###只要class属性是mnav的,全部获取到放到res列表中
for i in res:
    print(i.get_attribute('text'))  ####获取某个属性的值
dr.close()

3.4 切换页面(句柄)

###句柄  每产生一个tab页,都会有一个句柄来唯一标识这一页
##获取当前页面的句柄print(ds.current_window_handle)
# !/usr/bin/python
from selenium import webdriver
import time
ds=webdriver.Firefox()
ds.get('http://www.jd.com')
now=ds.current_window_handle  ###获取当前页面的句柄
time.sleep(2)
ds.find_element_by_xpath('//*[@id="J_cate"]/ul/li[2]/a[1]').click()
time.sleep(2)
all=ds.window_handles ##获取所有页面的句柄
print(all)
ds.switch_to_window(all[1])  ##切换页面
ds.find_element_by_xpath('/html/body/div[6]/div[1]/div[1]/div/div/dl[1]/dd/ul/li[1]/a').click()
ds.close()
time.sleep(2)
ds.switch_to_window(now)
ds.find_element_by_xpath('/html/body/div[1]/div[5]/div[1]/div[1]/div/ul/li[3]/a[1]').click()

3.5 切换框架

# !/usr/bin/python
from selenium import webdriver
import time
ds=webdriver.Firefox()
ds.get('http://qzone.qq.com/')
ds.switch_to_frame("login_frame")   ###切换到某一个框架中(只能用id,name,属性,如果没有的话 先定位到元素 ,在把元素传进去find_element_by_xpath)
# ds.switch_to_default_content()##退出当前框架,跳到最原始的页面中
ds.find_element_by_xpath('//*[@id="switcher_plogin"]').click()
qq=['1971065714','Ss0328@qq']
ds.find_element_by_xpath('//*[@id="u"]').send_keys(qq[0])
ds.find_element_by_xpath('//*[@id="p"]').send_keys(qq[1])
ds.find_element_by_xpath('//*[@id="login_button"]').click()
all=ds.window_handles ##获取所有页面的句柄
print(all)

3.6 对于弹出框的处理
示例为登录防火墙
弹出框是动态的js加载,只要把控制器切换到弹出框上面

##FW 登陆
# !/usr/bin/python
from selenium import webdriver
import time
one=webdriver.Chrome()
one.get('https://192.168.0.2:5009')
one.find_element_by_xpath('//*[@id="userLoginBox"]/form/ul/li[1]/input').send_keys('')
one.find_element_by_xpath('//*[@id="userLoginBox"]/form/ul/li[2]/input').send_keys('python@FW')
time.sleep(3)
dd=[]
a1=one.find_elements_by_class_name('nobody')
for i in a1:
    h = i.get_attribute('src')   ###获取某一个属性的值
    dd.append(h[-5])
one.find_element_by_xpath('//*[@id="input1"]').send_keys(dd)
one.find_element_by_xpath('//*[@id="userLoginBox"]/form/ul/li[4]/input[1]').click()
time.sleep(1)
###1.text  获取弹出框上面的文本信息
###2.accept   点击弹出框上面的确认按钮
###3.dismiss  点击弹出框上的取消按钮
###4.send_keys   向弹出框内输入内容
asd = one.switch_to_alert() ###切换警告框
print(asd.text)  ###获取弹出框的内容
asd.accept()   ###点击弹出框的确认
time.sleep(3)
one.close()

3.7控制鼠标动作
控制鼠标动作,示例京东网站商品导购
key_down。模拟按键按下
key_up。模拟按键弹起
click。点击
send_keys。输入
double_click。鼠标左键双击
click_and_hold。鼠标左键点击住不放
release。鼠标左键弹起,可以与click_and_hold配合使用
move_to_element。把鼠标移动到元素的中心点
content_click。鼠标右键点击
drag_and_drop。拖拽

# !/usr/bin/python
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains as aaa  ####控制鼠标动作
dr=webdriver.Chrome()
dr.get('http://jd.com')
dr.maximize_window()
sj=dr.find_element_by_xpath('//*[@id="J_cate"]/ul/li[2]/a[1]')  ###指向手机元素
aaa(dr).move_to_element(sj).perform()   ###把鼠标移到元素中心点,[.perform()开始执行]

3.8 智能等待
当查找元素或元素并没有立即出现的时候,设置一个元素,一个等待的时间,当智能等待查找到元素后,将直接进行下一步动作,当查找不到等待时间到时,就会报错。

###智能等待    设置一个最长的等待时间,设置一个等待的元素
###FW 登陆
from selenium import webdriver
from time import sleep
import selenium.webdriver.support.ui as ui  ###智能等待调用的类,as是重命名
one=webdriver.Chrome()
one.get('https://192.168.0.2:5001')
one.find_element_by_xpath('//*[@id="userLoginBox"]/form/ul/li[1]/input').clear()
one.find_element_by_xpath('//*[@id="userLoginBox"]/form/ul/li[1]/input').send_keys('administrator')
wait=ui.WebDriverWait(one,10) ###两个内容,最大时间和控制器
wait.until(lambda dr:dr.find_element_by_xpath('//*[@id="userLoginBox"]/form/ul/li[2]/input').is_displayed())
one.find_element_by_xpath('//*[@id="userLoginBox"]/form/ul/li[2]/input').send_keys('python@FW')
dd=[]
a1=one.find_elements_by_class_name('nobody')   ###定位四张验证码
for i in a1:
    h = i.get_attribute('src')   ###获取某一个属性的值
    dd.append(h[-5])
one.find_element_by_xpath('//*[@id="input1"]').send_keys(dd)
one.find_element_by_xpath('//*[@id="userLoginBox"]/form/ul/li[4]/input[1]').click()
sleep(3)
one.close()

3.9最后附上一个登录qq空间,破解滑块的代码

###破解滑块
# !/usr/bin/python
from selenium import webdriver
import time
from selenium.webdriver import ActionChains
dr = webdriver.Chrome()
dr.get('https://qzone.qq.com/')
dr.switch_to_frame('login_frame')   ##切换框架
dr.find_element_by_xpath('//*[@id="switcher_plogin"]').click()
time.sleep(2)
dr.find_element_by_xpath('//*[@id="u"]').send_keys('1971065714')
dr.find_element_by_xpath('//*[@id="p"]').send_keys('密码')
time.sleep(2)
dr.find_element_by_xpath('//*[@id="login_button"]').click()
time.sleep(2)
dr.find_element_by_xpath('//*[@id="newVcodeArea"]').click()

qq = dr.find_element_by_xpath('//*[@id="newVcodeIframe"]/iframe')
dr.switch_to_frame(qq)
action = ActionChains(dr)
try:
    for i in range(185,222):
        source=dr.find_element_by_xpath('//*[@id="tcaptcha_drag_button"]')#需要滑动的元素
        action.click_and_hold(source).perform()  #鼠标左键按下不放
        action.move_by_offset(i,0)#需要滑动的坐标
        action.release().perform() #释放鼠标
        time.sleep(3)
except:
    pass
time.sleep(2)

猜你喜欢

转载自blog.csdn.net/qq_42019406/article/details/82147377