元素位置中的Xpath问题

时间:2019-03-11 06:27:59

标签: java selenium xpath

对于我选择的元素,我得到了非常长的xpath。反正有缩短它的方法吗?这是我得到的xpath:

// li [@ class ='menu_men 1-level hasChild'] // div [contains(@ class,'level-2')] // div [@ class ='menu-wrapper'] // ul [@ class ='level-2'] // li [@ class ='1-level'] // div [@ class ='level-3'] // ul [@ class ='level-3 '] // li // a [@ class ='level-3'] [包含(text(),'Socks')]

这是URL:Calvin Klein Singapore我将鼠标悬停在'MEN'上方,将显示附件部分,而不是将我悬停在'Socks'上以获取xPath。

我在代码中得到以下执行,我想知道长xpath是否可能是原因之一:

  

org.openqa.selenium.NoSuchElementException:无此类元素:无法   定位元素:{“方法”:“ xpath”,“选择器”:“ // li [@ class ='first   menu_men 1级   hasChild'] // div [包含(@ class,'level-2')] // div [@ class ='menu-wrapper'] // ul [@ class ='level-2'] // li [@ class ='1-level'] // div [@ class ='level-3'] // ul [@ class ='level-3'] // li // a [@ class ='level-3'] [contains(text(),'Socks')]“}

我正在从chrome开发人员工具中使用快捷方式来获取xPath。

我是自动化的新手,我真的希望有人可以提供建议。谢谢。

@SameerArora,这是我必须清除弹出窗口的代码,正如我在下面的评论中提到的那样。

//for clearing the popup window
    @FindBy(how=How.XPATH,using="//*[starts-with(@id,'popup-subcription-closes-link-')]")
    public WebElement newsletterpopup;  

    public String clickCategory(){
                //.....
                resusableFunctions.buttonClick(driver, newsletterpopup, "popoup");
                }
    public void buttonClick(WebDriver driver, WebElement element, String elementName) throws InterruptedException
        {
            try
            {
                element.click();
                System.out.println("Log: ResuableFunction.buttonClick");
            }
        catch (org.openqa.selenium.ElementNotInteractableException notInteract)
            {}

4 个答案:

答案 0 :(得分:1)

您要查找的元素可以使用xpath找到:

WebElement element = driver.findElement(By.xpath("(//a[contains(text(),'Socks')])[1]"));

但是,由于在打开链接时该元素不直接可见,因此您会收到NoSuchElementException,因此要解决此问题,可以在直接在页面div上操作的元素上使用javascript click方法。
除此之外,我可以看到第一次打开页面时出现订阅弹出窗口,因此您需要先关闭该弹出窗口(如果存在弹出窗口),然后使用JavaScript单击“ Socks”元素点击方法。

您的代码应类似于:

List<WebElement> closeSubscriptionPopUp = driver.findElements(By.xpath("//a[contains(@id,'popup-subcription-closes-link')]"));
if (closeSubscriptionPopUp.size() > 0) {
    closeSubscriptionPopUp.get(0).click();
}
WebElement sockElement = driver.findElement(By.xpath("(//a[contains(text(),'Socks')])[1]"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", sockElement);

答案 1 :(得分:0)

尝试一下 // a [normalize-space(text())='袜子']

我建议您不要使用这么长的xpath并尝试自己编写xpath。

答案 2 :(得分:0)

要悬停在“ MEN” >>附件>>“袜子”部分,您需要使用硒 Actions 类。

由于实际上不可能先点击男性(因为它将打开其他部分), 因此,要将鼠标悬停在袜子上,您需要一次性链接所有想要实现的动作。

过程应为:

  1. 首先移动男性元素
  2. 移至配件
  3. 然后移至“袜子”并单击。

注意:通过使用Action类,我们可以一次完成所有流程的链接。 如下所述

1)第一种方式:

Actions action = new Actions(driver);
action.moveToElement(driver.findElement(By.xpath("(//a[contains(text(),'MEN')])[2]")))
.moveToElement(driver.findElement(By.xpath("(//a[contains(text(),'Socks')])[1]")))
.click().build().perform();

2)等待的第二种方式:

WebDriverWait wait= new WebDriverWait(driver, 10);
Actions action = new Actions(driver);
action.moveToElement(driver.findElement(By.xpath("(//a[contains(text(),'MEN')])[2]"))).build().perform();
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("(//a[contains(text(),'Socks')])[1]")));
action.moveToElement(driver.findElement(By.xpath("(//a[contains(text(),'Socks')])[1]")));
action.click().build().perform();

答案 3 :(得分:-1)

尝试:

array_random($groups, 1),