You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium实现鼠标悬停Men标签并点击Shirts项失败排查

Fixing the Men > Shirts Click Issue in Selenium for Barneys.com

Hey there! Let's work through why your hover-and-click action isn't landing on the Shirts category under Men on Barneys.com. I’ll break down common pitfalls in your code and how to fix them:

1. Ditch Hardcoded Sleeps for Explicit Waits

Your Thread.sleep(3000) is a shot in the dark—sometimes the page or dropdown elements aren’t fully loaded even after 3 seconds. Explicit waits tell Selenium to pause until the element is actually ready (visible/interactable), which is way more reliable.

Here’s how to implement that:

// Initialize a 10-second wait
WebDriverWait wait = new WebDriverWait(util.getdriver(), Duration.ofSeconds(10));
// Wait for the Men category to be visible before proceeding
WebElement menCategory = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//a[@class='accord-header' and contains(.,'Men')]")));

2. Simplify Your Actions Chain

Your current chain starts by moving to a generic accord-header element before targeting Men—this can confuse the hover action. Let’s streamline it to focus directly on the Men category first, then wait for the Shirts link to become clickable:

Actions action = new Actions(util.getdriver());
// Hover over the Men category to trigger the dropdown
action.moveToElement(menCategory).perform();

// Wait for the Shirts link to be clickable (gives the dropdown time to fully expand)
WebElement shirtsLink = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@title='Shirts']")));

// Now click the Shirts link
action.moveToElement(shirtsLink).click().perform();

3. Double-Check Your Element Locators

Sometimes XPaths can be too vague or miss subtle attribute changes. For the Men category, make your selector more specific to avoid targeting the wrong element:

By menLocator = By.xpath("//nav//a[@class='accord-header' and text()='Men']");

For Shirts, confirm the title attribute is exactly "Shirts" (no extra spaces or capitalization). If there’s variation, use contains() instead:

By shirtsLocator = By.xpath("//a[contains(@title, 'Shirts')]");

4. Handle Blocking Overlays

Occasionally, cookie banners, modals, or other overlays can block the Shirts link even if it’s visible. Add a step to dismiss any such elements before performing the hover (e.g., click an "Accept Cookies" button if present).

Full Revised Code Example

Putting it all together, here’s a more robust version of your test method:

public void PurchaseItemTest() throws InterruptedException, IOException {
    WebDriver driver = util.getdriver();
    WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));

    // Wait for Men category to be visible
    WebElement menCategory = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//a[@class='accord-header' and contains(.,'Men')]")));

    // Hover over Men to trigger dropdown
    Actions action = new Actions(driver);
    action.moveToElement(menCategory).perform();

    // Wait for Shirts link to be clickable
    WebElement shirtsLink = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@title='Shirts']")));

    // Click Shirts
    shirtsLink.click();
}

This approach fixes timing issues, simplifies the hover flow, and ensures elements are ready before interaction—should resolve your problem!

内容的提问来源于stack exchange,提问作者chris stewart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:04:53