当前位置:   article > 正文

selenium常见的指令及其用法_selenium常用指令

selenium常用指令

1 认识selenium

selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。

支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google,Chrome,Opera,Edge等

1.1 下载安装

pip install selenium -i 源镜像
  • 1

1.2 驱动安装

  • Selenium需要驱动程序与所选浏览器进行交互
  • 浏览器驱动版本需要和浏览器版本相符
Chrome: http://chromedriver.storage.googleapis.com/index.html
Edge: https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
  • 1
  • 2

安装好驱动之后将驱动文件放在python安装目录之下,否则,使用的时候需要设置驱动路径

使用谷歌浏览器,Edge浏览器都可行,在这里我电脑上出现了一个小问题,也许是翻墙导致浏览器打不开,在这里我打开谷歌–>文件地址–>然后更改.exe名字–>才能正常打卡。

2 爬虫与反爬虫的斗争

爬虫:对某个网站数据或图片感兴趣,开始抓取网站信息;

网站:请求次数频繁,并且访问ip固定,user_agent也是python,开始限制访问;

爬虫:通过设置user_agent,并添加代理ip请求;

网站:压力过大,不符合常规现象,开始设置登陆访问;

爬虫:注册账号,携带cookie获取数据;

网站:发现网站单账号访问异常,限制账号权限;

爬虫:开始模仿手动请求,限制爬取速度

网站:设置验证码策略

爬虫:打码平台介入,或者机器学习识别验证码

网站:。。。。。。

3 selenium入门

# 下载  pip install selenium
# 导入模块
from selenium import webdriver

# 使用谷歌浏览器
driver = webdriver.Chrome()

# 使用谷歌打开百度页面
driver.get("https://www.baidu.com")

# 窗口最大化
driver.maximize_window()

# 获取页面源代码
driver.page_source

# 获取所有cookie
driver.get_cookies()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

3.1 页面元素定位

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 1、通过id值定位
driver.find_element(By.ID,"kw")

# 2、通过class值定位
driver.find_element(By.CLASS_NAME,"s_ipt")

# 3、通过name定位
driver.find_element(By.NAME,"wd")

# 4、通过tag_name定位
driver.find_element(By.TAG_NAME,"div")
# 说明:HTML本质就是由不同的tag(标签)组成,而每个tag都是指同一类,所以tag定位效率低,一般不建议使用;

# 5、通过XPATH语法定位
driver.find_element(By.XPATH,"//*[@id=\"kw\"]")

# 6、通过css语法定位
driver.find_element(By.CSS_SELECTOR,"#kw")

# 7、通过文本定位
driver.find_element(By.PARTIAL_LINK_TEXT, "花美果丰").click()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

3.2 动作链

  • ActionChains方法列表
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) ——拖拽到某个元素然后松开
key_down(value, element=None) ——按下某个键盘上的键
key_up(value, element=None) ——松开某个键
move_to_element(to_element) ——鼠标移动到某个元素
perform() ——执行链中的所有动作
release(on_element=None) ——在某个元素位置松开鼠标左键
send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素
move_by_offset(x,y)  ——移动到某个坐标
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3.2.1 鼠标移动

# -*- coding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/mouseover.htm')

# 鼠标移动到此元素,在下面的input框中会显示“Mouse moved”
write = driver.find_element(By.XPATH,'//input[@value="Write on hover"]')
# 鼠标移动到此元素,会清空下面input框中的内容
blank = driver.find_element(By.XPATH,'//input[@value="Blank on hover"]')

result = driver.find_element(By.NAME,'t1')

action = ActionChains(driver)
# 移动到write,显示“Mouse moved”
time.sleep(3)
# 移动到write上
action.move_to_element(write).perform()

# 移动到blank上,清空
time.sleep(3)
action.move_to_element(blank).perform()
# 移动到write上
time.sleep(3)
action.move_to_element(write).perform()

driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

3.1.2 鼠标拖拽

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from time import sleep

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/dragDropMooTools.htm')

target = driver.find_element(By.ID,'dragger')  # 被拖拽元素
item1 = driver.find_element(By.XPATH,'//div[text()="Item 1"]')  # 目标1
item2 = driver.find_element(By.XPATH,'//div[text()="Item 2"]')  # 目标2
item3 = driver.find_element(By.XPATH,'//div[text()="Item 3"]')  # 目标3
item4 = driver.find_element(By.XPATH,'//div[text()="Item 4"]')  # 目标4

action = ActionChains(driver)
# 1.移动dragger到目标1
action.drag_and_drop(target, item1).perform()
sleep(2)

driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

3.1.3 点击操作

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/clicks.htm')
# 单击按钮
click_left = driver.find_element(By.XPATH,'//input[@value="click me"]')
# 双击按钮
doubleclick_btn = driver.find_element(By.XPATH,'//input[@value="dbl click me"]')
# 右键单击按钮
click_right = driver.find_element(By.XPATH,'//input[@value="right click me"]')
# 链式用法
ActionChains(driver).click(click_left).double_click(doubleclick_btn).context_click(click_right).perform()

sleep(2)
driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

3.3 页面等待

3.3.1 强制等待

其实就是time.sleep()

缺点时不智能,设置的时间太短,元素还没有加载出来;设置的时间太长,则会浪费时间

3.3.2 显示等待

  • 每经过多少秒就查看一次等待条件是否达成,如果达成就停止等待,继续执行后续代码
  • 如果没有达成就继续等待直到超过规定的时间后,报超时异常

显式等待是您定义的代码,用于等待特定条件发生,然后再继续执行代码。这种情况的极端情况是 time.sleep(),它将条件设置为要等待的确切时间段。提供了一些方便的方法来帮助您编写只等待所需时间的代码。WebDriverWait 与 ExpectedCondition 结合使用是实现此目的的一种方式。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("http://somedomain/url_that_delays_loading")
def search():
	try:
    	element = WebDriverWait(driver, 10, 0.5).until(
        	EC.presence_of_element_located((By.ID, "myDynamicElement"))
    	)
	except TimeoutException:
    	return search()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在上面的代码中,Selenium 将等待最多 10 秒以找到匹配给定条件的元素。如果在那段时间内没有找到任何元素,则抛出 TimeoutException。捕获到异常后写一个递归操作,这样10秒之后就会继续等待10秒,直到元素加载完毕

3.3.3 隐式等待

  • 针对元素定位,设置了一个时间,在一段时间内判断元素定位成功就进行下一步;
  • 在设置的时间内没有定位成功,则会报超时加载;
from selenium import webdriver

driver = webdriver.Chrome()

driver.implicitly_wait(10) # 隐式等待,最长等20秒  

driver.get('https://www.baidu.com')

driver.find_element_by_xpath()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 针对元素定位,设置了一个时间,在一段时间内判断元素定位成功就进行下一步;
  • 在设置的时间内没有定位成功,则会报超时加载;
from selenium import webdriver

driver = webdriver.Chrome()

driver.implicitly_wait(10) # 隐式等待,最长等20秒  

driver.get('https://www.baidu.com')

driver.find_element_by_xpath()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/489109
推荐阅读
相关标签
  

闽ICP备14008679号