我们有一个用BrowserStack运行的自动化UI测试,在等待元素被添加到DOM时,它并不总是一致地运行,偶尔会超时,但当使用Chromedriver本地运行时,测试100%成功。
以下是selenium等待失败的一个示例:
return WebDriverWait(self.__driver, 10).until(
ec.presence_of_element_located((By.XPATH, locator))
)有没有其他人看到过与BrowserStack类似的不一致,并知道可能导致它的原因,以及是否有更好的方法等待元素变得可用。
我们得到的确切表达式是来自ec.presence_of_element_located((By.XPATH, locator))的TimeoutException。
发布于 2020-08-04 01:52:21
presence_of_element_located()
presence_of_element_located()是检查元素是否出现在页面的DOM上的期望值。这并不一定意味着元素是可见的。因此,需要等待出现第一个匹配的WebElement。
通用用例
通常,在您的测试中,简单地等待元素的出现可能不足以满足您的需求,您可能需要等待元素成为可见的或可交互的。
要等到元素可见,您需要为visibility_of_element_located()归纳WebDriverWait,您的有效代码块将是:
return WebDriverWait(self.__driver, 10).until(
ec.visibility_of_element_located((By.XPATH, locator))
)为了等待元素可交互,您需要为element_to_be_clickable()归纳WebDriverWait,您的有效代码块将是:
return WebDriverWait(self.__driver, 10).until(
ec.element_to_be_clickable((By.XPATH, locator))
)注意::您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec这个用例
在这个用例中,下面这行代码:
ec.presence_of_element_located((By.XPATH, locator))无法在所需的时间范围内确定所需的元素,因此您面临TimeoutException。
然而,从TimeoutException中很难挖掘出失败的实际结果。
解决方案
作为了解失败确切原因的解决方案,您需要删除WebDriverWait并将代码行替换为以下任一项:
find_element_by_class_name(name)find_element_by_css_selector(css_selector)find_element_by_id(id)find_element_by_link_text(link_text)find_element_by_name(name)find_element_by_partial_link_text(partial_link_text)find_element_by_tag_name(tag_name)find_element_by_xpath(xpath)如果需要,您可以在调试时通过time.sleep(secs)降低搜索诱导等待的速度。
参考文献
您可以在以下位置找到几个相关的讨论:
发布于 2020-08-04 05:05:08
此问题已解决。出于某种原因,将OS BrowserStack切换到OS X解决了这个问题。使用chrome-driver的本地测试在两个操作系统上都有效,但我们的BrowserStack测试只在Mac上一致有效,大约一半的时间都失败了。我们仍在努力了解这到底是为什么,但目前,这是修复。
https://stackoverflow.com/questions/63233808
复制相似问题