通过Selenium访问时,DOM不会在PhantomJS中填充

时间:2017-11-13 18:59:36

标签: java selenium selenium-webdriver phantomjs

我一直在寻找这个问题的解决方案很多天了,但是运气不好。

我使用的版本如下:

-Java 8

-Selenium 3.4.0

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

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

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

我正在尝试使用PhantomJS运行Selenium,并且遇到了让页面完全可用的问题。

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

   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”:“无法找到带有id的元素'inbox-widget-container-id'”    在线:   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(标题),我会得到以下内容:

<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中运行的建议,如果有的话,它会填充DOM。所以,也许我需要找出如何让它在幻像中运行,尽管我在弄清楚如何做到这一点时遇到了一些麻烦。

1 个答案:

答案 0 :(得分:1)

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

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