Check whether your browser is a bot
Pass: 1/10, Fail: 0
<script type="text/javascript">
const iframe = document.createElement("iframe");
iframe.setAttribute("sandbox", "allow-scripts");
iframe.src = "https://d1exrvfwzmo830.cloudfront.net/checkbox-iframe.html";
wrapper.querySelector(".tab-pane").appendChild(iframe);
window.addEventListener('message', function (ev) {
if (!ev.data || ev.data.type !== 'bot-check-click') return;
if (ev.data.screenY > 100) {
success("");
} else {
fail("");
}
});
</script>
<div class="iframe-contents">
<input id="click-me-box" type="checkbox"/>
<label for="click-me-box">Click Me</label>
<script type="text/javascript">
document.getElementById('click-me-box').addEventListener('click', (e) => {
parent.postMessage({
type: 'bot-check-click',
screenX: e.screenX,
screenY: e.screenY
}, '*');
});
</script>
</div>
Your network connection does not support HTTP3. You are probably using a proxy. Detected HTTP version: 2.0
<script type="text/javascript">
const brands = navigator.userAgentData?.brands || [];
const brandNames = brands.map(b => b.brand.toLowerCase());
let name = "unknown";
if (brandNames.some(b => b.includes('edge'))) name = 'edge';
else if (brandNames.some(b => b.includes('brave'))) name = 'brave';
else if (brandNames.some(b => b.includes('opera') || b.includes('opr'))) name = 'opera';
else if (brandNames.some(b => b.includes('chrome'))) name = 'chrome';
else if (brandNames.some(b => b.includes('chromium'))) name = 'chromium';
else if (brandNames.some(b => b.includes('safari'))) name = 'safari';
if (name === "unknown") {
if (/firefox/i.test(navigator.userAgent)) {
name = 'firefox';
}
}
if (name === "chrome" || name === "edge") {
success(name);
} else {
fail(`Detected ${name} browser. Chrome and Edge cover 80% of desktop browser market share. Any other browser at large scale scraping will stand out as Bart Simpsons head. Also too much work to implement these tests for every browser.`);
}
</script>
<script type="text/javascript">
if (navigator.userAgentData) {
const brands = navigator.userAgentData.brands;
const chromeVersion = parseInt(brands.find(b => b.brand.includes('Chromium')).version, 10);
const baseVersion = 142;
const currentDate = new Date();
const monthsPassed = (currentDate.getFullYear() - 2025) * 12 + (currentDate.getMonth() - 10);
const currentChromeVersion = baseVersion + monthsPassed;
if (chromeVersion >= currentChromeVersion - 1) {
success("Chrome version " + chromeVersion);
} else {
fail("Chrome version too old. Yours: " + chromeVersion + " Expected: " + (currentChromeVersion - 1) + "+");
}
}
</script>
<script type="text/javascript">
const platform = navigator.platform;
if (platform === "Win32" || platform === "MacIntel") {
success(platform);
} else {
fail(`Detected ${platform}. Windows and OSX cover 80% of desktop browser market share. Any other browser at large scale scraping will stand out as Bart Simpsons head.`);
}
</script>
<script type="text/javascript">
let result;
try {
result = Function.prototype.toString.call(Function.prototype.toString);
} catch (e) {
result = e.toString();
}
if (result === "function toString() { [native code] }") {
success(result);
} else {
failExpected("function toString() { [native code] }", result);
}
</script>
<script type="text/javascript">
let result;
try {
result = Date.prototype.toString.call(Function.prototype.toString);
} catch (e) {
result = e.toString();
}
if (result === "TypeError: Method Date.prototype.toString called on incompatible receiver function toString() { [native code] }") {
success(result);
} else {
failExpected("TypeError: Method Date.prototype.toString called on incompatible receiver function toString() { [native code] }", result);
}
</script>
<script type="text/javascript">
let result;
try {
result = Intl.Locale.prototype.toString.call(Function.prototype.toString);
} catch (e) {
result = e.toString();
}
if (result === "TypeError: Method Intl.Locale.prototype.toString called on incompatible receiver function toString() { [native code] }") {
success(result);
} else {
failExpected("TypeError: Method Intl.Locale.prototype.toString called on incompatible receiver function toString() { [native code] }", result);
}
</script>
<script type="text/javascript">
const frame = document.createElement('iframe');
document.body.appendChild(frame);
let result;
try {
result = frame.contentWindow.Function.prototype.toString.call(Function.prototype.toString);
} catch (e) {
result = e.toString();
}
if (result === "function toString() { [native code] }") {
success(result);
} else {
failExpected("function toString() { [native code] }", result);
}
</script>
<script type="text/javascript">
const frame = document.createElement('iframe');
document.body.appendChild(frame);
let result;
try {
result = frame.contentWindow.Date.prototype.toString.call(Function.prototype.toString);
} catch (e) {
result = e.toString();
}
if (result === "TypeError: Method Date.prototype.toString called on incompatible receiver function toString() { [native code] }") {
success(result);
} else {
failExpected("TypeError: Method Date.prototype.toString called on incompatible receiver function toString() { [native code] }", result);
}
</script>
<script type="text/javascript">
const frame = document.createElement('iframe');
document.body.appendChild(frame);
let result;
try {
result = frame.contentWindow.Intl.Locale.prototype.toString.call(Function.prototype.toString);
} catch (e) {
result = e.toString();
}
if (result === "TypeError: Method Intl.Locale.prototype.toString called on incompatible receiver function toString() { [native code] }") {
success(result);
} else {
failExpected("TypeError: Method Intl.Locale.prototype.toString called on incompatible receiver function toString() { [native code] }", result);
}
</script>
<script type="text/javascript">
const frame = document.createElement('iframe');
document.body.appendChild(frame);
let result;
try {
result = Function.prototype.toString.call(frame.contentWindow.Function.prototype.toString);
} catch (e) {
result = e.toString();
}
if (result === "function toString() { [native code] }") {
success(result);
} else {
failExpected("function toString() { [native code] }", result);
}
</script>
<script type="text/javascript">
const frame = document.createElement('iframe');
document.body.appendChild(frame);
let result;
try {
result = Date.prototype.toString.call(frame.contentWindow.Function.prototype.toString);
} catch (e) {
result = e.toString();
}
if (result === "TypeError: Method Date.prototype.toString called on incompatible receiver function toString() { [native code] }") {
success(result);
} else {
failExpected("TypeError: Method Date.prototype.toString called on incompatible receiver function toString() { [native code] }", result);
}
</script>
<script type="text/javascript">
const frame = document.createElement('iframe');
document.body.appendChild(frame);
let result;
try {
result = Intl.Locale.prototype.toString.call(frame.contentWindow.Function.prototype.toString);
} catch (e) {
result = e.toString();
}
if (result === "TypeError: Method Intl.Locale.prototype.toString called on incompatible receiver function toString() { [native code] }") {
success(result);
} else {
failExpected("TypeError: Method Intl.Locale.prototype.toString called on incompatible receiver function toString() { [native code] }", result);
}
</script>
<script type="text/javascript">
const originalObjectApply = Object.apply;
const originalReflectApply = Reflect.apply;
let trapped = false;
Object.apply = function () {
trapped = true;
return originalObjectApply.apply(this, arguments);
};
Reflect.apply = function () {
trapped = true;
return originalReflectApply.apply(this, arguments);
};
try {
Function.prototype.toString.toString();
} catch (e) {
trapped = true;
}
if (!trapped) {
success("OK");
} else {
fail("trapped apply call");
}
</script>
<script type="text/javascript">
const canvas = document.createElement("canvas");
const gl = canvas.getContext("webgl");
const debugExt = gl.getExtension('WEBGL_debug_renderer_info');
const vendor = gl.getParameter(debugExt.UNMASKED_VENDOR_WEBGL);
const vendorLower = vendor.toLowerCase();
if (vendorLower.includes('amd') || vendorLower.includes('nvidia') || vendorLower.includes('intel')) {
success(vendor);
} else if (vendor === "Google Inc. (Google)") {
fail(`Detected ${vendor}. You are running Chrome with --disable-gpu`);
} else {
fail(`Detected ${vendor}`);
}
</script>
<script type="text/javascript">
const canvas = document.createElement("canvas");
const gl = canvas.getContext("webgl");
const debugExt = gl.getExtension('WEBGL_debug_renderer_info');
const renderer = gl.getParameter(debugExt.UNMASKED_RENDERER_WEBGL);
const rendererLower = renderer.toLowerCase();
if (rendererLower.includes('amd') || rendererLower.includes('nvidia') || rendererLower.includes('intel')) {
success(renderer);
} else if (rendererLower.includes('swiftshader')) {
fail(`Detected ${renderer}. You are running Chrome with --disable-gpu`);
} else {
fail(`Detected ${renderer}`);
}
</script>
<script type="text/javascript">
const canvas = document.createElement("canvas");
const gl = canvas.getContext("webgl", {failIfMajorPerformanceCaveat: true});
if (gl) {
success("failIfMajorPerformanceCaveat: true");
} else {
fail("failIfMajorPerformanceCaveat: false");
}
</script>
<script type="text/javascript">
const canvas = document.createElement("canvas");
const gl = canvas.getContext("webgl");
const result = Function.prototype.toString.apply(gl.getParameter);
if (result === "function getParameter() { [native code] }") {
success(result);
} else {
failExpected("function getParameter() { [native code] }", result);
}
</script>
<script type="text/javascript">
const canvas = document.createElement("canvas");
const gl = canvas.getContext("webgl");
const extensions = gl.getSupportedExtensions();
const canvas2 = document.createElement("canvas");
const gl2 = canvas2.getContext("webgl2");
const extensions2 = gl2.getSupportedExtensions();
const result = Function.prototype.toString.apply(gl.getParameter);
if (JSON.stringify(extensions) !== JSON.stringify(extensions2)) {
success("webgl and webgl2 extensions differ");
} else {
fail("webgl and webgl2 extensions are the same");
}
</script>
<script type="text/javascript">
if (navigator.gpu && await navigator.gpu.requestAdapter()) {
success("WebGPU available");
} else {
fail("WebGPU unavailable");
}
</script>
<script type="text/javascript">
const vendor = (await navigator.gpu.requestAdapter()).info.vendor.toLowerCase();
if (['intel', 'amd', 'nvidia', 'apple'].includes(vendor)) {
success(vendor);
} else {
fail(vendor);
}
</script>
<script type="text/javascript">
if (navigator.platform === 'Linux x86_64') {
success('Skipping');
return;
}
const testString = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
function fontPresent(fontName) {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
ctx.font = '72px monospace';
const baseline = ctx.measureText(testString).width;
ctx.font = `72px "${fontName}", monospace`;
const width = ctx.measureText(testString).width;
return width !== baseline;
}
const fonts = ["DejaVu Sans","DejaVu Serif","DejaVu Sans Mono","Bitstream Vera Sans","Bitstream Vera Serif","Bitstream Vera Sans Mono"];
const foundAll = fonts.filter(fontPresent);
if (foundAll.length) {
fail('Found Linux fonts: ' + foundAll.join(', '));
} else {
success('No Linux fonts found');
}
</script>
<script type="text/javascript">
if (navigator.platform === 'Win32') {
success('Skipping');
return;
}
const testString = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
function fontPresent(fontName) {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
ctx.font = '72px monospace';
const baseline = ctx.measureText(testString).width;
ctx.font = `72px "${fontName}", monospace`;
const width = ctx.measureText(testString).width;
return width !== baseline;
}
const fonts = ["Arial Narrow","Trebuchet MS","Microsoft Sans Serif","Comic Sans MS"];
const foundAll = fonts.filter(fontPresent);
if (foundAll.length) {
fail('Found Windows fonts: ' + foundAll.join(', '));
} else {
success('No Windows fonts found');
}
</script>
<script type="text/javascript">
if (navigator.platform === 'MacIntel') {
success('Skipping');
return;
}
const testString = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
function fontPresent(fontName) {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
ctx.font = '72px monospace';
const baseline = ctx.measureText(testString).width;
ctx.font = `72px "${fontName}", monospace`;
const width = ctx.measureText(testString).width;
return width !== baseline;
}
const fonts = ["Apple Chancery","San Francisco","American Typewriter","Apple Symbols","Apple SD Gothic Neo Bold","AppleGothic Regular"];
const foundAll = fonts.filter(fontPresent);
if (foundAll.length) {
fail('Found MacOS fonts: ' + foundAll.join(', '));
} else {
success('No MacOS fonts found');
}
</script>