Selenium(选择元素,浏览器/元素操作,等待,页面交互)
1.环境准备
1.1 安装selenium
pip install selenium
1.2 下载浏览器驱动,这里以Chrome为例:
点击Chrome右上角三个点--help--about Chrome查看版本
下载对应版本的驱动,这里使用华为云的镜像地址:https://repo.huaweicloud.com/chromedriver/
尽量保证驱动版本和浏览器版本一致,前三位保持一致一般就可以正常使用
把chromedriver.exe放在浏览器application目录下
1.3 设置环境变量
因为Pycharm创建项目时默认使用虚拟环境,所以将驱动地址添加为环境变量使用更方便。
复制chromedriver.exe的文件地址,也就是 C:\Program Files\Google\Chrome\Application,然后添加系统环境变量即可。
2.Selenium语法
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome() #创建Chrome的实例,代码运行到这里时会打开浏览器
driver.get('https://www.baidu.com') #访问网址,代码运行到此时会访问百度
2.1 查找元素
建议使用CSS选择器,因为它的效率最高
以上的查找函数只能查找到一个元素,如果这个元素不存在,就会报NosuchElementException,我们想一次查找到多个元素怎么办呢?只需要使用 driver.find_elements(),它的返回值是一个列表,元素出现的先后顺序对应返回值的下标。
2.2 获取元素属性
2.2.1 获取元素尺寸
element.size
2.2.3 获取元素文本
element.text
2.2.4 获取元素属性值
element.get_attribute('属性名')
2.2.5 判断元素是否可见
element.is_displayed()
2.2.6 判断元素是否可用
element.is_enabled()
2.2.7 判断元素是否选中
element.is_selected()
2.3 浏览器操作
2.3.1 窗口最大化
driver.maximize_window()
2.3.2 设置窗口大小
deiver.set_window_size(weight , height)
2.3.3 设置窗口位置
driver.set_window_position(x, y)
2.3.4 页面后退
driver.back()
2.3.5 页面前进
driver.forward()
2.3.6 页面刷新
driver.refresh()
2.3.7 关闭浏览器
driver.quit()
2.3.8 关闭当前页面
driver.close()
2.3.9 获取当前页面标题
driver.title
2.3.10 获取当前url
driver.current_url
2.4 等待
我们知道,代码的执行速度是很快的,如果用户的网络较慢或者页面上的元素是异步加载的导致我们查找元素时该元素还未被加载到页面中,这时候就需要等待,延时一段时间等待元素加载完成。
2.4.1 强制等待
在代码中直接使用 sleep() 延迟代码的执行时间
2.4.2 隐式等待
driver.implicitly_wait(timeout),设置完成后对全局有效,如果第一次查找元素未找到就会等待timeout秒后再去查找,如果还未找到则会报错。
2.4.3 显式等待
element = WebDriverWait(driver, timeout, frequency=0.5).until(lambda x: x.find_element(By.ID, 'id值') )
等待timeout秒,如果第一次没找到那么会间隔frequency秒再去找,直到until里的函数返回值不为False。显式等待不仅可以等待元素,还可以返回找到的元素,如果超时还没找到会报错: TimeOutException
2.5 页面交互操作(下拉框,弹出框,滚动条)
2.5.1 下拉框
方法一:直接使用元素的click()方法达到选中对应选项的效果
方法二:使用封装的select对象
from selenium.webdriver.support.select import Select
driver = webdriver.Chrome()
select = Select(driver.find_element(By.CSS_SELECTOR ,'#cars')) #元素必须是下拉框对象
select.select_by_index(2) #通过索引选中选项
select.select_by_value('1') #通过value属性值选中该选项
select.select_by_visible_text('奔驰') #通过文本选中选项
2.5.2 弹出框
driver = webdriver.Chrome()alert = driver.switch_to.alert //获取了弹出框对象
message = alert.text #获取弹出框文本内容
alert.dismiss() #取消
alert.accept() #确认
2.5.3 滚动条
selenium自身不能操作滚动条,只能通过js操作。
js = 'window.scrollTo(0,document.body.scrollHeight)'
driver.execute_script(js)
2.6 模拟鼠标操作
actions = ActionChains(driver)
actions.click(driver.find_element(By.CSS_SELECTOR,"#su")) #单击
actions.double_click(driver.find_element(By.ID,"su")) #双击
actions.perform()#可以像上面一样多步操作一起执行,也可以像下面一步一步的执行actions.context_click(driver.find_element(By.ID,"su")).perform() #右击
actions.move_to_element(driver.find_element(By.ID,"su")).perform() #悬停,hover
actions.drag_and_drop(element_source , element_target).perform() #把element_source拖动到element_target的位置
2.7 模拟键盘操作
2.7.1 键盘操作
2.7.2 常用键盘值
driver = webdriver.Chrome()
input_element = driver.find_element(By.ID, "input_element_id")# 输入内容
input_element.send_keys("Hello, World!")
# 发送组合键
input_element.send_keys(Keys.CONTROL, 'a') # 全选
input_element.send_keys(Keys.CONTROL, 'c') # 复制
input_element.send_keys(Keys.CONTROL, 'v') # 粘贴