窗口
python
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
driver =webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
#2.输⼊百度⽹址:https://www.baidu.com
driver.get("https://www.baidu.com")
driver.find_element(By.CSS_SELECTOR,"#s-top-left > a:nth-child(3)").click()
print(driver.title)
driver.quit()
在这个实现里面,我们在百度一下的首页打开了百度地图这个标签,之后我们打印当前页面的title,发现还是"百度一下",并非是百度地图,说明点击后的页面并没有发生转换
就需要我们的今天的操作
1)获取当前⻚⾯句柄:
driver.current_window_handle
3)获取所有⻚⾯句柄:
driver.window_handles
3)切换当前句柄为最新⻚⾯:
cpp
curWindow = driver.current_window_handle
allWindows = driver.window_handles
for window in allWindows:
if window != curWindow:
driver.switch_to.window(window)
python
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
driver =webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
#2.输⼊百度⽹址:https://www.baidu.com
driver.get("https://www.baidu.com")
driver.find_element(By.CSS_SELECTOR,"#s-top-left > a:nth-child(3)").click()
curWindow = driver.current_window_handle
allWindows = driver.window_handles
for window in allWindows:
if window != curWindow:
driver.switch_to.window(window)
print(driver.title)
driver.quit()
运行结果:

但是这是两个页面,来了三个怎么办,用if语句无法实现,别担心,在实践当中,我们一般都是两个页面
如果有两个窗口,driver.close()后,请问当前处于哪个窗口:句柄处于关闭的这个窗口,要使用另一个窗口,需要切换
弹窗
弹窗是在⻚⾯是找不到任何元素的,这种情况怎么处理?使⽤selenium提供的Alert接⼝

cpp
alert = driver.switchTo.alert
//确认
alert.accept()
//取消
alert.dismiss()
提⽰弹窗

需要输入文本信息的弹窗输入信息的时候是看不见信息的
cpp
alert = driver.switchTo.alert
alert.send_keys("hello")
alert.accept()
alert.dismiss()
注意:弹窗出现,页面其他的元素是定位不到的,因此需要切换到弹窗,处理弹窗
等待
通常代码执⾏的速度⽐⻚⾯渲染的速度要快,如果避免因为渲染过慢出现的⾃动化误报的问题呢?可以使⽤selenium中提供的三种等待⽅法:
time.sleep()
优点:使⽤简单,调试的时候⽐较有效
缺点:影响运⾏效率,浪费⼤量的时间

隐式等待
隐式等待是⼀种智能等待,他可以规定在查找元素时,在指定时间内不断查找元素。如果找到则代码
继续执⾏,直到超时没找到元素才会报错。
implicitly_wait()
#隐式等待5秒
driver.implicitly_wait(5)
隐式等待作⽤域是整个脚本的所有元素。即只要driver对象没有被释放掉( driver.quit() ),隐
式等待就⼀直⽣效。
优点:智能等待,作⽤于全局,因此代码只需要写一句即可,不需要像time.sleep()那样,每一句代码后面都需要写
显示等待
显⽰等待也是⼀种智能等待,在指定超时时间范围内只要满⾜操作的条件就会继续执⾏后续代码
WebDriverWait(driver,sec).until(functions)
functions :涉及到selenium.support.ui.ExpectedConditions包下的 ExpectedConditions
类
比如:
cpp
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver,2)
wait.until(EC.invisibility_of_element((By.XPATH,'//*
[@id="2"]/div/div/div[3]/div[1]/div[1]/div')))
上面的as是起别名的意思,因为前面的expected_conditions太长了,不好写

alert_is_presert()这个函数用来检查弹窗是否出现,可以用显示等待来实现,不能用隐式等待实现,因为弹窗不是页面的元素
注意:显示等待和隐式等待不建议一起使用,因为可能会导致不可预测的等待时间,强制等待可以任意使用