Python + Selenium(创建对象, 元素定位, 显隐等待)

文章目录

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

一. 创建浏览器对象

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

二. 8中元素定位方式

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

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

  1. id 和 name
    • 优点:易于定位元素,大多是时其属性值是唯一的
    • 缺点:很多元素没有id 和 name 属性
  2. class_name 和 tag_name
    • 优点:几乎所有的元素都有class_name 和 tag_name
    • 缺点:class 和 tag的值往往不是唯一,很难精准的找到一个元素
  3. link_text 和 partial_link_text
  4. 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之后会抛出错误
    #如果没有该语句时则会马上抛出错误
    
  2. 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()
    
  3. 上边的例子并没有发现两者的操作上的区别
    selenium隐式等待和显式等待的区别.

五. 操作

  1. click():点击
  2. send_keys():模拟键盘输入
  3. submit():提交
  4. clear():清空输入框
  5. Select():下拉框
    • select_by_index(第几个选项)
    • select_by_value(value属性的值)
    • select_by_visible_text(页面上选项的文本值)
  6. switch_to.alert.accept():点击弹框确定
  7. switch_to.alert.dismiss(:点击弹框取消)
  8. window_handles:获取title
  9. 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)
    
  4. 输入文本内容之前记得用clear()清除里边的内容,哪怕没有内容
  5. 弹框(alter)的处理
    #获取弹框中的内容
    text = driver.switch_to.alert.text
    #点击确定按钮
    driver.switc_to.alert.accept() 
    #点击取消按钮
    driver.switc_to.alert.dismiss()
    
  6. 下拉框
    from selenium.webdriver.support.select import Select
    
    element = driver.find_element(By.ID, "xiala")
    Select(element).select_by_index(0)#获取下拉选项中的第一项
    
  7. 隐式等待和显示等待的区别

你可能感兴趣的:(python,selenium,学习)