How to Test Social Sharing on Web (Complete Guide)
Social sharing buttons let's URL of the image to the act of sharing is not just a decorative element drives referral traffic, influences SEO through social signals, and can be a primary conversion pat
Why Social Sharing Matters on the Web
Social sharing buttons let's URL of the image to the act of sharing is not just a decorative element drives referral traffic, influences SEO through social signals, and can be a primary conversion path for campaigns that rely on word‑of‑mouth. When a share button fails—whether it opens a blank popup, sends an incorrect URL, or leaks private data—the user experience deteriorates instantly and the brand loses potential reach. In production, these failures often appear only under specific conditions: a certain browser version, a logged‑in state, or after a particular interaction sequence that a scripted test never reaches. Therefore, testing social sharing must go beyond a simple “click and verify” check and address happy paths, error conditions, accessibility, and security/privacy aspects.
Common Failure Modes in Production
Understanding what typically breaks helps focus test effort. Below are the most frequent issues observed in live web applications:
| Failure Category | Typical Symptom | Root Cause |
|---|---|---|
| Incorrect URL | Shared link points to homepage or a stale version instead of the current page. | Dynamic URL not updated after client‑side routing; missing window.location.href fallback. |
| Missing Open Graph/Twitter Card tags | Shared preview shows default image or no description. | Meta tags omitted or rendered only after AJAX load; crawler fetches initial HTML. |
| Popup blocked | Clicking share does nothing; console shows “Popup blocked”. | Share triggered outside a user‑initiated event (e.g., in a setTimeout callback). |
| Share API not supported | Fallback to custom share dialog fails silently. | Feature detection omitted; polyfill not loaded. |
| Accessibility breakage | Screen reader announces button as “share” but no accessible name; keyboard focus lost. | ARIA labels missing or button implemented as a |
| Privacy leakage | Shared URL contains session tokens or PII in query string. | URL built from location.href without stripping sensitive parameters. |
| Race condition | Share dialog opens with stale data after a rapid navigation. | Asynchronous state update not awaited before invoking share. |
| Third‑party script conflict | Share button overridden by ad‑blocker or analytics script. | CSS pointer‑events:none or event listener overwritten. |
These patterns recur across frameworks (React, Vue, Svelte, plain JS) and are often missed by unit tests that render a static component.
Building a Comprehensive Test Matrix
A test matrix captures the combinations of state, user action, and environment that must be exercised. The table below lists core scenarios; each row can be expanded with sub‑steps for different browsers or devices.
| Test ID | Scenario | Preconditions | Steps | Expected Result | Pass/Fail Criteria |
|---|---|---|---|---|---|
| S1 | Happy‑path share via native Share API | User on a article page with navigator.share supported | 1. Click share button 2. Choose a target app in the OS share sheet 3. Confirm share | OS share sheet opens with correct title, URL, and image; target app receives the data | PASS if sheet appears and data matches page metadata; FAIL if sheet missing or data incorrect |
| S2 | Happy‑path share via fallback popup (Facebook) | Share API not available (e.g., Safari desktop) | 1. Click share button 2. Verify popup URL contains https://www.facebook.com/sharer/sharer.php?u= + encoded page URL 3. Close popup | Popup opens with correct sharer URL; no console errors | PASS if popup URL matches pattern and no errors; FAIL otherwise |
| S3 | Error – popup blocked | Share button attached to a setTimeout callback | 1. Wait for timeout to fire 2. Observe button click | No popup appears; console shows “Popup blocked” | PASS if block detected and fallback UI shown; FAIL if silent failure |
| S4 | Error – missing OG tags | Page rendered via SSR without meta tags | 1. Inspect for og:title, og:description, og:image 2. Use Facebook Sharing Debugger or Twitter Card validator | Tags present and contain correct values | PASS if all required tags present and validated; FAIL if any missing or stale |
| S5 | Edge case – rapid navigation | User navigates away within 200 ms of share click | 1. Click share 2. Immediately click a link to another page 3. Observe share dialog content | Share dialog should reflect original page data, not the new page | PASS if data unchanged; FAIL if dialog shows new page’s URL |
| S6 | Accessibility – keyboard & screen reader | Page loaded with share button | 1. Tab to button 2. Press Enter/Space 3. Run axe or manual screen‑reader check | Button reachable, operable, announces purpose; focus returns to logical element | PASS if button is focusable, has accessible name, and trap does not occur; FAIL otherwise |
| S7 | Security/Privacy – URL sanitization | Page URL contains ?token=abc123 or email=user@example.com | 1. Click share 2. Inspect shared URL in popup or OS sheet | Shared URL must not contain token or email parameters | PASS if sensitive params stripped; FAIL if they appear |
| S8 | Cross‑browser – Chrome, Firefox, Edge, Safari | Same test matrix executed on each browser | Repeat S1‑S7 per browser | Consistent behavior across browsers | PASS if all browsers meet criteria; FAIL if any deviate |
| S9 | Persona‑driven – impatient user | Simulate rapid clicks | 1. Double‑click share button quickly 2. Observe if multiple dialogs open | Only one share dialog should appear; extra clicks ignored or queued | PASS if UI prevents duplicate dialogs; FAIL if multiple dialogs appear |
| S10 | Persona‑driven – adversarial user | Inject malicious javascript: into URL via XSS (if applicable) | 1. Attempt to share a URL containing javascript:alert(1) 2. Verify that the share mechanism does not execute script | No script execution; URL either sanitized or share blocked | PASS if script not executed; FAIL if alert appears |
Each test can be automated with varying degrees of fidelity; the matrix serves as a checklist for both manual and automated efforts.
Manual Testing Procedure
A disciplined manual approach catches nuances that automated scripts may overlook, especially around timing, OS‑level share sheets, and visual rendering. Follow these steps for each release candidate:
- Environment preparation
- Open the page in Chrome, Firefox, Edge, and Safari (latest stable).
- Clear cookies and local storage to simulate a first‑time visitor.
- Enable device emulation for mobile viewports (e.g., iPhone 13, Pixel 6) to test touch‑specific share flows.
- Baseline verification
- Open DevTools → Elements and confirm the share button exists in the DOM with a visible, focusable element (
or). - Check the Computed tab for
pointer-events: noneordisplay: nonethat could hide the button unintentionally.
- Meta‑tag audit
- In the
, locateog:title,og:description,og:image,twitter:card,twitter:title,twitter:description,twitter:image. - Copy the values and paste them into the respective platform’s debugger (Facebook Sharing Debugger, Twitter Card Validator, LinkedIn Post Inspector).
- Note any warnings about missing tags, incorrect image dimensions, or blocked domains.
- Share‑API support check
- Run
navigator.sharein the console. If it returnstrue, the browser supports the native Share API. - If supported, proceed to step 5; otherwise, note that the fallback path will be exercised.
- Trigger the share flow
- Keyboard: Tab to the button, press Enter or Space.
- Mouse/Touch: Click or tap the button.
- Observe the immediate UI response: a native OS share sheet (mobile) or a popup window (desktop).
- Validate shared data
- For the native Share API, the OS sheet will display the title, text, and URL you passed. Confirm they match the page’s
, a sensible description (often), and the canonical URL. - For popup flows, inspect the popup’s URL in DevTools → Network. Ensure query parameters contain the correct
u=(Facebook) orurl=(Twitter) values, properly URL‑encoded.
- Error‑path simulation
- To test popup block, temporarily override the button’s
onclickwithsetTimeout(() => button.click(), 0)and repeat step 5. Verify the block detection UI (e.g., a fallback toast). - To test missing meta tags, remove them via DevTools → Elements, then repeat step 5 and observe the preview.
- Accessibility check
- With the button focused, run
axe.run()in the console or use the axe Chrome extension. Verify no violations related to missing name, role, or keyboard operability. - Use a screen reader (NVDA, VoiceOver, TalkBack) and listen to the announcement when the button gains focus. It should convey the purpose (“Share this article on social media”).
- Security/privacy scan
- If the page URL contains query strings that might be sensitive (e.g.,
?session_id=…), deliberately add such a parameter and repeat step 5. Inspect the shared URL; it should omit the parameter. - Confirm that no
javascript:URLs are ever passed to the share mechanism.
- Document results
- Record pass/fail for each test case in a spreadsheet, linking to screenshots or console logs.
- For any failure, capture the exact browser version, OS, and steps to reproduce.
Repeating this checklist before each release ensures that regressions in sharing behavior are caught early, especially those that only manifest under specific interaction timings or browser quirks.
Automated Approaches and Tooling Specific to Web
Automation expands coverage and provides rapid feedback in CI pipelines. Below are practical patterns for the most common web testing frameworks, with code snippets that can be dropped into existing test suites.
1. Playwright (Chromium, Firefox, WebKit)
Playwright excels at controlling browser contexts and intercepting dialogs. It can also invoke the native Share API on mobile emulators.
// share-test.spec.js
const { test, expect } = require('@playwright/test');
test.describe('Social sharing flow', () => {
test('native share API passes correct data', async ({ page }) => {
await page.goto('https://example.com/article/123');
// Ensure share button exists
const shareBtn = page.locator('button[aria-label="Share"]');
await expect(shareBtn).toBeVisible();
// Mock navigator.share to capture arguments
await page.addInitScript(() => {
window.__sharedData = null;
if (navigator.share) {
navigator.share = async (data) => {
window.__sharedData = data;
return Promise.resolve();
};
}
});
await shareBtn.click();
// Wait for the mocked share to be called
await page.waitForFunction(() => window.__sharedData !== null);
const data = await page.evaluate(() => window.__sharedData);
expect(data.title).toBe(await page.title());
expect(data.text).toContain('Check out this article');
expect(data.url).toBe(page.url());
});
test('fallback popup opens with correct sharer URL', async ({ page, context }) => {
// Disable native Share API to force fallback
await page.addInitScript(() => { navigator.share = undefined; });
await page.goto('https://example.com/article/123');
const [popup] = await Promise.all([
context.waitForEvent('page'),
page.locator('button[aria-label="Share"]').click()
]);
await popup.waitForLoadState();
const popupURL = popup.url();
expect(popupURL).toMatch(/^https:\/\/www\.facebook\.com\/sharer\/sharer\.php\?u=/);
const urlParam = new URL(popupURL).searchParams.get('u');
expect(decodeURIComponent(urlParam)).toBe(page.url());
await popup.close();
});
});
Why this works
- The
addInitScripthook lets us replacenavigator.sharewith a stub that captures the data without actually invoking the OS share sheet (which Playwright cannot automate). - For fallback popups, Playwright’s
waitForEvent('page')catches the newly opened window, enabling assertions on its URL.
2. Cypress (with cypress-iframe and cypress-popup)
Cypress does not natively handle cross‑origin popups, but the cypress-popup plugin provides a workaround.
// cypress/integration/social_sharing.spec.js
describe('Social sharing', () => {
beforeEach(() => {
cy.visit('https://example.com/article/123');
});
it('opens Facebook sharer with correct URL', () => {
// Cypress blocks target=_blank by default; we need to allow it
cy.window().then((win) => {
cy.stub(win, 'open').as('windowOpen');
});
cy.get('button[aria-label="Share"]').click();
cy.get('@windowOpen').should('be.calledWithMatch',
/^https:\/\/www\.facebook\.com\/sharer\/sharer\.php\?u=/);
const calledWith = cy.get('@windowOpen').getCall(0).args[0];
const url = new URL(calledWith);
expect(url.searchParams.get('u')).to.eq('https://example.com/article/123');
});
});
Notes
- The stub prevents the popup from actually opening, letting us assert on the arguments passed to
window.open. - For the native Share API, you can similarly stub
navigator.shareand inspect the argument object.
3. Selenium WebDriver (Java) with Apache HttpClient for OG validation
When you need to validate the actual HTML returned to crawlers (which may differ from the client‑rendered version), a headless Selenium run combined with an HTTP request to fetch the raw page is valuable.
public class SocialSharingTest {
private WebDriver driver;
@BeforeEach
void setUp() {
ChromeOptions opts = new ChromeOptions();
opts.addArguments("--headless");
driver = new ChromeDriver(opts);
}
@AfterEach
void tearDown() {
if (driver != null) driver.quit();
}
@Test
void ogTagsArePresent() {
driver.get("https://example.com/article/123");
WebElement ogTitle = driver.findElement(By.cssSelector("meta[property='og:title']"));
Assertions.assertEquals("Article Title", ogTitle.getAttribute("content"));
WebElement ogImage = driver.findElement(By.cssSelector("meta[property='og:image']"));
String imageUrl = ogImage.getAttribute("content");
Assertions.assertTrue(imageUrl.startsWith("https://"), "Image URL must be absolute");
}
@Test
void shareButtonInvokesCorrectURL() throws Exception {
driver.get("https://example.com/article/123");
WebElement shareBtn = driver.findElement(By.xpath("//button[@aria-label='Share']"));
shareBtn.click();
// Switch to popup
Set<String> handles = driver.getWindowHandles();
String main = driver.getWindowHandle();
handles.remove(main);
String popup = handles.iterator().next();
driver.switchTo().window(popup);
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
wait.until(ExpectedConditions.urlContains("facebook.com/sharer"));
String popupUrl = driver.getCurrentUrl();
Assertions.assertTrue(popupUrl.contains("u="), "Missing u parameter");
String sharedUrl = URLDecoder.decode(
new URL(popupUrl).getQuery().split("u=")[1], StandardCharsets.UTF_8);
Assertions.assertEquals("https://example.com/article/123", sharedUrl);
driver.switchTo().window(main);
}
}
Why this combination works
- Selenium drives the UI to confirm the button’s behavior.
- The same test can be extended to fetch the raw HTML via
HttpClientand run an OG validator (e.g., usingorg.jsoup.Jsoup) to catch SSR‑only issues.
4. Accessibility Automation with axe-core
Integrate axe into any test runner to catch ARIA and keyboard issues automatically.
// jest-axe example
import { toHaveNoViolations } from 'jest-axe';
expect.extend(toHaveNoViolations);
test('share button has no axe violations', async () => {
await page.goto('https://example.com/article/123');
const axeResult = await page.evaluate(async () => {
return await axe.run();
});
expect(axeResult).toHaveNoViolations();
});
5. Contract Testing for Share Endpoints
If your app relies on a backend to generate share‑specific URLs (e.g., a shortlink service), use Pact or Spring Cloud Contract to verify that the contract between frontend and API remains intact.
// Pact test (Groovy)
def "share endpoint returns correct shortlink"() {
given:
def pact = PactBuilder.createConsumer('frontend')
.hasPactWith('share-service')
and:
pact.uponReceiving('a request for article 123')
.path('/api/share')
.method('GET')
.query('articleId', '123')
.willRespondWith()
.status(200)
.body([shortlink: 'https://shrtco.de/abc123'])
when:
def response = shareServiceClient.getShareLink(123)
then:
response.shortlink == 'https://shrtco.de/abc123'
pact.verify()
}
These automated patterns give you fast, repeatable verification of the happy path, error paths, and metadata correctness. However, they cannot replace the human observation of OS‑level share sheets, timing‑sensitive race conditions, or the subtle ways real users interact with the button (e.g., long‑press, accidental double‑tap). The next section shows how autonomous, persona‑driven testing surfaces those blind spots.
Edge Cases That Only Appear in Production
Even with exhaustive matrices and automation, certain defects surface only after real‑world usage. Below are the most elusive categories, why they hide from scripted tests, and how to surface them.
1. Timing‑Dependent Race Conditions
When a page updates its URL via the History API after a user action (e.g., infinite scroll loads the next article and pushes a new state), a share button that reads window.location.href at mount time will share the old URL. Automated tests that mount the component in isolation rarely simulate the exact sequence of scroll → state change → share click within the 100‑200 ms window where the race manifests.
Detection tip
- Use a tool like WebPageTest with a custom script that scrolls, waits for a network request, then triggers a share click via synthetic events.
- In Playwright, you can chain actions with
await page.waitForTimeout(50)to shrink the window and increase the chance of hitting the bug.
2. Browser Extension Interference
Ad‑blockers, privacy extensions, or social‑widget blockers often replace share buttons with their own iframes or add pointer-events:none via content scripts. Since test environments usually run with a clean profile, these extensions are absent, and the bug stays hidden.
Detection tip
- Run a subset of your CI matrix on a browser profile that includes popular extensions (uBlock Origin, Privacy Badger, Social Fixer).
- Use Selenium’s
--load-extensionflag to load the extension’s.crxfile and verify that the share button remains functional.
3. Mixed‑Content Blocking
If the page is served over HTTPS but the Open Graph image URL is HTTP, modern browsers will block the image from appearing in the share preview, yet the meta tag remains present in the DOM. Automated checks that only look for the tag’s existence will miss this.
Detection tip
- After fetching the page via
curloraxios, inspect theog:imagevalue and make a HEAD request to verify the scheme matches the page’s scheme. - Include this check in a nightly job that runs against production URLs.
4. Locale‑Specific URL Encoding
Some locales use non‑ASCII characters in page titles (e.g., Japanese, Arabic). If the share URL is built using encodeURIComponent only on the URL but not on the title or description, the resulting share link may break on certain platforms (e.g., WhatsApp truncates at the first byte‑order mark). Automated tests that use only ASCII titles will not catch it.
Detection tip
- Parameterize your test matrix with a set of Unicode strings and verify that the share URL’s query string remains valid according to RFC 3986.
- Use a service like https://www.ietf.org/rfc/rfc3986.txt to validate the encoded string.
5. OS‑Level Share Sheet Restrictions
On Android, certain apps (e.g., Gmail) may refuse to accept a share intent if the MIME type is incorrectly set (e.g., sending text/plain when the app expects text/uri). Web apps that invoke the native Share API without specifying a files array or incorrect type` field can cause silent failures.
Detection tip
- On real devices or emulators, use
adb shell am start -a android.intent.action.SEND ...to manually invoke the share intent with the data captured from your page and observe the resolver list. - In automated device farms (BrowserStack, Sauce Labs), you can capture the intent via accessibility services and assert that the expected apps appear.
6. CSP (Content Security Policy) Blocking the Popup
A strict CSP that disallows window.open or script-src 'unsafe-inline' can cause the share popup to be blocked silently, leaving no console message in production if the CSP is only applied via a header that your test environment omits.
Detection tip
- Deploy a staging environment that mirrors the production CSP header exactly.
- Run your share tests against that staging URL and watch for the
Refused to load the frame because it violates the following Content Security Policy directivemessage.
7. Dark‑Mode or Forced‑Colors Mode Affecting Visibility
Some sites change the button’s appearance based on prefers-color-scheme or forced colors mode. If the button’s contrast falls below WCAG AA in dark mode, a user may not perceive it as interactive, leading to low share rates that are mistakenly attributed to disinterest.
Detection tip
- Use the Chrome DevTools rendering pane to emulate
prefers-color-scheme: darkand forced colors, then run an axe contrast check on the button. - Include this as a regular visual regression step (e.g., with Percy or Chromatic) to catch contrast regressions.
These production‑only issues demonstrate why a purely scripted suite can give a false sense of confidence. The following section shows how an autonomous, persona‑driven explorer can discover many of them without explicit test cases.
Autonomous, Persona‑Driven Testing with SUSA
SUSA is an autonomous QA platform that explores a web application much like a human tester would, guided by configurable user personas. Instead of writing explicit test steps, you point SUSA at a URL or upload an APK (for hybrid apps) and let it exercise the UI. The platform builds a knowledge graph of visited screens, records actions that lead to dead ends or errors, and learns from each run to increase coverage.
How SUSA Approaches Social Sharing
- Persona‑driven interaction styles
- *Curious*: clicks every visible element, hovers over icons, tries long‑press on mobile.
- *Impatient*: performs rapid double‑clicks, scrolls quickly, abandons after a short delay.
- *Elderly*: uses larger tap targets, prefers keyboard navigation, avoids gestures that require fine motor control.
- *Adversarial*: attempts to inject malformed URLs, tries to trigger JavaScript via the share button’s
hreforonclick.
Each persona has a distinct probability distribution for actions like “click share button”, “open devtools”, “resize viewport”, or “enable high‑contrast mode”. When SUSA encounters a share button, it will automatically try the native Share API, the fallback popup, and even attempt to share via the browser’s address bar drag‑and‑drop (a behavior seen in power users).
- State‑aware exploration
SUSA tracks the URL, History state, and DOM mutations after each action. If a share button’s behavior depends on a recent route change (e.g., after infinite scroll loads a new article), the platform will detect that the share data diverges from the page’s current title and log a mismatch. This catches race conditions that static tests miss because SUSA’s exploration is not bound to a pre‑written script; it can naturally arrive at the share button after a series of scrolls, clicks, and waits that a human might perform.
- Automatic detection of broken or missing metadata
After each share attempt, SUSA extracts the data that was handed to the share mechanism (either by stubbing navigator.share or by capturing the popup URL). It then compares that data against the page’s tags and the canonical URL. A mismatch triggers a bug report with a screenshot, console log, and the exact sequence of actions that led to the error.
- Accessibility and security checks built in
- The platform runs an axe‑core scan on every newly discovered screen and flags violations such as missing ARIA labels on share buttons.
- For privacy, SUSA inspects the shared URL for known sensitive query‑parameter names (e.g.,
token,session,email) and reports if they appear. - It also attempts to load the share URL in a sandboxed iframe to see if any script execution is possible (detecting XSS via
javascript:URLs).
- Cross‑session learning
Suppose the first run discovers that the share button is hidden behind a modal that only appears after a user scrolls 80 % down the page. SUSA records this condition and, on subsequent runs, prioritizes scrolling to that depth before attempting to share. Over time, the platform builds a library of “interesting preconditions” (e.g., “user has scrolled past the comment section”, “dark mode is enabled”, “ad‑blocker is active”) and uses them to guide future exploration, increasing the likelihood of hitting edge cases.
Practical Example: Finding a CSP‑Induced Popup Block
Imagine a production site that recently tightened its CSP to disallow window.open unless the origin matches https://cdn.example.com. The share button uses a fallback popup to facebook.com/sharer. In a standard Cypress test, the popup is stubbed, so the test passes. In a manual exploratory session, a tester might notice the popup never appears and see a CSP violation in the console—but only if they have the DevTools open and the exact CSP header is present.
SUSA, running with the “ad‑blocker” persona (which often loads a custom extension that adds headers) and the “curious” persona (which opens DevTools automatically), will:
- Load the page with the exact CSP header present (by fetching the URL directly from the production environment).
- Click the share button.
- Observe that no new window opens and that the console contains a CSP violation message.
- Log a bug: “Share popup blocked by CSP directive; fallback mechanism fails.”
Because SUSA does not rely on a predefined assertion that expects a popup, it records the actual outcome (no popup) and treats the deviation from the expected behavior (based on its internal model of what a share button should do) as a defect.
Integrating SUSA into Your Workflow
- CI gate: Add a step that runs SUSA against your staging URL for a limited time (e.g., 5 minutes) and fails the build if any high‑severity bug (crash, ANR equivalent, security issue) is reported.
- Nightly deep dive: Allow SUSA to explore for 30 minutes with all personas enabled, then review the generated report for medium‑severity issues like missing OG tags or contrast failures.
- Feedback loop: Export the discovered flows as Playwright scripts (SUSA can auto‑generate regression scripts) and add them to your automated suite, ensuring that the bugs found autonomously stay covered in future runs.
By combining scripted verification with autonomous, persona‑driven exploration, you achieve both the precision of unit‑level checks and the breadth of real‑world usage simulation.
Checklist for Release
Before tagging a release, run through this concise list. Each item can be verified manually, via your automated suite, or with a quick SUSA spot‑check.
| ✅ Item | How to Verify |
|---|---|
Share button is present, focusable, and has an accessible name (aria-label or inner text). | DevTools → Elements; axe check. |
| Clicking the button opens either the native share sheet (if supported) or a popup with the correct sharer URL. | Manual click; Playwright stub; CSP check. |
The shared URL matches the page’s canonical URL and does not contain sensitive parameters (token, session, email). | Inspect popup URL or navigator.share stub args. |
| Open Graph/Twitter Card tags are present and contain non‑empty, correctly sized values. | View page source; use Facebook Sharing Debugger / Twitter Card Validator. |
| The share button works in the latest stable versions of Chrome, Firefox, Edge, and Safari (both desktop and mobile viewports). | Browser matrix; Sauce Labs/BrowserStack. |
| No console errors (CSP, mixed‑content, blocked popups) appear during the share flow. | DevTools → Console; axe‑core scan. |
| Contrast ratio between button background and surrounding content meets WCAG AA in both light and dark modes. | Chrome DevTools contrast checker; axe. |
| Share flow respects user gestures: single tap/click opens share; double tap/click does not spawn multiple dialogs. | Manual test; Playwright double‑click test. |
| When the Share API is unavailable, the fallback popup does not get blocked by popup‑blocker settings. | Test with Chrome’s popup blocker set to “Block all”. |
Any third‑party scripts (analytics, ads) do not overlay or disable the share button (no pointer-events:none or display:none injected). | Inspect computed styles after scripts load. |
| For localized pages, share URLs correctly encode non‑ASCII characters in title/description fields. | Manual test with Japanese/Arabic content; verify URL encoding. |
| Accessibility tools (screen readers, voice control) announce the button’s purpose correctly. | NVDA, VoiceOver, TalkBack test. |
No JavaScript execution occurs when attempting to share a javascript: URL (if such a URL can be injected). |
Test Your App Autonomously
Upload your APK or URL. SUSA explores like 10 real users — finds bugs, accessibility violations, and security issues. No scripts.
Try SUSA Free