【问题标题】:Selenium will not click class idSelenium 不会点击类 id
【发布时间】:2022-01-12 14:18:34
【问题描述】:

我正在尝试让 selenium 执行以下操作:

  1. 打开网站
  2. 点击搜索框
  3. 在搜索框中输入“西雅图”
  4. 从建议的结果中选择第一个结果

我的代码在第 2 步失败。 搜索框的类 id 是“class= input_search ng-pristine ng-valid ng-empty ng-touched”

这是我的代码:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
url = 'https://wego.here.com/'
driver.get(url)

driver.find_element_by_css_selector('.input_search.ng-pristine.ng-valid.ng-empty.ng-touched').click()
driver.find_element_by_css_selector('.input_search.ng-pristine.ng-valid.ng-empty.ng-touched').send_keys('Seattle')
driver.find_element_by_css_selector('.input_search.ng-pristine.ng-valid.ng-empty.ng-touched').send_keys(Keys.ENTER)

任何建议将不胜感激!

其他问题

感谢@Prophet,我能够完成第一次自动点击和自动填充,但是当我尝试使用不同的搜索框执行相同的任务时,它不喜欢它。请参考我在现有代码中添加的以下代码:

wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "button.btn"))).send_keys(Keys.ENTER)

wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "input.itinerary_item_input_0"))).click() wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "input.itinerary_item_input_0"))).send_keys('Chicago') wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "input.itinerary_item_input_0"))).send_keys(Keys.ENTER)

button.btn 确实有效,但 input.itinerary_item_input_0 无效。这是源截图:

【问题讨论】:

  • 首先检查该类是否是唯一的,老实说,永远不要使用那种类型的类,因为它们用于设计,因此它们可能不是唯一的,要么使用元素的 xpath 或 id,如果可用
  • 如果我的回答解决了您的问题,请告诉我?

标签: selenium


【解决方案1】:
wait=WebDriverWait(driver, 60)
driver.get('https://wego.here.com/')
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"input.input_search"))).send_keys("Seattle")
wait.until(EC.element_to_be_clickable((By.XPATH,"//div[@class='dropdown_list']/div[1]"))).click()

这将在将字符串发送到输入标签后选择第一个选项。

进口:

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

【讨论】:

    【解决方案2】:

    您使用了错误的定位器。
    ng-emptyng-touched 可能不会一直存在。
    所以不是

    driver.find_element_by_css_selector('.input_search.ng-pristine.ng-valid.ng-empty.ng-touched').click()
    

    试试这个:

    driver.find_element_by_css_selector('input.input_search').click()
    

    input.input_search 是该元素的唯一、稳定的定位器。
    此外,您必须添加延迟,最好使用预期条件,如下所示:

    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
    
    driver = webdriver.Chrome()
    wait = WebDriverWait(driver, 20)
    
    url = 'https://wego.here.com/'
    driver.get(url)
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "input.input_search"))).click()
    

    【讨论】:

    • 谢谢!如果我理解正确,来自“input.input_search”的第一个 input 会在 css 中找到输入标签,而 input_search 就是您可以在类变量中找到的内容。但是,当我尝试使用具有不同定位器的不同搜索框执行相同任务时,它的工作方式不同,所以我想知道我的理解是否正确。请参阅我在帖子中所做的编辑以供参考。感谢您的帮助!
    • 如果我明白你的意思,不。创建正确定位器的方法是找到将唯一匹配该元素的元素属性值的最小唯一组合。因此,对于这个特定元素,类 input_search 将为这个元素提供一个最小的唯一匹配。对于其他元素,有时您需要使用它们的 id 值或多个 class 值或其他一些属性值。通常需要使用一些父元素子元素属性来定位子元素。
    猜你喜欢
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-28
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 2017-04-16
    相关资源
    最近更新 更多