对 Python 中的正则表达式执行 WebDriverWait() 或类似检查



我希望能够执行类似于WebDriverWait()的东西,即:

WebDriverWait(driver, 60).until(
    expected_conditions.text_to_be_present_in_element((By.XPATH, "//tr[5]/td[11]/div"), "1.000000")
)

。对于正则表达式,它在失败之前等待分配的时间量。 我知道我可以做一些事情,例如...

assert re.search(r"[0,1]{1}.[0-9]{6}", driver.find_element_by_xpath("//tr[5]/td[11]/div").text)

。或者我可以在上面的例子中用匹配替换搜索。 此方法的问题是,如果对象..(1) 尚未加载或..(2)仍在向预期转变的过程中。我可以做一些类似的事情...

for x in range (1,60):
    try:
        assert re.search(r"[0,1]{1}.[0-9]{6}", driver.find_element_by_xpath("//tr[5]/td[11]/div").text)
    except AssertionError:
        if x < 60:
            time.sleep(1)
        else:
            raise AssertionError

。它每秒检查一次 60 秒,以查看断言语句是否已计算为 true。 这可以适合模块或类。 我想知道的是,在Python中是否有一个更优雅的解决方案来处理我不知道的这个问题。

如果您查看"预期条件"是什么,您会发现很容易创建自定义条件

import re
from selenium.webdriver.support.expected_conditions import _find_element

class text_match(object):
    def __init__(self, locator, regexp):
        self.locator = locator
        self.regexp = regexp
    def __call__(self, driver):
        element_text = _find_element(driver, self.locator).text
        return re.search(self.regexp, element_text)

用法:

WebDriverWait(driver, 60).until(
    text_match((By.XPATH, "//tr[5]/td[11]/div"), r"[0,1]{1}.[0-9]{6}")
)

在较新版本的Selenium中,你可以这样做

def regex_to_be_present_in_element(locator, regexp):
    """ An expectation for checking if the given text is present in the
    specified element, extended to allow and return a regex match
    locator, text
    """
    def _predicate(driver):
        try:
            element_text = driver.find_element(*locator).text
            return re.search(regexp, element_text)
        except StaleElementReferenceException:
            return False
    return _predicate

用法:

match = WebDriverWait(driver, 60).until(
    regex_to_be_present_in_element((By.XPATH, "//tr[5]/td[11]/div"), r"[0,1]{1}.[0-9]{6}")
)

您甚至可以使用 match.groups() 访问匹配组,例如处理状态/错误消息。

最新更新