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

3

我希望能够执行类似于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)

在上面的例子中,我可以用match替换search。这种方法的问题是,如果对象(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秒,以查看assert语句是否评估为true。 这可以放入模块或类中。 我想知道的是,是否有更优雅的解决方案,在Python中使用Selenium WebDriver来处理这个问题,我不知道。

2个回答

7

如果您查看“预期条件”是什么,您会发现很容易制作自定义的预期条件

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}")
)

1
感谢您的回复!我会抽出时间来分析它的工作原理。我也相信这将有助于加深我对Python的理解。非常感谢! - rwbyrd
嘿@alecxe。我终于开始尝试这个了,但是在return语句中遇到了以下错误:_AttributeError: 'tuple' object has no attribute 'text'_。 - rwbyrd
@rwbyrd 嗯,我的错,已经修好了 - 请再次检查一下。谢谢。 - alecxe
1
+1 对于这个很棒的答案。它来自2015年,但是当前的文档 https://selenium-python.readthedocs.io/waits.html 现在实现了一些不同的方式。 - Dan-Dev

0
在较新版本的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()访问匹配组,例如处理状态/错误消息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接