我希望这个问题是独一无二的,也有助于其他测试人员
我需要python selenium的解决方案
我需要通过时间显式等待来替换几行time.sleep()
行代码。
当Chrome在每个预期被点击的元素之前休眠几秒钟时,测试会成功运行,但不会失败。
所以它是这样的:
driver.find_element_by_xpath("x").click()
time.sleep(5)
driver.find_element_by_xpath("y").click()
time.sleep(5)
driver.find_element_by_xpath("z").click()
time.sleep(5)
...
肯定是隐晦等待是不够的。
以下是推荐的代码:
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID, 'someid')))
我看一下这个示例代码,但似乎我必须多次引用每个ID。
所以问题是:
是否有任何全局解决方案使用显式等待脚本中的每个元素,而不需要乘以代码行?
答案 0 :(得分:1)
我不知道这是否是你需要的。但是如果你愿意,你可以使用一个试图点击的功能,直到成功或达到超时。这样,你只需要调用它并等待。
manager.create_api(Roles, results_per_page=0, methods=['GET'])
如果您应用它,您的代码将是:
import timeit
from selenium import webdriver
def safe_click(wd_elem, max_time=10):
"""
wd_elem should be a WebElement object, so it has the .click() method
max_time defaults to 10 [seconds], and it's how long will the script try to click before it stops
"""
start = timeit.default_timer()
while timeit.default_timer() - start <= max_time:
try:
wd_elem.click()
return
except:
pass
print 'Max time reached; stopped trying'
wd = webdriver.Chrome()
wd.get('https://stackoverflow.com/questions/48624119/general-explicit-wait-selenium-python')
elem_to_click = wd.find_element_by_xpath('//*[@id="question-header"]/h1/a')
safe_click(elem_to_click) # Clicks it
safe_click(None) # After 10 seconds, it gives up