2016-02-13 44 views
1

我在那裏的錯誤出現在我的Python GUI說明一個問題,「ElementNotVisibleException:消息:元素當前不可見,因此可能無法與之交互」,因此它停止我的腳本。元素不可見的錯誤(Python中,硒)

幾乎我具有低於其中I選擇的乘客在其離港航班通過選擇座椅座位的圖像,下一個單選按鈕被選中,然後另一個座位被選擇並繼續。

然而,對於選擇在離港航班最後一個乘客座位後,它會自動去降低入站列表,並在那裏選擇第一個乘客的單選按鈕,但腳本錯誤停止。

我試圖使用XPath等待平面地圖入站地圖點擊入境旅客出庭說明,但它不喜歡這一點。

我的問題是,我怎麼能拿到劇本來選擇進港航班座位,酷似出港航班一旦它從出站開關入站?

下面是代碼我有選擇乘客和他們的席位:

#seats selection - outbound 

for outbound_passenger in driver.find_elements_by_css_selector("ol[data-flightbound='Outbound'] li[data-personid]"): 
    outbound_passenger.click() 

#driver.find_elements_by_css_selector("ol.passengerlist li[data-personid]"): 

    outbound_has_infant = outbound_passenger.get_attribute("data-hasinfant") 

# choose seats 
    if outbound_has_infant: 
     # select a non-selected infant seat 
     outbound_seat = driver.find_element_by_css_selector(".planebody a.seat.infant:not(.reserved):not(.selected)") 
    else: 
     # select a non-reserved non-selected seat 
     outbound_seat = driver.find_element_by_css_selector(".planebody a.seat:not(.reserved):not(.selected)") 

    print("Passenger: %s, choosing seat: %s" % (outbound_passenger.text.strip(), outbound_seat.get_attribute("data-seat"))) 
    outbound_seat.click() 

inbound_plan = wait.until(EC.visibility_of_element_located((By.XPATH, "/html/body/div[3]/form/div[1]/div/div[1]/div[15]/div[2]/div/div[2]/div[2]"))) 

#seats selection - inbound 

for inbound_passenger in driver.find_elements_by_css_selector("ol[data-flightbound='Inbound'] li[data-personid]"): 
    inbound_passenger.click() 

#driver.find_elements_by_css_selector("ol.passengerlist li[data-personid]"): 

    inbound_has_infant = inbound_passenger.get_attribute("data-hasinfant") 

    # choose seats 
    if inbound_has_infant: 
     # select a non-selected infant seat 
     inbound_seat = driver.find_element_by_css_selector(".planebody a.seat.infant:not(.reserved):not(.selected)") 
    else: 
     # select a non-reserved non-selected seat 
     inbound_seat = driver.find_element_by_css_selector(".planebody a.seat:not(.reserved):not(.selected)") 

    print("Passenger: %s, choosing seat: %s" % (inbound_passenger.text.strip(), inbound_seat.get_attribute("data-seat"))) 
    inbound_seat.click() 
+0

你的意思是因爲滾動元素不在視圖中?編輯:我的壞。你的意思是,下一個座位計劃仍然沒有出現,因此,不可見 – Obsidian

+0

當我有這樣的問題時,我總是添加一個相當大的time.sleep,以檢查它是否是一個JavaScript更改速度慢於Selenium檢查它的DOM,或者這是我的代碼選擇元素錯誤的方式。一個小小的建議,嘗試添加ID的HTML標記,它會簡單地選擇你和調試 –

+0

@Obsidian是喜歡它似乎無法繼續單選按鈕的點擊,因爲當我們從出站名單跳到入名單,這架飛機的座位計劃從出站變爲入站,因此該短暫時刻導致錯誤 – BruceyBandit

回答

2

這可能是因爲有一個以上的inbound_seat,然後當你運行該代碼,硒返回元素是不是一個你正在期待。請注意,默認情況下,Selenium總是返回第一個元素,以防止有多個元素。

# choose seats 
if inbound_has_infant: 
    # select a non-selected infant seat 
    inbound_seat = driver.find_element_by_css_selector(".planebody a.seat.infant:not(.reserved):not(.selected)") 
else: 
    # select a non-reserved non-selected seat 
    inbound_seat = driver.find_element_by_css_selector(".planebody a.seat:not(.reserved):not(.selected)") 
+0

啊,你是對的。我添加了隱形和可見性等待,然後爲outbound_seat和inbound_seat添加了.outbound和.inbound,並且它工作正常。謝謝 – BruceyBandit