对于我选择的元素,我得到了非常长的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)
{}
答案 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 类。
由于实际上不可能先点击男性(因为它将打开其他部分), 因此,要将鼠标悬停在袜子上,您需要一次性链接所有想要实现的动作。
过程应为:
注意:通过使用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),