我认为这类似于以下问题:Button not clickable in Selenium Chrome window
我需要自动搜索有关清单列表的信息。我正在尝试硒,但它无法单击按钮来执行搜索。也许这是网站的保护?
到目前为止,我的脚本是:
import time
import string
import itertools
from selenium import webdriver
chromedriver_location = "/home/dell/Downloads/chromedriver"
driver = webdriver.Chrome(chromedriver_location)
driver.get('https://www.idealista.com/valoraciones-inmuebles')
time.sleep(2)
test = '7559431DG0075N0001EY'
initial_button = '//*[@id="vendorlead"]/div[2]/a'
search_field = '//*[@id="search-by-reference"]'
valoration = '//*[@id="vendorlead"]/button'
driver.find_element_by_xpath(initial_button).click()
driver.find_element_by_xpath(search_field).send_keys(test)
driver.find_element_by_xpath(valoration).click()
当我手动或通过Selenium Chrome中的脚本单击按钮时,它将在控制台上显示以下错误:
预先感谢
答案 0 :(得分:1)
您被阻止了。 (做第三个答案,其他答案在自动化调试方法中非常有效)
运行测试,让它无法按下最后一个按钮-但不要关闭镶边。在该chromedriver实例中,选择右上角的语言选项,然后选择英语。
您将经历很多我不是机器人的验证码。完成所有步骤,直到您访问英语网站。 (您将无法使它们自动化-它们旨在停止自动化。)
关闭Chrome驱动程序。
按原样重新运行脚本。
...
以上内容对我有用。 我第一次运行以下内容,但由于您的错误而失败。我做到了以上几点,运行了相同的代码而没有进行更改,并且它起作用了。
import time
import string
import itertools
import selenium
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.idealista.com/valoraciones-inmuebles')
test = '7559431DG0075N0001EY'
#Objects
initial_button = '//*[@id="vendorlead"]/div[2]/a'
#search_field = '//*[@id="search-by-reference"]'
search_field ='//*[@id="vendorlead"]//input'
valoration = '//*[@id="vendorlead"]/button'
#Actions
time.sleep(5)
driver.find_element_by_xpath(initial_button).click()
time.sleep(5)
driver.find_element_by_xpath(search_field).send_keys(test)
time.sleep(5)
driver.find_element_by_xpath(valoration).click()
time.sleep(5)
...请不要使用该时间。在真实脚本中睡眠。我只需要排除同步问题。
python 3.8,chrome 83
答案 1 :(得分:0)
在发送键和点击搜索之间是否需要一些同步?
我快速浏览了该站点,并手动输入了测试数据 该网站运行一些脚本。 如果您尝试按无数据搜索,则不会发生任何事情。
尝试在发送键和单击之间设置time.sleep作为快速测试。 如果可行,请使用Web驱动程序等待进行动态同步。
答案 2 :(得分:0)
正如我对其他答案的评论中所述,我尝试了您的代码并获得了相同的结果。 我还尝试了c#,所以它不是硒绑定。
我尝试了一些手动操作,看起来根本的问题是sendkeys没有设置表单数据。
我找不到您拥有的对象-所以我只是使用devtools查找了一个新的对象,并且工作了。
如果您更改:
search_field = '//*[@id="search-by-reference"]'
成为:
search_field ='//*[@id="vendorlead"]//input'
在c#中对我有用。
我知道您正在使用python,但这是我在c#中所做的,以使其正常工作:
[Test]
public void stackoverflow()
{
var driver = new ChromeDriver();
driver.Url = "https://www.idealista.com/valoraciones-inmuebles";
driver.Manage().Window.Maximize();
var test = "7559431DG0075N0001EY";
string initial_button = "//*[@id='vendorlead']/div[2]/a";
string search_field = "//*[@id='vendorlead']//input";
string valoration = "//*[@id='vendorlead']/button";
driver.FindElement(By.XPath(initial_button)).Click();
driver.FindElement(By.XPath(search_field)).SendKeys(test);
driver.FindElement(By.XPath(valoration)).Click();
}