1.元素定位和常用方法
wd=webdriver.Chrome()
element = wd.find_element(By.ID,'kw')//通过id查找画面元素
element1=wd.find_element(By.CLASS_NAME,'animal')//返回第一个元素,使用类名查询
elements = wd.find_elements(By.CLASS_NAME,'animal')//返回所有元素,使用类名查询
element2=wd.find_element(By.TAG_NAME,'div')//使用标签名查询
element.send_keys('我要offer\n')//输入查询关键字并且回车,回车是\n
element.click()//点击该元素
如果找不到元素,find_element方法会抛出selenium.common.exceptions.NoSuchElementException
的异常
异常处理可以使用try
try:
element = wd.find_element(By.ID,'kw')/
except NoSuchElementException:
print("找不到元素")
如果找不到元素,find_element方法会返回空列表
wd.quit()//退出webdriver
from selenium.webdriver.common.by import By
wd.find_element(By.ID, 'username').send_keys('byhy')
wd.find_element(By.CLASS_NAME, 'password').send_keys('sdfsdf')
wd.find_element(By.TAG_NAME, 'input').send_keys('sdfsdf')
wd.find_element(By.CSS_SELECTOR,'button[type=submit]').click()
webdriver对象选择范围是整个web页面
webelement对象选择元素的范围是该元素的内部
import time
time.sleep(2)//2是2秒
wd.implicitly_wait(10)//隐式等待或者全局等待
element.clear()//清除元素内容比如输入框等
element.get_attribute('class')//获取元素属性
element.get_attribute('outerHTML')//获取元素包括元素标签
element.get_attribute('innerHTML')//获取内部元素标签
element.get_attribute('value')//可以获取输入框里的文本
element.get_attribute('innerText')//获取文本
element.get_attribute('TextContent')//获取文本
elememnt=wd.find_elements(By.CSS_SELECTOR,'.plant')//class为plant的元素
elememnt=wd.find_elements(By.CSS_SELECTOR,'.#plant')//ID为plant的元素
elememnt=wd.find_elements(By.CSS_SELECTOR,'#container > div')//id为container 下面的标签为div的子元素
elememnt=wd.find_elements(By.CSS_SELECTOR,'#container > div')//id为container 下面的标签为div的子元素
elememnt=wd.find_elements(By.CSS_SELECTOR,'[href="http://www.miitbeian.gov.cn"]')//选择属性href的元素
css选择器可以组合表达选出子元素,表达式的验证可以使用chrome的F12后选中element标签然后再ctrl+f去验证是否正确
如果想要选择或条件的元素,可以使用逗号分隔
elements = wd.find_elements(By.CSS_SELECTOR, 'div,#BYHY')//选择所有tag名为div的元素 和 id为BYHY的元素
根据次序选择子节点
span:nth-child(2) //父元素的第二个元素并且为span的元素
:nth-child(2)//所有有父元素的第二个元素没有其它限定条件
p:nth-last-child(1)//最后一个p
span:nth-of-type(2)//第一个span类型的子元素
span:nth-last-of-type(2)//倒数第一个span类型的子元素
p:nth-child(even)//偶数节点
p:nth-child(odd)//奇数节点
nth-of-type(even)
nth-of-type(odd)
h3+span//h3标签后面紧跟着的span标签
h3 ~ span//h3标签后面的所有span
可以在前面加选择器限定
#t1 h3~span
2.切换窗口,切换到iframe文档对象操作
html中有iframe的时候需要切换webdriver的操作对象
wd.switch_to(iframe_reference)//参数可以使用iframe标签里id或者name的值
当iframe没有id或者name属性时可以定位
wd.switch_to.frame(wd.find_element(By.TAG_NAME,'iframe'))
从iframe里面切换出来
wd.switch_to.default_content()
切换到不同的窗口,同一个浏览器
wd.switch_to.window(handle)
handle的取得:
for handle in wd.window_handles:
wd.switch_to.widnow(handle):
if '必应' in wd.title:
break
为了回到原来的窗口,我们需要在切换之前先保存原来的handle
mainhandle=wd.current_window_handle
执行完别的窗口的操作后回到原来的窗口就可以
wd.switch_to.window(mainhandle)
3.常用工具类Select,ActionChains
对于select选择框,selenium专门提供了一个Select类
from selenium.webdriver.support.ui import Select
select = Select(wd.find_element(By.ID, "ss_single"))
s.select_by_value('1')
s.select_by_index(2)
s.select_by_visible_text('小雷老师')
s.deselect_by_index(1)
s.deselect_by_value('2')
s.deselect_by_visible_text('小雷老师')
s.deselect_all()
鼠标右键点击,双击,移动鼠标到某个元素,鼠标拖拽
可以通过Selenium提供的ActionChains类来实现
from selenium.webdriver.common.action_chains import ActionChains
ac = ActionChains(wd)
ac.move_to_element(
wd.find_element(By.NAME,'tj_briicon')
).perform()
定位元素技巧
在chrome的console里使用
setTimeout(function(){debugger}, 5000)
然后在页面停住前找到隐藏的元素
4.切换到alert去操作
alert的弹出框如何点击
wd.switch_to.alert.accept()//点击确定
wd.switch_to.alert.dismiss()//点击取消
wd.switch_to.alert.text//获取对话框文本
alert=wd.switch_to.alert
alert.send_keys()
alert.accept()
alert.dismiss()
driver.get_window_size()//获取窗口大小
driver.set_window_size(x, y)//改变窗口大小
diver.title//获取当前窗口标题
diver.curent_url//获取当前窗口URL地址
driver.get_screenshot_as_file('1.png')//截屏
ele.send_keys(r'h:\g02.png')//上传文件
5.Xpath选择器
基本使用
wd.find_element(By.XPATH,'/html/body/div/select[@class="single_choice"]/option[2]')
//div 从当前节点开始找到所有div元素
//div//p 找到所有div元素里面的p元素
//div/p 找到所有div下面的直接子节点是p的元素
//div/* div下面的所有子元素
//*[@id='west'] 不管标签名字选取id为west的元素
//div[@class="single_choice"] 根据class选取div元素
//*[@multiple] 找到有属性multiple的元素
a[href*="mlitbeian"] 属性值包含某个字符串
a[href^="http"] 属性以http开头
a[href$="gov.cn"] 属性以gov.cn结尾
//*[contains(@style,'color')] 属性值style包含color
//*[starts-with(@style,'color')] 属性值style以color字符串开头
//*[starts-with(@class,'m')] 属性值class以m开头
//p[2]选择p类型的第2个子元素
//p[last()-1] 选择p类型的倒数第2个
//option[position()<=2] 或者 //option[postion()<3] 选取option的第一到第二个子元素
//option[position()=last()]
组选择:
//option | //h4 使用 | 号隔开
/.. 可以用来表示某个元素的父节点
//*[@id="china"]/..
继续找上层父节点
//*[@id="china"]/../../..
选择 class 为 single_choice 的元素的所有后续兄弟节点 //*[@class='single_choice']/following-sibling::*
等同于CSS选择器 .single_choice ~ *
选择 class 为 single_choice 的元素的 所有 前面的兄弟节点,这样写
//*[@class='single_choice']/preceding-sibling::*
xpath 常见坑
当你要在一个element对象里再去找一个element对象时,要在最前面加上一个./
china = wd.find_element(By.ID, 'china')
elements = china.find_elements(By.XPATH, './/p')
不加的话相当于啊还是全文档去找的而不是china里面去找