我正在使用硒工具,因此我需要等待页面上的最新日期和时间更新。由于我只需要验证我的元素是否包含今天的缩写月份和日期(格式为“ 10月16日”),因此我添加了一个自定义EC来允许正则表达式搜索页面文本。我正在搜索的示例如下:
页面最初包含旧日期。触发了一个js函数来更新该日期,我需要等待该日期才能继续。
问题是,当使用.format()并将其添加到我的正则表达式中时,我的代码似乎截断了格式化的日期。
date.today()
返回预期的'2019-10-16'
today.strftime('%b %d')
返回预期的'Oct 16'
"^(.*?(\b{}\b)[^$]*)$".format(day)
返回'^(.*?Oct 1)[^$]*)$'
这是出乎意料的,我不确定为什么会发生这种情况。我正在将VS Code与蟒蛇3.6的Anaconda安装一起使用。
我确实确认我的正则表达式可以使用https://www.regextester.com/98103我只是插入了正则表达式,包括日期的手动格式,还包括了网页中的示例文本。这并不排除存在此问题,因为我的理解是正则表达式不是通用的。
我尝试使用基本代码删除变量和格式:date_regex = "^(.*?(\b{}\b)[^$]*)$".format(date.today().strftime('%b %d'))
[尝试使用.strftime('%a')
仅搜索“星期三”的日期似乎也被截断为'^(.*?We)[^$]*)$'
(这并不理想,因为我可能已经有一个星期或更长时间了,无法等待)。
from datetime import date
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
# custom expected condition
class wait_for_text_to_match(object):
def __init__(self, locator, regexp):
self.locator = locator
self.regexp = regexp
def __call__(self, driver):
element_text = EC._find_element(driver, self.locator).text
return re.search(self.regexp, element_text)
# Code snip
today = date.today()
print(today) # Output: 2019-10-16
day = today.strftime('%b %d') # Ex: Oct 14
print(day) # output: Oct 16
date_regex = "^(.*?(\b{}\b)[^$]*)$".format(day)
date_regex
print(date_regex) # Output: ^(.*?Oct 1)[^$]*)$
wait.until(wait_for_text_to_match(
(By.XPATH,
'//*[@id="syncInfo"]/div/table/tbody/tr[7]/td[2]'),
date_regex))
我的期望是正则表达式将被格式化为包括我构建的整个一天。
^(.*?Oct 1)[^$]*)$
^(.*?Oct 16)[^$]*)$
如果操作正确,则将其插入我的自定义EC中,如果找到,则使我的代码等待定义的超时。
您需要为正则表达式使用原始字符串,或转义反斜杠。常规字符串文字中的\b
是退格键,因此当您在终端上打印正则表达式时,它将备份并在日期的最后一位上打印下一个字符。而且正则表达式不匹配,因为网页中没有退格键。
date_regex = r"^(.*?(\b{}\b)[^$]*)$".format(day)