文章目录
1.selenium的安装和浏览器驱动
pip install selenium
- 保证机器上有Chrome浏览器,下载对应浏览器的驱动
- Chrome浏览器驱动下载地址: http://chromedriver.storage.googleapis.com/index.html
- Firefox浏览器驱动下载地址:https://github.com/mozilla/geckodriver/releases/
- IE浏览器驱动下载地址:http://selenium-release.storage.googleapis.com/index.html
2.webdriver对象和属性options设置
- Chrome浏览器
from selenium import webdriver
# chrome 浏览器的配置类
from selenium.webdriver import ChromeOptions
options = webdriver.ChromeOptions()
# 无头浏览器的模式
options.add_argument('--headless')
# 屏蔽掉正在监控
options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 忽略证书错误
options.add_argument('--ignore-certificate-errors')
# 设置代理
options.add_argument('--proxy-server=http://127.0.0.1:8081')
# 屏蔽网页消息的提示
options.add_argument("--no-sandbox")
# 使用假设备进行MediaStream替换实际的摄像头和麦克风。
options.add_argument("--use-fake-device-for-media-stream")
# 通过选择媒体流的默认设备(例如WebRTC)来绕过媒体流信息量。与--use-fake-device-for-media-stream一起使用。
options.add_argument("--use-fake-ui-for-media-stream")
driver = webdriver.Chrome(executable_path='chromedriver', chrome_options=options)
# 设置浏览器的尺寸
driver.set_window_size(1366, 768)
# 最大化窗口
driver.maximize_window()
- Firefox浏览器
from selenium import webdriver profile = webdriver.FirefoxProfile() profile.set_preference('network.proxy.type', 1) profile.set_preference('network.proxy.http', '10.10.10.1') profile.set_preference('network.proxy.http_port', '8081') profile.update_preferences() browser = webdriver.Firefox(executable_path='C:\geckodriver.exe', firefox_options=options, firefox_profile=profile )
3. 发起请求
# 设置浏览器的
driver.get("https://www.baidu.com")
# 获取页面的内容
page_source = driver.page_source
4.查找元素
-
例如有一个html标签
<input type="text" name="passwd" id="passwd-id" /> <html> <body> <p class="content">Site content goes here.</p> </body> <html>
# find_element_by_id 根据标签id查找 # find_element_by_name 根据标签name查找 # find_element_by_xpath 根据xpath规则查找 # find_element_by_link_text 根据链接文本获取超链接 continue_link = driver.find_element_by_link_text('Continue') # find_element_by_partial_link_text 根据本分文本获取链接属性 continue_link = driver.find_element_by_partial_link_text('Conti') # find_element_by_tag_name 通过标签名查找元素 heading1 = driver.find_element_by_tag_name('h1') # find_element_by_class_name 根据class name 定位 class='content' content = driver.find_element_by_class_name('content') # find_element_by_css_selector 根据css选择器查找元素 content = driver.find_element_by_css_selector('p.content')
-
填写表格
# 获取到元素后,可以对元素进行操作 # 输入操作 search_bar = driver.find_element_by_xpath('//*[@id="search_bar"]/input') search_bar.send_keys('要搜索的内容') # 点击操作 driver.find_element_by_id("submit").click()
-
获取属性值或文本值
# 获取标签内的文本 driver.find_element_by_xpath('//h3[@class="nickname"]/span').text # 获取属性 driver.find_element_by_xpath("//select[@name='name']").get_attribute("value"))
5. 获取cookie
cookies = self.driver.get_cookies()
# 返回的是cookie的字典列表
cookies_str = ''
for cookie in cookies:
cookies_str += cookie['name'] + '=' + cookie['value'] + ";"
print(cookies_str)
# 把cookie的name和value拼接成字符串 xxx1=xxx1;xxx2=xxx2的形式,后续放在requests的 User-Agent中
6.页面/frame/历史记录切换
- 使用
switch_to_window
方法 - 使用窗口的名字切换
# <a href="somewhere.html" target="windowName">Click here to open a new window</a> driver.switch_to_window("windowName")
- 使用handle来切换
# 遍历handle列表来切换 for handle in driver.window_handles: driver.switch_to_window(handle) # 获取当窗口的句柄 driver.current_window_handle # 切换到新的窗口 driver.switch_to.window(new_handle)
- frame的操作
# 切换到frame,进入到frame中 driver.switch_to_frame("frameName") # 进入frame, 并操作frame中的元素 driver.switch_to_frame("frameName.0.child") # 退出frame driver.switch_to_default_content()
-
进入iframe的几种方式
<html lang="en"> <head> <title>FrameTest</title> </head> <body> <iframe src="a.html" id="frame_id" name="frame_name"></iframe> </body> </html> # 进入iframe的方法 driver.switch_to.frame(0) # 1.用frame的index来定位,第一个是0 driver.switch_to.frame("frame1") # 2.用id来定位 driver.switch_to.frame("myframe") # 3.用name来定位 driver.switch_to.frame(driver.find_element_by_tag_name("iframe")) # 4.用查找到元素对想进入
-
嵌套frame的操作
<html> <iframe id="frame1"> <iframe id="frame2" / > </iframe> </html> # 从页面进入iframe2中,一层层进入 driver.switch_to.frame("frame1") driver.switch_to.frame("frame2") # 切换回父iframe driver.switch_to.parent_frame()
-
- 切换弹出框
# 访问网站的弹出框 alert = driver.switch_to_alert()
- 访问浏览器的历史记录
# 浏览器前进记录 driver.forward() # 浏览器后退记录 driver.back()
7.操作鼠标或者键盘
- 鼠标操作 (ActionChains)
-
调用ActionChains方法的时候,不会立即执行,而是会将所有的操作按顺序存放在一个队列里,当你调用**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) ——发送某个键到指定元素
on_element: 鼠标要操作的元素,None时,为操作鼠标当前的位置
-
click, double_click, context_click
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from time import sleep driver = webdriver.Firefox() driver.implicitly_wait(10) driver.maximize_window() driver.get('http://sahitest.com/demo/clicks.htm') click_btn = driver.find_element_by_xpath('//input[@value="click me"]') # 单击按钮 doubleclick_btn = driver.find_element_by_xpath('//input[@value="dbl click me"]') # 双击按钮 rightclick_btn = driver.find_element_by_xpath('//input[@value="right click me"]') # 右键单击按钮 ActionChains(driver).click(click_btn).double_click(doubleclick_btn).context_click(rightclick_btn).perform() # 链式用法 print(driver.find_element_by_name('t2').get_attribute('value')) sleep(2) driver.quit()
-
move 操作
write_ele = driver.find_element_by_xpath('//input[@value="Write on hover"]') blank_ele = driver.find_element_by_xpath('//input[@value="Blank on hover"]') # 创建对象 action = ActionChains(driver) # 移动到write元素,显示“Mouse moved” action.move_to_element(write_ele).perform() # 鼠标移动到blank 元素上 action.move_to_element(blank_ele).perform() # 移动到距离当前位置(10,50)的点,与上句效果相同,移动到blank上,清空 action.move_by_offset(10, 50).perform() # 移动到距离blank元素(10,-40)的点,可移动到write上 action.move_to_element_with_offset(blank, 10, -40).perform()
-
drag
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from time import sleep driver = webdriver.Firefox() driver.implicitly_wait(10) driver.maximize_window() driver.get('http://sahitest.com/demo/dragDropMooTools.htm') # 被拖拽元素 dragger = 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(dragger, item1).perform() sleep(2) # 2.点击保持主该元素,拖拽多item2元素释放 action.click_and_hold(dragger).release(item2).perform() sleep(2) # 3.点击保持主该元素,拖拽到item3元素,然后释放,提交 action.click_and_hold(dragger).move_to_element(item3).release().perform() sleep(2) # 点击保持主该元素,移动到指定坐标,释放,提交 action.click_and_hold(dragger).move_by_offset(400, 150).release().perform() sleep(2) driver.quit()
-
- 键盘
- 按键的操作,可以用sendkeys() 方法实现,也可以用 ActionChains里的一些方法
from selenium.webdriver.common.keys import Keys # 发送回车键 elem.send_keys(Keys.RETURN)
- 按键的操作
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.keys import Keys driver = webdriver.Firefox(executable_path='C:\geckodriver.exe',) driver.implicitly_wait(10) driver.maximize_window() driver.get('http://sahitest.com/demo/keypress.htm') key_up_radio = driver.find_element_by_id('r1') # 监测按键升起 key_down_radio = driver.find_element_by_id('r2') # 监测按键按下 key_press_radio = driver.find_element_by_id('r3') # 监测按键按下升起 enter = driver.find_elements_by_xpath('//form[@name="f1"]/input')[1] # 输入框 result = driver.find_elements_by_xpath('//form[@name="f1"]/input')[0] # 监测结果 # 监测key_down key_down_radio.click() # 选中输入框,按下control键,释放,提交 ActionChains(driver).key_down(Keys.CONTROL, enter).key_up(Keys.CONTROL).perform() # 监测key_up key_up_radio.click() # 选中enter输入框 enter.click() # 按下shift,释放,提交 ActionChains(driver).key_down(Keys.SHIFT).key_up(Keys.SHIFT).perform() # 监测key_press key_press_radio.click() # 选中enter输入框 enter.click() # 输入a 提交 ActionChains(driver).send_keys('a').perform() driver.quit()
- 组合键的使用
action = ActionChains(driver) input1 = driver.find_elements_by_tag_name('input')[3] # 鼠标聚焦到input1 input1.click() # ctrl+c 组合键,复制文本内容 action.key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform() action. input2 = driver.find_elements_by_tag_name('input')[4] # 向input2 元素中输入 Ctrl+V的粘贴快捷键 action.key_down(Keys.CONTROL,input2).send_keys('v').key_up(Keys.CONTROL).perform()
8.等待页面加载完成
- 显示等待(你在代码中定义等待一定条件发生后再进一步执行你的代码。)
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver.get("http://somedomain/url_that_delays_loading") try: # 等待浏览器响应,直到达到 预期的条件 通过ID来筛选 element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "myDynamicElement")) ) finally: driver.quit()
- 隐式等待(等待一段时间取查找元素) implicitly_wait
driver.implicitly_wait(10) # seconds driver.get("http://somedomain/url_that_delays_loading") myDynamicElement = driver.find_element_by_id("myDynamicElement")
9.提交JS脚本
js_code = 'alert("hello,word!")'
driver.execute_script(js_code)