基本操作
from selenium import webdriver
#————————打开网页
b = webdriver.Chrome()#打开浏览器
b.get('https://www.baidu.com')
title = b.title #获得网页title
print(title)
www = b.current_url #返回打开的网址
print(www)
#————————定位元素
ele = b.find_element_by_id('kw') #根据id定位元素
ele = b.find_element_by_name('wd') #根据name定位元素
ele1 = b.find_element_by_class_name('')#根据class属性定位元素
ele2 = b.find_element_by_tag_name('input') #根据标签名定位元素
ele3 = b.find_element_by_link_text('帐号密码登录') #根据text定位元素
ele4 = b.find_element_by_partial_link_text('账号')#模糊text定位元素
ele5 = b.find_element_by_css_selector('')#根据css定位元素
#———————常用操作
ele.clear() #清空
ele.send_keys('李小龙') #模拟键盘输入
ele.back()#返回上一级
ele1.send_keys('刘德华')#模拟键盘输入
b.maximize_window()#最大化窗口
b.close() # 关闭当前窗口
b.quit() #关闭浏览器
#———————如果需要定位的元素在frame内,需要先进入frame
b.switch_to_frame('ptlogin_iframe')#先定位到frame里面
#———————遇到新标签窗口
now_handle = b.current_window_handle #先拿到原来窗口的句柄
print(now_handle)
all_handles = b.window_handles #拿到全部窗口的句柄
for handle in all_handles: #比对句柄
print(handle)
if handle != now_handle:
b.switch_to_window(handle) #跳转到新窗口
b.close() #关闭当前窗口
b.quit()#关闭浏览器
测试过程中,遇到原页面打开了新的页面的问题,用获取窗口句柄的方法来解决:
now_handle = driver.current_window_handle #得到当前窗口句柄
driver.find_element_by_id("baidu").click()
all_handles = driver.window_handles #获取所有窗口句柄
for handle in all_handles:
if handle != now_handle:
driver.switch_to_window(handle)
driver.find_element_by_id("kw").send_keys('python')
driver.find_element_by_id("su").click()
self.driver.implicitly_wait(30)
driver.switch_to_window(now_handle) #返回window.html
1 / 强制等待
用time.sleep()来强制等待多长时间
2 / 隐性等待
implicitly_wait(xx)
格式:
driver.implicitly_wait(
30
)
# 隐性等待,最长等30秒
隐形等待是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。注意这里有一个弊端,那就是程序会一直等待整个页面加载完成,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步,但有时候页面想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢,我仍得等到页面全部完成才能执行下一步,我想等我要的元素出来之后就下一步怎么办?有办法,这就要看selenium提供的另一种等待方式——显性等待wait了。
3 / 显性等待
WebDriverWait,配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。
它主要的意思就是:程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。
格式:
先导入模块:
from selenium.webdriver.support.ui import WebDriverWait
WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)
某论坛自动签到小练习:
#某论坛的自动签到小练习
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('http://www.sketchupbar.com/forum.php')
assert 'SketchUp'in driver.title
ele = driver.find_element_by_class_name('vm')
print(ele)
ele.click()
#由于发现正常的账号登陆,需要用滑条解锁认证,转而考虑用qq关联账号登陆。避过滑条。
driver.implicitly_wait(2) #隐性等待,最长2秒
driver.switch_to_frame('ptlogin_iframe')#先定位到frame里面
ele = driver.find_element_by_id('switcher_plogin') #定位到frame里面之后再定位具体元素
print(ele)
ele.click()
username = driver.find_element_by_id('u') #定位账号
username.send_keys('xxxxxxxxx') #输入账号
password = driver.find_element_by_id('p') #定位密码
password.send_keys('xxxxxxxxx') #输入密码
password.click()
enter = driver.find_element_by_id('login_button') #定位点击授权登陆
enter.click()
driver.implicitly_wait(10)#隐性等待,最长10秒
font = driver.find_element_by_class_name('font') #定位签到关键字
now_handle = driver.current_window_handle #获取当前窗口句柄
print(now_handle)
font.click()
all_handles = driver.window_handles #获取全部窗口句柄
for handle in all_handles:
print(handle)
if handle != now_handle:
driver.switch_to_window(handle) #跳转到新标签窗口
try:
jd = driver.find_element_by_id('JD_sign') #在新标签窗口进行签到操作
jd.click()
print('签到成功!!!')
driver.quit() # 关闭浏览器
except:
print('已经签到过啦!!!!')
driver.quit() # 关闭浏览器
xpath
模拟鼠标和输入事件
ActionChains 类,用于生成模拟用户行为
1 / 导入
from selenium.webdriver.common.action_chains import ActionChains
2 / 生成模拟用户行为对象
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get('http://www.maiziedu.com/')
ActionChains(driver) #生成模拟用户行为对象。driver就是生成的浏览器句柄
3 / perform() 执行存储的行为
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get('http://www.maiziedu.com/')
ele = driver.find_element_by_link_text('企业直通车')
ActionChains(driver).move_to_element(ele).perform() #生成模拟用户行为对象并移动到元素上。driver就是生成的浏览器句柄
sub_ele = driver.find_element_by_link_text('软件测试') #再在这个弹出页面中定位元素
处理Alter对象
比较详细用法的一篇文章:
点击打开链接
__________________________________________________________________________________________________
PhantomJs
讲解PhantomJs配置比较详细的一个博客点击打开链接
PhantomJs文档说明点击打开链接
官方文档 点击打开链接
配置headers 和proxy 点击打开链接
扩展阅读 点击打开链接
selenium支持的各种driver 点击打开链接
phantomjs设置请求头 点击打开链接
phantomjs设置请求头的小代码:
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.common.proxy import ProxyType
from headers import get_headers
dcap = dict(DesiredCapabilities.PHANTOMJS)
# #设置请求头
#dcap["phantomjs.page.settings.userAgent"]=("Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3")
dcap["phantomjs.page.settings.userAgent"] = (get_headers().get('User_Agent')) #随机获取请求头
#不载入图片
dcap["phantomjs.page.settings.loadImages"] = False
#设置代理
#打开带配置的浏览器
driver = webdriver.PhantomJS(desired_capabilities=dcap)
#driver.get('http://1212.ip138.com/ic.asp')
#driver.get('https://httpbin.org/get?show_env=1')
driver.get('http://www.myip.cn/judge.php')
# driver.get_screenshot_as_file('01.png')
print(driver.page_source)
driver.quit()
phantomjs超时设置:
phantomjs设置代理
点击打开链接
知乎上的这篇文章比较细,记录下来
# 不使用代理代打开ip138
browser=webdriver.PhantomJS(PATH_PHANTOMJS)
browser.get('http://1212.ip138.com/ic.asp')
print('1: ',browser.session_id)
print('2: ',browser.page_source)
print('3: ',browser.get_cookies())
# 利用DesiredCapabilities(代理设置)参数值,重新打开一个sessionId,我看意思就相当于浏览器清空缓存后,加上代理重新访问一次url
proxy=webdriver.Proxy()
proxy.proxy_type=ProxyType.MANUAL
proxy.http_proxy='1.9.171.51:800'
# 将代理设置添加到webdriver.DesiredCapabilities.PHANTOMJS中
proxy.add_to_capabilities(webdriver.DesiredCapabilities.PHANTOMJS)
browser.start_session(webdriver.DesiredCapabilities.PHANTOMJS)
browser.get('http://1212.ip138.com/ic.asp')
print('1: ',browser.session_id)
print('2: ',browser.page_source)
print('3: ',browser.get_cookies())
# 还原为系统代理
proxy=webdriver.Proxy()
proxy.proxy_type=ProxyType.DIRECT
proxy.add_to_capabilities(webdriver.DesiredCapabilities.PHANTOMJS)
browser.start_session(webdriver.DesiredCapabilities.PHANTOMJS)
browser.get('http://1212.ip138.com/ic.asp')
通过输出sessionid、cookies,可以发现,这两者都改变了。如果你要保留第一次访问的cookies,需要自己获取第一次cookies,然后在第二次访问前先delete_all_cookies, 然后add_cookie ,不要直接add_cookie,不然会产生两个name一样的cookie。
add_cookie时,phantomjs需要name/value/domain/path 写全(firefox只需要name和value),不然在2.11phantomjs中会发生异常"selenium.common.exceptions.WebDriverException: Message: You may only set cookies for the current domain"设置phantomjs代理Ip
#这个小程序用来示例设置phantomjs的proxy
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.common.proxy import Proxy
from selenium.webdriver.common.proxy import ProxyType
#未使用代理打开ip138
browser = webdriver.PhantomJS()
browser.get('http://1212.ip138.com/ic.asp')
print('1:',browser.session_id)
print('2:',browser.page_source)
print('3:',browser.get_cookies())
#使用代理
proxy = webdriver.Proxy()
proxy.proxy_type =ProxyType.MANUAL
proxy.http_proxy = '61.191.173.31:808'
#将代理设置添加到webdriver.DesiredCapabilities.PHANTOMJS中
proxy.add_to_capabilities(webdriver.DesiredCapabilities.PHANTOMJS)
browser.start_session(webdriver.DesiredCapabilities.PHANTOMJS)
browser.get('http://1212.ip138.com/ic.asp')
print('1:',browser.session_id)
print('2:',browser.page_source)
print('3:',browser.get_cookies())