【问题标题】:PhantomJs swithToFrame does not workPhantomJs swithToFrame 不起作用
【发布时间】:2017-04-20 04:46:26
【问题描述】:
    <dependency>
        <groupId>com.github.detro</groupId>
        <artifactId>phantomjsdriver</artifactId>
        <version>1.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>3.0.1</version>
    </dependency>

    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-support</artifactId>
        <version>3.0.1</version>
    </dependency>

当我将下面的代码与 phantomjsdriver 一起使用时,在切换到 Frame 后,我无法通过 css 选择器找到元素 - table.b3id-widget-table.b3-widget-table。该元素位于 iframe 内。

同时,我可以使用具有相同代码的 Firefox 或 Chrome 二进制文件找到此元素。似乎在切换到框架后,phantomjs 无法在 iframe 中找到任何元素。有什么线索吗?

wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("standalone-container-main-widgetIframe")));
driver.switchTo().frame("standalone-container-main-widgetIframe");
wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("table.b3id-widget-table.b3-widget-table")));

另一个答案建议添加以下选项,以防 iframe 位于另一个来源。

String [] phantomJsArgs = {"--ignore-ssl-errors=true", "--ssl-protocol=any", "--web-security=false"};
dCaps.setCapability(PhantomJSDriverService.PHANTOMJS_GHOSTDRIVER_CLI_ARGS, phantomJsArgs);
dCaps.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, phantomJsArgs);

但这对我没有帮助。最奇怪的是有时它会工作几次,不知何故从 50 次尝试中 1 次。我更改了不同的超时、隐式等待、显式等待 - 没有任何帮助,甚至等待 3-4 分钟。似乎不是时间问题。我还注意到我的 iframe 没有 src 属性,也许这就是问题

 <iframe frameborder="0" src="about:blank" id="standalone-container-main-widgetIframe">

我还使用 PhantomJs 截取了屏幕截图,看起来页面已成功加载,包括嵌套的 iframe,由于某种原因,屏幕截图被修剪了。

【问题讨论】:

  • @Igor 更新了问题。修正错字。是复制粘贴标记,实际上这个标记是由谷歌生成的。这是带有订单的 Google 电子钱包表格
  • @user12384512 我无法在 Windows 上使用 selenium-server-standalone-3.0.1phantomjs 2.1.1 重现您的问题。我得到iframeBy.cssSelector("table.b3id-widget-table.b3-widget-table"),它在页面加载后使用jQuery 动态加载页面,我什至可以执行一些javascript 并更改iframe 正文颜色。如果您愿意,我可以提供我的示例(基于您的代码)。
  • @ChristosLytras 我认为我们的代码非常相似。我没有尝试在沙盒中重现它。最终我不得不使用 FF 二进制文件而不是 PhantomJs。如果您只有 Google Wallet Merchat 帐户,您可以尝试自己解析相同的页面。也许您的标记和 Google 标记之间的区别在于 Google 使用 javascript 在 iframe 中动态添加元素。

标签: java selenium-webdriver phantomjs


【解决方案1】:

你试过了吗……

driver.FindElement(By.Name("standalone-container-main-widgetIframe"));
string frameHTML = driver.SwitchTo().Frame("standalone-container-main-widgetIframe").PageSource;
doc.LoadHtml(frameHTML);

所以这样你也可以看到你的框架 html。为此,您还需要使用 htmlagilitypack...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多