一、css定位

  1. """
  2. css定位
  3. 基于find_element_by_css_selector()实现
  4. """
  5. import time
  6. from selenium import webdriver
  7. from selenium.webdriver.common.by import By
  8. driver=webdriver.Chrome()
  9. driver.get("https://www.baidu.com")
  10. # 通过绝对路径进行定位 一般不用
  11. el1=driver.find_element_by_css_selector("html body div div div div div form span input ")
  12. el2=driver.find_element_by_css_selector("html>body> div> div> div> div >div> form> span> input ")
  13. # 2通过id定位 #id属性值
  14. # 3通过class属性定位 .class属性值 s_ipt
  15. el3=driver.find_element_by_css_selector("#kw")
  16. el4=driver.find_element_by_css_selector('.s_ipt')
  17. # 4通过其他属性定位,并且多个属性定位
  18. el5=driver.find_element_by_css_selector("[autocomplete='off']")
  19. el6=driver.find_element_by_css_selector("[autocomplete='off'][class='s_ipt']")
  20. # 5通过标签定位 标签名+属性/id/class进行定位 组合定位
  21. el7=driver.find_element_by_css_selector("input#kw")
  22. el8=driver.find_element_by_css_selector("input.s_ipt")
  23. el9=driver.find_element_by_css_selector("input[autocomplete='off']")
  24. #6通过层级定位 层级之间通过>或者空格隔开 相对路径
  25. el10=driver.find_element_by_css_selector("form#form>span>input#kw")
  26. # 通过兄弟节点定位
  27. # 场景:同一个元素下面多一个相同的元素 多胞兄弟
  28. # 第一个元素 标签:first‐child
  29. # 第二个元素 标签:nth‐child(n)
  30. # 最后元素 标签:last‐of‐type
  31. el11=driver.find_element_by_css_selector("div#s‐top‐left>a:first‐child")
  32. el12=driver.find_element_by_css_selector("div#s‐top‐left>a:nth‐child(3)")
  33. el13=driver.find_element_by_css_selector("div#s‐top‐left>a:last‐of‐type")
  34. # el13.click()
  35. # el10.send_keys("chromedriver")
  36. # time.sleep(2)
  37. # driver.close()
  38. """
  39. 定位多个元素
  40. """
  41. ellist=driver.find_elements_by_css_selector("#kw")
  42. print(ellist)
  43. # 返回WebElement
  44. el14=ellist[0]
  45. """
  46. 元素定位是否通过一个方法,支持所有的定位方式定位到元素
  47. find_element()
  48. find_elements() 基于多个定位方式找到一组元素
  49. """
  50. el15=driver.find_element(By.CSS_SELECTOR,"#kw")
  51. el16=driver.find_element(By.ID,"kw")
  52. el14.send_keys("chromedriver")
  53. time.sleep(2)
  54. driver.close()
  55. """
  56. webdriver底层关于元素定位 8+8+2=18
  57. """

二、元素的常用操作

四大操作:

1、输入

2、点击

3、获取文本

4、获取属性

  1. """
  2. 元素四大操作
  3. """
  4. import time
  5. from selenium import webdriver
  6. from selenium.webdriver.common.by import By
  7. driver=webdriver.Chrome()
  8. driver.get("http://www.baidu.com")
  9. time.sleep(2)
  10. el1=driver.find_element(By.ID,"kw")
  11. # 输入
  12. # el1.send_keys()
  13. # 点击
  14. # el1.click()
  15. # 获取元素文本内容
  16. el2=driver.find_element(By.LINK_TEXT,"新闻")
  17. print("打印该元素的文本内容:",el2.text)
  18. # 获取元素的属性
  19. print("获取autocomplete属性值:",el1.get_attribute("autocomplete"))

三、三大切换

1、切换窗口:当定位的元素不在当前窗口,则需要切换窗口

  1. import time
  2. from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.support.wait import WebDriverWait
  5. from selenium.webdriver.support import expected_conditions as EC
  6. """
  7. 元素等待:
  8. 1、强制等待 time.sleep(秒数) 停留
  9. 2、智能等待(隐士等待) driver.implicitly_wait(秒数) 给页面上所有的元素设置全局等待时间只要在设置的时间范围内找到了元素,就会执行下一个代码,最多等待设置的时间
  10. 3、显示等待 显示等待:等待当前需要操作的元素 基于多种条件+等待元素
  11. 多种条件:等待元素可见?等待url跳转为xxx?等待新窗口出现?很多场景条件
  12. from selenium.webdriver.support.wait import WebDriverWait
  13. from selenium.webdriver.support import expected_conditions
  14. 自动化测试框架脚本:
  15. 以显示等待为主
  16. 以强制等待为辅
  17. """
  18. driver=webdriver.Chrome()
  19. # 智能等待
  20. # driver.implicitly_wait(10)
  21. driver.get("http://www.baidu.com")
  22. # 输入搜索内容
  23. el1=driver.find_element(By.ID,"kw")
  24. el1.send_keys("chromedriver")
  25. #点击百度一下
  26. el2=driver.find_element(By.ID,'su')
  27. el2.click()
  28. # 显示等待
  29. loc=(By.LINK_TEXT,"ChromeDriver Mirror")
  30. # 等待元素存在
  31. WebDriverWait(driver,15,0.5).until(EC.presence_of_element_located(loc))
  32. # 点击搜索的内容
  33. el3=driver.find_element(*loc)
  34. el3.click()
  35. # 新打开的窗口里面定位元素 需要切换窗口
  36. # 获取浏览器窗口列表 最早打开的窗口放到list的最前面
  37. wins=driver.window_handles
  38. print(wins)
  39. # 切换最后打开的窗口
  40. driver.switch_to.window(wins[‐1])
  41. el4=driver.find_element(By.LINK_TEXT,"2.0/")
  42. el4.click()
  43. # 为了看到效果
  44. time.sleep(3)
  45. driver.close()

2、切换iframe:当定位的元素在frame/iframe,则需要切换

  1. """
  2. 定位的元素包含在iframe/frame标签里面
  3. 切换到iframe/frame
  4. """
  5. import time
  6. from selenium.webdriver.common.by import By
  7. from selenium import webdriver
  8. driver=webdriver.Chrome()
  9. driver.get("https://ke.qq.com/?tuin=80805fad")
  10. driver.find_element(By.ID,"js_login").click()
  11. time.sleep(2)
  12. # 切换iframe 方式一:id
  13. # driver.switch_to.frame("id")
  14. # 切换iframe 方式二:索引 索引值从0开始
  15. driver.switch_to.frame(1)
  16. # 切换iframe 方式三:找到iframe元素
  17. # driver.switch_to.frame(driver.find_elements(By.XPATH,"//iframe")[2])
  18. # 再定位元素
  19. driver.find_element(By.LINK_TEXT,"帐号密码登录").click()
  20. time.sleep(2)
  21. driver.close()
  22. # 切换当前iframe/frame上一级iframe/frame元素
  23. driver.switch_to.parent_frame()
  24. # 返回第一代iframe/frame
  25. driver.switch_to.default_content()
  1. """
  2. 定位的元素包含在iframe/frame标签里面
  3. 切换到iframe/frame
  4. """
  5. import time
  6. from selenium import webdriver
  7. from selenium.webdriver.common.by import By
  8. from selenium.webdriver.support.wait import WebDriverWait
  9. from selenium.webdriver.support import expected_conditions as EC
  10. driver = webdriver.Chrome()
  11. driver.get("https://ke.qq.com/?tuin=80805fad")
  12. driver.find_element(By.ID,"js_login").click()
  13. # 点击登录后去定位iframe,太快了,弹窗的iframe还没有加载出来
  14. time.sleep(2)
  15. # 切换iframe 方式一:id
  16. # driver.switch_to.frame("id")
  17. # 切换iframe 方式二:索引 从0开始索引
  18. driver.switch_to.frame(2)
  19. # 切换iframe 方式三:找到iframe元素
  20. # driver.switch_to.frame(driver.find_element(By.XPATH,"//section/div/div/div/iframe"))
  21. # a = driver.find_elements(By.XPATH,"//iframe")
  22. # print(a)
  23. # driver.switch_to.frame(a[2])
  24. # 再定位元素
  25. loc = (By.ID,"switcher_plogin")
  26. WebDriverWait(driver,15,0.5).until(EC.presence_of_element_located(loc))
  27. driver.find_element(*loc).click()
  28. time.sleep(2)
  29. driver.close()
  30. # 切换当前iframe/frame上一级iframe/frame元素
  31. driver.switch_to.parent_frame()
  32. # 返回第一代iframe/frame
  33. driver.switch_to.default_content()

3、切换弹出窗口

下节课讲解

四、元素三大等待

  1. import time
  2. from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.support.wait import WebDriverWait
  5. from selenium.webdriver.support import expected_conditions as EC
  6. """
  7. 元素等待:
  8. 1、强制等待 time.sleep(秒数) 停留
  9. 2、智能等待(隐式等待) driver.implicitly_wait(秒数) 给页面上所有的元素设置全局等待时间
  10. 只要在设置的时间范围内找到了元素,就会执行下一个代码,最多等待设置的时间
  11. 3、显示等待 显示等待:等待当前需要操作的元素 基于多种条件+等待元素
  12. 多种条件:等待元素可见?等待url跳转为xxx?等待新窗口出现?很多场景条件
  13. from selenium.webdriver.support.wait import WebDriverWait
  14. from selenium.webdriver.support import expected_conditions
  15. 自动化测试框架脚本:
  16. 以显示等待为主
  17. 以强制等待为辅
  18. """
  19. driver=webdriver.Chrome()
  20. # 智能等待
  21. # driver.implicitly_wait(10)
  22. driver.get("http://www.baidu.com")
  23. # 输入搜索内容
  24. el1=driver.find_element(By.ID,"kw")
  25. el1.send_keys("chromedriver")
  26. #点击百度一下
  27. el2=driver.find_element(By.ID,'su')
  28. el2.click()
  29. # 显示等待
  30. loc=(By.LINK_TEXT,"ChromeDriver Mirror")
  31. # 等待元素存在
  32. WebDriverWait(driver,15,0.5).until(EC.presence_of_element_located(loc))
  33. # 点击搜索的内容
  34. el3=driver.find_element(*loc)
  35. el3.click()
  36. # 新打开的窗口里面定位元素 需要切换窗口
  37. # 获取浏览器窗口列表 最早打开的窗口放到list的最前面
  38. wins=driver.window_handles
  39. print(wins)
  40. # 切换最后打开的窗口
  41. driver.switch_to.window(wins[‐1])
  42. el4=driver.find_element(By.LINK_TEXT,"2.0/")
  43. el4.click()
  44. # 为了看到效果
  45. time.sleep(3)
  46. driver.close()

作业:实现的业务流程,进入腾讯课堂首页,完成登录的操作