Селектор >
соответствует только прямым потомкам, но не потомкам.
Вы хотите
div.test th, td, caption {}
или более вероятно
div.test th, div.test td, div.test caption {}
Edit:
Первый говорит
div.test th, /* any <th> underneath a <div class="test"> */
td, /* or any <td> anywhere at all */
caption /* or any <caption> */
Тогда как второй говорит
div.test th, /* any <th> underneath a <div class="test"> */
div.test td, /* or any <td> underneath a <div class="test"> */
div.test caption /* or any <caption> underneath a <div class="test"> */
В вашем оригинале div.test > th
говорит any <th> which is a **direct** child of <div class="test">
, что означает, что оно будет соответствовать <div class="test"><th>this</th></div>
, но не будет совпадать <div class="test"><table><th>this</th></table></div>