我希望能够执行类似于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()
访问匹配组,例如处理状态/错误消息。