无法在selenium-java中使用xpath错误找到元素

这是我试图执行的代码

public WebDriver createPart() { try { driver.findElement(By.id("username")).sendKeys("502409373"); driver.findElement(By.id("password")).sendKeys("Magic14Magic"); driver.findElement(By.id("submitFrmShared")).click(); driver.manage().timeouts().implicitlyWait(70, TimeUnit.SECONDS); driver.manage().timeouts().pageLoadTimeout(70, TimeUnit.SECONDS); Select dropCountry = new Select(driver.findElement(By.id("txtNewLocation"))); dropCountry.selectByVisibleText("India"); driver.manage().timeouts().implicitlyWait(50, TimeUnit.SECONDS); driver.findElement(By.xpath("//button[@class='btn']/label")).click(); driver.manage().timeouts().implicitlyWait(70, TimeUnit.SECONDS); driver.manage().timeouts().pageLoadTimeout(70, TimeUnit.SECONDS); Thread.sleep(10000); driver.findElement(By.xpath("//li[@class='icon-button add']/span")).click(); driver.findElement(By.xpath("//div[@id='ENCActions']/a/label")).click(); driver.findElement(By.xpath("//label[starts-with(text(),'Create Part...')]")).click(); driver.manage().timeouts().implicitlyWait(70, TimeUnit.SECONDS); driver.manage().timeouts().pageLoadTimeout(70, TimeUnit.SECONDS); String parentWindowHandler = driver.getWindowHandle(); // Store your parent window String subWindowHandler = null; Set handles = driver.getWindowHandles(); // get all window handles Iterator iterator = handles.iterator(); while (iterator.hasNext()){ subWindowHandler = iterator.next(); } driver.switchTo().window(subWindowHandler); // switch to popup window WebDriverWait wait = new WebDriverWait(driver, 10); WebElement element = driver.findElement(By.xpath("//select[@id='Type-Field']//following-sibling::div//div//input")); element.click(); Thread.sleep(3000); element.sendKeys(Keys.BACK_SPACE); Thread.sleep(3000); element.sendKeys("Subassy"); Thread.sleep(4000); driver.findElement(By.xpath("//div[@data-value='Subassy']")).click(); driver.findElement(By.xpath("//span[text()='Description']//parent::td//following-sibling::td//textarea")).sendKeys("Testing"); driver.findElement(By.xpath("//option[text()='BioSc-DS-Chemical']//parent::select")).click(); Thread.sleep(2000); driver.findElement(By.xpath("//option[text()='BioSc-DS-Chemical']")).click(); driver.findElement(By.xpath("//a[text()='Done']")).click(); driver.switchTo().window(parentWindowHandler); driver.manage().timeouts().implicitlyWait(70, TimeUnit.SECONDS); driver.manage().timeouts().pageLoadTimeout(70, TimeUnit.SECONDS); wait = new WebDriverWait(driver, 60); element = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@title='Part Details']"))); element.click(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return driver; } 

这是元素的html代码,我无法找到。

  

这是堆栈跟踪

 Exception in thread "main" org.openqa.selenium.TimeoutException: Expected condition failed: waiting for element to be clickable: By.xpath: //a[@title='Part Details'] (tried for 60 second(s) with 500 MILLISECONDS interval) Caused by: org.openqa.selenium.NoSuchElementException: Cannot locate an element using By.xpath: //a[@title='Part Details'] 

即使我使用了等待声明。 我无法找到该元素。 我已经使用chrome xpathvalidation了xpath。 请帮我解决我的问题。 Selenium版本:3.3.1。 实际流程是,我点击主页面中的一个链接,结果是一个包含表单的弹出窗口。 填写表单并单击“完成”后,弹出窗口将自动关闭,主页面将刷新并打开新页面。 现在,我试图单击新主页中的“零件详细信息”链接,该链接不起作用。

我添加了这个代码,以找到正确的窗口处理程序。

 subWindowHandler = null; Set handles1 = driver.getWindowHandles(); // get all window handles iterator = handles1.iterator(); while (iterator.hasNext()){ subWindowHandler = iterator.next(); driver.switchTo().window(subWindowHandler); element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//a[@title='Part Details']"))); System.out.println("KK1"); } 

给我输出:

 Exception in thread "main" org.openqa.selenium.TimeoutException: Expected condition failed: waiting for visibility of element located by By.xpath: //a[@title='Part Details'] (tried for 10 second(s) with 500 MILLISECONDS interval) 

这里,所需的“零件细节”元素位于我已包含在代码中的框架中。 但是,我无法在框架内找到元素。 这是我修改过的代码。

 System.out.println(driver.switchTo().window(parentWindowHandler).getTitle()); driver.switchTo().frame("content"); driver.switchTo().frame("detailsDisplay"); driver.findElement(By.xpath("//a[@title='Part Details']")).click(); 

但我面临这个错误。

 Exception in thread "main" org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//a[@title='Part Details']"} 

我附上了html代码的截图。 HTML截图

更改visibilityOfElementLocated而不是elementToBeClickable 。 您可以直接找到webeelement,然后单击它,如下所示:

 element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//a[@title='Part Details']"))); 

要使用文本作为零件详细信息调用链接上的click() ,您需要引入WebDriverWait并调用click() ,如下所示:

  • linkText

     new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.linkText("Part Details"))).click(); 
  • cssSelector

     new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("a.tablink[title='Part Details']"))).click(); 
  • xpath

     new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@class='tablink' and @title='Part Details']"))).click(); 

你的parentWindowHandler不正确,你在错误的时间点获取它。

尝试在代码行下方移动到try块中的第一行

 try { String parentWindowHandler = driver.getWindowHandle(); // Store your parent window 

切换到父窗口后,尝试刷新页面,然后找到下面给出的元素。 它可以解决您的问题。

  driver.switchTo().window(parentWindowHandler); driver.navigate().refresh(); driver.manage().timeouts().implicitlyWait(70, TimeUnit.SECONDS); driver.manage().timeouts().pageLoadTimeout(70, TimeUnit.SECONDS); wait = new WebDriverWait(driver, 60); element = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@title='Part Details']"))); element.click();