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

知名一线大咖带你简单学习Selenium的基本用法

时间:2020-07-20 15:49:27      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:网页   软件   dom   jquery   内容   exception   ted   需要   mon   

闲言

requests模块是一个不完全模拟浏览器行为的模块,只能爬取到网页的HTML文档信息,无法解析和执行CSS、JavaScript代码,因此要我们做人为判断。

selenium模块本质是通过驱动浏览器完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器。由于selenium解析执行了CSS、JavaScript所以相对requests它的性能是低下的。

 

selenium基本使用

import time

from selenium import webdriver#驱动浏览器

from selenium.webdriver import ActionChains #滑动

from selenium.webdriver.common.by import By #选择器

from selenium.webdriver.common.by import By #按什么方式查找,By.ID,By.CSS_SELECTOR

from selenium.webdriver.common.keys import Keys #键盘按键操作

from selenium.webdriver.support import expected_conditions as EC  #等待所有标签加载完毕

from selenium.webdriver.support.wait import WebDriverWait #等待页面加载完毕 寻找某些元素

browser=webdriver.Chrome() #调用Chrome 驱动,生成浏览器对象

wait=WebDriverWait(browser,10) #设置selenium等待浏览器加载完毕的最大等待时间
try: browser.get(‘https://www.baidu.com/‘) baidu_input_tag=browser.find_element_by_id("kw") #寻找到百度页面的id=‘kw‘的标签 key=baidu_input_tag.send_keys(‘张根‘) #在标签中输入‘张根‘ baidu_button_tag=browser.find_element_by_id(‘su‘) #寻找到百度页面id=‘su‘的标签 baidu_button_tag.click() #点击 wait.until(EC.presence_of_element_located((By.ID,‘4‘))) #等待百度页面 ID=‘4‘的标签完毕,最大等待10秒 ‘‘‘ 请求相关: browser.get(‘url‘) 响应相关: print(browser.page_source) #显示网页源码 print(browser.current_url) #获取当前url print(browser.get_cookies()) #获取当前网页cokies ‘‘‘ finally: time.sleep(5) browser.close() #关闭浏览器

selenium选择器

模拟浏览器无非请求 ----> 显示页面 -----> 寻找标签 ------> 点击标签的事件,所以selenium的关键是怎么找到页面中的标签,进而触发标签事件。

1、通过标签id属性进行定位

browser.find_element(By.ID,‘kw‘).send_keys("美女")

browser.find_element_by_id(‘kw‘).send_keys(‘性感‘)

2、通过标签name属性进行定位

browser.find_element_by_name("wd").send_keys("Linux")

browser.find_element(By.NAME,‘wd‘).send_keys("美女")

3、通过标签名进行定位

browser.find_element_by_tag_name("input").send_keys("selenium")

browser.find_element(By.TAG_NAME, ‘input‘).send_keys(‘aaa‘)

4、通过CSS查找方式进行定位

browser.find_element(By.CSS_SELECTOR, ‘#kw‘).send_keys(‘python django‘)

browser.find_element(By.CSS_SELECTOR, ‘#kw‘).send_keys(‘python 之美‘)

5、通过xphan方式定位

browser.find_element_by_xpath(‘//*[@id="kw"]‘).send_keys("python Tornado")

browser.find_element(By.XPATH, ‘//*[@id="kw"]‘).send_keys(‘吐槽大会‘)

6、通过搜索 页面中 链接进行定位

有时候不是一个输入框也不是一个按钮,而是一个文字链接,我们可以通过link

browser.find_element_by_link_text("新闻").click()

7、通过搜索 页面中 链接进行定位 ,可以支持模糊匹配

browser.find_element_by_partial_link_text("新").click()

browser.find_element_by_partial_link_text("闻").click()

8、小结

上述均可以改写成find_element(By.ID,‘kw‘)的形式

find_elements_by_xxx的形式是查找到多个元素,结果为列表

import time

from selenium import webdriver#驱动浏览器

from selenium.webdriver import ActionChains #滑动

from selenium.webdriver.common.by import By #选择器

from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR

from selenium.webdriver.common.keys import Keys #键盘按键操作

from selenium.webdriver.support import expected_conditions as EC  #等待所有标签加载完毕

from selenium.webdriver.support.wait import WebDriverWait #等待页面加载完毕 寻找某些元素

browser=webdriver.Chrome() #调用Chrome 驱动,生成浏览器对象

wait=WebDriverWait(browser,10) #设置selenium等待浏览器加载完毕的最大等待时间

try: browser.get(‘https://www.baidu.com/‘) #通过标签id属性进行定位 # browser.find_element(By.ID,‘kw‘).send_keys("美女") # browser.find_element_by_id(‘kw‘).send_keys(‘性感‘) #通过标签name属性进行定位 # browser.find_element_by_name("wd").send_keys("Linux") # browser.find_element(By.NAME,‘wd‘).send_keys("美女") #通过标签名称进行定位 # browser.find_element_by_tag_name("input").send_keys("selenium") # browser.find_element(By.TAG_NAME, ‘input‘).send_keys(‘aaa‘) # 通过CSS查找方式进行定位 # browser.find_element(By.CSS_SELECTOR, ‘#kw‘).send_keys(‘python django‘) # browser.find_element(By.CSS_SELECTOR, ‘#kw‘).send_keys(‘泰山‘) # 通过xphan方式定位 # browser.find_element_by_xpath(‘//*[@id="kw"]‘).send_keys("python Tornado") # browser.find_element(By.XPATH, ‘//*[@id="kw"]‘).send_keys(‘吐槽大会‘) # 通过搜索 页面中 链接进行定位 # browser.find_element_by_link_text("新闻").click() #通过搜索 页面中 链接进行定位 ,可以支持模糊匹配 # browser.find_element_by_partial_link_text("新").click() # browser.find_element_by_partial_link_text("闻").click() finally: browser.find_element_by_id("su").click() time.time(3) browser.close() # 关闭浏览器browser.quit()

 

等待元素被加载

1、selenium只是模拟浏览器的行为,而浏览器解析页面是需要时间的(执行css,js),一些元素可能需要过一段时间才能加载出来,为了保证能查找到元素,必须等待

对面试经验、软件、接口、自动化测试感兴趣可以175317069,群内会有不定期的免费资料链接发放,这些资料都是从各个技术网站搜集、整理出来的。如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。

2、等待的方式分两种

wait=WebDriverWait(browser,10) #显式等待

wait1=browser.implicitly_wait(10)    #隐式等待

wait.until(EC.presence_of_element_located((By.CLASS_NAME,‘tH0‘)))

test = wait.until(lambda x: x.find_element_by_xpath(‘xpath‘))

‘‘

显式等待:指定等待某个标签加载完毕

隐式等待:等待所有标签加载完毕

‘‘‘

 

元素交互操作

ActionChains

用selenium做自动化,有时候会遇到需要模拟鼠标操作才能进行的情况(如:iframe标签),比如单击、双击、点击鼠标右键、拖拽(滑动验证)等。而selenium给我们提供了一个类来处理这类事件——ActionChains

frame标签切换

如果网页页面嵌套frame标签,子页面访问不到父页面的内容,父页面也访问不到子页面的内容所以需要切换;

from selenium import webdriver

from selenium.webdriver import ActionChains #鼠标键盘动作链

from selenium.webdriver.common.by import By  # 按照什么方式查找,By.ID,By.CSS_SELECTOR

from selenium.webdriver.common.keys import Keys  # 键盘按键操作

from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素

import time

browser=webdriver.Chrome()

wait1=WebDriverWait(browser,10)

browser.get(‘http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable‘)

browser.switch_to.frame(‘iframeResult‘)#切换到id=‘iframewrapper‘的iframe子标签

action_chains=ActionChains(browser) #实例化1个动作链队列

source=browser.find_element_by_id(‘draggable‘) #找到拖拽的源标签

target=browser.find_element_by_id(‘droppable‘)#找到拖拽的目标标签

action_chains.drag_and_drop(source,target).perform()#把动作放到动作链中,perform()准备串行执行;
‘‘‘


click(on_element=None) ——单击鼠标左键

click_and_hold(on_element=None) ——点击鼠标左键,不松开

context_click(on_element=None) ——点击鼠标右键

double_click(on_element=None) ——双击鼠标左键

drag_and_drop(source, target) ——拖拽到某个元素然后松开

drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开

key_down(value, element=None) ——按下某个键盘上的键

key_up(value, element=None) ——松开某个键

move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标

move_to_element(to_element) ——鼠标移动到某个元素

move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置

perform() ——执行链中的所有动作

release(on_element=None) ——在某个元素位置松开鼠标左键

send_keys(*keys_to_send) ——发送某个键到当前焦点的元素

send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素

‘‘‘

time.sleep(5)

browser.quit()

关于ActionChains参看:http://blog.csdn.net/huilan_same/article/details/52305176

1.点击,清空

import time

from selenium import webdriver#驱动浏览器

from selenium.webdriver import ActionChains #滑动

from selenium.webdriver.common.by import By #选择器

from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR

from selenium.webdriver.common.keys import Keys #键盘按键操作

from selenium.webdriver.support import expected_conditions as EC  #等待所有标签加载完毕

from selenium.webdriver.support.wait import WebDriverWait #等待页面加载完毕 寻找某些元素

browser=webdriver.Chrome() #调用Chrome 驱动,生成浏览器对象

wait=WebDriverWait(browser,10) #设置selenium等待浏览器加载完毕的最大等待时间

browser.get(‘https://www.baidu.com/‘)

browser.find_element(By.ID,‘kw‘).send_keys("美女")

browser.find_element_by_id("su").click()#点击按钮

time.sleep(4)

browser.find_element(By.ID,‘kw‘).clear()#清空input标签中的内容,让重新输入

browser.find_element_by_id(‘kw‘).send_keys(‘性感‘)

browser.find_element_by_id("su").click() #点击按钮

2.前进和后退

import time

from selenium import webdriver#驱动浏览器

from selenium.webdriver import ActionChains #滑动

from selenium.webdriver.common.by import By #选择器

from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR

from selenium.webdriver.common.keys import Keys #键盘按键操作

from selenium.webdriver.support import expected_conditions as EC  #等待所有标签加载完毕

from selenium.webdriver.support.wait import WebDriverWait #等待页面加载完毕 寻找某些元素

import time from selenium import webdriver browser=webdriver.Chrome() browser.get(‘http://www.cnblogs.com/sss4/‘) browser.find_element_by_partial_link_text( ‘PythonWEB框架之Flask‘).click() time.sleep(3) browser.back() #后退 time.sleep(3) browser.forward() #前进 time.sleep(5) browser.close()

3.cokies相关

import time

from selenium import webdriver#驱动浏览器

from selenium.webdriver import ActionChains #滑动

from selenium.webdriver.common.by import By #选择器

from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR

from selenium.webdriver.common.keys import Keys #键盘按键操作

from selenium.webdriver.support import expected_conditions as EC  #等待所有标签加载完毕

from selenium.webdriver.support.wait import WebDriverWait #等待页面加载完毕 寻找某些元素

from selenium import webdriver

browser=webdriver.Chrome()

browser.get(‘https://www.zhihu.com/explore‘)

print(browser.get_cookies())                    #获取cokies信息

browser.add_cookie({‘k1‘:‘xxx‘,‘k2‘:‘yyy‘}) #添加cokies信息

print(browser.get_cookies())

browser.delete_all_cookies()                  #删除cokies信息,慎用

4.选项卡管理

from selenium import webdriver

browser=webdriver.Chrome()

browser.execute_script(‘window.open()‘) #打开选项卡

browser.execute_script(‘window.open()‘)

print(browser.window_handles)            #获取所有的选项卡

browser.switch_to_window(browser.window_handles[0]) #切换至选项卡0

browser.get(‘https://www.taobao.com‘)

browser.switch_to_window(browser.window_handles[1]) #切换至选项卡1

browser.get(‘https://www.baidu.com‘)

browser.switch_to_window(browser.window_handles[2]) #切换至选项卡2

browser.get(‘https://v.qq.com/‘)

5.selenium异常处理

from selenium import webdriver

from selenium.common.exceptions import TimeoutException,NoSuchElementException,NoSuchFrameException

try:

browser=webdriver.Chrome()

browser.get(‘http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable‘)

browser.switch_to.frame(‘iframssseResult‘)

except TimeoutException as e:

print(e)

except NoSuchFrameException as e:

print(e)

finally:

browser.close()

 

6.获取元素属性

//获取a连接的href属性值
browser.find_element_by_xpath(‘//a‘)).get_attribute(‘href‘)

 

 

7.切换窗口

定位iframe

  1.有id,并且唯一,直接写id

  driver.switch_to_frame("x-URS-iframe")

  driver.switch_to.frame("x-URS-iframe")

  2.有name,并且唯一,直接写name

  driver.switch_to_frame("xxxx")

  driver.switch_to.frame("xxxx")

  3.无id,无name,先定位iframe元素

  iframe = driver.find_elements_by_tag_name("iframe")[0]

  driver.switch_to_frame(iframe)

  driver.switch_to.frame(iframe)

  4.从frame中切回主文档(switch_to.default_content())

  切到frame中之后,我们便不能继续操作主文档的元素,这时如果想操作主文档内容,则需切回主文档。

  driver.switch_to.default_content()

 

8.获取cookie

获取cookie

cookie = browser.get_cookies()

#获取到的是一个坑爹的list,没错,是个list,所用下面的代码可以转成request使用的cookiejar

cookie_jar = requests.cookies.RequestsCookieJar()

for item in cookie:

cookie_jar.set(item["name"], item["value"], path=‘/‘, domain=item["domain"])

print("cookie处理后---->", cookie_jar)

知名一线大咖带你简单学习Selenium的基本用法

标签:网页   软件   dom   jquery   内容   exception   ted   需要   mon   

原文地址:https://www.cnblogs.com/flowToken1024532/p/13344787.html

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