并行硒测试的指纹识别问题
Fingerprinting issue with parallel selenium tests
我正在使用 https://github.com/Valve/fingerprintjs2 为匿名站点访问者创建唯一 ID。
问题是我想同时模拟多个用户会话,所以我运行这样测试
nosetests --processes=8 --process-timeout=120
此外,我正在使用 selenium 网格进行更真实的测试方法,该方法有两个节点 - 一个有多个 firefox 实例,另一个有 chrome 个。
@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
问题是 - 即使 webdriver 每次测试都打开新的浏览器 - 它返回相同的指纹
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")
...
指纹仅因浏览器不同而不同,测试用例或测试则不同。
有没有办法让 webdriver 实例在浏览器指纹识别方面是唯一的?
据我所知,browser fingerprint
技术是为了区分浏览器而创建的,即使客户端已清除 cookies
并重新启动会话。所以你在这里描述的是预期的。
我建议您使用 DesiredCapabilities
,每次启动浏览器时设置一些随机分辨率,例如:
driver.manage().window().setSize(new Dimension(1024, 768))
DesiredCapabilities dc=DesiredCapabilities.firefox();
FirefoxProfile profile = new FirefoxProfile();
dc.setCapability(FirefoxDriver.PROFILE, profile);
Webdriver driver = new FirefoxDriver(dc);
我正在使用 https://github.com/Valve/fingerprintjs2 为匿名站点访问者创建唯一 ID。
问题是我想同时模拟多个用户会话,所以我运行这样测试
nosetests --processes=8 --process-timeout=120
此外,我正在使用 selenium 网格进行更真实的测试方法,该方法有两个节点 - 一个有多个 firefox 实例,另一个有 chrome 个。
@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
问题是 - 即使 webdriver 每次测试都打开新的浏览器 - 它返回相同的指纹
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")
...
指纹仅因浏览器不同而不同,测试用例或测试则不同。
有没有办法让 webdriver 实例在浏览器指纹识别方面是唯一的?
据我所知,browser fingerprint
技术是为了区分浏览器而创建的,即使客户端已清除 cookies
并重新启动会话。所以你在这里描述的是预期的。
我建议您使用 DesiredCapabilities
,每次启动浏览器时设置一些随机分辨率,例如:
driver.manage().window().setSize(new Dimension(1024, 768))
DesiredCapabilities dc=DesiredCapabilities.firefox();
FirefoxProfile profile = new FirefoxProfile();
dc.setCapability(FirefoxDriver.PROFILE, profile);
Webdriver driver = new FirefoxDriver(dc);