pip install selenium
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()
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
)
# 设置浏览器的
driver.get("https://www.baidu.com")
# 获取页面的内容
page_source = driver.page_source
例如有一个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"))
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中
switch_to_window
方法# Click here to open a new window
driver.switch_to_window("windowName")
# 遍历handle列表来切换
for handle in driver.window_handles:
driver.switch_to_window(handle)
# 获取当窗口的句柄
driver.current_window_handle
# 切换到新的窗口
driver.switch_to.window(new_handle)
# 切换到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()
调用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()
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()
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()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")
js_code = 'alert("hello,word!")'
driver.execute_script(js_code)