Selenium元素查询优化

背景

  • 前段时间给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
喜欢就支持一下吧
点赞0 分享