码迷,mamicode.com
首页 > 其他好文 > 详细

Selenium基本操作

时间:2021-05-24 04:49:43      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:tps   信息   pass   工具   poll   exce   原理   text   href   

Selenium基本操作

Selenium工具原理

  1. Selenium2的核心是webdriver
  2. webdriver是按照 client-server设计原理设计
  3. client:简单来说就是我们写的代码,以http请求的方式发送给server端,server 端接收请求,执行相应操作,并返回给client端。
  4. server:客户端的脚本启动后,被控制的浏览器就是server端,职责就是等待 client端发送请求并作出响应。
  5. 使用的协议: JSON Wire protocol(作用是可以让同一个浏览器驱动处理不同编程语言的脚本)

Selenium安装

  1. 在dos窗口用pip命令安装selenium(Python3用pip3)

    命令: pip3 install

  2. 配置谷歌驱动文件 : 把chromedriver.exe放置在python的Scripts目录下面

Selenium中元素定位方法(9种)

# 1.id定位
# 写法1
driver.find_element_by_id(‘kw‘).send_keys(‘aa‘)
# 写法2
element=driver.find_element_by_id(‘kw‘)
element.send_keys(‘aa‘)

# 2.name定位
driver.find_element_by_name(‘wd‘).send_keys(‘bb‘)

# 3.class定位
driver.find_element_by_class_name(‘s_ipt‘).send_keys(‘cc‘)

# 4.js定位(js脚本定位)
# 定义js变量
js=‘var a = document.getELementById("kw").value="dd"‘
driver.execute(js)

# 5.link定位(链接定位)
driver.find_element_by_link_text(‘hao123‘).click()

# 6.partial_link定位(模糊链接定位)
driver.find_element_by_partial_link_text(‘ao1‘).click()

# 7.tag_name定位(标签名定位)
driver.find_element_by_tag_name("input").send_keys(‘aa‘)
all_element=driver.find_elements_by_tag_name("input")
print(all_element)
print(type(all_element))
print(len(all_element))
#注意点:使用单独的标签名很难一次性定位到我们想要的元素,有的时候需要跟for循环组合使用
for i in all_element: #遍历获取出来的input标签
    if i.get_attribute(‘id‘)==‘kw‘: #通过get_attribute获取每一个标签的的id属性
        i.send_keys(‘aa‘)
        
# 8.xpath定位
driver.find_element_by_xpath(‘//*[@id="kw"]‘).send_keys(‘bb1‘)
driver.find_element_by_xpath(‘//input[@id="kw"]‘).send_keys(‘bb2‘)
driver.find_element_by_xpath(‘//*[@name="wd"]‘).send_keys(‘bb3‘)
driver.find_element_by_xpath(‘//*[@class="s_ipt"]‘).send_keys(‘bb4‘)
driver.find_element_by_xpath(‘//*[@class="s_ipt" and @name="wd"]‘).send_keys(‘bb5‘)
driver.find_element_by_xpath(‘//*[@id="form"]/span[1]/input[1]‘).send_keys(‘bb6‘)

# 9.css定位
driver.find_element_by_css_selector(‘#kw‘).send_keys(‘cc1‘)
driver.find_element_by_css_selector(‘.s_ipt‘).send_keys(‘cc2‘)
driver.find_element_by_css_selector(‘[id=kw]‘).send_keys(‘cc3‘)
driver.find_element_by_css_selector(‘[name=wd]‘).send_keys(‘cc4‘)
driver.find_element_by_css_selector(‘[name=wd][id=kw]‘).send_keys(‘cc5‘)
driver.find_element_by_css_selector(‘form>span>input‘).send_keys(‘cc6‘)

在这9种常用的定位方法中,优先顺序

1)有id优先使用id定位

2)没有id,考虑使用name或者class定位。

3)如果没有id,name,class再考虑用xpath,css定位。

4)如果是链接可以考虑使用link_text,partial_link_text 定位。

5)tag_name和JavaScript还是用的比较少的。 我们根据实际情况,具体问题具体分析

selenium中的三种等待方式

1.强制等待:设置固定的线程休眠时间为n秒

time.sleep(n)

from selenium import webdriver #从selenium库导入webdriver包
from time import sleep
driver=webdriver.Chrome()
driver.get(‘http://www.baidu.com‘)
# driver.maximize_window()
sleep(2)   #强制等待,线程等待,通过time模块导入

2.隐式等待

  • 隐式等待是全局的针对所有元素,设置等待时间如n秒,如果n秒内出现,则继续向下,否则抛异常。

  • 可理解为在n秒内,不停刷新看元素是否加载出来

driver.implicitly_wait(5)

driver.implicitly_wait(5) #隐式等待,是webdriver里面的方法,作用于全局,在5秒内任何时间元素加载完成,就可以继续往下走,超时则报错

3.显式等待

单独针对某个元素,设置一个等待时间如n秒,每隔m秒检查一次是否出现,如果在n秒之前任何时候出现,则继续向下,超过n秒尚未出现则抛异常

WebDriverWait(driver,n,m)

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located(By.ID,‘kw‘)).send_keys(‘666‘) # 显式等待,作用与某个元素,等待5秒,每隔0.5秒轮询一次,只要所需的元素出现则继续往下走,否则会报错

#详细解释
‘‘‘
from selenium.webdriver.support.wait import WebDriverWait #导入模块
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

driver:浏览器驱动
timeout:最长超时时间,默认以秒为单位
poll_frequency:检测的间隔步长,默认为0.5s
ignored_exceptions:超时后的抛出的异常信息,默认抛出
NoSuchElementException异常。
‘‘‘


常用控件

1. send_keys()对文本框操作

只能对input标签起作用

driver=webdriver.Chrome()
driver.get(‘https://passport.jd.com/new/login.aspxReturnUrl=https%3A%2F%2Fwww.jd.com%2F‘) #京东操作
sleep(1)
driver.find_element_by_xpath(‘//*[@id="content"]/div[2]/div[1]/div/div[3]‘).click()
sleep(2)
driver.find_element_by_id(‘loginname‘).send_keys(‘13388888888‘)
driver.find_element_by_id(‘nloginpwd‘).send_keys(‘123456‘)

send_keys()上传文件

from selenium import webdriver   #从selenium库中导入webdriver包
from time import sleep

driver = webdriver.Chrome()
url = ‘https://www.baidu.com/‘
driver.get(url)
driver.maximize_window()
driver.find_element_by_xpath(‘//[@id="form"]/span[1]/span[1]‘).click()
sleep(3)
element = driver.find_element_by_class_name(‘upload-pic‘)   #定位到上传文件框  (不需要点击)
element.send_keys(r‘D:\kxz\aa.jpg‘)   #上传文件

其它上传文件方法

2.隐藏框操作

  1. from selenium.webdriver.common.action_chains import ActionChains ---导入相关库
  2. ActionChains(driver).move_to_element(mouse).perform() ---移动到指定元素,进行悬停perform
from selenium import webdriver #从selenium库导入webdriver包
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains

driver=webdriver.Chrome()
driver.get(‘http://www.baidu.com‘)
# driver.maximize_window()
sleep(2)

# 方法1
driver.find_element_by_id(‘s-usersetting-top‘).click()
driver.find_element_by_link_text(‘搜索设置‘).click()


# 方法2:类似rf的鼠标悬停
mouse=driver.find_element_by_id(‘s-usersetting-top‘) # 定位到某个元素
ActionChains(driver).move_to_element(mouse).perform() # 把鼠标移动到某个元素,进行悬停
sleep(5)
driver.find_element_by_link_text(‘搜索设置‘).click()
driver.close()

3.下拉框选择

from selenium import webdriver #从selenium库导入webdriver包
from time import sleep
from selenium.webdriver.support.select import Select

driver=webdriver.Chrome()
driver.get(‘https://www.ctrip.com/‘)
# driver.maximize_window()
sleep(2)

ele=driver.find_element_by_id(‘id="J_roomCountList"‘)
Select(ele).select_by_index(4) #通过索引进行选择
sleep(2)
Select(ele).select_by_value(‘6‘) #通过标签种的value进行选择
sleep(2)
Select(ele).select_by_visible_text(‘7间‘) #通过文本进行选择

4.弹框处理

警告型弹框,确认型弹框,输入型弹框

# 1.alert警告型弹框处理
from selenium import webdriver #从selenium库导入webdriver包
from time import sleep

driver=webdriver.Chrome()
driver.get(‘file:///D:/kxz/DCS/%E7%AC%AC%E4%BA%8C%E4%B8%AA%E6%9C%88%E8%AF%BE%E4%BB%B6/alert.html‘)
# driver.maximize_window()
t=driver.switch_to.alert   # 切换到alert框中
sleep(2)
t.accept() #点击确定
sleep(2)
t.accept() #点击确定
sleep(2)

driver.refresh()  #刷新页面

t=driver.switch_to.alert  #经过刷新页面以后也要重新进入alert框中

print(t.text) #打印alert框中的信息

sleep(2)
t.dismiss() #点击取消
sleep(2)
t.accept()
sleep(2)
# 2.确认型弹框处理
from selenium import webdriver #从selenium库导入webdriver包
from time import sleep
driver=webdriver.Chrome()
driver.get(‘file:///D:/kxz/DCS/%E7%AC%AC%E4%BA%8C%E4%B8%AA%E6%9C%88%E8%AF%BE%E4%BB%B6/enter.html‘)
sleep(2)
# driver.maximize_window()
driver.find_element_by_class_name(‘alert‘).click()
sleep(2)
t=driver.switch_to.alert   # 切换到alert框中
t.dismiss()
sleep(2)
driver.refresh()
driver.find_element_by_class_name(‘alert‘).click()
sleep(2)
t=driver.switch_to.alert   # 切换到alert框中
t.accept()
from selenium import webdriver #从selenium库导入webdriver包
from time import sleep
driver=webdriver.Chrome()
driver.get(‘file:///D:/kxz/DCS/%E7%AC%AC%E4%BA%8C%E4%B8%AA%E6%9C%88%E8%AF%BE%E4%BB%B6/prompt.html‘)
sleep(2)
# driver.maximize_window()
driver.find_element_by_class_name(‘alert‘).click()
t=driver.switch_to.alert
t.send_keys(‘666‘)
sleep(3)
t.accept()
sleep(2)

driver.find_element_by_class_name(‘alert‘).click()
t=driver.switch_to.alert
sleep(2)
t.send_keys(‘777‘)
sleep(3)
t.dismiss()
driver.close()

5.iframe框处理

#iframe框处理
from selenium import webdriver #从selenium库导入webdriver包
from time import sleep
driver=webdriver.Chrome()
driver.get(‘https://www.jd.com/‘)
sleep(2)
# driver.maximize_window()
driver.find_element_by_class_name(‘link-login‘).click()
sleep(2)
driver.find_element_by_xpath(‘//*[@id="kbCoagent"]/ul/li[1]/a‘).click()
sleep(2)

# 方法1:
iframe=driver.find_element_by_id(‘ptlogin_iframe‘) #通过id定位到iframe框
driver.switch_to.frame(iframe)
sleep(2)
driver.find_element_by_id(‘img_out_1121234835‘).click()


#方法2
iframe=driver.find_element_by_tag_name(‘iframe‘) #通过标签名定位到iframe框
driver.switch_to.frame(iframe)
sleep(2)
driver.find_element_by_id(‘img_out_1121234835‘).click()


# 方法3:
driver.switch_to.frame(0) #通过索引定位到iframe框,索引从0开始
sleep(2)
driver.find_element_by_id(‘img_out_1121234835‘).click()

其它操作

1.断言

from selenium import webdriver #从selenium库导入webdriver包
from time import sleep
driver=webdriver.Chrome()
driver.get(‘http://www.baidu.com‘)
text1=driver.find_element_by_xpath(‘//*[@id="s-top-left"]/a[2]‘).text
print(text1)


# 方法1:if判断
if text1==‘hao123‘:
    print(‘断言成功‘)
else:
    print(‘断言失败‘)
    
# 方法2:assert [如果断言失败直接报错,断言成功也没结果]
title=driver.title
assert title==‘百度一下,你就知道‘

2.获取文本

from selenium import webdriver #从selenium库导入webdriver包
from time import sleep
driver=webdriver.Chrome()
driver.get(‘http://www.baidu.com‘)
# driver.maximize_window()
text1=driver.find_element_by_xpath(‘//*[@id="s-top-left"]/a[2]‘).text
print(text1)

3.获取title

title=driver.title #不用加()调用

4.刷新页面&页面返回

driver.refresh() #页面刷新
driver.back() #页面返回

5.获取窗口的尺寸

size = driver.get_window_size()
print(size)

6.切换窗口

#获取当前窗口,获取所有窗口
from selenium import webdriver #从selenium库导入webdriver包
from time import sleep
driver=webdriver.Chrome()
driver.get(‘http://www.baidu.com‘)
# driver.maximize_window()
sleep(2)
driver.find_element_by_link_text(‘hao123‘).click()
title=driver.title
print(title)
handle=driver.current_window_handle #获取当前窗口的句柄
print(handle)
all_handle=driver.window_handles #获取所有窗口的句柄
print(all_handle)

# 切换窗口
# 方法1:
driver.switch_to.window(all_handle[-1])
title1=driver.title
print(title1)

# 方法2: for循环切换
for i in all_handle:
    if i!=handle:
        driver.switch_to.window(i)
        title2=driver.title
        print(title2)

7.关闭窗口

driver.close() # 关闭当前的窗口
driver.quit() # 关闭整个浏览器,关闭所有的窗口

8.滚动条操作(js操作)

from selenium import webdriver
from time import sleep
driver=webdriver.Chrome()
driver.get(‘https://www.jd.com/‘)
driver.maximize_window()
js1=‘window.scrollTo(0,20000)‘ #向下滑动
driver.execute_script(js1)
sleep(3)
js2=‘window.scrollTo(0,0)‘ #向下滑动
driver.execute_script(js2)

9.模拟键盘操作

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.keys import Keys

driver=webdriver.Chrome()
driver.get(‘https://www.baidu.com/‘)
driver.maximize_window()
driver.find_element_by_id(‘kw‘).send_keys(‘aa‘)
sleep(2)
driver.find_element_by_id(‘kw‘).send_keys(Keys.BACK_SPACE) #模拟删除键操作
sleep(2)
driver.find_element_by_id(‘kw‘).send_keys(Keys.CONTROL,‘a‘) #模拟键盘全选操作(ctrl+A)
driver.find_element_by_id(‘kw‘).send_keys(Keys.CONTROL,‘x‘) #模拟键盘剪切操作(ctrl+X)
driver.find_element_by_id(‘kw‘).send_keys(Keys.CONTROL,‘v‘) #模拟键盘粘贴操作(ctrl+v)
driver.find_element_by_id(‘kw‘).send_keys(Keys.ENTER) #模拟键盘回车操作

模拟键盘操作封装

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.keys import Keys

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

def find_element_id(localId,*value):
    ‘‘‘对id元素定位后的send_keys()进行封装‘‘‘
    sleep(2)
    driver.find_element_by_id(localId).send_keys(*value)  # 模拟删除键操作
    
find_element_id(‘kw‘,‘aa‘,Keys.BACK_SPACE) #调用

Selenium基本操作

标签:tps   信息   pass   工具   poll   exce   原理   text   href   

原文地址:https://www.cnblogs.com/zz-winkie/p/14753071.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!