云之高水之远 2020-05-05
本篇主要介绍了selenium常用的元素选择以及对应的元素操作句柄,同时介绍了一些如键盘操作、选择框、页面操作,键盘输入等常用方法。
另介绍了CSS Selector的基本语法
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 类型的对象。
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‘)
基本用法与class_name大致相同
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 的 Webdriver 对象 有个方法叫 implicitly_wait
该方法接受一个参数, 用来指定 最大等待时长。
如果我们 加入如下代码wd.implicitly_wait(10)
那么后续所有的 find_element
或者 find_elements
之类的方法调用 都会采用上面的策略:
如果找不到元素, 每隔 半秒钟 再去界面上查看一次, 直到找到该元素, 或者 过了10秒 最大时长。
# 清除输入框已有的字符串 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‘)
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 |
# 最小化窗口 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‘)
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 | 去除所有选中元素 |
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)
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()为取消
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
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 |
5.环境变量配置在linux系统下,需要将可执行文件配置到环境变量或将文件移动到属于环境变量的目录里面方法一:将文件移动到属于环境变量目录中sudo mv chromedriver /user/bin