我正在尝试为某个按钮/框架获取xpath。我可以使用xpath来定位元素,但是在运行自动化时却找不到元素异常。我试图切换到特定的框架,然后找到按钮,但是没有用。附加页面和图像的链接。 链接:https://www.msn.com/en-in/weather/today/New-Delhi,Delhi,India/we-city-28.608,77,201?iso=IN
这是我尝试的代码。
WebDriverWait wait = new WebDriverWait(cdriver,30);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@id='foot']//following::iframe[@style='width:9.7rem;']")));
System.out.println("Ive waited for the frame to load");
int size = cdriver.findElements(By.tagName("iframe")).size();
System.out.println(size);
/*for(int i=0; i<=size; i++){
cdriver.switchTo().frame(i);
System.out.println("Switched to frame "+i);
int total= cdriver.findElements(By.xpath("//*[@id='u_0_0']/div/button/span")).size();
System.out.println(total);
cdriver.switchTo().defaultContent();
}*/
cdriver.switchTo().frame(2);
System.out.println("Switched to frame");
cdriver.findElement(By.xpath("//*[@id='u_0_0']/div/button/span")).click();
获取存在的帧数,然后为每个元素检入,但无法切换到该帧。
答案 0 :(得分:0)
要访问所需元素,因为所需元素位于<iframe>
中,因此您必须:
frameToBeAvailableAndSwitchToIt()
诱导 WebDriverWait 。您可以使用以下任一Locator Strategies:
使用CSS_SELECTOR
:
driver.get("https://www.msn.com/en-in/weather/today/New-Delhi,Delhi,India/we-city-28.608,77,201?iso=IN")
new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.cssSelector("iframe[src^='//www.facebook.com/plugins/like']")));
使用XPATH
:
driver.get("https://www.msn.com/en-in/weather/today/New-Delhi,Delhi,India/we-city-28.608,77,201?iso=IN")
new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//iframe[starts-with(@src, '//www.facebook.com/plugins/like')]")));
在这里您可以找到有关Ways to deal with #document under iframe的相关讨论
答案 1 :(得分:0)
使用switchTo().frame(2)
时,您实际上切换到了第三个<iframe>
。您可以使用switchTo().frame(1)
,但更好的选择是使用唯一标识符而不是索引
WebElement iframe = cdriver.findElement(By.csSelector("#fbcount > iframe"));
cdriver.switchTo().frame(iframe);
要等待帧加载,请使用frameToBeAvailableAndSwitchToIt
,而不要使用elementToBeClickable
wait.until(ExpectedConditions.elementToBeClickable(By.csSelector("#fbcount > iframe")));
System.out.println("Switched to frame");