Selenium常见异常解析及解决方案示范
1. 作用
Selenium是一个自动化测试工具,也可被用于Web服务的应用程序的功能测试。本文将详细讲解在使用Selenium时,遇到的常见的异常以及解决方案,希望能够帮助到大家。
2. 常见异常
2.1. NoSuchElementException 异常
问题描述: 在WebDriver执行元素的定位操作时,找不到对应的元素,就会抛出NoSuchElementException异常。
原因:
- 元素xpath定位不正确;
- 页面还没加载完全或渲染完全;
- 页面上对应的元素已经被删除或隐藏。
解决方案:
- 确认元素的xpath定位是否准确;
- 加入隐式/显式等待,等待页面加载完全;
- 判断元素是否存在再进行操作,可以使用find_elements代替find_element,如果返回的列表为空,表示元素不存在。
2.2. TimeoutException 异常
问题描述: 操作超时导致的异常,比如说load页面时间过长、网络连接过慢等等。
原因:
- 页面或操作所需的资源过多;
- 网络连接过慢导致请求等待时间过长。
解决方案:
- 等待页面加载完全后再进行操作;
- 设置较长的超时时间;
- 使用其他网络状况更好的机器进行测试。
3. 示例说明
3.1. NoSuchElementException 异常解决示例
场景描述: 在一个网页上,需要从下拉框里面选择一个选项,但是下拉框的选项列表还没有完全展示出来。
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("https://www.example.com")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, '//*[@id="dropdown"]/option[text()="Option3"]'))
)
driver.find_element_by_xpath('//*[@id="dropdown"]/option[text()="Option3"]').click()
except NoSuchElementException as e:
print(e) # 打印异常信息
finally:
driver.quit()
在下拉框还没有完全展示出来时,使用上述代码皆会抛出NoSuchElementException异常。为了解决这个问题,我们可以使用显式等待,等待下拉框的选项全部展示出来,然后再进行选择操作。
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("https://www.example.com")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, '//*[@id="dropdown"]/option[text()="Option3"]'))
)
WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.XPATH, '//*[@id="dropdown"]/option')))
driver.find_element_by_xpath('//*[@id="dropdown"]/option[text()="Option3"]').click()
except NoSuchElementException as e:
print(e) # 打印异常信息
finally:
driver.quit()
3.2. TimeoutException 异常解决示例
场景描述: 在一个网页上,需要点击一个按钮,但是由于网络连接过慢,导致点击操作超时。
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("https://www.example.com")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, '//*[@id="button"]'))
)
driver.find_element_by_xpath('//*[@id="button"]')
except TimeoutException as e:
print(e) # 打印异常信息
finally:
driver.quit()
在网络连接较慢的时候,上述代码会抛出TimeoutException异常,为了避免这种情况,我们可以手动设置一个较长的超时时间。
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("https://www.example.com")
try:
element = WebDriverWait(driver, 30).until(
EC.presence_of_element_located((By.XPATH, '//*[@id="button"]'))
)
driver.find_element_by_xpath('//*[@id="button"]')
except TimeoutException as e:
print(e) # 打印异常信息
finally:
driver.quit()
4. 结论
遇到异常时不能惊慌失措,要从异常信息中分析具体的原因,采取相应的解决方案,才能达到快速调试和解决问题的效果。我们可以使用Selenium提供的各种API,结合我们的开发需求,灵活运用,达到最佳的测试代码质量和效率。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Selenium常见异常解析及解决方案示范 - Python技术站