Selenium 4 新特性
相对定位器
to_left_of()
:位于目标元素左侧的元素
to_right_of()
:位于目标元素右侧的元素
above()
:位于目标元素上方的元素
below()
:位于目标元素下方的元素
near()
:位于目标元素附近(默认50像素以内)的元素
示例代码
from selenium import webdriver
from selenium.webdriver.support.relative_locator import with_tag_name
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
map_link = driver.find_element(By.LINK_TEXT, "地图")
elements = driver.find_elements(with_tag_name("a").near(map_link))
print("目标元素为a元素,它位于地图链接附近,符合条件的目标元素有")
for element in elements:
print(element.text)
elements = driver.find_elements(with_tag_name("a").to_left_of(map_link))
print("目标元素为a元素,“地图”链接在其左侧,符合条件的目标元素有")
for element in elements:
print(element.text)
news_link = driver.find_element(By.LINK_TEXT, "新闻")
elements = driver.find_elements(with_tag_name("a").to_right_of(news_link).to_left_of(map_link))
print("目标元素为a元素,“地图”链接在其左侧,“新闻”链接在其右侧,符合条件的目标元素有")
for element in elements:
print(element.text)
输出
> 目标元素为a元素,它位于地图链接附近,符合条件的目标元素有
> hao123
> 视频
> 目标元素为a元素,“地图”链接在其左侧,符合条件的目标元素有
> 新闻
> hao123
> 目标元素为a元素,“地图”链接在其左侧,“新闻”链接在其右侧,符合条件的目标元素有
> hao123
显示等待逻辑组合
以前用
WebDriverWait
只能在until
或者until_not
中传入一个等待条件
all_of(* expected_conditions)
:多个等待条件必须同时为True,以列表返回每个等待条件的返回值
any_of(* expected_conditions)
:多个等待条件中至少有一个为True,以列表返回每个等待条件的返回值
none_of(* expected_conditions)
:多个等待条件中一个为True都没有,返回布尔类型
例子
from selenium import webdriver
import selenium.webdriver.support.expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
def bar_linkdisplayed(webDriver):
return webdriver.find_element(By.LINK_TEXT, "贴吧").is_displayed()
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
wait = WebDriverWait(driver, 5)
returns = wait.until(EC.all_of(
bar_link_displayed,
lambda p: p.find_element(By.LINK_TEXT, "地图").is_displayed(),
EC.visibility_of_element_located((By.LINK_TEXT, "视频"))
))
print("all_of示例返回结果:", returns)
returns = wait.until(EC.any_of(
EC.visibility_of_element_located((By.ID, "kw")),
EC.visibility_of_element_located((By.ID, "不存在的元素"))
))
print("any_of示例返回结果:", returns)
returns = wait.until(EC.none_of(
EC.visibility_of_element_located((By.ID, "不存在的元素1")),
EC.visibility_of_element_located((By.ID, "不存在的元素2"))
))
print("none_of示例返回结果:", returns)
输出
> all_of示例返回结果:[True, True, <WebElement(session="...", element="...AC2")]
> any_of示例返回结果:<WebElement(session="...", element="...ASDF2")
> none_of示例返回结果:True
获取等待信息
在以前,
set_page_load_timeout
、implicitly_wait
和set_script_timeout
仅能够设置等待,但无法获取当前的等待设置
driver.timeouts
来获取当前等待设置
from selenium import webdriver
driver = webdriver.Chrome()
driver.set_page_load_timeout(5)
driver.implicitly_wait(6)
driver.set_script_timeout(7)
print(driver.timeouts.__dict__)
print(driver.timeouts._page_load)
print(driver.timeouts._implicit_wait)
print(driver.timeouts_script)
结果
> {'_implicit_wait': 6000, '_page_load': 5000, '_script': 7000}
> 5000
> 6000
> 7000
打开新窗口
之前并不支持主动打开新窗口
new_window()
:支持打开新窗口
参数tab
以标签形式打开,参数window
以新窗口形式打开
from selenium import webdriver
driver = webdriver.Chrome()
driver.switch_to.new_window("tab")
driver.switch_to.new_window("window")