After setting 448 to win, Steyn (4 for 55) tore the heart out of Australia’s batting, which imploded, in the late afternoon and, as the game went past 6pm, Chris Rogers (107) was needlessly run out before Nathan Lyon fell lbw to Elgar with two balls left.
Replays showed that Lyon had actually edged the ball on to his pad, but the Australians had used their available reviews in a frantic final half hour.
It was one of several controversies in a drama-filled couple of hours – Australia eventually being bowled out for 216 – after play was extended by eight overs.
The tourists had hoped to hold out and play tomorrow, when heavy rain is forecast, but it wasn’t to be.
South Africa earlier declared their second innings on 270 for five as Hashim Amla hit an unbeaten 127.
It’s a fantastic victory for South Africa who have hit back after being outclassed in the first Test.
The final Test starts in Cape Town on March 1.
Scores: South Africa 423 & 270-5 v Australia 246 & 216
Image via Getty