2017-09-13 4 views
0

出発都市の入力ボックスgoogle flightsにテキストを送信しようとしています。私はそれを見つけることができますが、私が試してみてsend_keysとテキストを送信すると、エラーelement not visibleが出ます。どのようにセレンが入力ボックスを見つけることが可能ですが、私はそれを使用することはできませんキーを送信します。私は私のwebdriverとしてfirefoxからchromeに切り替えるまで私はこのエラーがありませんでした。私のコードはSeleniumが要素を検索しましたが、テキストを送信できません

import 
from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

class Bot: 

    def __init__(self): 
     # self.browser = webdriver.Firefox(executable_path='./geckodriver') 
     self.browser = webdriver.Chrome('./chromedriver') 
     self.departure_city = "COU" 
     self.destination_city = "HND" 
     self.departure_day = "December 1" 
     self.return_day = "December 10" 
     self.prices = [] 
     self.Run() 

    def Run(self): 
     try: 
      self.SetFlight() 
      self.SetDates() 
      self.FindPrices() 
      self.SendText() 
      time.sleep(10) 
      self.browser.quit() 


     except Exception as ex: 
      print(ex) 
      self.browser.quit() 

    def SetFlight(self): 
     self.browser.get('https://www.google.com/flights/'); 
     departure_take_off_boxes = self.browser.execute_script(
      "return document.querySelectorAll('.EIGTDNC-Kb-f.EIGTDNC-Kb-b')") 
     print(departure_take_off_boxes[0].get_attribute('outerHTML')) 
     print(departure_take_off_boxes[1].get_attribute('outerHTML')) 
     self.browser.implicitly_wait(20) 
     departure_take_off_boxes[0].send_keys(self.departure_city) 
     departure_take_off_boxes[0].send_keys(Keys.RETURN) 
     time.sleep(1) 
     # departure_take_off_boxes[1].send_keys(self.destination_city) 
     # departure_take_off_boxes 

答えて

0

分析以下である:

セレンページから要素を見つけることができる、唯一の要素は、要素がページに表示され等しくない、ページのソース内にHTMLコードを有することを意味します。 isPresent()とisDisplay()の違いと同様です。

どの要素が表示されている決定するためにセレンのために、私は以下のようにいくつかのルールをknwo:
1素子のサイズがゼロ
2要素「表示」CSSの値が「なし」

ことませんではありません私はFirefoxのドライバーでパスを実行することができますが、クロムドライバーでパスを実行できる理由は非常に奇妙に感じます.W3CのWebdirver仕様でも定義されていたと思います。

なぜ入力ボックスが表示されないのか、私はその入力ボックスのまわりのhtmlコードを調べます。入力ボックスの上部にdivレイヤーのカバーがあり、入力ボックスのサイズが1x1に設定されていることがわかりましたCSSスタイル。

enter image description here

私はカバーされdivの層を隠された、あなたはそれを見ることができると私は入力値をできることをした後、CSSで設定された幅と高さのチェックを外してみました。

私は確信してtは、セレンは、要素が表示されているかを決定するために以下のルールを使用していないよ:

If there is something cover the element, the element will be not visible. 

しかし、ユーザーの経験から、ユーザーがその要素を見ることができない、とセレンAPIを閉鎖する最善しようとしていますユーザーエクスペリエンス

ソリューション:

も、あなたはdivの層までの要素を作るが、その大きさもあなた入力し、いくつかの値が小さすぎる、あなたはsitllテキストあなた入力を参照することはできません。

これはUIデザインの問題です。あなたは開発チームと通信する必要があります。

0

以下をお試しください:詳細については

element = driver.find_element_by_id("id") 
actions = ActionChains(driver) 
actions.move_to_element(element).perform() 
element.Clear() //if needed 
element.SendKeys("sendKeysHere") 

、次のマニュアルの7.2節を参照してください。http://selenium-python.readthedocs.io/api.html

関連する問題