Python-selenium(web自动化工具)笔记+遇到的坑

Python-selenium(web自动化工具)笔记

Selenium 是一个用于Web应用程序测试的工具。

1. 准备工作

1.1. 安装

pip install selenium

1.2. 下载浏览器驱动

Chrome浏览器驱动:chromedriver

下载对应的浏览器版本的驱动,放到python安装路径的根目录即可使用

1.3. 测试

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('www.baidu.com')

2. 基础知识

2.1. 元素定位

driver.find_element_by_xpath()   # 推荐使用xpath 几乎满足所有需求
driver.find_element_by_class_name() # 比较常用
# 当class的属性有多个时,多使用下面这个,属性以点'.'代替空格进行分割
driver.find_element_by_css_selector() 
# 以下看情况使用
driver.find_element_by_id()
driver.find_element_by_name()
driver.find_element_by_tag_name()
driver.find_element_by_link_text()
driver.find_element_by_partial_link_text()

element表示只找第一个满足条件的元素

elements表示找到所有满足条件的元素,返回列表,常用于获取ul下所有的li标签

2.1.1. 元素大小
driver.find_element_by_xpath('//div').size
#返回值
{'height': 18, 'width': 48}
2.1.3. 元素中的文本
driver.find_element_by_xpath('//div').text
2.1.4. 元素的属性
driver.find_element_by_xpath('//div')get_attribute('href') 

2.2. 页面交互

2.2.1. 输入

如:

<input type="text" name="passwd" id="passwd-id" />

通过元素定位,往input标签内输入文字

driver.find_element_by_name('passwd').send_keys('文本')
2.2.2. 点击

如:点击提交按钮

driver.find_element_by_name('submit').click()

a标签无法点击时,使用如下方法:

  • 方法一:
from selenium.webdriver.common.keys import Keys
driver.find_element_by_name('submit').send_keys(Keys.ENTER)
  • 方法二:
#使用js语法
document.getElementById("xxx")  # id获取元素,xxx表示id值
document.getElementByClassName("xxx")  # class获取元素,xxx表示class值
document.getElementByName("xxx")  #name获取元素,xxx表示name值
document.getElementByTagName("xxx")  # 获取tag标签,xxx表示tag值
document.querySelectorAll("xxx")  # css获取元素,xxx表示css语法

document.getElementById("xxx").click()  # 点击元素,元素后直接click()即可
#例如:
js ='document.getElementById("password").click()'  # js点击元素
driver.execute_scrtip(js)
2.2.3. 下拉框
element = driver.find_element_by_xpath("//select[@name='name']")
all_options = element.find_elements_by_tag_name("option")
for option in all_options:
    print("Value is: %s") % option.get_attribute("value")
    option.click()
2.2.4. 取消选中
select = Select(driver.find_element_by_id('id'))
select.deselect_all()
2.2.5. 获取选项列表
select = Select(driver.find_element_by_xpath("xpath"))
all_selected_options = select.all_selected.options
2.2.6. 获取所有可用的选项
options = select.options

2.3. 拖放 ——通常可以用于滑块验证码

element = driver.find_element_by_name("source")
target = driver.find_element_by_name("target")

from selenium.webdriver import ActionChains
action_chains = ActionChains(driver)
action_chains.drag_and_drop(element,target).perform()

2.4. 切换switch

2.4.1. 切换窗口
num = driver.window_handles       # 获取窗口,返回列表
alert = driver.switch_to_window(num['']) # 切换到指定的窗口 
2.4.2. 弹出式对话框
alert = driver.switch_to_alert()
2.4.2.1. 确认
driver.switch_to_alert().accept()
2.4.2.1. 取消
driver.switch_to_alert().dimiss()
2.4.2.1. 输入
driver.switch_to_alert().send_keys()
2.4.3 切换frame框架内
driver.switch_to_frame('frameName')

如果在元素无法定位时,就需要关注元素是否在frame框架内,使用上面方法切换到frame框架之后再定位。

2.5. 调用js代码

driver.excute_script(js)
2.5.1. 滑动滚动条
# 顶部
js = "var q=document.documentElement.scrollTop=0"
driver.execute_script(js)

# 向下滑动200像素
js = 'window.scrollBy(0,200)'
driver.excute_script(js)

常用

1.无界面模式

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')  # 无头
options.add_argument('--disable-gpu') # 规避bug

driver = webdriver.Chrome(options=options)

2. 防检测

在开发者工具的Console选项卡中查询window.navigator.webdriver,当这个值变成undefined表示成功

2.1. 只适用于较老版本
from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions

option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = Chrome(options=option)
2.2. 适用于新版本
from selenium import webdriver

# 加入下面两个实验选项,达到更完美的效果
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)

driver = webdriver.Chrome(options=options)
# 关键代码
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
  "source": """
    Object.defineProperty(navigator, 'webdriver', {
      get: () => undefined
    })
  """
})

这里我们是通过命令,使Chrome浏览器打开时先执行给定的这段代码,然后才运行网站自带的js代码

注意:只能在第一个打开的窗口内有效,如果打开另外的窗口将无法隐藏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BIN丶虫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值