文章目录

  • 一. 创建浏览器对象
  • 二. 8中元素定位方式
  • 三. 每种元素定位的优缺点
  • 四. 隐式等待和显式等待
  • 五. 操作
  • 六. 总结


一. 创建浏览器对象

from selenium import webdriver
driver = webdriver.Chrome()#如果配置了如果系统配置了chromedriver.exe的path路径则不用填写,否则需要填写chromedriver.exe的路径
driver.maximize()  #浏览器窗口最大化

二. 8中元素定位方式

  1. 通过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('我是不是最帅的男人')
  1. 通过name元素定位
#输入文本前清空输入框中的内容
driver.find_element(By.ID, 'wd').clear()
driver.find_element(By.ID, 'wd').send_keys('我一定是世界上最帅的男人吧')
  1. 通过class_name元素定位
#hint_PIwZX c_font_2AD7M,发现有两个类名,class_name方法只能填写一个类名,通过图片中右边的样式信息发现第一个类对这个元素影响较大,
#故选第一个,这是什么原理呢:就是说对一个事物描述的细节越多,就证明符合这么多属性的对象存在的越少,这样更能精准找到我们想要的元素,我是这样理解的
#一个页面中可能存在多个类名为hint_PIwZX的元素
dev.find_element(By.CLASS_NAME, 'hint_PIwZX)
  1. 通过tag_name定位元素(通过标签定位元素)
#一个页面中可能存在多个h3标签
dev.find_element(By.TAG_NAME, 'h3')
  1. 通过link_text方式定位
#只能定位a标签,必须是完全匹配
dev.find_element(By.LINK_TEXT, '我是不是世界上最帅的男人? - 知乎')
  1. 通过partial_link_text定位
#只能定位a标签,可以模糊匹配匹配
dev.find_element(By.LINK_TEXT, '我是不是世界上最帅的男人? ')
  1. 通过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')
  1. 通过css_selector定位(元素选择器)
#  #\33  > h3 > a
dev.find_element(By.CSS_SELECTOR, ' #\33  > h3 > a')

三. 每种元素定位的优缺点

  1. id 和 name
  • 优点:易于定位元素,大多是时其属性值是唯一的
  • 缺点:很多元素没有id 和 name 属性
  1. class_name 和 tag_name
  • 优点:几乎所有的元素都有class_name 和 tag_name
  • 缺点:class 和 tag的值往往不是唯一,很难精准的找到一个元素
  1. link_text 和 partial_link_text
  • 特点:只能用于<a>标签
  1. xpath 和 css_selector
  • xpath 和 css_selector几乎可以用于所有页面元素定位
  • 都有工具可以直接生成xpath和css_selector
  • 但工具的生成不是100%有用.有时需要手写

四. 隐式等待和显式等待

  1. 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之后会抛出错误
#如果没有该语句时则会马上抛出错误
  1. 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()
  1. 上边的例子并没有发现两者的操作上的区别
    selenium隐式等待和显式等待的区别.

五. 操作

  1. click():点击
  2. send_keys():模拟键盘输入
  3. submit():提交
  4. clear():清空输入框
  5. Select():下拉框
  • select_by_index(第几个选项)
  • select_by_value(value属性的值)
  • select_by_visible_text(页面上选项的文本值)
  1. switch_to.alert.accept():点击弹框确定
  2. switch_to.alert.dismiss(:点击弹框取消)
  3. window_handles:获取title
  4. execute_script():执行javascript脚本

六. 总结

  1. 当submit按钮无法定位时,定位form表单中任意元素,然后.submit()
  2. css_selector可采用任意属性定位
  3. 类似于日历控件需要将"readonly"属性删除
#js脚本:document.getElementById("日历控件的id值").removeAttribute("readonly")
 js = document.getElementById("日历控件的id值").removeAttribute("readonly")
 driver.execute_script(js)
  1. 输入文本内容之前记得用clear()清除里边的内容,哪怕没有内容
  2. 弹框(alter)的处理
#获取弹框中的内容
text = driver.switch_to.alert.text
#点击确定按钮
driver.switc_to.alert.accept() 
#点击取消按钮
driver.switc_to.alert.dismiss()
  1. 下拉框
from selenium.webdriver.support.select import Select

element = driver.find_element(By.ID, "xiala")
Select(element).select_by_index(0)#获取下拉选项中的第一项
  1. 隐式等待和显示等待的区别