1.1 元素的常用方法和属性
1.1.1 send_keys()发送文本
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
browsers = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
browsers.get('http://www.baidu.com')
browsers.maximize_window()
browsers.find_element(By.ID, 'kw').send_keys('selenium')
time.sleep(3)
1.1.2 click()鼠标点击
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
browsers = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
browsers.get('http://www.baidu.com')
browsers.maximize_window()
browsers.find_element(By.ID, 'kw').send_keys('selenium')
browsers.find_element(By.ID, 'su').click()
time.sleep(3)
1.1.3 clear()清除输入框
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
browsers = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
browsers.get('http://www.baidu.com')
browsers.maximize_window()
browsers.find_element(By.ID, 'kw').send_keys('selenium')
browsers.find_element(By.ID, 'kw').clear()
time.sleep(3)
1.1.4 get_attribute()获取元素属性
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
browsers = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
browsers.get('http://www.baidu.com')
browsers.maximize_window()
attribute = browsers.find_element(By.XPATH, '//*[@id="form"]/span[1]/span[2]').get_attribute('class')
print(attribute)
time.sleep(3)
1.1.5 text获取元素文本
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
browsers = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
browsers.get('http://www.baidu.com')
browsers.maximize_window()
text = browsers.find_element(By.XPATH, '//*[@id="hotsearch-content-wrapper"]/li[1]/a/span[2]').text
print(text)
time.sleep(3)
1.1.6 screen_shot()获取元素截图
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
browsers = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
browsers.get('http://www.baidu.com')
browsers.maximize_window()
browsers.save_screenshot('./baidu.png')
time.sleep(3)
1.2 元素的其他方法和属性
1.2.1 is_enabled判断元素是否已启用
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
browsers = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
browsers.get('http://www.baidu.com')
browsers.maximize_window()
enabled = browsers.find_element(By.ID, 'su').is_enabled()
print(enabled)
1.2.2 is_selected()判断勾选框是否选中
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
browsers = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
browsers.get('http://www.baidu.com')
browsers.maximize_window()
browsers.find_element(By.ID, 's-top-loginbtn').click()
time.sleep(1)
enabled = browsers.find_element(By.ID, 'TANGRAM__PSP_11__isAgree').is_selected()
print(enabled)
1.2.3 submit()提交表单
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
browsers = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
browsers.get('https://passport.baidu.com/v2/?reg')
browsers.maximize_window()
enabled = browsers.find_element(By.ID, 'TANGRAM__PSP_4__submit').submit()
print(enabled)
1.2.4 rect获取元素的尺寸和坐标
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
browsers = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
browsers.get('https://passport.baidu.com/v2/?reg')
browsers.maximize_window()
rect = browsers.find_element(By.ID, 'TANGRAM__PSP_4__form').rect
1.2.5 size获取元素尺寸
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
browsers = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
browsers.get('https://passport.baidu.com/v2/?reg')
browsers.maximize_window()
size = browsers.find_element(By.ID, 'TANGRAM__PSP_4__form').size
2.1 元素的进阶操作
2.1.1 下拉菜单
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
from webdriver_manager.chrome import ChromeDriverManager
browsers = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
browsers.get('https://passport.baidu.com/v2/?reg')
browsers.maximize_window()
# 找到下拉菜单元素
element = browsers.find_element(By.ID, 'Selector')
# 构建下拉菜单类对象
select = Select(element)
# 根据值选择
select.select_by_value('值')
# 根据文本选择
select.select_by_visible_text('文本')
# 根据索引选择
select.select_by_index(1)
2.1.2 文件上传
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
from webdriver_manager.chrome import ChromeDriverManager
browsers = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
browsers.get('https://passport.baidu.com/v2/?reg')
browsers.maximize_window()
# 如果上传是input标签可用send_keys
browsers.find_element(By.ID, 'Selector').send_keys(r'附件路径')
# 如果是一个button而不是input,找type="file"的标签元素
browsers.find_element(By.ID, 'Selector').send_keys(r'附件路径')
2.1.3 对话框
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
from webdriver_manager.chrome import ChromeDriverManager
browsers = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
browsers.get('https://passport.baidu.com/v2/?reg')
browsers.maximize_window()
# 获取弹框对象
alert = browsers.switch_to.alert
# 确定
alert.accept()
# 取消
alert.dismiss()
# 输入
alert.send_keys('输入内容')
time.sleep(2)
2.1.4 内嵌页面
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
from webdriver_manager.chrome import ChromeDriverManager
browsers = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
browsers.get('https://passport.baidu.com/v2/?reg')
browsers.maximize_window()
# 切换至内嵌页面再去进行页面操作
browsers.switch_to.frame("name属性值/id属性值/元素本身")
# 涉及多个内嵌页面可使用
# 切换到上一层
browsers.switch_to.parent_frame()
# 切换至最底层根html
browsers.switch_to.default_content()
2.1.5 窗口切换
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
from webdriver_manager.chrome import ChromeDriverManager
browsers = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
browsers.get('https://passport.baidu.com/v2/?reg')
browsers.maximize_window()
# 获取窗口句柄(返回一个列表)
handles = browsers.window_handles
# 获取当前窗口的句柄
handle = browsers.current_window_handle
# 切换至对应窗口
browsers.switch_to.window(handles[handles.index('0')])
2.1.6 翻页
import time
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
from webdriver_manager.chrome import ChromeDriverManager
browsers = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
browsers.get('https://passport.baidu.com/v2/?reg')
browsers.maximize_window()
# 向上下翻页,其他可参考https://www.selenium.dev/selenium/docs/api/py/webdriver/selenium.webdriver.common.keys.html
browsers.find_element(By.XPATH,'/html/body').send_keys(Keys.PAGE_DOWN)
browsers.find_element(By.XPATH,'/html').send_keys(Keys.PAGE_UP)
2.1.7 组合按键
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
browsers = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
browsers.get('https://passport.baidu.com/v2/?reg')
browsers.maximize_window()
# ctrl+a
browsers.find_element(By.XPATH, '/html/body').send_keys(Keys.CONTROL, 'a')
2.1.8 执行js代码
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
browsers = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
browsers.get('https://passport.baidu.com/v2/?reg')
browsers.maximize_window()
# 执行js
browsers.execute_script('window.scrollTo(0, document.body.scrollHeight);')
2.2 不适合selenuim操作的场景
2.2.1 验证码
解决办法:
1.让开发去掉验证码
2.让开发加入万能验证码
2.2.2 文件下载
解决办法:
使用selenium查找链接将其传递给例如libcurl的http请求库