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

时间:2015-01-30 16:30:13

标签: python regex selenium selenium-webdriver webdriver

我希望能够执行类似于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。这可以适合模块或类。我想知道的是,如果在Selenium WebDriver的Python中有一个更优雅的解决方案来处理我不知道的问题。

1 个答案:

答案 0 :(得分:3)

如果您查看what an "Expected Condition" is,您会发现很容易制作自定义

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