无法使用Web驱动程序Java遍历框架

时间:2018-10-22 08:26:34

标签: java selenium-webdriver frame

我正在尝试将元素放入第二帧here

但是我收到了该元素不存在或

的错误消息
Unable to locate element: {"method":"xpath","selector":"//frameset/frame[2]//a"}

我尝试了所有方法,但对我而言不起作用,这是我的代码

WebDriver driver = new ChromeDriver();
driver.get("https://dps.psx.com.pk/");  

//switch to the mainFrame
WebElement mainFrame = driver.findElement(By.xpath("//frameset/frame[2]//a"));
driver.switchTo().frame(mainFrame);
List<WebElement> childs = mainFrame.findElements(By.xpath(".//*"));

for(WebElement child : childs) {
    System.out.println(child);
}

我也尝试过等待元素加载,然后尝试访问框架内的元素,但仍然存在相同的错误。

2 个答案:

答案 0 :(得分:1)

frame定位符是//frameset/frame[2]//a是对frame的深入研究。

您也可以直接使用name属性进行切换。 switchTo().frame()可以接收idnameWebElement作为参数

driver.switchTo().frame("mainFrame");

如果框架需要花费一些时间来加载,则可以使用显式等待和ExpectedCondition frameToBeAvailableAndSwitchToIt

WebDriverWait wait = new WebDriverWait(WebDriverRefrence,20);
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//frameset/frame[2]")));

答案 1 :(得分:0)

根据您共享的 HTML ,您必须遍历所需的frame

  • 诱导 WebDriverWait 使所需的框架可用并切换到该框架。
  • 诱导 WebDriverWait 以使所需的元素可单击,您可以使用以下解决方案:

    • 使用name

      new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.name("mainFrame")));
      new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.name("element_name"))).click();
      
    • 使用xpath

      new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//frame[@name='mainFrame' and contains(@src,'index1')]")));
      new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("element_xpath"))).click();