Проблема отпечатков пальцев с параллельными тестами селена

Я использую https://github.com/Valve/fingerprintjs2 для создания уникальных идентификаторов для анонимных посетителей сайта. .

Проблема в том, что я хочу имитировать сеансы нескольких пользователей одновременно, поэтому я запускаю тесты таким образом.

nosetests --processes=8 --process-timeout=120

Также я использую селеновую сетку для более реалистичного подхода к тестированию с двумя узлами: один с несколькими экземплярами Firefox, а другой с хромированными.

 @classmethod
 def setUpClass(cls):
    cls.sessions_ids = set([])

 def setUp(self):
    self.driver = webdriver.Remote(
        command_executor='http://localhost:4444/wd/hub',
        desired_capabilities={
            "browserName": "firefox", #chrome
            "platform": "ANY",
        }
    )
    self.driver.set_page_load_timeout(30)

 def test_anon_session(self):
    self.driver.get("http://localhost:8000/")
    wait = WebDriverWait(self.driver, 10)
    wait.until(
        lambda driver: self.driver.execute_script(
            "return jQuery.active == 0"
        )
    )
    sessionId = # getting sessionId (fingerprint2 js result)
    self.sessions_ids.add(sessionId)

 def test_anon_session_other_page(self):
    self.driver.get("http://localhost:8000/delivery")
    ...

@classmethod
def tearDownClass(cls):
    # 2 is a tests_count
    assert len(cls.sessions_ids) == 2, "Non unique sessions %r" % cls.sessions_ids

Проблема в том, что даже веб-драйвер открывает новый браузер в каждом тесте - он возвращает один и тот же отпечаток пальца.

Non unique sessions firefox set([u'c0509e372ee0906cb0120edd5b349620'])

Даже если я изменю строку пользовательского агента

def test_delivery_page_different_user_agent(self):
    profile = FirefoxProfile()
    profile.set_preference("general.useragent.override", "CatchBot/2.0; +http://www.catchbot.com")
    driver = Remote(
        command_executor='http://localhost:4444/wd/hub',
        desired_capabilities={
            "browserName": "chrome",
            "platform": "ANY",
        },
        browser_profile=profile,
    )
    driver.set_page_load_timeout(30)
    driver.get("http://localhost:8000/delivery")
    ...

Fingerprint отличается только для разных браузеров, но не тестовых случаев или тестов.

Есть ли способ сделать экземпляр webdriver уникальным с точки зрения снятия отпечатков пальцев браузера?


person Aristarhys    schedule 01.04.2016    source источник


Ответы (1)


Насколько я знаю, browser fingerprint технологии созданы для того, чтобы различать браузеры, даже если клиент очистил cookies и перезапустил сеанс. Так что то, что вы описали здесь, ожидаемо.

Я бы посоветовал вам поиграть с DesiredCapabilities, устанавливать случайное разрешение каждый раз при запуске браузера, например:

driver.manage().window().setSize(new Dimension(1024, 768)) 

или профиль Firefox:

DesiredCapabilities dc=DesiredCapabilities.firefox();
FirefoxProfile profile = new FirefoxProfile();
dc.setCapability(FirefoxDriver.PROFILE, profile);
Webdriver driver =  new FirefoxDriver(dc); 
person Rudziankoŭ    schedule 01.04.2016