文章目录
- 一. 创建浏览器对象
- 二. 8中元素定位方式
- 三. 每种元素定位的优缺点
- 四. 隐式等待和显式等待
- 五. 操作
- 六. 总结
一. 创建浏览器对象
from selenium import webdriver
driver = webdriver.Chrome()#如果配置了如果系统配置了chromedriver.exe的path路径则不用填写,否则需要填写chromedriver.exe的路径
driver.maximize() #浏览器窗口最大化
二. 8中元素定位方式
- 通过id元素定位
from selenium import webdriver
from selenium.webdriver.common.by import By
dev = webdriver.Chrome()
dev.maximize_window()
#访问网址
dev.get('https://www.baidu.com')
#在搜索框中输入文本信息
driver.find_element(By.ID, 'kw').send_keys('我是不是最帅的男人')
- 通过name元素定位
#输入文本前清空输入框中的内容
driver.find_element(By.ID, 'wd').clear()
driver.find_element(By.ID, 'wd').send_keys('我一定是世界上最帅的男人吧')
- 通过class_name元素定位
#hint_PIwZX c_font_2AD7M,发现有两个类名,class_name方法只能填写一个类名,通过图片中右边的样式信息发现第一个类对这个元素影响较大,
#故选第一个,这是什么原理呢:就是说对一个事物描述的细节越多,就证明符合这么多属性的对象存在的越少,这样更能精准找到我们想要的元素,我是这样理解的
#一个页面中可能存在多个类名为hint_PIwZX的元素
dev.find_element(By.CLASS_NAME, 'hint_PIwZX)
- 通过tag_name定位元素(通过标签定位元素)
#一个页面中可能存在多个h3标签
dev.find_element(By.TAG_NAME, 'h3')
- 通过link_text方式定位
#只能定位a标签,必须是完全匹配
dev.find_element(By.LINK_TEXT, '我是不是世界上最帅的男人? - 知乎')
- 通过partial_link_text定位
#只能定位a标签,可以模糊匹配匹配
dev.find_element(By.LINK_TEXT, '我是不是世界上最帅的男人? ')
- 通过xpath定位
#复制的结果是://*[@id="2"]/h3/a
#意思是 //*(任意路径下) [@id="2"](id为"2"的元素)下 /h3(h3标签) /a(a标签)}
dev.find_element(By.XPATH, '//*[@id="2"]/h3/a')
#完整的xpth路径是这样的/html/body/div[2]/div[3]/div[1]/div[3]/div[2]/h3/a
#通过完整的xpth路径也可以定位得到
dev.find_element(By.XPATH, '/html/body/div[2]/div[3]/div[1]/div[3]/div[2]/h3/a')
- 通过css_selector定位(元素选择器)
# #\33 > h3 > a
dev.find_element(By.CSS_SELECTOR, ' #\33 > h3 > a')
三. 每种元素定位的优缺点
- id 和 name
- 优点:易于定位元素,大多是时其属性值是唯一的
- 缺点:很多元素没有id 和 name 属性
- class_name 和 tag_name
- 优点:几乎所有的元素都有class_name 和 tag_name
- 缺点:class 和 tag的值往往不是唯一,很难精准的找到一个元素
- link_text 和 partial_link_text
- 特点:只能用于<a>标签
- xpath 和 css_selector
- xpath 和 css_selector几乎可以用于所有页面元素定位
- 都有工具可以直接生成xpath和css_selector
- 但工具的生成不是100%有用.有时需要手写
四. 隐式等待和显式等待
- implicitly_wait():隐式等待
from selenium import webdriver
from selenium.webdriver.common.by import By
#当使用了隐士等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常
#换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0
#一旦设置了隐式等待,则它存在整个 WebDriver 对象实例的声明周期中,隐式的等到会让一个正常响应的应用的测试变慢,
#它将会在寻找每个元素的时候都进行等待,这样会增加整个测试执行的时间。
#举例
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.implicitly_wait(10)#正常执行一次,注释之后执行一次
driver.find_element(By.ID, 'hh').click()
#结果是有该语句时如果找不到该元素10s之后会抛出错误
#如果没有该语句时则会马上抛出错误
- WebDriverWait():显式等待
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "hh")))
element.click()
- 上边的例子并没有发现两者的操作上的区别
selenium隐式等待和显式等待的区别.
五. 操作
- click():点击
- send_keys():模拟键盘输入
- submit():提交
- clear():清空输入框
- Select():下拉框
- select_by_index(第几个选项)
- select_by_value(value属性的值)
- select_by_visible_text(页面上选项的文本值)
- switch_to.alert.accept():点击弹框确定
- switch_to.alert.dismiss(:点击弹框取消)
- window_handles:获取title
- execute_script():执行javascript脚本
六. 总结
- 当submit按钮无法定位时,定位form表单中任意元素,然后.submit()
- css_selector可采用任意属性定位
- 类似于日历控件需要将"readonly"属性删除
#js脚本:document.getElementById("日历控件的id值").removeAttribute("readonly")
js = document.getElementById("日历控件的id值").removeAttribute("readonly")
driver.execute_script(js)
- 输入文本内容之前记得用clear()清除里边的内容,哪怕没有内容
- 弹框(alter)的处理
#获取弹框中的内容
text = driver.switch_to.alert.text
#点击确定按钮
driver.switc_to.alert.accept()
#点击取消按钮
driver.switc_to.alert.dismiss()
- 下拉框
from selenium.webdriver.support.select import Select
element = driver.find_element(By.ID, "xiala")
Select(element).select_by_index(0)#获取下拉选项中的第一项
- 隐式等待和显示等待的区别