#########################
需要掌握两类1,元素的操作2,浏览器的操作
###############################
元素的常用操作方法1,clear() 清空2,sendkeys() 输入值,需要有参数,3,click() 点击
#############################
浏览器的常用操作
1,driver.maximize_window() 最大化窗口,一定要记住,
2,driver.set_window_size(100,100) 设置窗口大小
3,driver.set_window_position(100,200) 设置窗口位置,
4,back()
5,forward()
6,refresh()
7,close() 关闭单个窗口,
8,quit() 关闭所有的窗口,
#################################
学习webdriver的其他方法
1,获取元素的大小
2,获取元素的文本,这是非常重要的,往往是一个是否登陆成功的验证条件,
3,获取元素的属性值
4,判断元素是否为可见状态,
1,size 获取元素的大小,这是后面没有括号的,需要定位元素
2,text, 获取元素的文本,需要定位元素, 这是后面没有括号的,
3,title 获取页面的title 这就是预期的你进入页面的结果,不需要定位元素,没有括号,
4,current_url 获取当前的url,没有括号,
5,get_attribute('XXX') 获取属性的值,XXX要获取的属性, 比如获取一个超链接的url地址,href,
6,is_display() 判断元素是否可见,
7,is_enabled() 判断元素是否可用,比如一个按钮是否可以点击,或者你要点击同意之后才可用, 都是常用的场景,
##################################
webdriver的鼠标和键盘操作,这个了解,不常用,鼠标有一个常用的就是悬停,
1,context_click() 右击,但是你是不能选择弹出的菜单的,
2,double_click() 双击
3,drag_and_drop() 拖拽
4,move_to_element() 悬停
5,perform() 此方法用来执行上面的所有的方法
这是导入包,from selenium.webdriver.common.action_chains import ActionChains
实例化actionchains对象,action = ActionChains(driver)
调用右击方法,ac = action.context_click(element) 这个username是说在哪里进行右击,传递的是已经定位好的元素,element
执行 ac.perform()
可以写成一句:ActionChains(driver).context_click(element).perform()
悬停也是一样的,悬停之后会有效果,
######################################
鼠标拖拽需要单独说一下
1,首先要定义两个元素,source target
2,drag_and_drop(source,target) 这是传递两个地址,
3,drag_and_drop(source,500,0 ) 这是拖拽500个像素,
####################################
键盘操作,模拟键盘上面的组合操作,比如ctrl+c ctrl+v
导入包,from selenium.webdriver.common.keys import Keys
1,sendkeys(keys.BACK_SPACE) 删除键
2,sendkeys(keys.SPACE) 空格
3,sendkeys(keys.TAB)
4,sendkeys(keys.ESCAPE)
5,sendkeys(keys.ENTER)
6,sendkeys(keys.CONTROL,'a')
7,sendkeys(keys.CONTROL,'c')
#######################################
元素等待:1,元素等待,这是非常重要的, 如果在加载是操作不到的,所以要等待加载完,然后才做, 这种有显示等待,隐式等待
2,不设置等待会报出异常,因为找不到元素, 和网速有关系,
显式等待, 这种方法比较复杂,不常用,我们常用的是隐式等待,我们工作中也是使用隐式等待,
1,导包
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
2,ctrl+alt+空格,导入包
ctrl+p 提示参数
#######################################
from selenium importwebdriverfrom selenium.webdriver.common.by importByfrom selenium.webdriver.common.action_chains importActionChainsfrom selenium.webdriver.common.keys importKeysfrom selenium.webdriver.support.wait importWebDriverWaitfrom selenium.webdriver.support importexpected_conditions as ECfrom time importsleep#实例化浏览器
driver =webdriver.Firefox()
driver.get("https://www.baidu.com")
element= (By.CSS_SELECTOR,'#kw')
WebDriverWait(driver,10).until(EC.presence_of_element_located(element)).send_keys('admin')
sleep(2)
driver.quit()
可以分开写:
driver=webdriver.Firefox()
driver.get("https://www.baidu.com")
element= (By.CSS_SELECTOR,'#kw')
wait= WebDriverWait(driver,10)
element=wait.until(EC.presence_of_element_located(element))
element.send_keys('admin')
sleep(2)
driver.quit()
如果找不到元素,会报出一个异常,
######################################
隐式等待1,作用于全部的元素,显示等待是作用于一个元素的,#实例化浏览器
driver =webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.implicitly_wait(10) #这里设置10秒,工作中一般设置30秒,
element = driver.find_elements_by_css_selector('#kw').send_keys('123')
sleep(2)
driver.quit()
所以我们在写的时候,打开页面,
先写最大化窗口
之后就是写隐式等待,
#################################
下拉框,警告框,滚动条的操作
掌握调用js的方法
###############################
from selenium importwebdriverfrom selenium.webdriver.common.by importByfrom selenium.webdriver.common.action_chains importActionChainsfrom selenium.webdriver.common.keys importKeysfrom selenium.webdriver.support.wait importWebDriverWaitfrom selenium.webdriver.support importexpected_conditions as ECfrom time importsleep#实例化浏览器
driver =webdriver.Firefox()
driver.get("https://www.baidu.com")#select的操作#第一种方式 tag_name 定位
tags = driver.find_elements_by_tag_name('option')for tag intags:if tag.get_attribute('value') == 'sh':
tag.click()if tag.text =='重庆':
tag.click()#这种方式,不能切换,因为for循环是从上往下的,
#第二种方式 css 定位
driver.find_elements_by_css_selector('[value = "sh"]').click()
driver.find_elements_by_css_selector('[value = "cq"]').click()
driver.find_elements_by_css_selector('[value = "bj"]').click()#这种方式如果有300个城市怎么办?
#第三种方法 select 这是专门用来select标签诞生的,#有三种方法:#select_by_index()#select_by_value()#select_by_visible_value()#记住这三种方法是直接就选中了,不需要再去点击了,
from selenium.webdriver.support.select importSelect
selectEle= driver.find_elements_by_css_selector('select')
select=Select(selectEle)
select.select_by_index(1)
select.select_by_index(2)
select.select_by_index(3)
select.select_by_value('sh')
select.select_by_value('bj')
select.select_by_visible_text('上海')
sleep(2)
driver.quit()
########################################
from selenium importwebdriverfrom selenium.webdriver.common.by importByfrom selenium.webdriver.common.action_chains importActionChainsfrom selenium.webdriver.common.keys importKeysfrom selenium.webdriver.support.wait importWebDriverWaitfrom selenium.webdriver.support importexpected_conditions as ECfrom time importsleep#实例化浏览器
driver =webdriver.Firefox()
driver.get("https://www.baidu.com")#警告框#text 获取文本, 这是没有括号的,#accept() 确定#dismiss() 取消
#想要使用这三种方法,要先获取这个警告框,#alertEle = driver.find_elements_by_css_selector('#alert') #定位警告框
alertEle.click() #点击
alert = driver.switch_to.alert #切换到警告框上,#然后就可以使用这三个方法了,
text = alert.text #需要一个变量接收
print(text)
alert.accept()
alert.dismiss()#取消和确定,不能同时使用的,
sleep(2)
driver.quit()
#######################################
from selenium importwebdriverfrom selenium.webdriver.common.by importByfrom selenium.webdriver.common.action_chains importActionChainsfrom selenium.webdriver.common.keys importKeysfrom selenium.webdriver.support.wait importWebDriverWaitfrom selenium.webdriver.support importexpected_conditions as ECfrom time importsleep#实例化浏览器
driver =webdriver.Firefox()
driver.get("https://www.baidu.com")#滚动条的操作#提供了js脚本调用方法,所以可以js控制滚动条
#最底层#js1 = "window.scrollTo(0,1000)" # window是窗口句柄,scroll这是滚动条的意思,第一个0是距离最左侧0, 第二个是距离最顶部1000#最顶层#js1 = "window.scrollTo(0,0)"#执行#driver.execute_script(js1)
js1= "window.scrollTo(0,1000)"driver.execute_script(js1)
sleep(2)
driver.quit()
########################################
frame表单的切换:
#实例化浏览器
driver =webdriver.Firefox()
driver.get("https://www.baidu.com")#frame表单的切换:#1,页面里面有套了页面,你需要切换进入frame才可以操作里面的元素,#2,frame是引用了另一个页面,
#方法:#driver.switch_to.frame('frame_name') # 里面是frame的name#driver.switch_to.default_content() # 恢复到默认页面,
driver.switch_to.frame('name')
driver.switch_to.default_content()
sleep(2)
driver.quit()
###################################
窗口的切换和截图
#实例化浏览器
driver =webdriver.Firefox()
driver.get("https://www.baidu.com")#截图保存,一般配合断言的使用
#多窗口切换#提供了三种方法#current = driver.current_window_handle # 获取当前窗口的句柄#handle = driver.window_handles # 获取所有的窗口的句柄#driver.switch_to.window(handle) # 切换到指定句柄
current=driver.current_window_handle
driver.find_element_by_link_text('百度').click()for hanle indriver.window_handles:if hanle !=current:
driver.switch_to.window(hanle)#下面就是操作
driver.find_elements_by_css_selector('#id').send_keys('123')#截图
driver.get_screenshot_as_file('../img/123.png') #括号里面是保存路径
sleep(2)
driver.quit()
##################################
#验证码#处理方法#测试环境,去掉验证码#生产环境,设置万能验证码,#验证码识别技术,很难达到100%,验证码种类繁多啊,#记录cookie,记录cookie进行登陆,推荐,这个方法主要进行讲解,
##################################
cookie
用户登陆之后,服务器一般都会设置cookie,保存在浏览器,
你再去请求的时候,服务器校验cookie,有的话就不需要在去登陆了,实现了长连接,否则每次都要登陆
所以你可以先登陆,然后使用自动化脚本的时候,把cookie带上, 然后服务器就不要让你再登陆了,所以你都成功登陆了,你就不需要考虑验证码了
这就是绕过了验证码
方法:
get_cookie(name) name是键名,获取指定的cookie
get_cookie() 获取本网站本地所有cookie
add_cookie(str) 添加cookie, str要是字典格式的, str = {"id":"userid","name":"usename"}
########################################
获取百度的所有的cookie
from selenium importwebdriverfrom time importsleepimportjson#实例化浏览器
driver =webdriver.Firefox()
driver.get("https://www.baidu.com")#程序打开网页后20秒内手动登陆账户
sleep(20)
with open('cookies.txt','w') as cookief:#将cookies保存为json格式
cookief.write(json.dumps(driver.get_cookies()))
sleep(2)
driver.quit()
##########################################
把所有的cookie都设置到浏览器中,然后刷新页面就发现百度登陆了,
from selenium importwebdriverfrom time importsleepimportjson#实例化浏览器
driver =webdriver.Firefox()
driver.get("https://www.baidu.com")#首先清除由于浏览器打开已有的cookies
driver.delete_all_cookies()defgetPureDomainCookies(cookies):
domain2cookie={} #做一个域到cookie的映射
for cookie incookies:
domain=cookie['domain']if domain indomain2cookie:
domain2cookie[domain].append(cookie)else:
domain2cookie[domain]=[]
maxCnt=0
ansDomain=''
for domain indomain2cookie.keys():
cnt=len(domain2cookie[domain])if cnt >maxCnt:
maxCnt=cnt
ansDomain=domain
ansCookies=domain2cookie[ansDomain]returnansCookies
with open('cookies.txt','r') as cookief:#使用json读取cookies 注意读取的是文件 所以用load而不是loads
cookieslist =json.load(cookief)
cookieslist=getPureDomainCookies(cookieslist)#方法1 将expiry类型变为int
for cookie incookieslist:#并不是所有cookie都含有expiry 所以要用dict的get方法来获取
if isinstance(cookie.get('expiry'), float):
cookie['expiry'] = int(cookie['expiry'])
driver.add_cookie(cookie)#方法2删除该字段
#for cookie in cookieslist:
##该字段有问题所以删除就可以 浏览器打开后记得刷新页面 有的网页注入cookie后仍需要刷新一下
#if 'expiry' in cookie:
#del cookie['expiry']
#driver.add_cookie(cookie)
driver.refresh()
sleep(10)
driver.quit()
##############################################
###################################