每日分享:
我知道你最近很累,是那种看不见的身体上和精神上的疲惫感,但是,请你一定要坚持下去,就算无人问津也好,技不如人也罢,千万不要让烦躁和焦虑,毁了你本就不多的热情和定力,别贪心,我们不可能什么都有,也别灰心,我们不可能什么也没有。
当selenium控制浏览器打开多个标签页时,如何控制浏览器在不同的标签页中进行切换
from selenium import webdriver
url = 'https://jn.58.com/'
driver = webdriver.Chrome()
driver.get(url)
# 输出当前网址
print(driver.current_url)
# 输出句柄
print(driver.window_handles)
el = driver.find_element('xpath', '/html/body/div[3]/div[1]/div[1]/div/div[1]/div[1]/span[1]/a')
el.click()
# 点击后输出网址和句柄
print(driver.current_url)
print(driver.window_handles)
结果:
可以发现,点击前后,网址是一样的,要想对点击后的页面进行操作,必须通过句柄来切换操作页。
from selenium import webdriver
url = 'https://jn.58.com/'
driver = webdriver.Chrome()
driver.get(url)
print(driver.current_url)
print(driver.window_handles)
el = driver.find_element('xpath', '/html/body/div[3]/div[1]/div[1]/div/div[1]/div[1]/span[1]/a')
el.click()
# 句柄切换标签页
driver.switch_to.window(driver.window_handles[-1])
print(driver.current_url)
print(driver.window_handles)
el_list = driver.find_elements('xpath', '/html/body/div[6]/div[2]/ul/li/div[2]/h2/a')
print(len(el_list))
结果:
iframe是html中常用的一种技术,即一个页面中嵌套了另一个网页,selenium默认是访问不了frame中的内容的,对应的解决思路是driver.switch_to.frame(frame_element)
代码如下:
from selenium import webdriver
url = 'https://qzone.qq.com/'
driver = webdriver.Chrome()
driver.get(url)
el_frame = driver.find_element('xpath', '//*[@id="login_frame"]')
# driver.switch_to.frame():也可以直接填对应的id值
# driver.switch_to.frame('login_frame')
driver.switch_to.frame(el_frame)
driver.find_element('id', 'switcher_plogin').click()
driver.find_element('id', 'u').send_keys('你的账号')
driver.find_element('id', 'p').send_keys('你的密码')
driver.find_element('id', 'login_button').click()
selenium能够帮助我们处理页面中的cookie,比如获取、删除
driver.get_cookies()返回列表,其中包含的是完整的cookie信息!不光有name、value,还有domain等cookie其他维度的信息。所以如果想要把获取的cookie信息和requests模块配合使用,需要转换为name、value作为键值对的cookie字典
from selenium import webdriver
url = 'http://baidu.com'
driver = webdriver.Chrome()
driver.get(url)
# print(driver.get_cookies())
# cookies = {}
# for cookie in driver.get_cookies():
# cookies[cookie['name']] = cookie['value']
# print(cookies)
# 字典推导式,把cookie转换为字典 driver.get_cookies():获取当前标签页全部cookie信息
cookies = {cookie['name']: cookie['value']for cookie in driver.get_cookies()}
print(cookies)
删除一条cookie
driver.delete_cookie("Cookie_name")
删除所有cookie
driver.delete_all_cookies()
selenium可以让浏览器执行我们规定的js代码
目标:下滑并点击隐私声明(用xpath可以找到“隐私声明”这个元素,但如果要对其进行点击操作,需要先下滑页面至页面内有“隐私声明”这个元素之后才可以点击)
代码:
from selenium import webdriver
url = 'https://jn.lianjia.com/'
driver = webdriver.Chrome()
driver.get(url)
# 向下滑动2000px
js = 'scrollTo(0, 2000)'
# 执行js代码
driver.execute_script(js)
driver.find_element('xpath', '/html/body/div[11]/div/div[1]/div[1]/ul/li[4]/a').click()
页面加载出来的过程中需要花费时间等待网站服务器的响应,在这个过程中标签元素可能还没加载出来,是不可见的,如何处理这种情况
time.sleep()
缺点:不智能,设置的时间太短,元素还没有加载出来;设置时间太长则会浪费时间。
from selenium import webdriver
driver = webdriver.Chrome()
# 最多等10秒
driver.implicitly_wait(10)
driver.get('https://www.baidu.com')
driver.find_element('xpath', '//*[@id="lg"]/map/are')
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 显式等待
WebDriverWait(driver, 20, 0.5).until(
EC.presence_of_element_located((By.LINK_TEXT, '好123')))
# 参数20表示最长等待20秒
# 参数0.5表示0.5秒检查一次规定的标签是否存在
# EC.presence_of_element_located((By.LINK_TEXT, '好123')) 表示通过链接文本内容定位标签
# 每0.5秒一次检查,通过链接文本内容定位标签是否存在,如果存在就向下继续执行;如果不存在,直到20秒上限就抛出异常
print(driver.find_element_by_link_text('好123').get_attribute('href'))
driver.quit()
在了解隐式等待和显示等待以及强制等待后,我们发现并没有一种通用的方法来解决页面等待的问题。
import time
from selenium import webdriver
driver = webdriver.Chrome('/home/worker/Desktop/driver/chromedriver')
driver.get('https://www.taobao.com/')
time.sleep(1)
# i = 0
# while True:
for i in range(10):
i += 1
try:
time.sleep(3)
element = driver.find_element_by_xpath('//div[@class="shop-inner"]/h3[1]/a')
print(element.get_attribute('href'))
break
except:
js = 'window.scrollTo(0, {})'.format(i*500) # js语句
driver.execute_script(js) # 执行js的方法
driver.quit()