2014-11-27 3 views
1

У меня проблема с селенными тестами с phantomjs с Java. Я знаю, что phantomjs не поддерживает flash. Я запускаю двойные тесты с хромированным рекордером без включенной вспышки и фантома. на странице, в которой chromedriver отображает плагин с включенным плагином, он просто загружает остальную часть страницы и читает ее правильно. тесты фантомные сгенерирует исключение тайм-аута здесь:phantomjs не может загрузить страницу, если есть плагин Flash

WebDriverWait wait = new WebDriverWait(driver, 10); 
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[contains(text(),'"+s +"')]"))); 

любые идеи?

Полный StackTrace:

org.openqa.selenium.TimeoutException: Timed out after 10 seconds waiting for visibility of element located by By.xpath: //span[contains(text(),'Swiss Super League')] 
Build info: version: '2.41.0', revision: '3192d8a6c4449dc285928ba024779344f5423c58', time: '2014-03-27 11:29:39' 
System info: host: 'countZero', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '3.13.0-40-generic', java.version: '1.8.0_25' 
Driver info: org.openqa.selenium.phantomjs.PhantomJSDriver 
Capabilities [{applicationCacheEnabled=false, rotatable=false, handlesAlerts=false, databaseEnabled=false, version=1.9.0, platform=LINUX, browserConnectionEnabled=false, proxy={proxyType=direct}, nativeEvents=true, acceptSslCerts=false, driverVersion=1.0.3, locationContextEnabled=false, webStorageEnabled=false, browserName=phantomjs, takesScreenshot=true, driverName=ghostdriver, javascriptEnabled=true, cssSelectorsEnabled=true}] 
Session ID: 9422d0d0-7731-11e4-9730-f784ef9dac1a 
    at org.openqa.selenium.support.ui.WebDriverWait.timeoutException(WebDriverWait.java:79) 
    at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:228) 
    at com.hawaii.gatherer.parsers.betfred.parse(betfred.java:88) 
    at com.hawaii.gatherer.parsers.Parser.call(Parser.java:93) 
    at com.hawaii.gatherer.parsers.Parser.call(Parser.java:27) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.openqa.selenium.NoSuchElementException: Error Message => 'Unable to find element with xpath '//span[contains(text(),'Swiss Super League')]'' 
caused by Request => {"headers":{"Accept":"application/json, image/png","Connection":"Keep-Alive","Content-Length":"73","Content-Type":"application/json; charset=utf-8","Host":"localhost:18409"},"httpVersion":"1.1","method":"POST","post":"{\"using\":\"xpath\",\"value\":\"//span[contains(text(),'Swiss Super League')]\"}","url":"/element","urlParsed":{"anchor":"","query":"","file":"element","directory":"/","path":"/element","relative":"/element","port":"","host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/element","queryKey":{},"chunks":["element"]},"urlOriginal":"/session/9422d0d0-7731-11e4-9730-f784ef9dac1a/element"} 
Command duration or timeout: 795 milliseconds 
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html 
Build info: version: '2.41.0', revision: '3192d8a6c4449dc285928ba024779344f5423c58', time: '2014-03-27 11:29:39' 
System info: host: 'countZero', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '3.13.0-40-generic', java.version: '1.8.0_25' 
Driver info: org.openqa.selenium.phantomjs.PhantomJSDriver 
Capabilities [{applicationCacheEnabled=false, rotatable=false, handlesAlerts=false, databaseEnabled=false, version=1.9.0, platform=LINUX, browserConnectionEnabled=false, proxy={proxyType=direct}, nativeEvents=true, acceptSslCerts=false, driverVersion=1.0.3, locationContextEnabled=false, webStorageEnabled=false, browserName=phantomjs, takesScreenshot=true, driverName=ghostdriver, javascriptEnabled=true, cssSelectorsEnabled=true}] 
Session ID: 9422d0d0-7731-11e4-9730-f784ef9dac1a 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408) 
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:193) 
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145) 
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:595) 
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:348) 
    at org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:445) 
    at org.openqa.selenium.By$ByXPath.findElement(By.java:357) 
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:340) 
    at org.openqa.selenium.support.ui.ExpectedConditions.findElement(ExpectedConditions.java:730) 
    at org.openqa.selenium.support.ui.ExpectedConditions.access$000(ExpectedConditions.java:39) 
    at org.openqa.selenium.support.ui.ExpectedConditions$4.apply(ExpectedConditions.java:130) 
    at org.openqa.selenium.support.ui.ExpectedConditions$4.apply(ExpectedConditions.java:126) 
    at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:208) 
    ... 7 more 
Caused by: org.openqa.selenium.remote.ScreenshotException: Screen shot has been taken 
Build info: version: '2.41.0', revision: '3192d8a6c4449dc285928ba024779344f5423c58', time: '2014-03-27 11:29:39' 
System info: host: 'countZero', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '3.13.0-40-generic', java.version: '1.8.0_25' 
Driver info: driver.version: RemoteWebDriver 
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:125) 
    ... 17 more 
Caused by: org.openqa.selenium.remote.ErrorHandler$UnknownServerException: Error Message => 'Unable to find element with xpath '//span[contains(text(),'Swiss Super League')]'' 
caused by Request => {"headers":{"Accept":"application/json, image/png","Connection":"Keep-Alive","Content-Length":"73","Content-Type":"application/json; charset=utf-8","Host":"localhost:18409"},"httpVersion":"1.1","method":"POST","post":"{\"using\":\"xpath\",\"value\":\"//span[contains(text(),'Swiss Super League')]\"}","url":"/element","urlParsed":{"anchor":"","query":"","file":"element","directory":"/","path":"/element","relative":"/element","port":"","host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/element","queryKey":{},"chunks":["element"]},"urlOriginal":"/session/9422d0d0-7731-11e4-9730-f784ef9dac1a/element"} 
Build info: version: '2.41.0', revision: '3192d8a6c4449dc285928ba024779344f5423c58', time: '2014-03-27 11:29:39' 
System info: host: 'countZero', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '3.13.0-40-generic', java.version: '1.8.0_25' 
Driver info: driver.version: unknown 

код, чтобы воспроизвести проблему:

public void test() throws InterruptedException { 
    //System.setProperty("webdriver.chrome.driver", Application.chromeDriverPath); 
    //WebDriver driver= new ChromeDriver(); 
    WebDriver driver=new PhantomJSDriver(); 
    driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS); 
    driver.manage().window().setSize(new Dimension(1280, 800)); 

    driver.get("http://www.betfred.com/sport"); 

    WebElement footballLink=driver.findElement(By.linkText("Football")); 
    footballLink.click(); 

    WebDriverWait wait = new WebDriverWait(driver, 10); 
    WebElement europeanLink= wait.until(ExpectedConditions.visibilityOfElementLocated(By.partialLinkText("European Leagues"))); 
    europeanLink.click(); 

     wait = new WebDriverWait(driver, 10); 
     WebElement leagueLink= wait.until(ExpectedConditions.visibilityOfElementLocated(By.partialLinkText("Italian Serie A"))); 
     leagueLink.click(); 

     wait = new WebDriverWait(driver, 10); 
     WebElement finalLeagueLink=wait.until(ExpectedConditions.elementToBeClickable((By.xpath("//a[contains(text(),'Italian Serie A') and contains(@class,'action')]")))); 
     Thread.sleep(1000); 
     finalLeagueLink.click(); 

    driver.switchTo().frame("sportframe"); 

    wait = new WebDriverWait(driver, 30); 
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[contains(text(),'Italian Serie A')]"))); 

} 

к сведению, что если вы измените его на chromedriver не генерируется никакой ошибки, и вы можете увидеть страницу загруженной. с фантомом страница не загружается, и, следовательно, ошибка. возможно, я должен указать это как отчет об ошибке в github?

EDIT

Я представил новый вопрос здесь https://github.com/ariya/phantomjs/issues/12784

+0

Я не понимаю нисходящие точки. Я исправил исключение crash = throw из этого блока кода. – arisalexis

+0

сайт не использует SSL. URL-адрес: http://www.betfred.com/sport, когда вы отправляетесь в определенную лигу футбола-> европейские чашки-> голландские eredivisie-> матчей. что еще я могу опубликовать? исключение опубликовано в другом комментарии. Снимок экрана имеет страницу, обычно отображаемую, она просто не загружает финальную часть, когда я нажимаю на ссылку, как это делает хром. Это страница с содержимым сверху, а внизу - нет флэш-сообщения. Я не пытаюсь сделать игру, извините и благодарю за это. – arisalexis

+0

К сожалению, ссылки меняются. Я обновлю его сейчас, но он будет устаревшим через пару недель. – arisalexis

ответ

0

PhantomJS имеет размер видового экрана по умолчанию в 400x300. Для большинства сайтов, использующих фиксированную ширину, это слишком мало, поэтому появляется полоса прокрутки, поэтому при использовании элементов Selenium Webdrivers нельзя взаимодействовать, поскольку они скрыты вне поля зрения. Для других сайтов будет показан мобильный сайт (который, вероятно, основан на медиа-запросах), и используемые элементы могут отличаться от рабочего стола (и иметь другой селектор).

Чтобы решить эту проблему, необходимо установить видовой экран на что-то рабочий стол, как перед открытием страницы (как показано here):

driver.manage().window().setSize(new Dimension(1280, 800)); 

Это очень вероятно ничего общего с тем, что прошить объекты присутствуют на странице и PhantomJS не может их загрузить. Если бы это действительно имело какое-то отношение к этому, сценарий/PhantomJS потерпел бы крах раньше.


Может также быть полезно установить строку пользовательского агента на то, что представляет возможности PhantomJS. Некоторые сайты (например, google) будут использовать сетевые протоколы или поставлять JavaScript, который не может быть запущен в PhantomJS 1.x. Таким образом, для PhantomJS 1.x это будет

String userAgent = "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1"; 
System.setProperty("phantomjs.page.settings.userAgent", userAgent); 
+0

это не решит проблему. http://pastebin.com/BgL7DVXb вот полное исключение – arisalexis

0

Phantom Driver не поддерживает технологию Flash. Это делает только Java Script.

Смежные вопросы