以淘宝为例:
代码:
from selenium importwebdriver
browser=webdriver.Chrome()
browser.get('https://www.taobao.com')#找搜索框--id方式
input_first = browser.find_element_by_id('q')#找搜索框--css方式
input_second = browser.find_element_by_css_selector('#q')#找搜索框--xpath方式
input_third = browser.find_element_by_xpath('//*[@id="q"]')print(input_first)print(input_second)print(input_third)
browser.close()
结果:
多个节点的情况
find_element() 只能查找目标网页中的一个,要查找多个要用find_elements()
代码
from selenium importwebdriver
browser=webdriver.Chrome()
browser.get('https://www.taobao.com')
lis= browser.find_elements_by_css_selector('.service-bd li')print(lis)
browser.close()
结果:
[, , , , , , , , , , , , , , , ]
5、节点交互
输入文字:send_keys()
清空文字:clear()
点击按钮:click()
from selenium importwebdriverimporttime
browser=webdriver.Chrome()
browser.get('https://www.taobao.com')
input= browser.find_element_by_id('q')#输入文字‘iPhone’
input.send_keys('iphone')#睡1秒
time.sleep(1)#清空
input.clear()#输入文字‘iPad’
input.send_keys('ipad')#找到class='btn-search'的按钮
button = browser.find_element_by_class_name('btn-search')#点击它
button.click()
结果:
淘宝要登录,这里无法返回结果
6、动作链
执行鼠标拖曳 、 键盘按键等动作
from selenium importwebdriverfrom selenium.webdriver importActionChains
browser=webdriver.Chrome()
url= 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'browser.get(url)
browser.switch_to.frame('iframeResult')
source= browser.find_element_by_css_selector('#draggable')
target= browser.find_element_by_css_selector('#droppable')
actions=ActionChains(browser)
actions.drag_and_drop(source, target)
actions.perform()
结果
7、执行javascript
对于没有提供的操作,如下拉进度条,可以使用excute_script()方法实现。
from selenium importwebdriver
browser=webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')#下拉到底部后,谈出alert提示框
browser.execute_script('alert("To Bottom")')
8、获取节点信息
page_source 属性可以获取网页的源代码,然后通过Beautiful soup pyquery进行信息提取
也可以使用selenium自带的获取属性、文本等
· 获取属性
get_attribute()方法来获取节点的属性
from selenium importwebdriverfrom selenium.webdriver importActionChains
browser=webdriver.Chrome()
url= 'https://www.zhihu.com/explore'browser.get(url)#输出搜索框内容
logo = browser.find_element_by_id('Popover1-toggle')print(logo)#输出class="Input"的值
print(logo.get_attribute('class'))
结果:
Input
· 获取文本值
text()
·获取 id、位置、 标签名和大小
id 属性可以获取节点 id, location 属性可以获取该节点在页面中的相对位置, tag_name 属性可以获取标签名称, 就是宽高
9、延时等待
get()方法会在网页框架加载结束后结束执行,此时如果获取page_source,可能并不是浏览器完全加载完全的页面,如果有页面有额外的Ajax请求,在网页源代码中并不一定能成功获取,所以需要延时等待一下。
·隐式等待
from selenium importwebdriver
browser=webdriver.Chrome()#隐式等待,默认等待0秒,找不到继续等一会在找,容易受到页面加载时间的影响
browser.implicitly_wait(10)
browser.get('https://www.zhihu.com/explore')
input= browser.find_element_by_class_name('Input')print(input)
结果:
·显式等待
指定一个最长等待时间
from selenium importwebdriverfrom selenium.webdriver.common.by importByfrom selenium.webdriver.support.ui importWebDriverWaitfrom selenium.webdriver.support importexpected_conditions as EC
browser=webdriver.Chrome()
browser.get('https://www.taobao.com/')
wait= WebDriverWait(browser, 10)
input= wait.until(EC.presence_of_element_located((By.ID, 'q')))
button= wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))print(input, button)
结果:
10、前进和后退
forword() 前进下一个页面,back() 返回前一个页面
11、Cookies
get_cookies() 方法获取所有的 Cookie
add_cookies() 方法添加cookies
delete_all_cookies()方法删除所有的 Cookies