1、准备
下载chrome版本对就的对应的驱动chromedriver,放在python 安装目录下的Scripts目录下
2、安装selenium
pip install selenium
3、使用
声明浏览器对象
selenium支持很多浏览器,下面调用了Chrome浏览器,运行python 文件,将会打开Chrome浏览器
from selenium import webdriver
browser = webdriver.Chrome()
访问页面
打开百度页面
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
image.png
查找元素
单个元素查找
查找元素的方法有
find_element_by_name
find_element_by_id
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
su_id=browser.find_element_by_id('su')
su_css=browser.find_element_by_css_selector("#su")
su_xpath=browser.find_element_by_xpath("//*[@id='su']")
print(su_id)
print(su_css)
print(su_xpath)
image.png
多元素查找
同样的在单个元素中查找的方法在多个元素查找中同样存在:
find_elements_by_name
find_elements_by_id
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
元素交互操作
对获取到的元素调用交互方法
from selenium import webdriver
import time
browser=webdriver.Chrome()
browser.get("https://www.taobao.com")
input=browser.find_element_by_id('q')
input.send_keys("手机")
time.sleep(10)
input.clear()
input.send_keys("小米")
button=browser.find_element_by_class_name('btn-search')
button.click()
time.sleep(10)
browser.close()
把动作附加到交互链中
from selenium import webdriver
from selenium.webdriver import ActionChains
import time
browser=webdriver.Chrome()
# browser.get("https://www.taobao.com")
# input=browser.find_element_by_id('q')
# input.send_keys("手机")
# time.sleep(10)
# input.clear()
# input.send_keys("小米")
# button=browser.find_element_by_class_name('btn-search')
# button.click()
# time.sleep(10)
# browser.close()
url="http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
browser.get(url)
#切换到目标元素所在的frame
browser.switch_to_frame("iframeResult")
#确定拖拽目标的起点
source=browser.find_element_by_id("draggable")
#确定拖拽目标的终点
target=browser.find_element_by_id("droppable")
#形成动作链
actions=ActionChains(browser)
actions.drag_and_drop(source,target)
#执行
actions.perform()
'''
1.先用switch_to_alert()方法切换到alert弹出框上
2.可以用text方法获取弹出的文本 信息
3.accept()点击确认按钮
4.dismiss()相当于点右上角x,取消弹出框
'''
t=browser.switch_to_alert()
print(t.text)
time.sleep(2)
t.accept()
time.sleep(10)
browser.close()
执行JavaScript
可以直接调用js方法实现一些操作
比如拖动页面、弹框显示
from selenium import webdriver
browser=webdriver.Chrome()
browser.get("https://www.zhihu.com/explore")
browser.execute_script("window.scrollTo(0,document.body.scrollHeight)")
browser.execute_script("alert('To Button')")
browser.close()
切换Frame
通过switch_to.frame()和switch_to.parent_frame()进入和退出frame
等待
当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常, 换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0
隐式等待
到了一定的时间发现元素还没有加载,则继续等待我们指定的时间,如果超过了我们指定的时间还没有加载就会抛出异常,如果没有需要等待的时候就已经加载完毕就会立即执行
from selenium import webdriver
browser = webdriver.Chrome()
browser.implicitly_wait(10)
browser.get('https://www.zhihu.com/explore')
input = browser.find_element_by_class_name('zu-top-add-question')
print(input)
浏览器的前进和后退
back()
forward()
cookie
get_cookies()
delete_all_cookes()
add_cookie()
选项卡操作
通过执行js命令实现新开选项卡window.open()
不同的选项卡是存在列表里browser.window_handles
通过browser.window_handles[0]就可以操作第一个选项卡
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.execute_script('window.open()')
print(browser.window_handles)
browser.switch_to_window(browser.window_handles[1])
browser.get('https://www.taobao.com')
time.sleep(1)
browser.switch_to_window(browser.window_handles[0])
browser.get('https://python.org')
异常处理
这里的异常比较复杂,这里只进行简单的演示,查找一个不存在的元素
from selenium import webdriver
from selenium.common.exceptions import TimeoutException, NoSuchElementException
browser = webdriver.Chrome()
try:
browser.get('https://www.baidu.com')
except TimeoutException:
print('Time Out')
try:
browser.find_element_by_id('hello')
except NoSuchElementException:
print('No Element')
finally:
browser.close()
网友评论