Peterborough United recorded a ninth win from 11 league games as a late strike from Tyrone Barnett earned Darren Ferguson's men three vital points at Vale Park.
Britt Assombalonga fired wide of the target on 10 minutes after receiving a pass from Paul Taylor as Posh recorded the first shot of the game.
Tyrone Barnett was next to try his luck on 13 minutes after a slick Posh build-up involving Taylor and McCann, but the striker's volley went wide of the target.
On 23 minutes, a superb run from Taylor saw him get to the by-line and cut the ball back to the onrushing Swanson, but his shot was expertly blocked by Robertson. Assombalonga then saw an effort pushed around the post.
Taylor saw a curler claimed by Neal after Assombalonga had raced clear only to be squeezed out of things by the centre back. Posh made a change on 36 minutes as Mark Little replaced Alcock at right-back.
Loft fired wide after a good knock-down from Pope moments later. After two minutes of added time, referee Mr Bull brought an end to the first half.
Swanson fired inches past the post on 49 minutes from 25-yards with goalkeeper Neal scrambling across his goal-line.
McCann curled a free-kick over the crossbar on 52 minutes after Taylor had been upended by Robertson.
Little saw a curler deflected behind for a corner while Olejnik did well to hold a skidding shot from Tom Pope. Nathaniel Mendez-Laing replaced Taylor just before the hour as Darren Ferguson shuffled his pack.
Lee Hughes fired wide of the near post on 71 minutes after Rowe was caught out of position in attack as Posh tried to find the right balance between attack and defence.
McCann fired wide of the near post after a corner kick routine was only half cleared as the game entered the final 10 minutes.
The deadlock was broken on 86 minutes and it was a well-worked one too. BARNETT played an incisive one-two with Kearns and fired an unstoppable left-foot shot past Neal and into the back of the net.
Final Score: Port Vale 0-1 Posh
Port Vale: Neal, Yates, Jones, Robertson, Dickinson (sub Dodds 87min), Chilvers, Loft, Pope, Lines, Griffith (sub Birchall 87min), Hughes (sub Myrie-Williams 81min). Unused subs: Johnson,Shuker, Williamson, Duffy, Birchall.
Posh: Olejnik, Alcock (sub Little 36min), Zakuani, Bostwick, Swanson (sub Kearns 67min), Payne, McCann, Rowe, Taylor (sub Mendez-Laing 56min) , Barnett, Assombalonga. Unused subs: Brisley, Day, Knight-Percival, Gordon.
Attendance: 6,311 (662 Posh fans)