背景
- 前段时间给QA组写了一个自动录制生成Python Seleinum代码的,但生成的代码查询没有处理延时等待,导致代码稳定性不好, 容易出现元素查询失败
解决思路
- 在不修改原来代码的情况下重写元素查询的两个方法find_element, find_elements
实现
代码实现比较简单,直接贴上代码
selenium_monkey.py
import time
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
def wait_element(self, by, value, timeout=10):
# 由于没有把driver对象传进来,所以直接循环等待查询
end_time = time.time() + timeout
while True:
if self.find_elements(by=by, value=value): # 找到元素就返回
break
if time.time() > end_time: # 超时返回
break
time.sleep(0.5)
def find_element_ext(self, by=By.ID, value=None):
wait_element(self, by=by, value=value) # 重点:等待元素出现
return super(Chrome, self).find_element(by=by, value=value)
def patch_find_element():
# 重写原来的find_element
Chrome.find_element = find_element_ext
复制代码
test_selenium.py
import time
import logging
from selenium.webdriver import Chrome
from selenium_monkey import patch_find_element
patch_find_element() # 打补丁,那样原来的代码就可以不用做任何修改了
logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(name)s:%(lineno)d] [%(levelname)s]- %(message)s')
logger = logging.getLogger(__name__)
class TestSeleiumCase:
# 执行 pytest -s test_seleinum.py
def test_find_element_wait(self):
context1 = Chrome(executable_path=r"C:\Users\dong\Downloads\chromedriver.exe")
context1.get("https://www.baidu.com/")
context1.find_element_by_css_selector(css_selector="input[name=\"wd\"]").click()
context1.find_element_by_css_selector(css_selector="input[name=\"wd\"]").send_keys("python")
time.sleep(2)
context1.close()
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END