// a [содержит (@ class, 'btnX') и span [text () = 'Войти']] не очень хорошая идея, потому что вы собираетесь искать в DOM каждый якорь, а затем пытаться сравните это с вашими критериями поиска.
В идеале вы хотите привязать свой XPath к первому восходящему элементу с идентификатором, а затем пройти вниз по дереву.
например. если ваш html
<div id="foo">
<a class="btnX btnSelectedBG" href="#"><span>Sign in</span></a>
</div>
Вы можете использовать:
//div[@id='foo']/a[contains(@class, 'btnX')][span[.='Sign in']]
К сожалению, я не знаю остальную часть структуры страницы, поэтому не могу дать вам ничего более конкретного, чем:
//a[contains(@class, 'btnX')][span[.='Sign in']]
но это действительно не очень хороший xpath.
(Мой XPath немного отличается от вас, потому что я использовал. В качестве ярлыка для текста () и второй набор [] в качестве ярлыка для и)