selenium相当于机器人,可以完成点击等人类可以做的操作.
webdriver是一系列可以驱动不同浏览器的软件,和selenium配合使用.
软件准备:安装了selenium这个第三方库和不同浏览器的driver
安装测试:
from selenium import webdriver
#webdriver是用来区分不同的浏览器的
#这个是浏览器驱动程序的路径
driver_path=r"D:\Assist\browserDriver\Mozila-driver\geckodriver.exe"
#webdriver后面那个类,可以选Edge,Chrome,还是火狐更好用一点
driver=webdriver.Firefox(executable_path=driver_path)
driver.get(r"https://www.baidu.com/s?wd=chrome%20driver&rsv_spt=1&rsv_iqid=0x8bfc640c0009118d&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=ib&rsv_sug3=12&rsv_sug1=11&rsv_sug7=100")
#不同于urllib,requests库,它的get()不会返回响应对象,而是放到属性中.
print(driver.page_source)
关闭页面:
'''有两个方法:
driver.close():关闭当前页面
driver,quit():关闭整个浏览器'''
from selenium import webdriver
import time
driver_path=r"D:\Assist\browserDriver\Mozila-driver\geckodriver.exe"
driver=webdriver.Firefox(executable_path=driver_path)
url=r"https://www.baidu.com/baidu?wd=%E5%93%88%E5%93%88%E5%93%88%E8%A1%A8%E6%83%85%E5%8C%85&tn=monline_4_dg&ie=utf-8"
driver.get(url)
time.sleep(4)
driver.close()
driver.quit()
元素定位:
'''
find_element_by_id:根据id来查找某个元素。等价于:
submitTag = driver.find_element_by_id('su')
submitTag1 = driver.find_element(By.ID,'su')
find_element_by_class_name:根据类名查找元素。 等价于:
submitTag = driver.find_element_by_class_name('su')
submitTag1 = driver.find_element(By.CLASS_NAME,'su')
find_element_by_name:根据name属性的值来查找元素。等价于:
submitTag = driver.find_element_by_name('email')
submitTag1 = driver.find_element(By.NAME,'email')
find_element_by_tag_name:根据标签名来查找元素。等价于:
submitTag = driver.find_element_by_tag_name('div')
submitTag1 = driver.find_element(By.TAG_NAME,'div')
find_element_by_xpath:根据xpath语法来获取元素。等价于:
submitTag = driver.find_element_by_xpath('//div')
submitTag1 = driver.find_element(By.XPATH,'//div')
find_element_by_css_selector:根据css选择器选择元素。等价于:
submitTag = driver.find_element_by_css_selector('//div')
submitTag1 = driver.find_element(By.CSS_SELECTOR,'//div')
要注意,find_element是获取第一个满足条件的元素。find_elements是获取所有满足条件的元素。
所有方法都有两个版本.
'''
from selenium import webdriver
import time
driver_path=r"D:\Assist\browserDriver\Mozila-driver\geckodriver.exe"
driver=webdriver.Firefox(executable_path=driver_path)
url=r"https://www.baidu.com/"
driver.get(url)
inputTag=driver.find_element_by_id("kw")
inputTag.send_keys("python")#整个方法是用来操作输入框的
操作表单元素:
'''
text/password/number
操作输入框:分为两步:
第一步:找到这个元素。
第二步:使用send_keys(value),将数据填充进去。示例代码如下:
inputTag = driver.find_element_by_id('kw')
inputTag.send_keys('python')
使用clear方法可以清除输入框中的内容。示例代码如下:
inputTag.clear()
checkbox底层也是input实现的
操作checkbox:
因为要选中checkbox标签,在网页中是通过鼠标点击的,
因此想要选中checkbox标签,那么先选中这个标签,然后执行click事件。示例代码如下:
rememberTag = driver.find_element_by_name("rememberMe")
rememberTag.click()
选择select:
select元素不能直接点击,
因为点击后还需要选中元素,
这时候selenium就专门为select标签提供了一个类selenium.webdriver.support.ui.Select,
将获取到的元素当成参数传到这个类中,创建这个对象,
以后就可以使用这个对象进行选择了,
示例代码如下:
from selenium.webdriver.support.ui import Select
# 选中这个标签,然后使用Select创建对象
selectTag = Select(driver.find_element_by_name("jumpMenu"))
# 根据索引选择
selectTag.select_by_index(1)
# 根据值选择
selectTag.select_by_value("http://www.95yueba.com")
# 根据可视的文本选择
selectTag.select_by_visible_text("95秀客户端")
# 取消选中所有选项
selectTag.deselect_all()
操作按钮:操作按钮有很多种方式。比如单击、右击、双击等。这里讲一个最常用的。就是点击。直接调用click函数就可以了。示例代码如下:
inputTag = driver.find_element_by_id('su')
inputTag.click()
'''
#操作输入框:
from selenium import webdriver
import time
driver_path=r"D:\Assist\browserDriver\Mozila-driver\geckodriver.exe"
driver=webdriver.Firefox(executable_path=driver_path)
url=r"https://bbs.byr.cn/"
driver.get(url)
time.sleep(2)
#输入框
#先获取用户名
input_id=driver.find_element_by_id("id")
input_id.send_keys("woshiid")
time.sleep(2)
#在获取密码框:
input_passwd=driver.find_element_by_id("pwd")
input_passwd.send_keys("woshimima")
time.sleep(2)
#然后操作selectbox
from selenium.webdriver.support.ui import Select
savetime_select=Select(driver.find_element_by_name("CookieDate"))
savetime_select.select_by_value("3")
time.sleep(2)
#最后操作按钮
submit=driver.find_element_by_id("b_login")
submit.click()
time.sleep(2)
行为链:
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
driver_path=r"D:\Assist\browserDriver\Mozila-driver\geckodriver.exe"
driver=webdriver.Firefox(executable_path=driver_path)
url=r"https://www.baidu.com/"
driver.get(url)
inputTag = driver.find_element_by_id('kw')
submitTag = driver.find_element_by_id('su')
actions = ActionChains(driver)
actions.move_to_element(inputTag)
actions.send_keys_to_element(inputTag,'python')
actions.move_to_element(submitTag)
actions.click(submitTag)
actions.perform()
'''click_and_hold(element):点击但不松开鼠标。
context_click(element):右键点击。
double_click(element):双击。 更多方法请参考'''
操作Cookie:
'''Cookie操作:
获取所有的cookie:
for cookie in driver.get_cookies():
print(cookie)
根据cookie的key获取value:
value = driver.get_cookie(key)
删除所有的cookie:
driver.delete_all_cookies()
删除某个cookie:
driver.delete_cookie(key)
'''
等待:
'''
现在的网页越来越多采用了 Ajax 技术,
这样程序便不能确定何时某个元素完全加载出来了。
如果实际页面等待时间过长导致某个dom元素还没出来,
但是你的代码直接使用了这个WebElement,
那么就会抛出NullPointer的异常。为了解决这个问题。
所以 Selenium 提供了两种等待方式:一种是隐式等待、一种是显式等待。
'''
'''
就好比浏览器是老师,
dom元素就是学生,
老师找学生有事,有两个办法,
隐式等待:可以等学生都到齐以后再找学生,
显示等待:也可以等某个特定的学生,那个学生一来老师就不等了'''
'''所以,隐式等待是针对页面的,
显示等待是针对某个元素的'''
from selenium import webdriver
driver_path=r"D:\Assist\browserDriver\Mozila-driver\geckodriver.exe"
driver=webdriver.Firefox(executable_path=driver_path)
url=r"https://www.baidu.com/"
#隐式等待,等待页面加载
driver.implicitly_wait(20)
driver.get(url)
'''
显示等待是表明某个条件成立,才执行获取元素的操作、
也可以等待的时候指定一个最大的时间,
如果超过这个时间那么就会抛出一个异常(exceptions.TimeoutException)。
显示等待是应该使用 selenium.webdriver.support.excepted_conditions期望的条件和
selenium.webdriver.support.ui.webDriverWait 来配合完成。'''
from selenium.webdriver.support.ui import WebDriverWait # 显示等待
# 设置等待执行语句
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
try:
element = WebDriverWait(driver, 10).until(
# 位于...位置存在某个元素
# EC.presence_of_element_located((By.ID, 'form_email')) # 必须是元组
EC.text_to_be_present_in_element(
(By.XPATH, '//div[@class="main"]/div[@class="mod"]/h2[1]'),
'热点内容 • • • • • • ( 更多 )')
)
# element.send_keys('python')
print(element)
finally:
driver.quit()
多页面与页面切换:
from selenium import webdriver
import time
driver_path=r"D:\Assist\browserDriver\Mozila-driver\geckodriver.exe"
driver=webdriver.Firefox(executable_path=driver_path)
url=r"https://www.baidu.com/"
driver.get(url)
#但这个时候如果我要切换到另一个页面去,但又不想丢失原有的页面
#用此方法执行一段JavaScript代码就好
driver.execute_script("window.open('https://www.cnblogs.com/jingdenghuakai/p/11695431.htmlhtttps://www.douban.com')")
#该属性为当前执行页面的url
driver.current_url
'''执行driver.execute_script("window.open('htttp://www.douban.com')")语句
后,只是打开了一个页面,当前执行的页面并没有变化.
所以要切换执行页面.
补充一点,driver对象有个属性为window_handler,
是个列表,按照窗口创建的顺序储存着窗口handler对象,
切换页面的时候,只要把目标窗口的handler对象传进去就好'''
driver.switch_to.window(driver.window_handles[1])
print(driver.current_url)
print(driver.window_handles)
代理ip:
from selenium import webdriver
import time
#关键步骤在此
options = webdriver.FirefoxOptions()
options.add_argument("--proxy-server=http://171.13.103.221:9999")
driver_path=r"D:\Assist\browserDriver\Mozila-driver\geckodriver.exe"
#这里也要修改
driver=webdriver.Firefox(executable_path=driver_path,options=options)
url=r"https://www.baidu.com/"
driver.get(url)
WebElement元素拓展:
'''
WebElement拓展:
from selenium.webdriver.remote.webelement import WebElement类是每个获取出来的元素的所属类。
有一些常用的属性:
find_element():
get_attribute(name):这个标签的某个属性的值。
screentshot("filename"):获取当前页面的截图。这个方法只能在driver上使用。
driver的对象类,也是继承自WebElement。
更多请阅读相关源代码。
'''