元素定位方法分类
直接调用型(推荐方式)
driver.find.element_by_xxx(value)
使用BY类型(导入BY)
from selenium.webdriver.common.by import import By
driver.find_element(By.xxx,value)
元素定位方法的分类(按定位方式)
id // id定位
name //name属性值定位
class name //伪类名定位
tag name //标签名定位
link text //链接文本定位
partial link text //部分链接文本
xpath //xpath路径表达式
css selector //css选择器定位
八种定位方式的示例
driver.find_element_by_xpath(value)
driver.find_element_by_id(value)
driver.find_element_by_css_selector(value)
driver.find_element_by_name(value)
driver.find_element_by_class_name(value)
driver.find_element_by_link_text(value)
driver.find_element_by_partial_link_text(value)
driver.find_element_by_tag_name(value)
元素的操作
test = driver.find_element_by_xpath(value)
点击和输入
test.click() //点击
test.clear() //清空输入框
test.send_keys(data) //输入数据
获取所有窗口的句柄(用于识别多标签或窗口的情况)
handles = driver.window.handlers()
//会得到一个列表,在Selenium运行过程中的每一个窗口都有一个对应的值存放在里面
driver.switch_to_window(handlers[n])
//通过句柄进入该窗口
多表单切换
实际上就是用iframe/frame,引用了其他页面的链接
直接使用id值切换进表单
driver.switch_to.frame(value)
定位到元素,在切换进去
e = driver.find.element_by_id(xxx)
driver.switch_to.frame(e)
鼠标和键盘的操作
-
导入动作链类,动作链可以储存鼠标的动作,并一起执行
from selenium.webdriver import ActionChains
ActionChains(driver)* 鼠标右击 el = driver.find_element_by_xxx(value) context_click(el) 对el执行右击 * 执行ActionChains中储存的所有动作 perform() ActionChains(driver).context_click(ele).perform() 点击鼠标右键 ActionChains(driver). double_click(ele).perform() 点击鼠标左键 ActionChains(driver).move_to_element(el).perform() 鼠标悬停
键盘操作使用的是Keys类,一般配合send_keys使用
* 导入
from selenium.webdriver.common.keys import Keys
* 常用键盘操作
send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
send_keys(Keys.SPACE) 空格键(Space)
send_keys(Keys.TAB) 制表键(Tab)
send_keys(Keys.ESCAPE) 回退键(Esc)
send_keys(Keys.ENTER) 回车键(Enter)
send_keys(Keys.CONTROL,‘a’) 全选(Ctrl+A)
send_keys(Keys.CONTROL,‘x’) 剪切(Ctrl+X)
send_keys(Keys.CONTROL,‘v’) 粘贴(Ctrl+V)
send_keys(Keys.F1) 键盘 F1
……
send_keys(Keys.F12) 键盘 F12
浏览器等待:
为什么要等待:网站内容过多,如果不进行等待而直接定位元素,可能会抛出异常
selenium中等待的分类:显示等待,隐式等待
显示等待:根据条件等待,等待条件出现
代码:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
#WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,
#默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置
#时间检测不到则抛出异常
WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located((By.CLASS_NAME,"g-hu")))
隐式等待:根据事件进行等待,等待特定时间
driver.implicitly_wait(n)
优先 隐式等待 次之 显式等待 最次 固定等待
代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver = webdriver.Firefox()
# print(dir(driver))
url = "https://bj.58.com"
driver.get(url)
# driver.get_screenshot_as_file("baidu.png") 截图
print(driver.title)
driver.maximize_window()
# 元素定位 根据id
ss = driver.find_element_by_id("kw")
# 元素定位 BY类型
ss = driver.find_element("name","wd")
# 元素定位 xpath
ss = driver.find_element_by_xpath(".//*[@name='wd']")
# 元素定位CSS类型
ss = driver.find_element_by_css_selector(".s_ipt")
# 链接文本定位
ss = driver.find_element_by_link_text("hao123")
ss.click()
# 多窗口跳转
# driver.refresh()
dj = driver.find_element_by_xpath("html/body/div[3]/div[1]/div[1]/div/div[2]/div[1]/span[2]/em[5]/a")
dj.click()
handles = driver.window_handles
print(handles)
driver.switch_to.window(handles[1])
cp = driver.find_element_by_xpath(".//*[@id='selection']/dl[7]/dd/a[5]")
cp.click()