Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Google Flights上,send_键与Selenium Python不兼容_Selenium_Web Scraping - Fatal编程技术网

在Google Flights上,send_键与Selenium Python不兼容

在Google Flights上,send_键与Selenium Python不兼容,selenium,web-scraping,Selenium,Web Scraping,试图浏览Google Flights网站,但遇到了一个早期问题,我无法将send_keys()发送到输入 fly_from = driver.find_element_by_xpath( "//*[@id='i6']/div[4]/div/div/div[1]/div/div/input") fly_from.send_keys("lax") 这是行不通的。我尝试过使用click()、clear()和time.sleep()的多种组合。它工作了大约两次

试图浏览Google Flights网站,但遇到了一个早期问题,我无法将
send_keys()
发送到输入

fly_from = driver.find_element_by_xpath(
"//*[@id='i6']/div[4]/div/div/div[1]/div/div/input")

fly_from.send_keys("lax")

这是行不通的。我尝试过使用click()、clear()和time.sleep()的多种组合。它工作了大约两次,然后又停止了工作。

查看您链接的页面,我认为问题在于,一旦您键入或单击第一个元素,就会出现一个新元素覆盖您标识的第一个元素。因此,如果您单击您标识的元素,定义新元素,然后
send\u keys()
它对我有效。像这样:

fly_from = driver.find_element_by_xpath(
"//*[@id='i6']/div[4]/div/div/div[1]/div/div/input")
fly_from.click()
fly_from_text = driver.find_element_by_xpath('//*[@id="i6"]/div[6]/div[2]/div[2]/div[1]/div/input')
fly_from_text.send_keys("lax")

另外,我只想指出变量名
fly\u from
似乎没有意义,因为该字段是目标字段。

您可能可以删除该绝对xpath,并使用下面给出的相对xpath:

//input[@role='combobox' and @aria-expanded='false'][not(@placeholder ='Where to?')]
代码:

fly_from = driver.find_element_by_xpath(
"//input[@role='combobox' and @aria-expanded='false'][not(@placeholder ='Where to?')]")

fly_from.send_keys("lax")

我看到它已经被回答了,但是这种定位器不会持续很久

我发布了一个更好的版本,利用显式等待和更强大的定位器

关于定位器:
-类名,
-直接子级。 所有详细信息都在代码注释中

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


driver = webdriver.Chrome(executable_path='/snap/bin/chromium.chromedriver')
driver.get('https://www.google.com/travel/flights')
assert "Google Flights" in driver.title
wait = WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".e5F5td.BGeFcf .V00Bye.ESCxub.KckZb>input[class='II2One j0Ppje zmMKJ LbIaRd']")))  # waiting for autocompleted field
field = driver.find_element_by_css_selector(".e5F5td.BGeFcf .V00Bye.ESCxub.KckZb>input[class='II2One j0Ppje zmMKJ LbIaRd']")  # finding autocompleted field
field.clear()  # clearing autocompleted field
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".BGeFcf .V00Bye.ESCxub.KckZb>input")))
click_input = driver.find_element_by_css_selector(".BGeFcf .V00Bye.ESCxub.KckZb>input")
click_input.click()  # clicking the field for a new input becoming interactible 
fly_from = driver.find_element_by_css_selector("input[aria-label='Where from?']")
city = "Moscow"
fly_from.send_keys("Moscow")  # making search
在调试期间,我还尝试以较小的延迟进行输入,如下所示,但这不是问题所在:

city = "Moscow"
for char in city:
    fly_from.send_keys(char)
    time.sleep(0.1)

真正的问题是更改输入定位器。

能否显示浏览器dom结构我知道我找到了正确的输入,因为如果我单击(),它将被单击。URL是,我正在尝试填写登录页面的输入。这是正确的,你写的东西和我的代码有什么区别?你插入了时间睡眠吗?首先,我找不到任何带有选择器的元素。。。我想你可以。但是即使选择器工作,这真的解决了问题吗?@C.Peck:我已经更改了定位器,一开始我没有看到所有的注释。是否先单击并发送正确的解决方案?是的,谷歌上的这个字段有点愚蠢/复杂。我个人不会在我的回答中使用这些XPath,但它是有效的。虽然我不打算为我的定位器辩护,但像
.e5F5td.BGeFcf.V00Bye.ESCxub.KckZb>输入[class='i2one j0Ppje zmMKJ LbIaRd']
对我来说肯定不稳定。这是谷歌,它们的类名是稳定的。
.e5f5f5td.BGeFcf.V00Bye.ESCxub.kzb>输入[class='II2One j0Ppje zmMKJ LbIaRd']
这有一些严重的问题@vitaliis,如果你下次重新加载或启动脚本,它可能不会工作。好的,我不熟悉谷歌的CSS。也许这更好。它对我也有效,也许随着时间的推移它是稳定的,如果你有这样的经验,我服从你@vitaliis,我知道你的定位器是从那里获得的,然后“灵感来自”OP的定位器非常脆弱。我会使用CSS选择器,
“input[placeholder='Where to?']”
,用于单击,然后使用CSS选择器,
“input[aria label='Where to?']”
,用于发送键。我希望我的定位器至少尽可能接近可读性。