selenium入门
Selenium入门
本篇主要介绍了selenium常用的元素选择以及对应的元素操作句柄,同时介绍了一些如键盘操作、选择框、页面操作,键盘输入等常用方法。
另介绍了CSS Selector的基本语法
selenium元素选择
id选择
from selenuium import webdriver wd = webdriver.Firefox(executable_path=r‘xxx‘) wd.get(‘http://www.baidu.com‘) id_element = wd.find_element_by_id(‘kw‘) id_element.send_keys(‘selenium‘)
使用了 WebDriver 对象 的方法 find_element_by_id,
这行代码运行是,就会发起一个请求通过 浏览器驱动 转发给浏览器,告诉它,需要选择一个id为 kw 的元素。
浏览器,找到id为kw的元素后,将结果通过 浏览器驱动 返回给 自动化程序, 所以 find_element_by_id 方法会 返回一个 WebElement 类型的对象。
class选择
from selenium import webdriver wd = webdriver.Firefox(executable_path=r‘xxx‘) wd.get(‘http://cdn1.python3.vip/files/selenium/sample1.html‘) # 根据 class name 选择元素,返回的是 一个列表 # 里面 都是class 属性值为 animal的元素对应的 WebElement对象 elements = wd.find_elements_by_class_name(‘animal‘) for element in elements: print(element.text)
元素也可以有 多个class类型 ,多个class类型的值之间用 空格 隔开,比如
<span class="chinese student">张三</span>
注意,这里 span元素 有两个class属性,分别 是 chinese 和 student, 而不是一个 名为 chinese student 的属性。我们要用代码选择这个元素,可以指定任意一个class 属性值,都可以选择到这个元素,如下element = wd.find_elements_by_class_name(‘chinese‘)
或者element = wd.find_elements_by_class_name(‘student‘)
而不能这样写element = wd.find_elements_by_class_name(‘chinese student‘)
tag_name选择
基本用法与class_name大致相同
WebElement对象选择元素
from selenium import webdriver wd = webdriver.Firefox(executable_path=r‘xx‘) wd.get(‘http://cdn1.python3.vip/files/selenium/sample1.html‘) element = wd.find_element_by_id(‘container‘) # 限制 选择元素的范围是 id 为 container 元素的内部。 spans = element.find_elements_by_tag_name(‘span‘) for span in spans: print(span.text)
Selenium周期性寻找元素
Selenium 的 Webdriver 对象 有个方法叫 implicitly_wait
该方法接受一个参数, 用来指定 最大等待时长。
如果我们 加入如下代码wd.implicitly_wait(10)
那么后续所有的 find_element
或者 find_elements
之类的方法调用 都会采用上面的策略:
如果找不到元素, 每隔 半秒钟 再去界面上查看一次, 直到找到该元素, 或者 过了10秒 最大时长。
selenium操作
element元素操作
# 清除输入框已有的字符串 element.clear() # 输入新字符串 element.send_keys(‘xxx‘) # 获取元素属性值 element = wd.find_element_by_id(‘input‘) print(element.get_attribute(‘class‘)) # 获取输入框里的文字 print(element.get_attribute(‘value‘)) # 获取元素标签中的文本 print(element.get_attribute(‘innerText‘)) print(elemnet.get_attribute(‘textContent‘)) # 获取整个html文本 print(element.get_attribute(‘outerHTML‘)) # 获取元素内部的HTML print(element.get_attribute(‘innerHTML‘)
keyboard键盘操作
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By driver = webdriver.Firefox(executable_path=r‘xx‘) driver.get(‘http://www.baidu.com‘) element = driver.find_element(By.ID,‘kw‘) element.send_keys(‘selenium‘) element.send_keys(Keys.BACK_SPACE) element.send_keys(Keys.SPACE) element.send_keys(Keys.ENTER)
键值 | 解释 |
---|---|
send_keys(Keys.BACK_SPACE) | 删除键BackSpace |
send_keys(Keys.SPACE) | 空格键Space |
send_keys(Keys.TAB) | 制表键Tab |
send_keys(Keys.ESPACE) | 回退键Esc |
send_keys(Keys.ENTER) | 回车键Enter |
send_keys(Keys.CONTROL,‘a’) | 全选Ctrl+A |
send_keys(Keys.CONTROL,‘c’) | 复制CTRL+C |
send_keys(Keys.CONTROL,‘x’) | 剪切CTRL+X |
send_keys(Keys.CONTROL,‘v’) | 粘贴Ctrl+V |
send_keys(Keys.F1) | 键盘F1 |
send_keys(Keys.F12) | 键盘F12 |
selenium页面操作
# 最小化窗口 driver.minimize_window() # 最大化窗口 driver.maximize_window() # 设置窗口尺寸 driver.set_window_size(1920,1080) # 获取窗口位置 driver.get_window_position() #driver.get_window_position()[‘x‘] or [‘y‘] # 获取窗口尺寸 driver.get_window_size() #driver.get_window_size()[‘width‘] or [‘height‘] # 获取浏览器名 driver.name # 获取网页源码 driver.page_source() # 前进 driver.forward() # 后退 driver.back() # 刷新 driver.refresh() # 设置编码 driver.page_source.encode(‘utf-8‘)
selenium 选择框
radio框,直接选择元素click即可
checkbox:可以先遍历多选框取消选中状态,再直接选择元素单击
select下拉框
from selenium.webdriver.support.select import Select select = Select(wd.find_element_by_id("ss_single")) select.select_by_value(‘xxx‘)
code descritption select_by_value value值选择 select_by_index 索引值选择 select_by_visible_text 可视化文本选择 deselect_by_value/index 删除选中元素 deselect_all 去除所有选中元素
selenium frame及窗口切换
wd.switch_to.frame(frame_reference)
wd.switch_to.default_content()
其中, frame_reference 可以是 frame 元素的属性 name 或者 ID 。
wd.find_element_by_tag_name(‘a‘).click() mainWindow = wd.current_window_handle # 必须等待页面加载完成 time.sleep(3) handles = wd.window_handles # 返回句柄列表 wd.switch_to.window(handles[1]) print(wd.title) wd.switch_to_window(mainWindow)
Selenium其他操作
selenium处理弹出框
WEB端共有三种弹出框Alert、confirm、prompt
driver.switch_to.alert.accept() #弹出框确定 driver.switch_to.alert.text #弹出框的文本内容 driver.switch_to.alert.dismiss() #弹出框取消 # Prompt 弹出框提交内容 driver.switch_to.alert.send_keys(‘xxx‘) driver.switch_to.alert.accept() # 同理dismiss()为取消
CSS Selector
CSS基本元素与属性选择
code | description |
---|---|
.animal | class selector |
#id | id selector |
element1>element2 | 直接子元素 |
element1 element2 | 后代元素 |
a[href*=‘xxx‘] | a节点href属性包含xxx |
a[href^=‘http‘] | a节点href属性以http开头 |
a[href$=‘.com‘] | a节点href属性以.com结尾 |
div[class=misc][ctype=gun] | 一元素多属性 |
ep:
<div id=‘bottom‘> <div class=‘footer1‘> <span class=‘copyright‘>版权</span> <span class=‘date‘>发布日期:2018-03-03</span> </div> <div class=‘footer2‘> <span>备案号 <a href="http://www.miitbeian.gov.cn">苏ICP备88885574号</a> </span> </div> </div>
选择版权: div.footer1 > span.copyright
or .footer1>.copyright
or .footer .copyright
CSS 组选择
code | description |
---|---|
.plant,.animal | 同时选择两种class |
#t1>span , #t1>p | t1里所有span和p |
span:nth-child(2) | 父元素中第二个子元素,且为span |
p:nth-last-child(1) | 倒数第一个,且为p元素 |
span:nth-of-type(1) | 第一个span元素 |
p:nth-last-of-type(2) | 倒数第二个为p元素的节点 |
p:nth-child(even) | 偶数节点,且为p元素 |
p:nth-child(odd) | 奇数节点,且为p元素 |
code | description |
---|---|
h3+span | 兄弟节点 |
h3~span | h3后的所有兄弟节点span |