selenium的基本使用
1 加载网页:
selenium通过控制浏览器,所以对应的获取的数据都是elements中的内容
```python
from selenium import webdriver
driver = webdriver.PhantomJS()
driver.get("http://www.baidu.com/")
driver.save_screenshot("长城.png")
2 定位和操作:
driver.find_element_by_id(“kw”).send_keys(“长城”)
driver.find_element_by_id("su").click()
3 查看请求信息:
driver.page_source
driver.get_cookies()
driver.current_url
4 退出
driver.close() #退出当前页面
driver.quit() #退出浏览器
元素定位的方法
1 selenium的定位操作
定位元素语法:
find_element_by_id (返回一个元素)
find_elements_by_xpath (返回一个包含元素的列表)
find_elements_by_link_text (根据连接文本获取元素列表)
find_elements_by_partial_link_text (根据链接包含的文本获取元素列表)
find_elements_by_tag_name (根据标签名获取元素列表)
find_elements_by_class_name (根据类名获取元素列表)
注意: find_element
和find_elements
的区别 by_link_text
和by_partial_link_tex
的区别:全部文本和包含某个文本
- 使用: 以豆瓣首页为例:豆瓣
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.douban.com/")
ret1 = driver.find_element_by_id("anony-nav")
print(ret1)
# 输出为:<selenium.webdriver.remote.webelement.WebElement (session="ea6f94544ac3a56585b2638d352e97f3", element="0.5335773935305805-1")>
ret2 = driver.find_elements_by_id("anony-nav")
print(ret2)
#输出为:[<selenium.webdriver.remote.webelement.WebElement (session="ea6f94544ac3a56585b2638d352e97f3", element="0.5335773935305805-1")>]
ret3 = driver.find_elements_by_xpath("//*[@id='anony-nav']/h1/a")
print(len(ret3))
#输出为:1
ret4 = driver.find_elements_by_tag_name("h1")
print(len(ret4))
#输出为:1
ret5 = driver.find_elements_by_link_text("下载豆瓣 App")
print(len(ret5))
#输出为:1
ret6 = driver.find_elements_by_partial_link_text("豆瓣")
print(len(ret6))
#输出为:28
driver.close()
- 获取数据语法
- find_element仅仅能够获取元素,不能够直接获取其中的数据,如果需要获取数据需要使用以下方法:
- 获取文本:
element.text
- 获取属性值:
element.get_attribute("href")
- 获取文本:
- find_element仅仅能够获取元素,不能够直接获取其中的数据,如果需要获取数据需要使用以下方法:
- 使用示例:
-
from selenium import webdriver driver =webdriver.Chrome() driver.get("https://www.douban.com/") ret4 = driver.find_elements_by_tag_name("h1") print(ret4[0].text) #输出:豆瓣 ret5 = driver.find_elements_by_link_text("下载豆瓣 App") print(ret5[0].get_attribute("href")) #输出:https://www.douban.com/doubanapp/app?channel=nimingye driver.close()
1.1 selenium - 键盘操作
-
from selenium.webdriver.common.keys import Keys browser = webdriver.Chrome() browser.get('http://www.baidu.com/') # 1、在搜索框中输入"selenium" browser.find_element_by_id('kw').send_keys('赵丽颖') # 2、输入空格 browser.find_element_by_id('kw').send_keys(Keys.SPACE) # 3、Ctrl+a 模拟全选 browser.find_element_by_id('kw').send_keys(Keys.CONTROL, 'a') # 4、Ctrl+c 模拟复制 browser.find_element_by_id('kw').send_keys(Keys.CONTROL, 'c') # 5、Ctrl+v 模拟粘贴 browser.find_element_by_id('kw').send_keys(Keys.CONTROL, 'v') # 6、输入回车,代替 搜索 按钮 browser.find_element_by_id('kw').send_keys(Keys.ENTER)
1.2 selenium - 鼠标操作
-
from selenium import webdriver # 导入鼠标事件类 from selenium.webdriver import ActionChains driver = webdriver.Chrome() driver.get('http://www.baidu.com/') #输入selenium 搜索 driver.find_element_by_id('kw').send_keys('赵丽颖') driver.find_element_by_id('su').click() #移动到 设置,perform()是真正执行操作,必须有 element = driver.find_element_by_name('tj_settingicon') ActionChains(driver).move_to_element(element).perform() #单击,弹出的Ajax元素,根据链接节点的文本内容查找 driver.find_element_by_link_text('高级搜索').click()
selenium的其他方法
1 selenium 处理cookie
通过driver.get_cookies()
能够获取所有的cookie
# 把cookie转化为字典
{cookie[‘name’]: cookie[‘value’] for cookie in driver.get_cookies()}
#删除一条cookie
driver.delete_cookie("CookieName")
# 删除所有的cookie
driver.delete_all_cookies()
2 页面等待
为什么需要等待
如果网站采用了动态html技术,那么页面上的部分元素出现时间便不能确定,这个时候就可以设置一个等待时间,强制要求在时间内出现,否则报错
页面等待的方法 time.sleep(10)
2.1 Selenium显示等待
原理:显示等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么久跳出Exception
(简而言之,就是直到元素出现才去操作,如果超时则报异常)
代码说明:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get('http://www.baidu')
element = WebDriverWait(driver,5,0.5).util(
EC.presence_of_element_located((By.ID,'kw'))
)
element.send_keys('hello')
driver.quit()
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
# driver:浏览器驱动
# timeout:最长超过时间,默认以秒为单位
# poll_frequency:监测的时间间隔,默认为0.5秒
# ignored_exceptions:超时后的异常信息,默认情况下抛NoSuchElementException异常
# WebDriverWait一般有until和until_not方法配合使用
# until(method,message)
# until_not(method ,message)
2.2 selenium的隐式等待
原理:隐式等待,就是在创建driver时,为浏览器对象创建一个等待时间,这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。
注意:在使用隐式等待的时候,实际上浏览器会在你自己设定的时间内部断的刷新页面去寻找我们需要的元素
代码说明:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.implicity_wait(10)
driver.get('http://www.baidu')
implicity_wait()
''' 默认参数的单位为妙,本例中设置等待时长为10秒,首先这10秒并非一个固定的等待时间,它并不影响脚本的执
行速度。其次,它并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位是,如果元素可以定位,则继续
执行,如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。假设在第六秒定位到了元素则继续执
行,若直到超出设置的时长10秒还没有定位到元素,则抛出异常。'''
3 switch方法切换的操作
3.1 一个浏览器肯定会有很多窗口,所以我们肯定要有方法来实现窗口的切换。切换窗口的方法如下:
也可以使用 window_handles 方法来获取每个窗口的操作对象。例如:
# 1. 获取当前所有的窗口
current_windows = driver.window_handles
# 2. 根据窗口索引进行切换
driver.switch_to.window(current_windows[1])
3.2 iframe是html中常用的一种技术,即一个页面中嵌套了另一个网页,selenium默认是访问不了frame中的内容的,对应的解决思路是
driver.switch_to.frame()
动手:模拟登陆qq邮箱
在使用selenium登录qq邮箱的过程中,我们会发现,无法在邮箱的登录input标签中输入内容,通过观察源码可以发现,form表单在一个frame中,所以需要切换到frame中
3.3 当你触发了某个事件之后,页面出现了弹窗提示,处理这个提示或者获取提示信息方法如下:
alert = driver.switch_to_alert()
3.4. 页面前进和后退
driver.forward() #前进
driver.back() # 后退
4 selenium的开发者模式功能
4.1 chromedriver设置无界面模式
from selenium import webdriver
options = webdriver.ChromeOptions()
# 添加无界面参数
options.add_argument('--headless')
browser = webdriver.Chrome(options=options)
browser.get('http://www.baidu.com/')
browser.save_screenshot('baidu.png')
4.2 使用开发者权限
from selenium import webdriver
import time
options = webdriver.ChromeOptions()
# 使用开发者权限
options.add_experimental_option('excludeSwitches', ['enable-automation'])
4.3 不加载图片
from selenium import webdriver
import time
options = webdriver.ChromeOptions()
# 使用开发者权限
options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 不加载图片
options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
4.4 去掉“Chrome正在受到自动化测试软件的控制”
# 加启动配置
option = webdriver.ChromeOptions()
option.add_argument('disable-infobars')
# 改动打开浏览器
driver = webdriver.Chrome(chrome_options=option)
5 selenium的优缺点
- selenium能够执行页面上的js,对于js渲染的数据和模拟登陆处理起来非常容易
- selenium由于在获取页面的过程中会发送很多请求,所以效率非常低,所以在很多时候需要酌情使用
转载:
————————————————
版权声明:本文为CSDN博主「Dannys彬彬」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/binbin327805084/article/details/107155644
selenium driver 发送ajax请求
request_url = 'http://www.xxx.com'
data = {
'p1': 'p1'
}
data_str = urlencode(data)
print(data_str)
ajax_query = """
var xmlhttp=new XMLHttpRequest();
xmlhttp.open(\"POST\",\"%s\",false);
xmlhttp.setRequestHeader(\"Content-type\",\"application/x-www-form-urlencoded\");
xmlhttp.send(\"%s\");
return xmlhttp.responseText;
""" % (request_url, data_str)
print(ajax_query)
t = int(round(time.time() * 1000))
resp = driver.execute_script(ajax_query)
print("take time(ms): ", int(round(time.time() * 1000)) - t)
print(resp)