【问题标题】:Can I obtain this input element with Selenium?我可以用 Selenium 获得这个输入元素吗?
【发布时间】:2019-07-18 22:40:52
【问题描述】:

我是 Selenium 的新手。 我一直在寻找所有可能的方法来解决这个问题(此时我认为它只是无法解决)我有一个包含此输入的网页(无法共享):

/html/body/table/tbody/tr[2]/td[2]/table/tbody/tr[3]/td/table/tbody/tr/td[2]/table/tbody/tr[2]/td/div/iframe/#document/html/body/div[2]/div/iframe/#document/html/frameset/frame/#document/html/frameset/frameset/frameset/frame/#document/html/body/div/form/table/tbody/tr[2]/td[2]/input

(如您所见,该结构混合了框架、iframe 和框架集;其中一些有 id,而另一些没有名称)

问题是 Selenium 不会通过我的任何方法找到元素 已经测试过

。首先我尝试了一个简单的 driver.findElement(By.all of them)

在他们不起作用后,我开始在网上寻找,但我找不到为什么我无法处理这个问题。

它是网页中唯一的输入,并且有一个id作为属性,所以应该很容易。

This is the class where I have been trying to make it work, 如果你想检查我不成功的工作,我将最后的努力集中在第 8 次尝试上

正如你所看到的,我一直在尝试通过多种方式获得它,框架似乎确实是一个问题,但不是它们,也不是等待。

真的没有办法得到这个元素吗?是不是其中一种情况 Selenium 无法自动化的地方?或者是我错过了什么。

对象是可见的,甚至没有滚动条,整个页面完全适合屏幕,Xpath 是我测试的首选之一,没有工作

提前谢谢你。

【问题讨论】:

  • 分享您的 HTML。
  • iframes 可能会把事情搞砸,因为它们是嵌入在网页中的网页。不幸的是,您有多个。在通过 id 选择元素之前,请查看this article 以了解如何切换到正确的 iframe。
  • 对不起 Ramtir 我知道你无法如你所愿地帮助我,但我不能分享 HTML :S。关于 iframe 主题,这篇文章提出的是我在发布的代码示例中的一种方法。也没有用。 @AutomatedChaos
  • 这个answer 描述了切换到第一帧(iframe),然后是其中的子帧(iframe)。这个answer 解释说你可以忽略框架集,只使用其中的框架。因此,尝试完成您的代码示例并假设框架是嵌套的,而不是您尝试过的兄弟姐妹:util.driver.switchTo().frame("contentAreaFrame") util.driver.switchTo().frame("isolatedWorkArea") util.driver.switchTo().frame("0") util.driver.switchTo().frame("0") util.driver.findElement(By.xpath(//input))
  • 我认为这就是我在网上做的事情:264,但完全按照你的建议尝试给了我这个错误:org.openqa.selenium.NoSuchFrameException: No frame element found by name or id 隔离工作区。虽然我开始调试并且经过大量尝试后我发现 SELENIUM 正在切换到另一个名称的另一个框架!即使我正在寻找确切的名称,Selenium 也搞砸了,所以我使用 By.xpath 切换到框架,它终于奏效了,谢谢大家。

标签: java selenium automation


【解决方案1】:

我不知道这是否是问题所在,但是您尝试使用的元素是可见的还是需要滚动才能查看?如果它不可见,请尝试使用它来滚动一点:

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.scrollBy(0,1000)");

另一种可能的解决方案是尝试使用绝对 xpath 而不是相对。有几种工具可以在 html 页面中查找元素的绝对 xpath。然后你可以使用

driver.findElement(By.xpath(absoluteXpath));

【讨论】:

  • 不,对象是可见的,甚至没有滚动条,整个页面完全适合屏幕,Xpath 是我测试的首选之一,但没有用。我尝试了几个,你可以在我发布的代码中看到一些,谢谢:(
【解决方案2】:

经过大量尝试,我意识到 selenium 在最后一个 switchTo 切换到不同的帧。这可能是一个错误,但我修改了最后一次切换到的方式,而不是

    var wait = (new WebDriverWait(driver, secsToWait));
    wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frameNameOrId));

    driver.switchTo().frame(driver.findElement(By.xpath("//frame[@"+attribute+"='"+frameNameOrId+"']")));

所以它终于工作并正常获得了输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多