Selenium 4 新特性

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_timeoutimplicitly_waitset_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")

取消find_element_by_*find_elements_by_*

Selenium Grid改变了控制面板

posted @ 2024-02-12 17:13  tongering  阅读(195)  评论(0)    收藏  举报