Selenium 2 と Browsermob プロキシで構築したこの自動化ツールは、必要なもののほとんどでうまく機能します。ただし、ネットワーク トラフィックをキャプチャする際に問題が発生しました。
私は基本的に、ページがリダイレクトされる前にクリックが提供する har をキャプチャしたいと考えています。たとえば、キャプチャしたいクリックで分析呼び出しが発生し、次にキャプチャしたくないページの読み込みで別の分析呼び出しが発生したとします。
現在、私の試みはすべて har をキャプチャするのが遅すぎるため、クリック分析呼び出しとページ読み込み呼び出しの両方が表示されます。これを機能させる方法はありますか?以下に現在の関連コードセクションを含めました
ヘルパー クラス内のメソッドclass _check_for_page_load(object):
def __init__(self, browser, parent):
self.browser = browser
self.maxWait = 5
self.parent = parent
def __enter__(self):
self.old_page = self.browser.find_element_by_tag_name('html')
def wait_for(self,condition_function):
start_time = time.time()
while time.time() < start_time + self.maxWait:
if condition_function():
return True
else:
time.sleep(0.01)
raise Exception(
'Timeout waiting for {}'.format(condition_function.__name__)
)
def page_has_loaded(self):
new_page = self.browser.find_element_by_tag_name('html')
###self.parent.log("testing ---- " + str(new_page.id) + " " + str(self.old_page.id))
return new_page.id != self.old_page.id
def __exit__(self, *_):
try:
self.wait_for(self.page_has_loaded)
except:
pass
def startNetworkCalls(self):
if self._p != None:
self._p.new_har("Step"+str(self._currStep))
def getNetworkCalls(self, waitForTrafficToStop = True):
if self._p != None:
if waitForTrafficToStop:
self._p.wait_for_traffic_to_stop(5000, 30*1000);
return self._p.har
else:
return "{}"
def click(self, selector):
''' clicks on an element '''
self.log("Clicking element '" + selector + "'")
el = self.findEl(selector)
traffic = ""
with self._check_for_page_load(self._d, self):
try:
self._curr_window = self._d.window_handles[0]
el.click()
except:
actions = ActionChains(self._d);
actions.move_to_element(el).click().perform()
traffic = self.getNetworkCalls(False)
try:
popup = self._d.switch_to.alert
if popup != None:
popup.dismiss()
except:
pass
try:
window_after = self._d.window_handles[1]
if window_after != self._curr_window:
self._d.close()
self._d.switch_to_window(self._curr_window)
except:
pass
return traffic
複数の Selenium アクションを実行する内部ファイル
##inside a for loop, we get an action that looks like "click('#selector')"
util.startNetworkCalls()
if action.startswith("click"):
temp_traffic = eval(action)
if temp_traffic == "":
temp_traffic = util.getNetworkCalls()
traffic = json.dumps(temp_traffic, sort_keys=True) ##gives json har info that is saved later
これらのいくつかのスニペットから、ネットワーク トラフィックを返す「クリック」機能を開始していることがわかります。クリック関数内で、クラス「_check_for_page_load」を参照していることがわかります。ただし、最初にこの行に到達すると、次のようになります。
###self.parent.log("testing ---- " + str(new_page.id) + " " + str(self.old_page.id))
ログ (有効な場合) は、最初のログで要素 ID が一致しないことを示しており、ページの読み込みが既に開始されていることを示しています。この機能を実現するために考えられるすべてのことを試したので、今はかなり行き詰まっています。