【问题标题】:building xpath with #document tag in html在html中使用#document标签构建xpath
【发布时间】:2019-01-25 23:07:42
【问题描述】:

如何从该网站为Try it 按钮构建xpath: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_alert

driver.findElement(By.xpath("//div[@id='iframewrapper']/iframe/????")).click();

我也试过这个 xpath //body[@contenteditable='false']/button 我知道不推荐。在 Chrome console 中可以,但在 Selenium 中找不到它,我不知道为什么。

【问题讨论】:

标签: selenium-webdriver


【解决方案1】:

编写这段代码,首先你需要切换到Frame,然后你需要点击那个按钮

driver.switchTo().frame("iframeResult")    
driver.findElement(xpath: "//button[text()='Try it']").click()

【讨论】:

  • 它适用于:driver.switchTo().frame("iframeResult"); driver.findElement(By.xpath("//button[text()='Try it']")).click(); 谢谢!
  • 另外我不明白为什么我需要在 click() 方法之前使用 switchTo() 方法
  • @BOB Iframe 等同于另一个 HTML 中的 HTML,因此它有自己的范围,因此每当您发现您的元素在 Iframe 中时,您需要在找到任何元素之前切换到该 Iframe。
  • @Rajagopalan 出于完成目的,之后是否有必要“切换回”(假设我们仍在同一页面中并且我们现在想要获取框架之外的元素)?如果是这样,该怎么做?
  • @khawabonga 哦,是的,你必须切换回来。我很困惑,因为你用了“外面”这个词
【解决方案2】:

如果你想使用 WebDriverWait :

WebDriverWait wait = new WebDriverWait(driver, 20)  
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("iframeResult")));  
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button[contains(text(),'Try it') and @onclick='myFunction()']"))).click();

【讨论】:

  • @Rajagopalan :好吧,如果我们使用它也没有什么坏处。执行时间将保持不变。
  • 执行时间不会保持不变,因为您在单击之前检查元素是否已启用!检查元素是否启用需要时间。
  • @Rajagopalan :这几乎是 500ms ,如果立即找到元素则更少。另外,您将获得稳定性。
  • @Rajagopalan 不,执行时间确实保持完全相同。如果不需要等待,则等待的初始检查将成功……因此执行时间完全相同。如果不完全相同,则等待必须等待,而无需等待的查找将失败。如果元素已经存在,添加等待不会增加执行时间。
  • @Rajagopalan 此外,如果页面确实需要短暂暂停,因为它加载缓慢,这种方法是安全的,没有等待会失败。这将避免不必要的间歇性故障。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-08
  • 2011-09-22
  • 2023-04-08
  • 2016-05-15
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
相关资源
最近更新 更多