元素等待的意义
在使用元素等待时,需要注意以下几点:
以下是一些常见的元素等待方法:
from selenium.webdriver.support.ui import WebDriverWait
# 定义一个获取元素的方法
def get_element(driver, element):
wait = WebDriverWait(driver, 10, 1)
# element = wait.until(lambda x: x.find_element(element[0], element[1]))
element = wait.until(lambda x: x.find_element(*element))
return element
这段代码是在使用 Selenium 库中的 WebDriverWait 类。
这段代码的目的是在最多等待 10 秒的时间内,每隔 1 秒检查一次,直到找到指定的元素。找到元素后,将其赋值给 element 变量。
通过设置等待时间和超时时的时间间隔,可以在执行操作之前确保网页已经加载完成,或者特定元素已经处于可用状态。
这样可以避免在元素尚未准备好时尝试与之交互而导致的错误。
下面是一个示例,使用上述显示等待的方法获取元素后,即使不使用time.sleep()方法进行等待,代码仍然可以正常执行:
import time
from appium import webdriver
from appium.options.android import UiAutomator2Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
# 定义一个获取元素的方法
def get_element(driver, element):
wait = WebDriverWait(driver, 10, 1)
element = wait.until(lambda x: x.find_element(*element))
return element
# 定义一个初始化APP的方法
def start_app(app_package, app_activity):
# 定义desired_caps 字典,初始化app的配置信息
desired_caps = {
"platformName": "android", # 表示的是android
"platformVersion": "10", # 表示的是设备系统的版本号
"deviceName": "DWV6R19A10002101", # 表示的是设备的ID名称
"appPackage": app_package, # 表示的是app的包名
"appActivity": app_activity, # 表示的是app的界面名
"newCommandTimeout": 100000,
"noReset": True
}
# 创建 Appium 驱动实例
options = UiAutomator2Options().load_capabilities(desired_caps)
driver = webdriver.Remote("http://localhost:4723/wd/hub", options=options)
# 启动应用程序
driver.wait_activity(desired_caps, 5)
# 返回驱动实例
return driver
if __name__ == "__main__":
# 本次启动的应用程序包名和活动名(作业帮)
app_package_zyb = "com.baidu.homework"
app_activity_zyb = ".activity.index.IndexActivity"
# 启动应用程序
driver_zyb = start_app(app_package_zyb, app_activity_zyb)
# 通过元素id来进行元素定位,定位到作业批改年级选择框并点击
grade_element = (By.ID, "com.baidu.homework:id/user_grade")
grade_select = get_element(driver_zyb, grade_element)
if grade_select.is_displayed():
grade_select.click()
print("grade_select clicked")
else:
print("grade_select not found or not displayed")
# 通过XPATH来进行元素定位,定位到六年级并点击,设置年级成功
grade_xpath = By.XPATH, "//android.widget.TextView[@resource-id='com.baidu.homework:id/gradeName' and @text='六年级']"
grade_set = get_element(driver_zyb, grade_xpath)
if grade_set.is_displayed():
grade_set.click()
print("grade_set clicked")
else:
print("grade_set not found or not displayed")
# 通过CLASS_NAME定位到"我的"并点击,进入我的tab页
# 下面代码如果不加上time.sleep()可能会报错,可以使用方法二来避免
time.sleep(3)
class_path = By.CLASS_NAME, "android.widget.ImageView"
may_tab = get_element(driver_zyb, class_path)
if may_tab.is_displayed():
may_tab.click()
print("may_tab clicked")
else:
print("may_tab not found or not displayed")
# 停止应用程序,退出驱动
time.sleep(5)
print("代码执行结束")
driver_zyb.quit()
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 定义一个获取元素的方法
def get_element_new(driver, element):
element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located(element))
return element
这段代码是在使用 Selenium 库中的 WebDriverWait 方法来等待一个元素可见。
具体解释如下:
这段代码的作用是在指定的时间内(10 秒)等待元素可见。如果在等待时间内元素可见,则代码继续执行;如果超过等待时间元素仍不可见,则会抛出异常。
通过使用 WebDriverWait 和期望条件,可以增加测试的稳定性和可靠性,以确保在执行后续操作之前元素处于所需的状态。
import time
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from appium.options.android import UiAutomator2Options
from selenium.webdriver.support import expected_conditions as EC
# 定义一个获取元素的方法
def get_element_new(driver, element):
element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located(element))
return element
# 定义一个初始化APP的方法
def start_app(app_package, app_activity):
# 定义desired_caps 字典,初始化app的配置信息
desired_caps = {
"platformName": "android", # 表示的是android
"platformVersion": "10", # 表示的是设备系统的版本号
"deviceName": "DWV6R19A10002101", # 表示的是设备的ID名称
"appPackage": app_package, # 表示的是app的包名
"appActivity": app_activity, # 表示的是app的界面名
"newCommandTimeout": 100000,
"noReset": True
}
# 创建 Appium 驱动实例
options = UiAutomator2Options().load_capabilities(desired_caps)
driver = webdriver.Remote("http://localhost:4723/wd/hub", options=options)
# 启动应用程序
driver.wait_activity(desired_caps, 5)
return driver
if __name__ == "__main__":
# 本次启动的应用程序包名和活动名(作业帮)
app_package_zyb = "com.baidu.homework"
app_activity_zyb = ".activity.index.IndexActivity"
# 启动应用程序
driver_zyb = start_app(app_package_zyb, app_activity_zyb)
# 通过元素id来进行元素定位,定位到作业批改年级选择框并点击
element = (By.ID, 'com.baidu.homework:id/user_grade')
grade_select = get_element_new(driver_zyb, element)
if grade_select.is_displayed():
grade_select.click()
print("grade_select clicked")
else:
print("grade_select not found or not displayed")
# 通过XPATH来进行元素定位,定位到六年级并点击,设置年级成功
element = (By.XPATH, '//android.widget.TextView[@resource-id="com.baidu.homework:id/gradeName" and @text="六年级"]')
grade_set = get_element_new(driver_zyb, element)
if grade_set.is_displayed():
grade_set.click()
print("grade_set clicked")
else:
print("grade_set not found or not displayed")
# 通过CLASS_NAME定位到"我的"并点击,进入我的tab页
element = (By.CLASS_NAME, "android.widget.ImageView")
may_tab = get_element_new(driver_zyb, element)
if may_tab.is_displayed():
may_tab.click()
print("may_tab clicked")
else:
print("may_tab not found or not displayed")
# 关闭浏览器
time.sleep(3)
print("代码执行完毕")
driver_zyb.quit()
未完待续……