我试图将文字发送到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
答案 0 :(得分:0)
<强>分析:强>
Selenium可以从页面中找到元素,只表示该元素在页面源中有html代码,不等于该元素在页面上可见。喜欢isPresent()和isDisplay()之间的区别。
对于硒如何确定一个元素是可见的,我有一些规则如下:
1.元素大小不为零
2.元素'display'css值不是'none'
我觉得很奇怪为什么你可以使用firefox驱动程序运行pass但是在Chrome驱动程序上,我想即使是W3C上的webdirver规范已经定义了,也许firefox和chrome实现了与他们的webdriver有所不同。
回到输入框不可见的原因,我查看输入框的html代码,我注意到输入框顶部有一个div层覆盖,输入框大小设置为css中的1x1样式。
我尝试隐藏覆盖的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