Selenium多条件等待
在Selenium的WebDriver中的等待时,我希望当出现两个元素中的任意一个元素即为成功,下面是我的代码,请问如何实现?
# --**--操作层模块,驱动浏览器进行操作--**--# By:@rainzee
# At:2020.08.16
# --**--导入依赖库--**--
from time import sleep
from selenium import webdriver
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
# --**--驱动器类--**--
# 驱动器类
class Driver(object):
'''驱动器类,初始化驱动器,并执行相关动作'''
def __init__(self, proxy, url:str, email:str, password:str, first_name:str, last_name:str, dateofbirth:str, gender:str):
'''构造函数参数绑定'''
self.proxy = proxy
self.url = url
self.email = email
self.password = password
self.first_name = first_name
self.last_name = last_name
self.dateofbirth = dateofbirth
self.gender = gender
self.sleep_time = 0.1
def init_driver(self):
'''初始化浏览器,设置启动方法和配置'''
# 初始化启动方法
option = webdriver.ChromeOptions()
# 启动参数部分
# --禁用图片加载
option.add_argument('blink-settings=imagesEnabled=false')
# --设置窗口尺寸
option.add_argument('window-size=1025,800')
# --设置窗口位置
option.add_argument('window-position=0,0')
# --配置代理
#option.add_argument(f'--proxy-server={self.proxy}')
# --忽略证书错误
option.add_argument('--ignore-certificate-errors')
# 初始化驱动引擎
driver = webdriver.Chrome(options=option)
# 初始化种子地址
driver.get(self.url)
# 成功标志
try:
WebDriverWait(driver, 15).until(expected_conditions.element_to_be_clickable((By.XPATH, "//a[@aria-label='Join Us']")))
return driver
except Exception:
driver.quit()
def drive(self):
'''驱动器操作函数,执行动作'''
# 载入已初始化的驱动引擎
self.driver = self.init_driver()
# 元素组件库
# --首页注册按钮
element_join = "//button[@data-type='click_navJoinLogin']"
# --注册框注册链接
element_join_us = "Join Us"
# --邮箱输入框
element_email = "//input[@data-componentname='emailAddress']"
# --密码输入框
element_password = "//input[@data-componentname='passwordCreate']"
# --firstname输入框
element_firstname = "//input[@data-componentname='firstName']"
# --lastname输入框
element_lastname = "//input[@data-componentname='lastName']"
# --生日输入框
element_date_of_birth = "//input[@data-componentname='dateOfBirth']"
# --性别选择按钮
element_gender = f"//ul[@data-componentname='gender']//li[{self.gender}]"
# --注册提交按钮
element_regist = "//input[@value='JOIN US']"
# 动作链
# --点击首页注册按钮
#self.driver.find_element_by_xpath(element_join).click()
#sleep(self.sleep_time)
# --点击注册框注册链接
#self.driver.find_element_by_link_text(element_join_us).click()
#sleep(self.sleep_time)
self.driver.find_element_by_xpath("//a[@aria-label='Join Us']").click()
WebDriverWait(self.driver, 20).until(expected_conditions.element_to_be_clickable((By.XPATH, "//input[@data-componentname='emailAddress']")))
# --输入注册邮箱
self.driver.find_element_by_xpath(element_email).send_keys(self.email)
sleep(self.sleep_time)
# --输入注册密码
self.driver.find_element_by_xpath(element_password).send_keys(self.password)
sleep(self.sleep_time)
# --输入firstname
self.driver.find_element_by_xpath(element_firstname).send_keys(self.first_name)
sleep(self.sleep_time)
# --输入lastname
self.driver.find_element_by_xpath(element_lastname).send_keys(self.last_name)
sleep(self.sleep_time)
# --输入生日
self.driver.find_element_by_xpath(element_date_of_birth).send_keys(self.dateofbirth)
sleep(self.sleep_time)
# --点击性别
self.driver.find_element_by_xpath(element_gender).click()
sleep(self.sleep_time)
# --注册提交
self.driver.find_element_by_xpath(element_regist).click()
# 成功指标
WebDriverWait(self.driver, 20).until(expected_conditions.element_to_be_clickable((By.XPATH, "//a[@aria-lable='Account']", "//")))
def close(self):
'''退出函数,增加代码健壮性'''
try:
self.driver.quit()
except Exception as error:
print(error)
old = find_element_by_id('xxx')
new = find_element_by_xpath('xxx')
if old or now is True:
在drive方法中的成功指标处,我希望实现
old = find_element_by_id('xxx')new = find_element_by_xpath('xxx')
if old or new is True:
即new或者old中任意一个元素出现,结束等待,该如何实现,使用if等均报错。
回答:
这么简单都不会么,好像selenium库有这个功能的函数
while 1: time.sleep(1)
old = find_element_by_id('xxx')
new = find_element_by_xpath('xxx')
if old or new:
break
回答:
https://stackoverflow.com/que...
根据上边的链接,可以使用以下方式实现多条件判断
Using CSS_SELECTOR:
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".element_A_class, .element_B_class"))
Using XPATH through lambda:
element = WebDriverWait(driver,20).until(lambda driver: driver.find_element(By.XPATH,"element_A_xpath") or driver.find_element(By.XPATH,"element_B_xpath"))
条件的填入并不局限于上述两种,自己尝试即可
还有1楼,‘这么简单都不会么’,你说这话对提问的人有帮助么?
以上是 Selenium多条件等待 的全部内容, 来源链接: utcz.com/p/937878.html