Cape Town:South African fast bowlers Morne Morkel and Dale Steyn took three wickets each as England were made to work hard for runs on the second day of the third Test at Newlands on Monday.
England were 241 for seven at the close, 50 behind South Africa's first innings total of 291.
Thanks mainly to Morkel, who took three for 57, and Steyn (three for 64), England were unable to take control despite ripping through the South African lower batting order early in the day.
Seven wickets fell during a dramatic morning's play, with South Africa losing their last four wickets for 12 runs in 17 balls at the start of the day and England slumping to 64 for three at lunch.
Another wicket fell soon after the interval when Paul Collingwood was leg before wicket to Morne Morkel for 19.
Alastair Cook (65) and Ian Bell (48) put on 60 for the fifth wicket and there were further useful partnerships of 41 between Bell and Matt Prior (50 not out) and 51 between Prior and Stuart Broad (25).
But every time it seemed England were getting on top one of the South African bowlers would strike to make the game even again.
Cook followed up his century when England won the second Test in Durban by an innings and 98 runs with another careful innings, leaving many deliveries and waiting for the right ball to hit.
He took 112 balls to post his fifty, hitting five fours, and faced 136 balls before scooping a catch to midwicket off Morkel.
Bell, another century-maker in Durban, never got on top of the bowling and faced 121 balls before slapping a short ball from Jacques Kallis to backward point.
Prior overcame a shaky start, playing and missing several times, but went on to reach his half-century in the final over of the day.
England fast bowler James Anderson took three wickets for one run at the start of play as South Africa's remaining batsmen succumbed rapidly.
Anderson finished with five for 63, his eighth five-wicket haul in Tests, but the key breakthrough came from fellow paceman Graham Onions, who dismissed South African centurion Kallis with the second ball of the day without adding to his overnight score of 108.
With the second new ball still virtually new, the tail was swept aside by Anderson.
But South Africa struck back almost immediately when Morkel had England captain Andrew Strauss caught behind for two, driving at the last ball of the first over of the England innings.
Cook and Jonathan Trott took the total to 36 before Steyn, who came on as first change, took two wickets in three balls.
Trott was bowled off an inside edge for 20. Kevin Pietersen was greeted by a bouncer, which he ducked under, but then pushed a full, swinging delivery back to a delighted bowler.