DOM 通过 Selenium 访问时未在 PhantomJS 中填充

DOM not Populating in PhantomJS when Accessing Through Selenium

很多天以来我一直在寻找这个问题的解决方案,但一直没有找到好方法。

我使用的版本如下:

-Java 8

-硒 3.4.0

-PhantomJS 1.9.8(与 PhantomJS 2.1.1 的结果相同)

-JUnit 4.12(通过 JUnit 调用代码。)

在 Windows 10 上一切都在发生 运行,但我在 CentOS 7 上遇到了类似的问题。

我正在尝试 运行 Selenium 与 PhantomJS 并且运行正在解决让页面完全可用的问题。

下面是一个代码片段(有大量的 System.outs 用于测试),其中我 运行 遇到了问题:

   methodDriver.manage().window().maximize();

   System.out.println(methodDriver.getPageSource());

   WebElement trackingInbox = methodDriver.findElement(By.id("inbox-widget-container-id"));

  WebElement inboxBody = trackingInbox.findElement(By.xpath("div[1]/div[2]/table/tbody"));

 >  List<WebElement> rows = inboxBody.findElements(By.tagName("tr"));

我明白了

"errorMessage":"Unable to find element with id 'inbox-widget-container-id'" at the line: WebElement trackingInbox = methodDriver.findElement(By.id("inbox-widget-container-id"));

这是因为当我在第二行打印页面源代码时,这些是 DOM 内容:

<body id="inboxBody" style="border:none; width:99%; align:center">
 <div id="inboxContent">
  <div class="mui-panel mui-panel-header">
   <p class="mui--text-subhead">Tracking Inbox</p>
  </div>
  <div id="inboxes_div">
   <div id="inboxes_control_section">
    <div id="inboxes_control_inboxGroup" style="float: left; padding-right: 10px;padding-left: 5px;">
     <select id="inbox_group" name="inbox_group"></select>
    </div>
    <div id="inboxes_control_inbox" style="float: left; padding-right: 10px;">
     <select id="inboxes" name="inboxes"></select>
    </div>
   </div>
   <p></p>
   <div id="inbox_content_div" style="padding-top: 5px;"></div>
  </div>
  <input type="hidden" id="inbox_content_totalRecords" value="">
 </div>
 <br>
</body>

但是,如果我使用 chrome 或 firefox (headed),我会得到以下信息:

<body id="inboxBody" style="border: none; width: 957px;"><div id="inbox-widget-container-id" class="ui-resizable" style="width: 958px; margin-left: 1px; height: 500px;"><div class="grid-widget" style="width: 955px;"><div class="heading" style="background: linear-gradient(rgb(66, 139, 202), rgb(7, 105, 173)); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom: 0px; width: 955px;"><table class="heading" style="width: 938px; table-layout: fixed;"><tbody><tr><td style="text-align: center; height: 35px; width: 90px;"><div class="btn-group no-border condensed"><span class="btn btn-primary btn-sm thin-padding no-border hover-effect sortable" data-sortable-event="click">Case�#�<i class="fa fa-sort-amount-asc fa-fw fa-opaque"> . . .
     <div id="inboxContent" style="display: none;">
    <div class="mui-panel mui-panel-header">
     <p class="mui--text-subhead">Tracking Inbox</p>
    </div>
    <div id="inboxes_div">
          <div id="inboxes_control_section">
      <div id="inboxes_control_inboxGroup" style="float: left; padding-right: 10px;padding-left: 5px;">
       <select id="inbox_group" name="inbox_group"><option value="inbox.group.case">Case</option><option value="group.InvestiagtionItems">Investigation Items</option></select>
      </div>
      <div id="inboxes_control_inbox" style="float: left; padding-right: 10px;">
       <select id="inboxes" name="inboxes"><option value="inbox.cases">Assigned</option></select>
      </div>
     </div>
     <p></p>
     <div id="inbox_content_div" style="padding-top: 5px;"></div>
         </div>
    <input type="hidden" id="inbox_content_totalRecords" value="" />
   </div>
    <br />
 
</body>

请注意,第一行持续了很长时间(我在这里故意将其缩短)。该行包含我想要使用但未显示在 PhantomJS 中的元素。

在“”元素上方,有一个带有jquery脚本的大“”元素。我听说这个脚本在 phantomjs 中不是 运行ning,如果是的话它会填充 DOM。所以,也许我需要找出如何在 phantom 中将其设置为 运行,尽管我在弄清楚如何做到这一点时遇到了一些麻烦。

您似乎需要等待一个元素。否则,该网站不允许 PhantomJS。我们先试试等待,看下面的例子。

WebDriverWait wait = new WebDriverWait(methodDriver, 10);
WebElement trackingInbox = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("inbox-widget-container-id")));