安装py库
pip install selenium
下载驱动webdriver
将驱动放置python根目录(部分驱动需要改名)
基本框架
# 加入单元测试
import unittest
#引入休眠
from time import sleep
#引入web驱动
from selenium import webdriver
#引入驱动选择器使用.find_element(By.XPATH, '//*[@id="su"]')
from selenium.webdriver.common.by import By
class PythonOrgSearch(unittest.TestCase):
# 开始运行的函数
def setUp(self):
print("加载驱动")
self.driver = webdriver.Edge()
# 开始运行完运行的函数(必须以test开头)
def test_open(self):
print("中间运行")
self.driver.get(r'https://www.baidu.com/')
sleep(5)
# 结束运行的函数
def tearDown(self):
print("结束运行")
self.driver.close()
# 入口函数
if __name__ == "__main__":
unittest.main()
此时只需要修改中间运行的主函数即可
对网页的操作
首先要获取主页的控件
(4版本已弃用)根据id、根据xpath、根据标签名、根据控件
element = driver.find_element_by_id("passwd-id")
element = driver.find_element_by_name("passwd")
element = driver.find_elements_by_tag_name("input")
element = driver.find_element_by_xpath("//input[@id='passwd-id']")
新版导入from selenium.webdriver.common.by import By
(4版本)新元素定位方法
searchTag = driver.find_element(By.ID, "value") 利用ID定位
searchTag = driver.find_element(By.CLASS_NAME, "value")利用类名定位
searchTag = driver.find_element(By.NAME, "value") 利用name属性定位
searchTag = driver.find_element(By.TAG_NAME, "value") 利用标签名定位
searchTag = driver.find_element(By.XPATH, "value") 利用xpath定位
searchTag = driver.find_element(By.CSS_SELETOR, "value")利用CSS选择器定位
选择多文件
driver.find_elements(By.XPATH, '//button')
休眠2秒
sleep(2)
文本框
输入文本
self.driver.find_element(By.XPATH, '//*[@id="kw"]').send_keys("some text")
清除文本
self.driver.find_element(By.XPATH, '//*[@id="kw"]').clear()
点击按钮
element = self.driver.find_element(By.XPATH, '//*[@id="su"]').click()
提交表单
element .submit()
选择框(俩种情况)
selenium的下拉选择框。我们通常会遇到两种下拉框,
一种是使用input标签做的假下拉框。(直接用点击按钮方法点击ul-li)
另一种使用的是html的标签select,
<select name="selecta" id="selectA">
<option value="bj">北京</option>
<option value="sh">上海</option>
<option value="gz">广州</option>
<option value="cq">重庆</option>
</select>
需要导入select
from selenium.webdriver.support.select import Select
然后
寻找根据需要选择
Select(self.driver.find_element(By.ID, "selectA")).select_by_visible_text("重庆")
选中方法如下
select_by_index(2):通过下标选中元素,下标从0开始
select_by_visibile_text:通过值选中元素
select_by_value:通过value值选中元素
拖拽控件
导入from selenium.webdriver import ActionChains
需拖动元素
element = driver.find_element_by_name("source")
要拖到位置
target = driver.find_element_by_name("target")
实现将("source")拖到("target")
action_chains = ActionChains(driver)
action_chains.drag_and_drop(element, target).perform()
打开多网页
打开第一个网页
self.driver.get(r'http://baidu.com')
利用JS打开第二个网页
self.driver.execute_script("window.open('https://www.zhihu.com')")
获取当前浏览器所有网页
handles = self.driver.window_handles
切换到第一个打开的
self.driver.switch_to.window(handles[0])
切换到第二个打开的
self.driver.switch_to.window(handles[1])
弹窗检测
弹窗类型
alert("只有确定按钮")
confirm("有确定和取消")
prompt("有确定和取消还有输入框")
如果关闭时有弹窗会报错
获取当前弹窗
alert = self.driver.switch_to.alert
获取弹窗内容print(alert.text)
点击确定alert.accept()
点击取消alert.dimiss()
只能对prompt弹框输入字符,alert 和 confirm 会报错 send_keys() (目前不知道什么原因,未输入成功)
前进与后退
driver.forward()前进
driver.back()后退
COOKIE
打开网址
self.driver.get("http://www.example.com")
编辑cookie写入
cookie = {'name' : 'foo', 'value' : 'bar'}
driver.add_cookie(cookie)
获取并打印
print(driver.get_cookies())
等待
导入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")
显式等待
显式等待指定某个条件,然后设置最长等待时间。如果在这个时间还没有找到元素,那么便会抛出异常了。程序默认会 500ms 调用一次来查看元素是否已经生成,如果本来元素就是存在的,那么会立即返回。 下面是一些内置的等待条件
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
隐式等待比较简单,就是简单地设置一个等待时间,单位为秒。
driver.implicitly_wait(10)
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")