0

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 が一致しないことを示しており、ページの読み込みが既に開始されていることを示しています。この機能を実現するために考えられるすべてのことを試したので、今はかなり行き詰まっています。

4

1 に答える 1