関数の実行時間を制限する必要があるため、Josh Leeの回答に従いました
try:
with time_limit(10):
long_function_call()
except TimeoutException, msg:
print "Timed out!"
ここで、 long_function_call() は、ページとやり取りしていくつかの操作を行う Selenium Webdriver 関数です。
def long_function_call(self, userName, password):
driver = self.initDriver()
try:
driver.get("https://yyyy.com")
time.sleep(2)
if not self.isHttps(driver.current_url):
isHttps = False
driver.find_element_by_id("i015516").clear()
time.sleep(5)
if 'https://yyy.com' not in driver.current_url:
self.raiseFailedToLogin('yyy')
except Exception as e:
self.raiseException('yyy',e)
finally:
driver.close()
driver.quit()
return 'yyyy'
ほとんどの場合、関数の実行時間がシグナル タイムアウトを超えるとシグナルが送信され、メソッドが停止しますが、場合によってはメソッドがタイムアウトを超えて停止しませんでした。Selenium がハングしているようです (firefox は開いていて、何もしていません)。
これらのケースでデバッガーを一時停止しようとしましたが、一時停止してもハングする場所が表示されませんでした。このメソッドでデバッグ一時停止よりもセレンFirefoxを閉じると:
_read_status [httplib.py:366]
begin [httplib.py:407]
getresponse [httplib.py:1030]
do_open [urllib2.py:1180]
http_open [urllib2.py:1207]
def _read_status(self):
# Initialize with Simple-Response defaults
line = self.fp.readline()
if self.debuglevel > 0: ################Hang here
場合によっては、セレンのシグナルアラームが機能しなかった理由は何ですか? (私は彼らが割り込みをキャッチするとは思わない)。