簡體   English   中英

無法從帶有彈出窗口/框架的網頁中抓取數據

[英]Can't scrape data from webpage with popup/frame

我無法使用 Robot Framework + Selenium 在面向客戶的網頁上查找要從中抓取數據的元素。 我認為,我的麻煩與彈出窗口/框架中存在的所需數據有關。 我尋找的數據位於客戶的發票上,當我按下按鈕時會彈出(“查看當前發票”)。 我已經成功登錄網站並進行了導航,有一次我成功按下了“查看當前發票”按鈕使發票彈出 - 但忘記提交該代碼並丟失了它。 :-(

無論如何,如果我在腳本期望按下按鈕時手動輸入彈出的發票,我似乎無法抓取后續數據。 我嘗試使用定位器(來自 Firefox 和 Chrome 內置的右鍵單擊檢查功能;Kataalon Recorder;Selenium IDE 等)識別發票上的元素。 我得到了一個看起來像有效定位器的東西(幾乎總是 Xpath); 然而,當我運行我的機器人腳本時,它無法找到有問題的元素。 我花了很多時間仔細研究頁面的源代碼,但由於我對 HTML/JS/CSS 的了解並不像我應該的那樣精通,所以我沒有成功。

這是發票按鈕的屏幕截圖:

在此處輸入圖片說明

這是按下按鈕時我看到的。 我想抓取所有發票數據,如到期金額、發票編號、到期日期等。

在此處輸入圖片說明

有誰知道我在這里缺少什么? 如果你是我,你會怎么做才能得到發票上的數據? 我知道我的問題可能聽起來很模糊和幼稚,但可以這么說,我已經走到了盡頭。 我願意分享頁面源代碼,更多截圖,無論需要什么。

編輯我使用 Rahul Rai 的方法在彈出時檢查彈出窗口; 然后搜索“iframe”。 有 10 場比賽; #7,當單擊時,導致發票彈出窗口以藍色突出顯示:

在此處輸入圖片說明

我認為這意味着這是引用彈出窗口的 iframe? 如果是這樣,我應該能夠在檢查代碼中找到有關 iframe 的“句柄”的信息,但在那里我沒有看到任何與我習慣的定位符(例如名稱、ID、xpath)相匹配的信息。 我什至嘗試過“Select Frame 1599252503952”,但這只是導致“找不到定位器'1599252503952'的元素”錯誤。

根據您分享的上述屏幕,我可以看到您的發票詳細信息位於 iframe 內。 因此,單擊“查看當前發票”按鈕后,您可以使用以下代碼在框架內導航,然后抓取所需信息。

WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[contains(@src,'invoice_detail_container']")))
#Code to scrape data
ele = driver.find_element_by_xpath('<xpath>')
print(ele.txt)
......
......
#After your work is done in this frame to navigate back to main window
driver.switch_to.default_content()

注意:我假設您的發票主框架不在任何其他 iframe 中(基於共享屏幕)。 同樣在元素開始之前沒有其他嵌套框架。 如果有任何其他嵌套框架,您需要先導航到該框架。

在檢查了 HTML 源代碼后,我終於能夠從 Invoice 彈出窗口中抓取數據,並看到以下內容:

<iframe frameborder="0" src="/cmc/invoice_detail_container.pyt?direction=//my.hughesnet.com/cmc/invoice_detail.pyt%3Finvnumber%1234-567890&amp;portletId=863" name="1599391562960" class="cboxIframe" allowfullscreen="true" webkitallowfullscreen="true" mozallowfullscreen="true"></iframe> 

然后,我可以使用 Robot Framework 中的 Select Frame 關鍵字,使用“class”策略為彈出窗口指定 iframe 定位器。 我還必須首先明確選擇主體框架。 最后,讓我進入 iframe 並抓取的代碼是:

Select Frame    body
Select Frame    class:cboxIframe

非常感謝 Rahul Rai 讓我更接近解決方案; 並感謝其他回答的人。

您需要將您的網站切換到框架/彈出窗口,您可以使用如下示例,可能會對您有所幫助。

 IList<IWebElement> textfields = new List<IWebElement>();
 textfields = driver.FindElements(By.TagName("iframe"));
 driver.SwitchTo().Frame(textfields[count); // number of textfields list.

請嘗試根據您的情況實施,如果有任何問題,請告訴我。

你可以嘗試這樣做:

driver.switch_to_active_element()

然后刮掉彈出窗口以關閉它。 那我覺得就好了...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM