Selenium的使用(超详细)

文章目录

          • 1.selenium的安装和浏览器驱动
          • 2.webdriver对象和属性options设置
          • 3. 发起请求
          • 4.查找元素
          • 5. 获取cookie
          • 6.页面/frame/历史记录切换
          • 7.操作鼠标或者键盘
          • 8.等待页面加载完成
          • 9.提交JS脚本

1.selenium的安装和浏览器驱动
  • pip install selenium
  • 保证机器上有Chrome浏览器,下载对应浏览器的驱动
    • Chrome浏览器驱动下载地址: http://chromedriver.storage.googleapis.com/index.html
    • Firefox浏览器驱动下载地址:https://github.com/mozilla/geckodriver/releases/
    • IE浏览器驱动下载地址:http://selenium-release.storage.googleapis.com/index.html
2.webdriver对象和属性options设置
  • Chrome浏览器
from selenium import webdriver
# chrome 浏览器的配置类
from selenium.webdriver import ChromeOptions

options = webdriver.ChromeOptions()
# 无头浏览器的模式
options.add_argument('--headless')
# 屏蔽掉正在监控
options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 忽略证书错误
options.add_argument('--ignore-certificate-errors')
# 设置代理
options.add_argument('--proxy-server=http://127.0.0.1:8081')
# 屏蔽网页消息的提示
options.add_argument("--no-sandbox")
# 使用假设备进行MediaStream替换实际的摄像头和麦克风。
options.add_argument("--use-fake-device-for-media-stream")
# 通过选择媒体流的默认设备(例如WebRTC)来绕过媒体流信息量。与--use-fake-device-for-media-stream一起使用。
options.add_argument("--use-fake-ui-for-media-stream")
driver = webdriver.Chrome(executable_path='chromedriver', chrome_options=options)
# 设置浏览器的尺寸
driver.set_window_size(1366, 768)
# 最大化窗口
driver.maximize_window()
  • Firefox浏览器
    from selenium import webdriver
    
    
    profile = webdriver.FirefoxProfile()
    profile.set_preference('network.proxy.type', 1)
    profile.set_preference('network.proxy.http', '10.10.10.1')
    profile.set_preference('network.proxy.http_port', '8081')
    profile.update_preferences()
    browser = webdriver.Firefox(executable_path='C:\geckodriver.exe',
                                     firefox_options=options,
                                     firefox_profile=profile
                                    )
    
3. 发起请求
# 设置浏览器的
driver.get("https://www.baidu.com")
# 获取页面的内容
page_source = driver.page_source
4.查找元素
  • 例如有一个html标签

    <input type="text" name="passwd" id="passwd-id" />
    <html>
     <body>
      <p class="content">Site content goes here.p>
    body>
    <html>
    
    # find_element_by_id  根据标签id查找
    # find_element_by_name  根据标签name查找
    # find_element_by_xpath  根据xpath规则查找
    # find_element_by_link_text  根据链接文本获取超链接
    continue_link = driver.find_element_by_link_text('Continue')
    # find_element_by_partial_link_text  根据本分文本获取链接属性
    continue_link = driver.find_element_by_partial_link_text('Conti')
    # find_element_by_tag_name  通过标签名查找元素
    heading1 = driver.find_element_by_tag_name('h1')
    # find_element_by_class_name  根据class name 定位 class='content'
    content = driver.find_element_by_class_name('content')
    # find_element_by_css_selector  根据css选择器查找元素
    content = driver.find_element_by_css_selector('p.content')
    
  • 填写表格

    # 获取到元素后,可以对元素进行操作
    # 输入操作
    search_bar = driver.find_element_by_xpath('//*[@id="search_bar"]/input')
    search_bar.send_keys('要搜索的内容')
    # 点击操作
    driver.find_element_by_id("submit").click()
    
  • 获取属性值或文本值

    # 获取标签内的文本
    driver.find_element_by_xpath('//h3[@class="nickname"]/span').text
    # 获取属性
    driver.find_element_by_xpath("//select[@name='name']").get_attribute("value"))
    
5. 获取cookie
cookies = self.driver.get_cookies()
# 返回的是cookie的字典列表
cookies_str = ''
for cookie in cookies:
	cookies_str += cookie['name'] + '=' + cookie['value'] + ";"
print(cookies_str)
# 把cookie的name和value拼接成字符串 xxx1=xxx1;xxx2=xxx2的形式,后续放在requests的 User-Agent中
6.页面/frame/历史记录切换
  • 使用 switch_to_window 方法
  • 使用窗口的名字切换
    # Click here to open a new window
    driver.switch_to_window("windowName")
    
  • 使用handle来切换
    # 遍历handle列表来切换
    for handle in driver.window_handles:
        driver.switch_to_window(handle)
    # 获取当窗口的句柄
    driver.current_window_handle
    # 切换到新的窗口
    driver.switch_to.window(new_handle)
    
  • frame的操作
    # 切换到frame,进入到frame中
    driver.switch_to_frame("frameName")
    # 进入frame, 并操作frame中的元素
    driver.switch_to_frame("frameName.0.child")
    # 退出frame
    driver.switch_to_default_content()
    
    • 进入iframe的几种方式

      <html lang="en">
      <head>
          <title>FrameTest</title>
      </head>
      <body>
      <iframe src="a.html" id="frame_id" name="frame_name"></iframe>
      </body>
      </html>
      # 进入iframe的方法
      driver.switch_to.frame(0)  # 1.用frame的index来定位,第一个是0
      driver.switch_to.frame("frame1")  # 2.用id来定位
      driver.switch_to.frame("myframe")  # 3.用name来定位
      driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))  # 4.用查找到元素对想进入
      
    • 嵌套frame的操作

      <html>
          <iframe id="frame1">
              <iframe id="frame2" / >
          </iframe>
      </html>
      # 从页面进入iframe2中,一层层进入
      driver.switch_to.frame("frame1")
      driver.switch_to.frame("frame2")
      
      # 切换回父iframe
      driver.switch_to.parent_frame()
      
  • 切换弹出框
    # 访问网站的弹出框
    alert = driver.switch_to_alert()
    
  • 访问浏览器的历史记录
    # 浏览器前进记录
    driver.forward()
    # 浏览器后退记录
    driver.back()
    
7.操作鼠标或者键盘
  • 鼠标操作 (ActionChains)
    • 调用ActionChains方法的时候,不会立即执行,而是会将所有的操作按顺序存放在一个队列里,当你调用**perform()**方法的时候,队列中的操作会一次执行

    • 方法列表

      click(on_element=None) ——单击鼠标左键

      click_and_hold(on_element=None) ——点击鼠标左键,不松开

      context_click(on_element=None) ——点击鼠标右键

      double_click(on_element=None) ——双击鼠标左键

      drag_and_drop(source, target) ——拖拽到某个元素然后松开

      drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开

      key_down(value, element=None) ——按下某个键盘上的键

      key_up(value, element=None) ——松开某个键

      move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标

      move_to_element(to_element) ——鼠标移动到某个元素

      move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置

      perform() ——执行链中的所有动作

      release(on_element=None) ——在某个元素位置松开鼠标左键

      send_keys(*keys_to_send) ——发送某个键到当前焦点的元素

      send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素

      on_element: 鼠标要操作的元素,None时,为操作鼠标当前的位置

    • click, double_click, context_click

      from selenium import webdriver
      from selenium.webdriver.common.action_chains import ActionChains
      from time import sleep
      
      
      driver = webdriver.Firefox()
      driver.implicitly_wait(10)
      driver.maximize_window()
      driver.get('http://sahitest.com/demo/clicks.htm')
      
      click_btn = driver.find_element_by_xpath('//input[@value="click me"]')  # 单击按钮
      doubleclick_btn = driver.find_element_by_xpath('//input[@value="dbl click me"]')  # 双击按钮
      rightclick_btn = driver.find_element_by_xpath('//input[@value="right click me"]')  # 右键单击按钮
      
      
      ActionChains(driver).click(click_btn).double_click(doubleclick_btn).context_click(rightclick_btn).perform()  # 链式用法
      
      print(driver.find_element_by_name('t2').get_attribute('value'))
      
      sleep(2)
      driver.quit()
      
    • move 操作

      write_ele = driver.find_element_by_xpath('//input[@value="Write on hover"]')
      blank_ele = driver.find_element_by_xpath('//input[@value="Blank on hover"]')
      
      # 创建对象
      action = ActionChains(driver)
      # 移动到write元素,显示“Mouse moved”
      action.move_to_element(write_ele).perform()
      
      # 鼠标移动到blank 元素上
      action.move_to_element(blank_ele).perform()
      # 移动到距离当前位置(10,50)的点,与上句效果相同,移动到blank上,清空
      action.move_by_offset(10, 50).perform()
      
      # 移动到距离blank元素(10,-40)的点,可移动到write上
      action.move_to_element_with_offset(blank, 10, -40).perform()
      
    • drag

      from selenium import webdriver
      from selenium.webdriver.common.action_chains import ActionChains
      from time import sleep
      
      driver = webdriver.Firefox()
      driver.implicitly_wait(10)
      driver.maximize_window()
      driver.get('http://sahitest.com/demo/dragDropMooTools.htm')
      
      # 被拖拽元素
      dragger = driver.find_element_by_id('dragger')
      item1 = driver.find_element_by_xpath('//div[text()="Item 1"]')  # 目标元素1
      item2 = driver.find_element_by_xpath('//div[text()="Item 2"]')  # 目标2
      item3 = driver.find_element_by_xpath('//div[text()="Item 3"]')  # 目标3
      item4 = driver.find_element_by_xpath('//div[text()="Item 4"]')  # 目标4
      
      action = ActionChains(driver)
      # 1.移动dragger到目标1
      action.drag_and_drop(dragger, item1).perform()
      sleep(2)
      # 2.点击保持主该元素,拖拽多item2元素释放
      action.click_and_hold(dragger).release(item2).perform()
      sleep(2)
      # 3.点击保持主该元素,拖拽到item3元素,然后释放,提交
      action.click_and_hold(dragger).move_to_element(item3).release().perform()
      sleep(2)
      # 点击保持主该元素,移动到指定坐标,释放,提交
      action.click_and_hold(dragger).move_by_offset(400, 150).release().perform()
      sleep(2)
      driver.quit()
      
  • 键盘
    • 按键的操作,可以用sendkeys() 方法实现,也可以用 ActionChains里的一些方法
    from selenium.webdriver.common.keys import Keys
    # 发送回车键
    elem.send_keys(Keys.RETURN)
    
    • 按键的操作
      from selenium import webdriver
      from selenium.webdriver.common.action_chains import ActionChains
      
      from selenium.webdriver.common.keys import Keys
      
      driver = webdriver.Firefox(executable_path='C:\geckodriver.exe',)
      driver.implicitly_wait(10)
      driver.maximize_window()
      driver.get('http://sahitest.com/demo/keypress.htm')
      
      key_up_radio = driver.find_element_by_id('r1')  # 监测按键升起
      key_down_radio = driver.find_element_by_id('r2')  # 监测按键按下
      key_press_radio = driver.find_element_by_id('r3')  # 监测按键按下升起
      
      enter = driver.find_elements_by_xpath('//form[@name="f1"]/input')[1]  # 输入框
      result = driver.find_elements_by_xpath('//form[@name="f1"]/input')[0]  # 监测结果
      
      # 监测key_down
      key_down_radio.click()
      # 选中输入框,按下control键,释放,提交
      ActionChains(driver).key_down(Keys.CONTROL, enter).key_up(Keys.CONTROL).perform()
      
      # 监测key_up
      key_up_radio.click()
      # 选中enter输入框
      enter.click()
      # 按下shift,释放,提交
      ActionChains(driver).key_down(Keys.SHIFT).key_up(Keys.SHIFT).perform()
      
      # 监测key_press
      key_press_radio.click()
      # 选中enter输入框
      enter.click()
      # 输入a 提交
      ActionChains(driver).send_keys('a').perform()
      driver.quit()
      
    • 组合键的使用
      action = ActionChains(driver)
      
      input1 = driver.find_elements_by_tag_name('input')[3]
      # 鼠标聚焦到input1
      input1.click()
      # ctrl+c 组合键,复制文本内容
      action.key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()
      action.
      
      input2 = driver.find_elements_by_tag_name('input')[4]
      # 向input2 元素中输入 Ctrl+V的粘贴快捷键
      action.key_down(Keys.CONTROL,input2).send_keys('v').key_up(Keys.CONTROL).perform()
      
8.等待页面加载完成
  • 显示等待(你在代码中定义等待一定条件发生后再进一步执行你的代码。)
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    
    driver.get("http://somedomain/url_that_delays_loading")
    try:
        # 等待浏览器响应,直到达到  预期的条件 通过ID来筛选
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "myDynamicElement"))
        )
    finally:
        driver.quit()
    
  • 隐式等待(等待一段时间取查找元素) implicitly_wait
    driver.implicitly_wait(10) # seconds
    driver.get("http://somedomain/url_that_delays_loading")
    myDynamicElement = driver.find_element_by_id("myDynamicElement")
    
    9.提交JS脚本
js_code = 'alert("hello,word!")'
driver.execute_script(js_code)

你可能感兴趣的:(Selenium)