Как я могу определить элемент, который находится в iframe, без использования абсолютного xpath? - PullRequest
0 голосов
/ 21 мая 2019

Я пишу сценарий Selenium для проверки количества строк на странице:

Строки находятся в iframe, поэтому я не мог не использовать / * [начальный-с (@id, 'someid'), чтобы найти количество элементов, так как веб-драйвер selenium не может найти элементы внутри iframe, используя id или относительный XPath. Работает только абсолютный xpath.

Мой абсолютный путь к моим строкам как таковой

Строка 1:

/html[1]/body[1]/form[1]/table[1]/tbody[1]/tr[1]/td[1]/table[1]/tbody[1]/tr[1]/td[1]/div[1]/table[1]/tbody[1]/tr[1]/td[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[2]/div[1]/table[1]/tbody[1]/tr[1]/td[1]/div[2]/div[1]/div[1]/table[1]/tbody[1]/tr[2]/td[1]/div[1]/table[1]/tbody[1]/tr[3]/td[1]

Строка 2:

/html[1]/body[1]/form[1]/table[1]/tbody[1]/tr[1]/td[1]/table[1]/tbody[1]/tr[1]/td[1]/div[1]/table[1]/tbody[1]/tr[1]/td[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[2]/div[1]/table[1]/tbody[1]/tr[1]/td[1]/div[2]/div[1]/div[1]/table[1]/tbody[1]/tr[2]/td[1]/div[1]/table[1]/tbody[1]/tr[5]/td[1]

Следовательно, как использовать, начинается с использования абсолютного xpath, который начинается со следующего:

/html[1]/body[1]/form[1]/table[1]/tbody[1]/tr[1]/td[1]/table[1]/tbody[1]/tr[1]/td[1]/div[1]/table[1]/tbody[1]/tr[1]/td[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[2]/div[1]/table[1]/tbody[1]/tr[1]/td[1]/div[2]/div[1]/div[1]/table[1]/tbody[1]/tr[2]/td[1]/div[1]/table[1]/tbody[1]/tr[

HTML

<iframe id="MasterSplitter_mainContent_ASPxPageControlManageProgramme_ucEnrolment_Programme_Details_CBPnlDetail_ucFunding_GrantCalculator_pcGC_CIF-1" title="" src="../Funding/FundingGrantCalculator.aspx?SessionKey=k6ML680ffjM3LcWqMwUzNOe33dRU4xgBxVoW%2ftYHVWJs1Re6Yr4oTA%3d%3d"
  scrolling="auto" frameborder="0" style="height: 100%; width: 100%;" xpath="1">


<tr ng-repeat-start="funding in data.fundings" ng-show="data.fundings.length > 0 &amp;&amp; !ShowLoading" ng-class="GetFundingRowCSSClass(funding)" data-qo-theme="danger" data-nq-tooltip="" data-qo-placement="top-center" data-qs-title="" class="ng-scope AvailableFunding" style="">

<tr ng-repeat-start="funding in data.fundings" ng-show="data.fundings.length > 0 &amp;&amp; !ShowLoading" ng-class="GetFundingRowCSSClass(funding)" data-qo-theme="danger" data-nq-tooltip="" data-qo-placement="top-center" data-qs-title="" class="ng-scope AvailableFunding" xpath="1">

</iframe>

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

Предполагая, что основное внимание уделяется окну браузера и количество строк должно быть получено из фреймов. Поэтому фокус должен быть перемещен в кадр.

Это делается с помощью метода SwichTo (). driver.SwitchTo (). Рама (0). Здесь 0 означает, что открыт только один кадр. Кадры могут быть выбраны с помощью Frameindex, FrameName и IwebElement.

После переключения на Frame xpath используется для вывода списка всех узлов tr.

// tr [содержит (@ ng-repeat-start, «финансирование в data.fundings»)

2 голосов
/ 21 мая 2019

Сначала вам нужно переключиться на iframe, для этого вы можете использовать этот код:

driver.SwitchTo().Frame(By.CssSelector("iframe[id*='MasterSplitter_mainContent']"));  

Как только вы окажетесь внутри фрейма, вы можете использовать этот xpath для вывода списка всех узлов tr.

//tr[contains(@ng-repeat-start,"funding in data.fundings")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...