1、首先、在pycharm中安装工具
pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple2、在我的浏览器(谷歌,版本86)中安装插件驱动WebDriver,下载插件地址 2、1驱动下载后解压放到python解释器的安装目录即可(我的解释器安装在下面位置)
通过 id 属性定位 : find_element_by_id 通过 name 属性定位 : find_element_by_name 通过 class 属性定位 : find_element_by_class_name 通过标签名定位 : find_element_by_tag_name 通过内容定位 a 标签(绝对匹配) : find_element_by_link_text 通过内容定位 a 标签(模糊匹配) : find_element_by_partial_link_text
代码示例 固定写法:file://{本地文件绝对路径}
""" 步骤: 1. 创建驱动对象 2. 打开测试网址 3. 找元素 4. 做后续操作 5. 关闭浏览器 """ from selenium.webdriver import Chrome import time import traceback # 1. 创建驱动对象 driver = Chrome() # file://{本地文件绝对路径} # 比如我的是Windows本地路径有一个自制的html页面 driver.get('file://F:/test/selenium/test.html') # 真是存在的url也可,如百度url # driver.get('https://www.baidu.com') try: # 如果找到,返回对象,没有找到,抛出异常NoSuchElementException el = driver.find_element_by_id('username') time.sleep(2) except Exception as e: # 产生异常后执行 # print(e) print(traceback.format_exc()) # 异常过程信息可以打印 finally: # 不管有没有异常,都会执行 driver.quit()如果找到,返回对象;没有找到,抛出异常NoSuchElementException
# 绝对路径 driver.find_element_by_xpath('/html/body/form/input') # 相对路径 driver.find_element_by_xpath('//body/form/input') # 结合属性 driver.find_element_by_xpath('//form/input[@type="text"]') # 满足多个属性 driver.find_element_by_xpath('//form/input[@type="text" and @name="username"]') # 指定元素的上一级路径 driver.find_element_by_xpath('//form/input/..') el = driver.find_element_by_xpath('//ul/li') # 默认是第1个(如果li标签有多个) print(el) # 得到一个列表 el = driver.find_element_by_xpath('//ul/li[1]') # 取第1个 el = driver.find_element_by_xpath('//ul/li[last()]') # 取最后一个 el = driver.find_element_by_xpath('//ul/li[last()-1]') # 取倒数第二个如果找到,返回对象;没有找到,抛出异常NoSuchElementException
# id="username", 通过id,‘#’号 driver.find_element_by_css_selector('#username') # class="input-password", 通过class,‘.’号 driver.find_element_by_css_selector('.input-password') # 通过标签元素 driver.find_element_by_css_selector("form") # 通过属性, 和xpath区别,没有@ driver.find_element_by_css_selector('input[type="text"]') # 取父节点为ul下的li标签 driver.find_element_by_css_selector("ul>li")语法:find_element(By.ID, 'username')
# find_element主要用于二次封装使用 # 参数1:为定位元素方式,参数2:定位元素的实现字符串,和以前用法一样 """ class By(object): ID = "id" XPATH = "xpath" LINK_TEXT = "link text" PARTIAL_LINK_TEXT = "partial link text" NAME = "name" TAG_NAME = "tag name" CLASS_NAME = "class name" CSS_SELECTOR = "css selector" """ # driver.find_element_by_id() # By通过快捷键导包 el = driver.find_element(By.ID, 'username') print(el)语法:find_elements(By.ID, 'username')
问题引入: 如果页面没有加载完成就定位元素,会找不到这个元素
三种解决方法:
显式等待使用:
""" 1. 创建WebDriverWait对象,指定等待时间 2. 语法:WebDriverWait对象.until()设置等待的元素 2.1 until()传入是一个函数名,这个函数有一个参数,这个参数是Chrome类型 2.2 上一步中的2.1函数体返回定位元素的对象 2.3 WebDriverWait对象.until()返回值就是定位到的对象 参数1:驱动对象,参数2:设置等待时间, 参数3:没有找到,自动调用调用wait_driver.until()指定的函数时间 返回值:对象 TimeoutException: 指定时间没有找到,抛出异常 如果元素没有找到,会自动调用wait_driver.until()指定的函数 """ wait_driver = WebDriverWait(driver, 10) # 语法:wait_driver对象.until(函数名) el = wait_driver.until(lambda foo: foo.find_element_by_tag_name('html'))显示等待的封装方法:
from selenium.webdriver import Chrome import time import traceback from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait # 1. 创建驱动对象 driver = Chrome() # file://{本地文件绝对路径} driver.get('file:///Users/mikejiang/Desktop/code/selenium_code/test.html') def find_w_element(by=By.ID, value=None, _t=10): wait_driver = WebDriverWait(driver, _t) el = wait_driver.until(lambda temp_driver: temp_driver.find_element(by, value)) return el def find_w_element_by_xpath(xpath, _t=10): wait_driver = WebDriverWait(driver, _t) el = wait_driver.until(lambda temp_driver: temp_driver.find_element_by_xpath(xpath)) return el try: el = find_w_element(By.ID, 'username') print(el) el = find_w_element_by_xpath('//form/input') print(el) except Exception as e: # 产生异常后执行 # print(e) print(traceback.format_exc()) # 异常过程信息可以打印 finally: # 不管有没有异常,都会执行 driver.quit()鼠标单击:元素对象.click()
# 1. 先找button元素对象 el = driver.find_element_by_id('button') # 点击10次 for _ in range(10): el.click() time.sleep(0.5)鼠标的其他用法:
reset_actions(self) : 清空行为链 click(self, on_element=None): 鼠标点击 click_and_hold(self, on_element=None) : 鼠标按下 release(self, on_element=None) : 松开鼠标 context_click(self, on_element=None) : 鼠标右击 double_click(self, on_element=None) : 鼠标双击 drag_and_drop(self, source, target) : 拖动元素,source 被拖动元素,target 表示被拖动到那个元素中 drag_and_drop_by_offset(self, source, xoffset, yoffset) : 拖动元素,给定x,y 轴偏移 key_down(self, value, element=None) : 按键按下 key_up(self, value, element=None) : 按键松开 move_by_offset(self, xoffset, yoffset) : 鼠标箭头移动,给定 x,y 轴偏移 move_to_element(self, to_element) : 鼠标移动到某个元素中心 move_to_element_with_offset(self, to_element, xoffset, yoffset) : 鼠标移动到元素内的 x,y 轴位置 send_keys(self, *keys_to_send): 发送多个按键,也可以是一个字符串 send_keys_to_element(self, element, *keys_to_send) :1、元素对象.text: 获取元素对象上的文本内容,标签上有内容才有效 2、元素对象.get_attribute('innerHTML') 获取标签上的内置的html代码,get_attribute也可以获取其它属性
和之前的frame一样,也需要先切换到另外的窗口(警告框)才能操作。
# 1. 弹出一个警告框 driver.execute_script('alert("hello mike")') time.sleep(2) # 2. 切换到警告框 alert = driver.switch_to.alert time.sleep(1) # 3. 关闭警告框 alert.dismiss() # 关闭 alert.accept() # 接收Select类: from selenium.webdriver.support.select import Select 说明:Select 类是 WebDriver 为解决 select 标签定位诞生的,此类定位的是 select 标签。
使用步骤:
(1)找到这个下拉框元素(2)创建一个select类的对象(3)对象可以对下拉框进行一些操作 # 1. 找下拉框元素 el = driver.find_element_by_id('select-multiple') # 2. 创建专属类型的对象 sel_obj = Select(el) # 3. 操作 print(sel_obj.options) # 查看下拉框内容 print(len(sel_obj.options)) # 查看下拉框个数 time.sleep(1) # 通过下拉框内容的下标进行选中 for i in range(len(sel_obj.options)): sel_obj.select_by_index(i) time.sleep(1)下拉框的其他一些操作:
select.options # select 中所有 options select.all_selected_options # 所有被选中的 option select.first_selected_option # 第一个被选中的 option select.select_by_value(value) # 通过 option 的值选中 select.select_by_index(index) # 通过 option 的下标选中 select.select_by_visible_text(text) # 通过 option 的可见文本选中 select.deselect_all() # 全部不选中 select.deselect_by_value(value) # 通过 option 的值取消选中 select.deselect_by_index(index) # 通过 option 的下标取消选中 select.deselect_by_visible_text(text) # 通过 option 的文本取消选中当我们进行一些自动化操作过程中,很多时候都不需要看到电脑在自动切换画面进行操作,而是让它在后台运行,最后给出我们结果就好。因此我们可以将程序设置成无界面模式.
在一开始创建驱动对象的时候,进行如下配置即可:
# 1. 创建配置对象 opt = ChromeOptions() # 2. 添加选项 opt.add_argument('--headless') opt.add_argument('--disable-gpu') # 3. 创建驱动对象, 指定配置选项信息 driver = Chrome(options=opt)