![](/img/trans.png)
[英]Javascript:Why is click event of “.deletebutton” not triggering
[英]selenium button click not triggering inline javascript event handler
我的 HTML 如下所示
<div class="container">
<div class="jumbotron">
<h1 id="survey-title" class="display-5 text-capitalize">Your favourite candidate</h1>
<hr class="my-4">
<div class="card-body">
<h5 id="question-title" class="card-title">What is your name?</h5>
<form id="question_form" action="/survey/takesurvey/1/2" method="post" class="form">
<input type="hidden" name="csrfmiddlewaretoken" value="ELBWYGZRxRuI7CoZ2xkmgCJ3f9JweFMM4Ew1pQbgSE3BLb38VStPJEbHvsyiBEFg">
<div class="form-group"><input type="text" name="response" value="asdfasdfas" maxlength="400" class="form-control" title="" id="id_response"></div>
</form>
</div>
<a id="btn-previous" href="javascript:history.back()" class="btn btn-primary ">Previous</a>
<a id="btn-next" href="/survey/takesurvey/finish/1" class="btn btn-primary">Next</a>
</div>
</div>
注意上一個按鈕上的href
<a id="btn-previous" href="javascript:history.back()" class="btn btn-primary ">Previous</a>
單擊下一步將提交表單並轉到“下一頁”,再次單擊“上一頁”應返回並保留上一頁的輸入值。 我正在使用以下代碼來測試此行為,以下代碼僅在我將sleep(1)
行置於查找元素和單擊之間時才有效。 否則頁面不會返回(網址不變)
cur_url = self.browser.current_url
self.browser.find_element_by_id('btn-next').click()
wait(lambda: self.assertNotEqual(self.browser.current_url, cur_url))
btn_previous = self.browser.find_element_by_id('btn-previous')
## This code is not working without the sleep below. Which I suspect
## has to do with javascript event handler (which is inline in html) not being loaded.
## Is there better way to check that the button is ready to be clicked
sleep(1)
btn_previous.click()
您可以將WebDriverWait
與element_to_be_clickable
條件一起使用。 也請檢查這里。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
WebDriverWait(self.browser, 5).until(EC.element_to_be_clickable((By.ID, "btn-previous"))).click()
您可以嘗試等待 JavaScript:
WebDriverWait(self.browser, 20).until(lambda d: d.execute_script(
'return (document.readyState == "complete" || document.readyState == "interactive")'))
# or without interactive
WebDriverWait(self.browser, 20).until(lambda d: d.execute_script(
'return document.readyState == "complete"'))
這不是理想的解決方案,而是目前對我有用的解決方法。
我的等待功能
from time import sleep
from functools import wraps
from selenium.common.exceptions import NoSuchElementException
def wrap_in_wait(func, retires=5):
@wraps(func)
def wrapper(*args, **kwargs):
return wait(func, *args, retires=retires, **kwargs)
return wrapper
def wait(func, *args, retires=10, exceptions=[AssertionError, NoSuchElementException], **kwargs):
for i in range(retires):
try:
return func(*args, **kwargs)
except Exception as e:
print('retry', i)
if type(e) not in exceptions:
raise e
if i == retires-1:
raise e
sleep(0.5 + i*.2)
使用變通解決方案測試功能
def test_question_form_is_loaded_with_existing_answer(self):
'''Test question form pre-loads'''
self.browser.get(self.live_server_url + self.url)
inp = self.browser.find_element_by_css_selector("input#id_response")
inp.send_keys("This is my answer")
self.browser.find_element_by_id('btn-next').click()
@wrap_in_wait
def click_previous_button():
btn_previous = self.browser.find_element_by_id('btn-previous')
btn_previous.click()
inp = self.browser.find_element_by_css_selector("input#id_response")
self.assertEqual(inp.get_attribute('value'), "This is my answer")
click_previous_button()
如果它引發AssertionError or NoSuchElementException
異常,此解決方案將重試click_previous_button
10 次。 它正在進行第二次嘗試。
但我仍然不確定為什么即使按鈕可點擊也不會觸發 javascript 事件,以及是否有直接的方法來測試 javascript 何時准備就緒
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.