PhantomJS无法检索网站的整个HTML /无法找到网页元素

时间:2016-06-25 22:14:45

标签: java selenium-webdriver phantomjs

我试图将phantomjs用于无头浏览器测试,我注意到像driver.get这样的简单命令(By.id(""))返回时发现了一个未找到元素的异常。我确实找到了问题的根源。我做了一个driver.getPageSource(),并注意到phantomjs没有检索或者"看到"完整的页面HTML。

以下代码是我试图运行的代码。我想在Google主页上找到搜索框。在浏览器中查看HTML,您可以看到搜索框的ID是" lst-ib"。但是,在执行getPageSource()时," lst-ib"结果中缺少。这不是一件大事,因为我仍然可以按名称访问该元素。但是在其他网页上,缺少整个HTML块,这导致getPageSource()完全省略了整个元素。这使得测试这些元素变得不可能。

import static org.junit.Assert.*;
import java.io.File;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriverService;
import org.openqa.selenium.remote.DesiredCapabilities;

public class AccessMessageDataRetentionSettings
{
    public WebDriver driver;

    @Before
    public void setup()
    {
        File f = new File("My path to the phantomjs executable");
        System.setProperty("phantomjs.binary.path", f.getAbsolutePath());
        DesiredCapabilities caps = new DesiredCapabilities();
        caps.setJavascriptEnabled(true);
        //caps.setCapability("takesScreenshot", false);
        caps.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, new String[] {"--ssl-protocol=any", "--ignore-ssl-errors=true", "--web-security=false" });
        driver = new PhantomJSDriver(caps);
        driver.get("http://www.google.com");

        //((JavascriptExecutor) driver).executeScript("var s=window.document.createElement('script'); s.src='path to my javascript file'; window.document.head.appendChild(s);");
        //WebDriverWait wait = new WebDriverWait(driver, 10);
        //driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        //wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("lst-ib")));
    }

    @Test
    public void test() 
    {
        System.out.println(driver.getPageSource());
        //driver.findElement(By.xpath("//input[@id = 'lst-ib']"));
        driver.findElement(By.id("lst-ib"));    
    }

    @After
    public void afterTest()
    {
        driver.quit();
    }   
}

我尝试过的事情:将webdriver声明为PhantomJSDriver,设置DesiredCapabilities的不同组合(包括将ssl-protocol设置为tlsv1),执行从https://github.com/facebook/react/issues/945通过javascriptExecutor建议的javascript shim(其中没有& #39;似乎在做任何事情),并尝试在Selenium中提供各种等待。

PhantomJS是否与现代网站不兼容,还是我完全错过了什么?

2 个答案:

答案 0 :(得分:1)

PhantomJS是无头浏览器,你可以在firefox,IE和chrome中处理很多选项,例如:

不支持的功能

很久以前,对插件(如Flash)的支持已被删除。主要原因是:

  • 纯无头(没有X11)使得无法使用窗口插件 由于这些插件的专有性(二进制blob),问题和错误很难调试 由于PhantomJS的性质,以下功能无关紧要:

  • WebGL需要一个支持OpenGL的系统。由于PhantomJS的目标是100%无头和自足,这是不可接受的。通过Mesa使用OpenGL仿真可以克服限制,但性能会降低。

  • 视频和音频需要提供各种不同的编解码器。

  • CSS 3-D需要透视正确的纹理映射实现。如果没有性能上的惩罚,就无法实施。

答案 1 :(得分:0)

谢谢你的回答。 PhantomJS最终过时了,而且使用起来太错误了。我最终使用运行firefox / chrome映像的docker容器,然后使用RemoteWebDriver运行我的测试。即使这意味着它们在容器内的实际浏览器上运行,但它是无头的#34;在我的结尾,这对我的目的来说已经足够了。