前期回顾
本期目标
在经过第一期的selenium学习以后,已经可以对网页进行简单的操作了。本期目标在其基础上进一步的学习selenium操作。
进阶操作
延时等待
在selenium中,get方法在网页框架加载结束以后才会结束执行,如果我们在get方法执行结束之前获取网页的源代码,可能无法获取完整的代码。所以,需要等待网页加载完成以后在获取节点。
selenium有两种等待方式,一种是隐式等待,一种是显示等待。
隐式等待
代码如下:
from selenium import webdriver
browser = webdriver.Chrome()
browser.implicitly_wait(10)
browser.get('https://www.baidu.com')
input1 = browser.find_element(By.ID, 'kw')
print(input1)
这里,我们使用了implicitly_wait方法实现了隐式等待。
显示等待
代码如下:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
wait = WebDriverWait(browser, 10)
input = wait.until(EC.presence_of_element_located((By.ID, 'kw')))
print(input)
这里使用了WebDriverWait对象,指定最长等待时间是10s,赋值给wait变量,通过调用wait的util方法,传入等待条件。
presence_of_element_located代表节点出现,通过By.ID确定选择的节点。
此外,还有其他的等待条件,帮助选择节点。
这里只列出常用的几个条件。感兴趣的可以去查看官网文档。
presence_of_element_located 代表元素存在dom书中
visibility_of_element_located 代表元素存在dom书中,并可见
element_to_be_clickable 代表元素可点击
title_is 标题是某内容
text_to_be_present_in_element 某个节点文本值包含某文字
element_to_be_selected 代表节点可选择
前进和后退
selenium中使用forward方法实现前进,使用back方法实现后退。
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.get('https://www.taobao.com')
print(browser.current_url)
browser.back()
print(browser.current_url)
browser.forward()
print(browser.current_url)
https://www.taobao.com/
https://www.baidu.com/
https://www.taobao.com/
Cookie
selenium可以对cookie进行操作,代码如下:
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
# 查看cookie
print(browser.get_cookies())
# 添加cookie
browser.add_cookie({'name': 'name', 'domain': 'www.baidu.com', 'value': 'value'})
print(browser.get_cookies())
# 删除所有cookie
browser.delete_all_cookies()
print(browser.get_cookies())
[{'domain': '.baidu.com', 'expiry': 1717243943, 'httpOnly': False, 'name': 'ZFY', 'path': '/', 'sameSite': 'None', 'secure': True, 'value': 'YLCG1dAAjYiKBmD3emL4M9:BsjRbEQJmjXYmaDQLBeM4:C'}, {'domain': '.baidu.com', 'expiry': 1685794343, 'httpOnly': False, 'name': 'BA_HECTOR', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': '8920a12k05a5246k0kahal0u1i7jn571n'}, {'domain': '.baidu.com', 'expiry': 1717243943, 'httpOnly': False, 'name': 'BAIDUID_BFESS', 'path': '/', 'sameSite': 'None', 'secure': True, 'value': 'B64F1AE465879B7AA55A06CBDF934A8F:FG=1'}, {'domain': '.baidu.com', 'httpOnly': False, 'name': 'H_PS_PSSID', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': '38515_36546_38687_38541_38797_38610_38768_38817_38639_38765_26350_38623'}, {'domain': '.baidu.com', 'expiry': 1717243942, 'httpOnly': False, 'name': 'BAIDUID', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': 'B64F1AE465879B7AA55A06CBDF934A8F:FG=1'}, {'domain': '.baidu.com', 'expiry': 1720267942, 'httpOnly': False, 'name': 'BIDUPSID', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': 'B64F1AE465879B7A83872B71EAD0397E'}, {'domain': '.baidu.com', 'expiry': 1720267942, 'httpOnly': False, 'name': 'PSTM', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': '1685707943'}, {'domain': 'www.baidu.com', 'expiry': 1686571943, 'httpOnly': False, 'name': 'BD_UPN', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': '12314753'}, {'domain': 'www.baidu.com', 'httpOnly': False, 'name': 'BD_HOME', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': '1'}]
[{'domain': '.baidu.com', 'expiry': 1717243943, 'httpOnly': False, 'name': 'ZFY', 'path': '/', 'sameSite': 'None', 'secure': True, 'value': 'YLCG1dAAjYiKBmD3emL4M9:BsjRbEQJmjXYmaDQLBeM4:C'}, {'domain': '.baidu.com', 'expiry': 1685794343, 'httpOnly': False, 'name': 'BA_HECTOR', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': '8920a12k05a5246k0kahal0u1i7jn571n'}, {'domain': '.baidu.com', 'expiry': 1717243943, 'httpOnly': False, 'name': 'BAIDUID_BFESS', 'path': '/', 'sameSite': 'None', 'secure': True, 'value': 'B64F1AE465879B7AA55A06CBDF934A8F:FG=1'}, {'domain': '.baidu.com', 'httpOnly': False, 'name': 'H_PS_PSSID', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': '38515_36546_38687_38541_38797_38610_38768_38817_38639_38765_26350_38623'}, {'domain': '.baidu.com', 'expiry': 1717243942, 'httpOnly': False, 'name': 'BAIDUID', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': 'B64F1AE465879B7AA55A06CBDF934A8F:FG=1'}, {'domain': '.www.baidu.com', 'httpOnly': False, 'name': 'name', 'path': '/', 'sameSite': 'Lax', 'secure': True, 'value': 'value'}, {'domain': '.baidu.com', 'expiry': 1720267942, 'httpOnly': False, 'name': 'BIDUPSID', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': 'B64F1AE465879B7A83872B71EAD0397E'}, {'domain': '.baidu.com', 'expiry': 1720267942, 'httpOnly': False, 'name': 'PSTM', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': '1685707943'}, {'domain': 'www.baidu.com', 'expiry': 1686571943, 'httpOnly': False, 'name': 'BD_UPN', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': '12314753'}, {'domain': 'www.baidu.com', 'httpOnly': False, 'name': 'BD_HOME', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': '1'}]
[]
标签页管理
访问网页的时候,可能会打开多个标签页,我们可以使用
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.execute_script('window.open()')
browser.switch_to.window(browser.window_handles[1])
browser.get('https://www.taobao.com')
print(browser.window_handles)
['EBEF1C5B75A2FA71CE251DAA95A462A3', 'DA250345DBD74CEA653B575282C8C71E']
在这里,我们使用js代码打开一个新的标签页,然后使用window_handles属性获取浏览器的所有的标签页,之后使用switch_to.window来选择标签页。之后就可以对这个标签页进行操作了。
无头模式
所谓的无头模式就是使代码运行时,不再弹出一个浏览器窗口。代码如下:
option = webdriver.ChromeOptions()
option.add_argument('--headless')
browser = webdriver.Chrome(options=option)
browser.get('https://www.baidu.com')