ChatGPT对话:Python程序自动模拟操作网页,无法弹出下拉列表框

news2024/10/5 13:00:26

【编者按】需要编写Python程序自动模拟操作网页。编者有编程经验,但没有前端编程经验,完全不知道如何编写这种程序。通过与ChatGPT讨论,1天完成了任务。因为没有这类程序的编程经验,需要边学习,边编程,遇到问题再网上查资料。如果没有ChatGPT,估计至少需要5天时间。
从登录开始模拟,直到完成任务,中间遇到了非常多的问题,其中耽误时间最长,与ChatGPT讨论最多的,就是下面记录的问题。
问题描述:为了规范用户输入信息,网页中有一个input框,随着用户输入字符到某个单词后,会弹出一个下拉列表框,然后要求用户单击表中列表项完成输入。遇到的问题是模拟了输入后始终不弹出下拉列表框。
下面是与ChatGPT解决问题的过程记录。

=========================================
1问:网页中,这个input是可以跟踪输入的,当输入字符后,有下拉列表框,再单击其中的列表项

ChatGPT:

如果你需要在输入后选择下拉列表框中的项,可以按照以下步骤进行操作:

  1. 输入文本: 使用 send_keys() 方法向输入框输入文本。
  2. 等待下拉列表框出现: 使用显式等待 (WebDriverWait) 等待下拉列表框的出现。
  3. 选择列表项: 单击所需的列表项。

下面是更新后的示例代码,假设下拉列表框的选择项使用 li 元素来表示:

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

# 设置WebDriver
driver = webdriver.Chrome(ChromeDriverManager().install())

try:
    # 打开目标网站
    driver.get('https://example.com')  # 替换为实际的URL

    # 找到输入框并输入文本
    input_element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, 'mat-input-3'))  # 替换为实际选择器
    )
    input_element.clear()  # 清空输入框内容
    input_element.send_keys('Example location')

    # 等待下拉列表框出现
    dropdown_list = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.CSS_SELECTOR, 'ul.dropdown-list'))  # 替换为实际选择器
    )

    # 找到列表项并单击
    dropdown_item = WebDriverWait(dropdown_list, 10).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, 'li'))  # 替换为实际选择器
    )
    dropdown_item.click()

    # 找到并单击提交按钮
    submit_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.mat-raised-button')) 
    )
    submit_button.click()

    # 等待页面加载或执行其他操作...

finally:
    # 关闭浏览器
    driver.quit()

请根据实际情况替换代码中的选择器,确保能准确地定位到输入框、下拉列表框和列表项。这样就能模拟用户在输入文本后选择下拉列表框中的项,并点击提交按钮了。

===========================
2问:这个列表框有5项,需要选择的“Example location”(编者更改了真实输入字符,下面有同样的处理),排在第5项,其它项,在这个模拟程序中实际不用管

ChatGPT:

理解了,你希望在输入文本后,自动选择下拉列表中的特定项,并点击提交按钮。下面是相应的示例代码,针对你描述的情况进行了调整:

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

# 设置WebDriver
driver = webdriver.Chrome(ChromeDriverManager().install())

try:
    # 打开目标网站
    driver.get('https://example.com')  # 替换为实际的URL

    # 找到输入框并输入文本
    input_element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, 'mat-input-3'))  # 替换为实际选择器
    )
    input_element.clear()  # 清空输入框内容
    input_element.send_keys('Example location')

    # 等待下拉列表框出现
    dropdown_list = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.CSS_SELECTOR, 'ul.dropdown-list'))  # 替换为实际选择器
    )

    # 找到并单击特定的列表项(假设 "Example location" 是第5项)
    dropdown_items = WebDriverWait(dropdown_list, 10).until(
        EC.visibility_of_all_elements_located((By.CSS_SELECTOR, 'li'))  # 替换为实际选择器
    )
    specific_item = dropdown_items[4]  # 第5项,索引从0开始
    specific_item.click()

    # 找到并单击提交按钮
    submit_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.mat-raised-button')) 
    )
    submit_button.click()

    # 等待页面加载或执行其他操作...

finally:
    # 关闭浏览器
    driver.quit()

在这个示例中:

  • send_keys('Example location') 输入文本 “Example location”。
  • 等待下拉列表框出现并找到所有的列表项。
  • 选择第5项(索引为4),并点击该项。
  • 执行提交按钮的点击操作。

请根据实际情况调整代码中的选择器和逻辑,确保能正确模拟用户在网页上的输入和选择操作。

===========================
3问:这个input,手动输入“Example ”后,有正确的下拉框出现。python程序中input_element.send_keys(‘Example location’)执行后没有下拉框

ChatGPT:

如果使用 send_keys() 方法输入文本后没有正确显示下拉框,这可能是由于以下几个原因导致的:

  1. 输入速度和事件触发: 有些网页的下拉框可能需要一定的时间来响应输入内容并显示匹配的下拉选项。有时候,输入过快可能会导致下拉框没有正确显示。你可以在 send_keys() 后加入适当的等待时间。

  2. 输入内容是否匹配: 确保使用 send_keys() 输入的内容与下拉框中的选项匹配。有时输入的内容不精确可能导致下拉框没有正确显示。

  3. 页面动态加载: 如果页面使用了动态加载或者 JavaScript 来实现下拉框功能,可能需要等待页面完全加载或者使用适当的等待条件 (WebDriverWait)。

为了更精确地模拟手动输入并触发下拉框,你可以尝试以下方法:

  • send_keys() 后添加适当的等待时间,例如 time.sleep(2),确保输入后等待一段时间再进行后续操作。

  • 如果页面使用了 JavaScript 来实现下拉框的显示,可以考虑使用 execute_script() 方法来模拟触发 JavaScript 事件,例如 input_element.send_keys('Example location'); input_element.send_keys(Keys.ENTER),这会发送一个回车键,可能会触发下拉框的显示。

下面是一个调整后的示例代码,演示了添加等待时间来确保下拉框能正确显示:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
import time

# 设置WebDriver
driver = webdriver.Chrome(ChromeDriverManager().install())

try:
    # 打开目标网站
    driver.get('https://example.com')  # 替换为实际的URL

    # 找到输入框并输入文本
    input_element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, 'mat-input-3'))  # 替换为实际选择器
    )
    input_element.clear()  # 清空输入框内容
    input_element.send_keys('Example location')
    
    # 等待一段时间,确保下拉框能正确显示
    time.sleep(2)

    # 等待下拉列表框出现
    dropdown_list = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.CSS_SELECTOR, 'ul.dropdown-list'))  # 替换为实际选择器
    )

    # 找到并单击特定的列表项(假设 "Example location" 是第5项)
    dropdown_items = WebDriverWait(dropdown_list, 10).until(
        EC.visibility_of_all_elements_located((By.CSS_SELECTOR, 'li'))  # 替换为实际选择器
    )
    specific_item = dropdown_items[4]  # 第5项,索引从0开始
    specific_item.click()

    # 找到并单击提交按钮
    submit_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.mat-raised-button')) 
    )
    submit_button.click()

    # 等待页面加载或执行其他操作...

finally:
    # 关闭浏览器
    driver.quit()

请根据你的具体情况调整代码,并确保在输入后等待足够的时间来确保下拉框正确显示。

========================
4问:是否是需要单击一下这个input,获取焦点,再输入字符,这样才能弹出下拉框

ChatGPT:

是的,有些网页中的输入框可能需要先单击获取焦点,然后才能正确输入内容并触发下拉框的显示。这种情况下,可以通过以下方式调整代码:

  1. 先单击获取焦点: 在使用 send_keys() 方法之前,先使用 click() 方法单击输入框,确保输入框获取了焦点。

  2. 输入文本后等待: 在输入文本后,等待一段时间以确保下拉框能正确显示。

下面是一个示例代码,演示了先单击输入框获取焦点,然后输入文本并等待一段时间,最后选择特定的下拉列表项和点击提交按钮的操作:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
import time

# 设置WebDriver
driver = webdriver.Chrome(ChromeDriverManager().install())

try:
    # 打开目标网站
    driver.get('https://example.com')  # 替换为实际的URL

    # 找到输入框并单击获取焦点
    input_element = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.ID, 'mat-input-3'))  # 替换为实际选择器
    )
    input_element.click()

    # 输入文本
    input_element.send_keys('Example location')

    # 等待一段时间,确保下拉框能正确显示
    time.sleep(2)

    # 等待下拉列表框出现
    dropdown_list = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.CSS_SELECTOR, 'ul.dropdown-list'))  # 替换为实际选择器
    )

    # 找到并单击特定的列表项(假设 "Example location" 是第5项)
    dropdown_items = WebDriverWait(dropdown_list, 10).until(
        EC.visibility_of_all_elements_located((By.CSS_SELECTOR, 'li'))  # 替换为实际选择器
    )
    specific_item = dropdown_items[4]  # 第5项,索引从0开始
    specific_item.click()

    # 找到并单击提交按钮
    submit_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.mat-raised-button')) 
    )
    submit_button.click()

    # 等待页面加载或执行其他操作...

finally:
    # 关闭浏览器
    driver.quit()

请根据具体情况调整代码,确保在输入文本前单击获取焦点,并在输入后等待足够的时间来确保下拉框的正确显示和选择。

=====================
5问:修改一下代码。下拉列表框是listbox,对应

html:<div role="listbox" class="mat-autocomplete-panel ng-star-inserted mat-autocomplete-visible" id="mat-autocomplete-36">

ChatGPT:

根据你提供的 HTML 结构,下面是一个示例代码,演示如何在输入框中输入文本,并选择特定的下拉列表项:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
import time

# 设置WebDriver
driver = webdriver.Chrome(ChromeDriverManager().install())

try:
    # 打开目标网站
    driver.get('https://example.com')  # 替换为实际的URL

    # 找到输入框并单击获取焦点
    input_element = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.ID, 'mat-input-3'))  # 替换为实际选择器
    )
    input_element.click()

    # 输入文本
    input_element.send_keys('Example location')

    # 等待一段时间,确保下拉框能正确显示
    time.sleep(2)

    # 找到下拉框的父元素
    dropdown_panel = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.CLASS_NAME, 'mat-autocomplete-panel'))  # 替换为实际选择器
    )

    # 找到所有下拉选项
    dropdown_items = dropdown_panel.find_elements(By.CSS_SELECTOR, 'mat-option')

    # 遍历下拉选项,找到并单击包含特定文本的选项
    target_text = "Example location"
    for option in dropdown_items:
        option_text = option.find_element(By.CSS_SELECTOR, '.mat-option-text').text.strip()
        if option_text == target_text:
            option.click()
            break

    # 找到并单击提交按钮
    submit_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.mat-raised-button')) 
    )
    submit_button.click()

    # 等待页面加载或执行其他操作...

finally:
    # 关闭浏览器
    driver.quit()

请根据你实际的网页结构和元素选择器进行调整。上述代码中,使用了 Selenium 的等待条件来确保元素的可见性和可点击性,以及适当的延迟来等待下拉框的显示和选项的加载。

=================
6问:Traceback (most recent call last):
File “get_appointment.py”, line 140, in
EC.visibility_of_element_located((By.CLASS_NAME, ‘mat-autocomplete-panel’)) # 替换为实际选择器
File “e:\ProgramData\Anaconda3\envs\gyroflow\lib\site-packages\selenium\webdriver\support\wait.py”, line 95, in until
raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:

ChatGPT:

TimeoutException通常意味着Selenium在指定的时间内无法找到期望的元素。这可能是由于以下几个原因导致的:

  1. 元素选择器不正确: 确保使用的选择器(如CLASS_NAME、CSS_SELECTOR等)能够准确地定位到目标元素。有时候网页结构或元素的class或id可能会变化,需要根据实际情况进行调整。

  2. 页面加载时间过长: 如果页面加载速度较慢,可能会导致元素在预期时间内未能加载完成。可以增加等待的时间,或者使用隐式等待来提高稳定性。

  3. 元素确实未出现: 如果元素是动态加载的,并且在指定的等待时间内未能出现,可能需要重新审视页面加载的逻辑和元素的加载时机。

针对你的情况,建议尝试以下几点来解决问题:

  • 确认选择器是否正确: 确保By.CLASS_NAME指向的类名(如mat-autocomplete-panel)确实对应于下拉框的父元素。

  • 增加等待时间: 可以增加等待的时间,例如将WebDriverWait中的等待时间从10秒增加到20秒,看看是否能解决问题。

  • 使用隐式等待: 在创建WebDriver时,可以设置隐式等待时间,以便在查找元素时等待一定的时间,例如driver.implicitly_wait(10),这样可以在找不到元素时自动等待一段时间再重试。

下面是一个调整后的示例代码,增加了一些错误处理和等待时间的调整:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
import time

# 设置WebDriver
driver = webdriver.Chrome(ChromeDriverManager().install())

try:
    # 打开目标网站
    driver.get('https://example.com')  # 替换为实际的URL

    # 找到输入框并单击获取焦点
    input_element = WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable((By.ID, 'mat-input-3'))  # 替换为实际选择器
    )
    input_element.click()

    # 输入文本
    input_element.send_keys('Example location')

    # 等待一段时间,确保下拉框能正确显示
    time.sleep(2)

    # 找到下拉框的父元素
    dropdown_panel = WebDriverWait(driver, 20).until(
        EC.visibility_of_element_located((By.CLASS_NAME, 'mat-autocomplete-panel'))  # 替换为实际选择器
    )

    # 找到所有下拉选项
    dropdown_items = dropdown_panel.find_elements(By.CSS_SELECTOR, 'mat-option')

    # 遍历下拉选项,找到并单击包含特定文本的选项
    target_text = "Example location"
    for option in dropdown_items:
        option_text = option.find_element(By.CSS_SELECTOR, '.mat-option-text').text.strip()
        if option_text == target_text:
            option.click()
            break

    # 找到并单击提交按钮
    submit_button = WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.mat-raised-button')) 
    )
    submit_button.click()

    # 等待页面加载或执行其他操作...

finally:
    # 关闭浏览器
    driver.quit()

请根据具体情况调整等待时间和选择器,确保能够准确地定位到输入框、下拉框以及提交按钮。

=================
7问:Traceback (most recent call last):
File “get_appointment.py”, line 141, in
EC.visibility_of_element_located((By.ID, ‘mat-autocomplete-36’)) # 替换为实际选择器

ChatGPT:

TimeoutException通常表示Selenium在等待期间未能找到预期的元素。这可能是由于以下几个原因导致的:

  1. 选择器不正确: 确保使用的选择器能够准确地定位到目标元素。在你的情况中,使用了By.ID来定位元素,需要确保'mat-autocomplete-36'对应的ID确实存在于页面中。

  2. 页面加载时间过长: 如果页面加载速度较慢,可能会导致元素在预期时间内未能加载完成。可以尝试增加等待的时间。

  3. 元素确实未出现: 如果元素是动态加载的,并且在指定的等待时间内未能出现,可能需要重新审视页面加载的逻辑和元素的加载时机。

在你的代码中,尝试将等待时间从10秒增加到20秒可能会有所帮助。此外,也可以使用隐式等待来提高稳定性。下面是调整后的示例代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
import time

# 设置WebDriver
driver = webdriver.Chrome(ChromeDriverManager().install())

try:
    # 打开目标网站
    driver.get('https://example.com')  # 替换为实际的URL

    # 找到输入框并单击获取焦点
    input_element = WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable((By.ID, 'mat-input-3'))  # 替换为实际选择器
    )
    input_element.click()

    # 输入文本
    input_element.send_keys('Example location')

    # 等待一段时间,确保下拉框能正确显示
    time.sleep(2)

    # 找到下拉框的父元素
    dropdown_panel = WebDriverWait(driver, 20).until(
        EC.visibility_of_element_located((By.ID, 'mat-autocomplete-36'))  # 替换为实际选择器
    )

    # 找到所有下拉选项
    dropdown_items = dropdown_panel.find_elements(By.CSS_SELECTOR, 'mat-option')

    # 遍历下拉选项,找到并单击包含特定文本的选项
    target_text = "Example location"
    for option in dropdown_items:
        option_text = option.find_element(By.CSS_SELECTOR, '.mat-option-text').text.strip()
        if option_text == target_text:
            option.click()
            break

    # 找到并单击提交按钮
    submit_button = WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.mat-raised-button')) 
    )
    submit_button.click()

    # 等待页面加载或执行其他操作...

finally:
    # 关闭浏览器
    driver.quit()

请根据具体情况进一步调整等待时间和选择器,确保能够准确地定位到输入框、下拉框以及提交按钮。

=====================
8问:我发现EC.visibility_of_element_located((By.ID, ‘mat-autocomplete-36’))这个ID中的数值36,每次运行时可能有变化,能否程序中查找<div role=“listbox” …>

ChatGPT:

可以通过查找具有 role="listbox" 属性的 <div> 元素来定位下拉列表。这样可以避免使用动态变化的ID。以下是修改后的代码示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
import time

# 设置WebDriver
driver = webdriver.Chrome(ChromeDriverManager().install())

try:
    # 打开目标网站
    driver.get('https://example.com')  # 替换为实际的URL

    # 找到输入框并单击获取焦点
    input_element = WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable((By.ID, 'mat-input-3'))  # 替换为实际选择器
    )
    input_element.click()

    # 输入文本
    input_element.send_keys('Example location')

    # 等待一段时间,确保下拉框能正确显示
    time.sleep(2)

    # 找到具有 role="listbox" 属性的 <div> 元素
    dropdown_panel = WebDriverWait(driver, 20).until(
        EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[role="listbox"]'))
    )

    # 找到所有下拉选项
    dropdown_items = dropdown_panel.find_elements(By.CSS_SELECTOR, 'mat-option')

    # 遍历下拉选项,找到并单击包含特定文本的选项
    target_text = "Example location"
    for option in dropdown_items:
        option_text = option.find_element(By.CSS_SELECTOR, '.mat-option-text').text.strip()
        if option_text == target_text:
            option.click()
            break

    # 找到并单击提交按钮
    submit_button = WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.mat-raised-button')) 
    )
    submit_button.click()

    # 等待页面加载或执行其他操作...

finally:
    # 关闭浏览器
    driver.quit()

在这个代码中,我们通过 EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[role="listbox"]')) 定位到具有 role="listbox" 属性的 <div> 元素,然后找到其下的所有 <mat-option> 元素,遍历这些选项并找到匹配目标文本的选项,最后进行点击操作。

请根据具体情况进一步调整选择器和等待时间,确保能够准确地定位到输入框、下拉框以及提交按钮。

=======================
9问:问题还是出在input_element.send_keys(‘Example location’)这里,在input元素中输入了字符后没有激活弹出下拉框,这里应该有一个交互过程,因为输入的字符不同,下拉框中的列表项就不同,但程序中没有这个交互过程,而只是等待出现下拉框,应该有错

ChatGPT:

为了触发下拉框的出现,可以尝试在输入框输入字符后,模拟按下键盘上的箭头键或回车键。这种方式可以强制触发下拉框的显示。以下是修改后的代码示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
import time

# 设置WebDriver
driver = webdriver.Chrome(ChromeDriverManager().install())

try:
    # 打开目标网站
    driver.get('https://example.com')  # 替换为实际的URL

    # 找到输入框并单击获取焦点
    input_element = WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable((By.ID, 'mat-input-3'))  # 替换为实际选择器
    )
    input_element.click()

    # 输入文本
    input_element.send_keys('Example location')

    # 模拟按下箭头键或回车键,以触发下拉框
    input_element.send_keys(Keys.DOWN)
    time.sleep(1)  # 等待下拉框显示
    input_element.send_keys(Keys.DOWN)
    time.sleep(1)
    input_element.send_keys(Keys.RETURN)

    # 等待一段时间,确保下拉框能正确显示
    time.sleep(2)

    # 找到具有 role="listbox" 属性的 <div> 元素
    dropdown_panel = WebDriverWait(driver, 20).until(
        EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[role="listbox"]'))
    )

    # 找到所有下拉选项
    dropdown_items = dropdown_panel.find_elements(By.CSS_SELECTOR, 'mat-option')

    # 遍历下拉选项,找到并单击包含特定文本的选项
    target_text = "Example location"
    for option in dropdown_items:
        option_text = option.find_element(By.CSS_SELECTOR, '.mat-option-text').text.strip()
        if option_text == target_text:
            option.click()
            break

    # 找到并单击提交按钮
    submit_button = WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.mat-raised-button')) 
    )
    submit_button.click()

    # 等待页面加载或执行其他操作...

finally:
    # 关闭浏览器
    driver.quit()

在这个代码中,input_element.send_keys(Keys.DOWN)input_element.send_keys(Keys.RETURN) 用于模拟用户按下键盘上的箭头键和回车键,从而触发下拉框的显示。根据需要,可以增加或减少按键的次数。确保在执行这些操作之后添加适当的等待时间,以便下拉框能够正确显示。

请根据具体情况进一步调整选择器和等待时间,确保能够准确地定位到输入框、下拉框以及提交按钮。

================
10问:input_element.send_keys(‘Example’),然后模拟空格键,再input_element最后增加一个空格符,代码如何写?

ChatGPT:

好的,我们可以修改代码为 input_element.send_keys('Example'),然后模拟空格键,并在 input_element 最后增加一个空格符。以下是修改后的代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
import time

# 设置WebDriver
driver = webdriver.Chrome(ChromeDriverManager().install())

try:
    # 打开目标网站
    driver.get('https://example.com')  # 替换为实际的URL

    # 找到输入框并单击获取焦点
    input_element = WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable((By.ID, 'mat-input-3'))  # 替换为实际选择器
    )
    input_element.click()

    # 输入文本 'Port'
    input_element.send_keys('Example')

    # 模拟按下空格键,以触发下拉框
    input_element.send_keys(Keys.SPACE)

    # 在输入框最后增加一个空格符
    input_element.send_keys(' ')

    # 等待一段时间,确保下拉框能正确显示
    time.sleep(2)

    # 找到具有 role="listbox" 属性的 <div> 元素
    dropdown_panel = WebDriverWait(driver, 20).until(
        EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[role="listbox"]'))
    )

    # 找到所有下拉选项
    dropdown_items = dropdown_panel.find_elements(By.CSS_SELECTOR, 'mat-option')

    # 遍历下拉选项,找到并单击包含特定文本的选项
    target_text = "Example location"
    for option in dropdown_items:
        option_text = option.find_element(By.CSS_SELECTOR, '.mat-option-text').text.strip()
        if option_text == target_text:
            option.click()
            break

    # 找到并单击提交按钮
    submit_button = WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.mat-raised-button')) 
    )
    submit_button.click()

    # 等待页面加载或执行其他操作...

finally:
    # 关闭浏览器
    driver.quit()

在这个代码中,input_element.send_keys('Example') 后,通过 input_element.send_keys(Keys.SPACE) 模拟按下空格键,然后再通过 input_element.send_keys(' ') 在输入框最后增加一个空格符。这个过程模拟了用户的输入操作,并且等待下拉框出现。

=============================
11问:程序执行仍然不弹出下拉框,但这时手动输入空格,可以弹出下拉框,说明程序模拟有问题

ChatGPT:

如果手动输入空格可以弹出下拉框,而程序模拟输入空格不行,可能是因为模拟输入的速度太快,或者需要一些其他的交互来触发下拉框弹出。我们可以尝试以下步骤:

  1. 输入 ‘Port’ 后,等待一下,然后再输入空格
  2. 通过JavaScript触发输入事件,以确保下拉框出现。

请尝试以下代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
import time

# 设置WebDriver
driver = webdriver.Chrome(ChromeDriverManager().install())

try:
    # 打开目标网站
    driver.get('https://example.com')  # 替换为实际的URL

    # 找到输入框并单击获取焦点
    input_element = WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable((By.ID, 'mat-input-3'))  # 替换为实际选择器
    )
    input_element.click()

    # 输入文本 'Port'
    input_element.send_keys('Example')

    # 等待一下,让前面的输入生效
    time.sleep(1)

    # 使用JavaScript触发input事件
    driver.execute_script("arguments[0].value = arguments[0].value + ' '", input_element)
    driver.execute_script("arguments[0].dispatchEvent(new Event('input', { bubbles: true }))", input_element)

    # 等待下拉框出现
    dropdown_panel = WebDriverWait(driver, 20).until(
        EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[role="listbox"]'))
    )

    # 找到所有下拉选项
    dropdown_items = dropdown_panel.find_elements(By.CSS_SELECTOR, 'mat-option')

    # 遍历下拉选项,找到并单击包含特定文本的选项
    target_text = "Example location"
    for option in dropdown_items:
        option_text = option.find_element(By.CSS_SELECTOR, '.mat-option-text').text.strip()
        if option_text == target_text:
            option.click()
            break

    # 找到并单击提交按钮
    submit_button = WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.mat-raised-button')) 
    )
    submit_button.click()

    # 等待页面加载或执行其他操作...

finally:
    # 关闭浏览器
    driver.quit()

在这个代码中,driver.execute_script("arguments[0].value = arguments[0].value + ' '", input_element) 用于在输入框中添加一个空格,并通过 driver.execute_script("arguments[0].dispatchEvent(new Event('input', { bubbles: true }))", input_element) 触发输入事件,确保下拉框出现。

====================
12问:仍然没有出现下拉框

ChatGPT:

如果模拟输入仍然无法触发下拉框出现,可以尝试添加更多的延迟或更复杂的模拟输入交互过程。以下是进一步的调整:

  1. 添加延迟:在每个键输入之间添加延迟,确保每个字符输入后有足够的时间让下拉框响应。
  2. 逐字符输入:逐字符输入 ‘Example location’,在每个字符输入后都模拟一个输入事件。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
import time

# 设置WebDriver
driver = webdriver.Chrome(ChromeDriverManager().install())

try:
    # 打开目标网站
    driver.get('https://example.com')  # 替换为实际的URL

    # 找到输入框并单击获取焦点
    input_element = WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable((By.ID, 'mat-input-3'))  # 替换为实际选择器
    )
    input_element.click()

    # 逐字符输入 'Example location'
    text_to_type = 'Example location'
    for char in text_to_type:
        input_element.send_keys(char)
        time.sleep(0.2)  # 添加延迟,确保每个字符输入后有足够的时间

        # 使用JavaScript触发input事件
        driver.execute_script("arguments[0].dispatchEvent(new Event('input', { bubbles: true }))", input_element)

    # 再次等待一下,确保输入生效
    time.sleep(1)

    # 使用空格触发下拉框
    input_element.send_keys(Keys.SPACE)
    driver.execute_script("arguments[0].dispatchEvent(new Event('input', { bubbles: true }))", input_element)

    # 等待下拉框出现
    dropdown_panel = WebDriverWait(driver, 20).until(
        EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[role="listbox"]'))
    )

    # 找到所有下拉选项
    dropdown_items = dropdown_panel.find_elements(By.CSS_SELECTOR, 'mat-option')

    # 遍历下拉选项,找到并单击包含特定文本的选项
    target_text = "Example location"
    for option in dropdown_items:
        option_text = option.find_element(By.CSS_SELECTOR, '.mat-option-text').text.strip()
        if option_text == target_text:
            option.click()
            break

    # 找到并单击提交按钮
    submit_button = WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.mat-raised-button')) 
    )
    submit_button.click()

    # 等待页面加载或执行其他操作...

finally:
    # 关闭浏览器
    driver.quit()

在这个代码中,每个字符输入后都会触发 input 事件,并且添加了适当的延迟,以确保输入的每个字符都有足够的时间被处理,从而使下拉框能够正常弹出。

============================
最终解决问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1900813.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QCustomPlot+ vs2022+ qt

零、printSupport 步骤一&#xff1a;下载QCustomPlot 访问QCustomPlot的官网 QCustomPlot 下载最新版本的源代码。 步骤二&#xff1a;配置项目 创建新的Qt项目&#xff1a; 打开VS2022&#xff0c;创建一个新的Qt Widgets Application项目。 将QCustomPlot源代码添加到项目…

C语言编程与进阶

1.0 C语言关键字 1-1C语言关键字-CSDN博客文章浏览阅读831次&#xff0c;点赞13次&#xff0c;收藏24次。define使用define定义常量return 0;使用define定义宏// define 定义宏&#xff0c;名字是ADD(x,y),x y 是宏的参数int a 10;int b 20;return 0;宏定义的本质是替换&am…

JavaEE——计算机工作原理

冯诺依曼体系&#xff08;VonNeumannArchitecture&#xff09; 现代计算机&#xff0c;大多遵守冯诺依曼体系结构 CPU中央处理器&#xff1a;进行算术运算与逻辑判断 存储器&#xff1a;分为外存和内存&#xff0c;用于存储数据&#xff08;使用二进制存储&#xff09; 输入…

百日筑基第十二天-入门Elasticsearch

百日筑基第十二天-入门Elasticsearch Elasticsearch 是什么 Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎。 安装 Elasticsearch 下载&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch Elasticsearch 是免安装的&#xff0c;只需要把 zip…

绝了,华为伸缩摄像头如何突破影像边界?

自华为Pura70 Ultra超聚光伸缩镜头诞生以来&#xff0c;备受大家的关注&#xff0c;听说这颗镜头打破了传统手机的摄像头体积与镜头的设计&#xff0c;为我们带来了不一样的拍照体验。 智能手机飞速发展的今天&#xff0c;影像功能已经成为我们衡量一款手机性能的重要指标。想…

【Qt5.12.9】程序无法显示照片问题(已解决)

问题记录&#xff1a;Qt5.12.9下无法显示照片 我的工程名为03_qpainter&#xff0c;照片cd.png存放在工程目录下的image文件夹中。 /03_qpainter/image/cd.png 因为这是正点原子Linux下Qt书籍中的例程&#xff0c;在通过学习其配套的例程中的项目&#xff0c;发现我的项目少…

Python的招聘数据分析与可视化管理系统-计算机毕业设计源码55218

摘要 随着互联网的迅速发展&#xff0c;招聘数据在规模和复杂性上呈现爆炸式增长&#xff0c;对数据的深入分析和有效可视化成为招聘决策和招聘管理的重要手段。本论文旨在构建一个基于Python的招聘数据分析与可视化管理系统。 该平台以主流招聘平台为数据源&#xff0c;利用Py…

昇思25天学习打卡营第1天|初识MindSpore

# 打卡 day1 目录 # 打卡 day1 初识MindSpore 昇思 MindSpore 是什么&#xff1f; 昇思 MindSpore 优势|特点 昇思 MindSpore 不足 官方生态学习地址 初识MindSpore 昇思 MindSpore 是什么&#xff1f; 昇思MindSpore 是全场景深度学习架构&#xff0c;为开发者提供了全…

Ubuntu固定虚拟机的ip地址

1、由于虚拟机网络是桥接&#xff0c;所以ip地址会不停地变化&#xff0c;接下来我们就讲述ip如何固定 2、如果apt安装时报错W: Target CNF (multiverse/cnf/Commands-all) is configured multiple times in /etc/apt/sources.list:10&#xff0c; 检查 /etc/apt/sources.list…

计算机组成原理--概述

&#x1f308;个人主页&#xff1a;小新_- &#x1f388;个人座右铭&#xff1a;“成功者不是从不失败的人&#xff0c;而是从不放弃的人&#xff01;”&#x1f388; &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f3c6;所属专栏&#xff1…

AI Earth应用—— 在线使用sentinel数据VV和VH波段进行水体提取分析(昆明抚仙湖、滇池为例)

AI Earth 本文的主要目的就是对水体进行提取,这里,具体的操作步骤很简单基本上是通过,首页的数据检索,选择需要研究的区域,然后选择工具箱种的水体提取分析即可,剩下的就交给阿里云去处理,结果如下: 这是我所选取的一景影像: 详情 卫星: Sentinel-1 级别: 1 …

Redis IO多路复用

0、前言 本文所有代码可见 > 【gitee code demo】 本文涉及的主题&#xff1a; 1、BIO、NIO的业务实践和缺陷 2、Redis IO多路复用&#xff1a;redis快的主要原因 3、epoll 架构 部分图片 via 【epoll 原理分析】 1、BIO单线程版 1.1 业务代码 client client代码相同…

Proxmox VE 8虚拟机直通USB磁盘

作者&#xff1a;田逸&#xff08;fromyz&#xff09; 今天有个兄弟发消息&#xff0c;咨询怎么让插在服务器上的U盾被Proxmox VE上的虚拟机识别。在很久很久以前&#xff0c;我尝试过在Proxmox VE 5以前的版本创建windows虚拟机&#xff0c;并把插在Proxmox VE宿主机上的银行U…

Vue3基础(二)

一、搭建工程(vite) ## 1.创建命令 npm create vuelatest## 2.具体配置 ## 配置项目名称 √ Project name: vue3_test ## 是否添加TypeScript支持 √ Add TypeScript? Yes ## 是否添加JSX支持 √ Add JSX Support? No ## 是否添加路由环境 √ Add Vue Router for Single P…

【matlab】智能优化算法——基准测试函数

智能优化算法的基准测试函数是用于评估和优化算法性能的一组标准问题。这些测试函数模拟了真实世界优化问题的不同方面&#xff0c;包括局部最小值、全局最优解、高维度、非线性、不连续等复杂性。以下是对智能优化算法基准测试函数的详细归纳&#xff1a; 测试函数的分类&…

使用nohup和CUDA_VISIBLE_DEVICES进行GPU训练的教程

文章目录 1. 在单个GPU上训练模型1.1 使用nohup命令运行Python脚本1.2 查看运行中的进程1.3 查看输出日志 2. 在多个GPU上训练模型2.1 启动第一个程序&#xff0c;指定使用第0号GPU2.2 启动第二个程序&#xff0c;指定使用第1号GPU2.3 查看运行中的进程2.4 查看输出日志 3. 总结…

【不容错过】可灵AI重磅更新:画质升级,运镜控制,首尾帧自定义,还有30万创作激励奖金!

还记得最近在各大平台肆虐的老照片变成视频吗&#xff0c;就是用快手的可灵AI做的&#xff0c;今天可灵又迎来了一次重大更新。 「电脑端上线了」 之前一直用其他工具生的图片还需要保存到手机上&#xff0c;再用可灵来生成视频&#xff0c;很多人都能感受到手机操作不太方便&…

【ARMv8/v9 GIC 系列 5.6 -- GIC 超优先级中断详细介绍】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 Interrupt superpriority超优先级中断的特性和应用Physical interface interrupt signalsPhysical Group 1 Non-NMI for Current Security StatePhysical Group 1 for Other Security State, or a Group 0 Non-NMIPhysical Group 1 …

上海外贸建站公司wordpress模板推荐

Sora索啦高端制造业wordpress主题 红色高端制造业wordpress主题&#xff0c;适合外贸企业出海建独立站的wordpress模板。 https://www.jianzhanpress.com/?p5885 Yamal外贸独立站wordpress主题 绿色的亚马尔Yamal外贸独立站wordpress模板&#xff0c;适用于外贸公司建独立站…

Akamai+Noname强强联合 | API安全再加强

最近&#xff0c;Akamai正式完成了对Noname Security的收购。本文我们将向大家介绍&#xff0c;经过本次收购后&#xff0c;Akamai在保护API安全性方面的后续计划和未来愿景。 Noname Security是市场上领先的API安全供应商之一&#xff0c;此次收购将让Akamai能更好地满足日益增…