Python-Selenium: 等待一个元素存在然后 return True or false
Python-Selenium: Wait for an element to exist then return True or false
我正在尝试创建一个函数来帮助确定某个元素是从网页中出现还是消失。
这就是我的。
def wait_for_element_to_exist(driver, by, seconds=15, negative=False):
wait = WebDriverWait(driver, seconds)
# waiting for element to exist
if not negative:
try:
wait.until(EC.presence_of_element_located(*by))
return True
except:
return False
#wait for element not to exist
else:
try:
wait.until_not(EC.presence_of_element_located(*by))
return True
except:
return False
唯一的问题是它总是 returns FALSE 无论如何称呼它或元素是否存在
wait_for_element_to_exist(self.driver, (By.XPATH, 'xpath'))
returnsFalse
wait_for_element_to_exist(self.driver, (By.CLASS, 'class'), negative=True)
returnsFalse
我做错了什么?
我认为您的代码出错了,因为您正在使用 try except 块。如果 Selenium 没有找到元素,我认为它没有发现错误——它只是 returns None.
所以在我过去为这个问题编写的类似代码中,我做了这样的事情:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.TAG_NAME, "h2"))
)
if element:
return True
else:
return False
因此应用于您的代码,如下所示:
def wait_for_element_to_exist(driver, by, seconds=15, negative=False):
wait = WebDriverWait(driver, seconds)
# waiting for element to exist
if not negative:
wait_result = wait.until(EC.presence_of_element_located(*by))
if wait_result:
return True
else:
return False
#wait for element not to exist
else:
wait_result = wait.until_not(EC.presence_of_element_located(*by))
if wait_result:
return True
else:
return False
希望有用吗?
您遇到的问题是您在 presence_of_element_located(*by)
上的通话
它抛出一个 TypeError,因为 *by 解包成两个元素,这比它预期的多一个。将 *by
更改为 by
.
一旦你这样做,如果你在这个页面上说,
wait_for_element_to_exist(browser, (By.ID, 'question-header'))
它returns正确
和wait_for_element_to_exist(browser, (By.ID, 'timeout-header'))
returns 错误。
我建议您在说
后将 except
更改为 except TimeoutException
from selenium.common.exceptions import TimeoutException
当我写过类似的函数时,我将定位方法和关联的字符串作为单独的参数传递,这样可能更容易阅读和调试。
我正在尝试创建一个函数来帮助确定某个元素是从网页中出现还是消失。
这就是我的。
def wait_for_element_to_exist(driver, by, seconds=15, negative=False):
wait = WebDriverWait(driver, seconds)
# waiting for element to exist
if not negative:
try:
wait.until(EC.presence_of_element_located(*by))
return True
except:
return False
#wait for element not to exist
else:
try:
wait.until_not(EC.presence_of_element_located(*by))
return True
except:
return False
唯一的问题是它总是 returns FALSE 无论如何称呼它或元素是否存在
wait_for_element_to_exist(self.driver, (By.XPATH, 'xpath'))
returnsFalse
wait_for_element_to_exist(self.driver, (By.CLASS, 'class'), negative=True)
returnsFalse
我做错了什么?
我认为您的代码出错了,因为您正在使用 try except 块。如果 Selenium 没有找到元素,我认为它没有发现错误——它只是 returns None.
所以在我过去为这个问题编写的类似代码中,我做了这样的事情:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.TAG_NAME, "h2"))
)
if element:
return True
else:
return False
因此应用于您的代码,如下所示:
def wait_for_element_to_exist(driver, by, seconds=15, negative=False):
wait = WebDriverWait(driver, seconds)
# waiting for element to exist
if not negative:
wait_result = wait.until(EC.presence_of_element_located(*by))
if wait_result:
return True
else:
return False
#wait for element not to exist
else:
wait_result = wait.until_not(EC.presence_of_element_located(*by))
if wait_result:
return True
else:
return False
希望有用吗?
您遇到的问题是您在 presence_of_element_located(*by)
上的通话它抛出一个 TypeError,因为 *by 解包成两个元素,这比它预期的多一个。将 *by
更改为 by
.
一旦你这样做,如果你在这个页面上说,
wait_for_element_to_exist(browser, (By.ID, 'question-header'))
它returns正确
和wait_for_element_to_exist(browser, (By.ID, 'timeout-header'))
returns 错误。
我建议您在说
后将except
更改为 except TimeoutException
from selenium.common.exceptions import TimeoutException
当我写过类似的函数时,我将定位方法和关联的字符串作为单独的参数传递,这样可能更容易阅读和调试。