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")));
很多天以来我一直在寻找这个问题的解决方案,但一直没有找到好方法。
我使用的版本如下:
-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")));