Selenium找到元素但不能向其发送文本

时间:2017-09-13 20:36:36

标签: python selenium

我试图将文字发送到google flights出发城市输入框。我能够找到它,但当我尝试使用send_keys发送文字时,我收到错误element not visible。硒如何能够找到输入框,但是当我发送它时,它不可用。在我从firefox切换到chrome作为我的webdriver之前,我没有出现此错误。我的代码在

之下
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

2 个答案:

答案 0 :(得分:0)

<强>分析:

Selenium可以从页面中找到元素,只表示该元素在页面源中有html代码,不等于该元素在页面上可见。喜欢isPresent()和isDisplay()之间的区别。

对于硒如何确定一个元素是可见的,我有一些规则如下:
1.元素大小不为零
2.元素'display'css值不是'none'

我觉得很奇怪为什么你可以使用firefox驱动程序运行pass但是在Chrome驱动程序上,我想即使是W3C上的webdirver规范已经定义了,也许firefox和chrome实现了与他们的webdriver有所不同。

回到输入框不可见的原因,我查看输入框的html代码,我注意到输入框顶部有一个div层覆盖,输入框大小设置为css中的1x1样式。

enter image description here

我尝试隐藏覆盖的div图层并取消选中css中的宽度和高度设置,之后你可以看到它并且我可以输入值。

我不确定,Selenium使用以下规则确定元素是可见的:

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

但是从用户体验来看,用户无法看到该元素,而selenium API最能贴近用户体验。

<强>解决方案:

即使您将元素设置为div图层,但它的大小太小,即使您输入了一些值,您也无法看到您输入的文本。

这是一个UI设计问题,您需要与开发团队沟通。

答案 1 :(得分: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