一. 创建浏览器对象二. 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
特点:只能用于标签 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:获取titleexecute_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)#获取下拉选项中的第一项隐式等待和显示等待的区别



