selenium 的使用--持续更
selenium
'''Python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Key from selenium.webdriver.support import expected_condition as EC from selenium.webdriver.support.wait import WebdriverWaitbrower= webdriver.Chrome()
try:
brower.get('https://www.baidu.com')
inp=brower.find_element_by_id('kw')
inp.send_keys('python')
inp.send_keys(Keys.ENTER)
waits=WebdriverWait(brower,10) #等待10s去做某些事情
waits.util(EC.presence_of_element_located((By.ID,'content_left'))) #显示等待
print(brower.current_url) #打印的是整个ulr
print(brower.get_cookies()) #打印cookies
print(brower.page_source) #打印渲染的网页
finally:
brower.close()
'''
一
selenium支持很多的浏览器 from selenium import webdriver brower=webdriver.Chrome() brower=webdriver.Firefox() brower=webdriver.Edge() brower=webdriver.PhantomJS() brower=webdriver.Safari()二、访问页面
可以用get方法请求页面,参数传入URL即可,接下来就是调用browser对象,让其执行各个动作模拟浏览器操作三、查找节点
'''python from selenium import webdriverbrowser = webdriver.Chrome()
browser.get('https://www.taobao.com')
inp_first = browser.find_element_by_id('q')
inp_se = browser.find_element_by_css_selector('#q')
inp_third = browser.find_element_by_xpath('//*[@id="q"]')
print(inp_first, inp_se, inp_third)
browser.close()
'''
查找节点的几种方法:
另外,selenium还提供了一种通用的方法find_element(),需要传递两个参数查找方式By和值。
'''PyThon
from selenium import webdriver
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
inp = browser.find_element(By.ID, 'q')
print(inp)
browser.close()
'''
上面的方法只能查找一个节点,如果要查找多个节点可以用find_elements() '''Python from selenium import webdriver from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
inp = browser.find_elements(By.CSS_SELECTOR, '.service-bd li')
print(inp)
browser.close()
'''
节点交互
selenium可以驱动浏览器来执行一些操作,也就是说可以让浏览器模拟执行一些动作。常用的方法有:输入文字send_keys(),清空文字clear(),点击按钮时click()方法。 '''Python from selenium import webdriver from selenium.webdriver.common.by import By import timebrowser=webdriver.Chrome()
browser.get('https://www.taobao.com')
inp=browser.find_element(By.ID,'q') #找到输入框
inp.send_keys('iphone-xs') #输入文字
time.sleep(1)
inp.clear() #清除文字
time.sleep(1)
inp.send_keys('ipad')
button=browser.find_element_by_class_name('btn-search ') #找到搜索按钮
button.click() #点击搜索按钮
'''
动作链
没有特定的执行对象,比如鼠标拖拽、键盘按键 '''Python from selenium import webdriver from selenium.webdriver import ActionChainsbrowser = webdriver.Chrome()
browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
actions = ActionChains(browser) # 实例化一个ActionChains对象
actions.drag_and_drop(source, target) # 调用drag_and_drop方法
actions.perform() # 调用perform()方法执行
'''
执行JavaScript
对于某些,selenium API并没有提供。比如下拉进度条,它可以直接模拟运行JavaScript'''Python
from selenium import webdriver
browser=webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
调用execute_script方法,里面执行前端的JavaScript的语句
browser.execute_script('alert("To Bottom")')
'''
获取节点信息
我们可以使用get_attribute()方法来获取节点的属性,但前提是先获取这个节点target = browser.find_element_by_css_selector('#droppable')
print(target.get_attribute('class'))
获取文本值
target = browser.find_element_by_css_selector('#droppable')
print(target.text)
获取id、位置、标签名和大小
print(target.id)
print(target.location)
print(target.tag_name)
print(target.size)
延时等待
在selenium中,get()方法会在网页框架加载结束后结束执行,此时如果获取page_source,可能并不是浏览器完全加载完成的页面,如果某些页面有额外的ajax请求,可能不能成功获取到。 所以加一个延时等待。 等待有两种方式:隐式等待,显示等待from selenium import webdriver
browser=webdriver.Chrome()
browser.implicitly_wait(10) #设置隐式等待
browser.get('https://www.zhihu.com/explore')
inp=browser.find_element_by_class_name('zu-top-add-question')
print(inp)
from selenium import webdriver
from selenium.webdriver.support.ui import WebdriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
browser=webdriver.Chrome()
browser.get('https://www.taobao.com/')
wait=WebDriverWait(browser,10)
inp=wait.until(EC.presence_of_element_located((By.ID,'q'))) #代表节点出现的意思
button=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.btn-search'))) #按钮是否可以点击
print(inp,button)
等待条件及其含义
title_is 标题是某内容 title_contains 标题包含某内容 presence_of_element_located 节点加载出来,传入定位元祖,如(By.ID,'p') visibility_of_element_located 节点可见,传入定位元祖 visibility_of 可见,传入节点对象 presence_of_all_elements_located 所有节点加载出来 text_to_be_present_in_element 某个节点文本包含某文字 text_to_be_present_in_element_value 某个节点的值包含某文字 frame_to_be_available_and_switch_to_it 加载并切换 invisibility_of_element_located 节点不可见 element_to_be_clickable 节点点击可见 staleness_of 判断一个节点是否仍在DOM,判断页面是否已经刷新 element_to_be_selected 节点可选择,传节点对象 element_located_to_be_selected 节点可选择,传入定位元祖 element_selection_state_to_be 传入节点对象以及状态,相等返回True,否则返回False element_located_selection_state_to_be 传入定位元祖以及状态,相等返回True,否则返回False alert_is_present 是否出现警告前进和后退
from selenium import webdriver import timebrowser=webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.get('https://www.taobao.com')
browser.get('https://www.zhihu.com')
browser.back() #后退
time.sleep(1)
browser.forward() #前进
time.sleep(2)
browser.close()
cookies
使用selenium还可以方便的对cookis进行操作,例如获取,添加,删除等from selenium import webdriver
browser=webdriver.Chrome()
browser.get('https://www.zhihu.com')
print(browser.get_cookies())
browser.add_cookie({'name':name,'domain':'www.zhihu.com','value':'germey'})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())
操作选项卡
import time from selenium import webdriverbrowser=webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.execute_script('window.open()') #执行JavaScript语句,打开新的选项卡
print(browser.window_handles)
browser.switch_to_window(browser.window_handles[1]) #切换到新的选项卡
browser.get('https://www.taobao.com')
time.sleep(1)
browser.switch_to_window(browser.window_handles[0]) #切换到原来的选项卡
browser.get('https://python.org')