我一直在寻找这个问题的解决方案很多天了,但是运气不好。
我使用的版本如下:
-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。所以,也许我需要找出如何让它在幻像中运行,尽管我在弄清楚如何做到这一点时遇到了一些麻烦。
答案 0 :(得分:1)
看起来你需要等待一个元素。否则,该网站不允许PhantomJS。让我们先试试等待,看下面的例子。
WebDriverWait wait = new WebDriverWait(methodDriver, 10);
WebElement trackingInbox = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("inbox-widget-container-id")));