ChatGPT对话:Python程序自动模拟操作网页,无法弹出下拉列表框
【编者按】需要编写Python程序自动模拟操作网页。编者有编程经验,但没有前端编程经验,完全不知道如何编写这种程序。通过与ChatGPT讨论,1天完成了任务。因为没有这类程序的编程经验,需要边学习,边编程,遇到问题再网上查资料。如果没有ChatGPT,估计至少需要5天时间。
从登录开始模拟,直到完成任务,中间遇到了非常多的问题,其中耽误时间最长,与ChatGPT讨论最多的,就是下面记录的问题。
问题描述:为了规范用户输入信息,网页中有一个input框,随着用户输入字符到某个单词后,会弹出一个下拉列表框,然后要求用户单击表中列表项完成输入。遇到的问题是模拟了输入后始终不弹出下拉列表框。
下面是与ChatGPT解决问题的过程记录。
=========================================
1问:网页中,这个input是可以跟踪输入的,当输入字符后,有下拉列表框,再单击其中的列表项
ChatGPT:
如果你需要在输入后选择下拉列表框中的项,可以按照以下步骤进行操作:
- 输入文本: 使用
send_keys()
方法向输入框输入文本。 - 等待下拉列表框出现: 使用显式等待 (
WebDriverWait
) 等待下拉列表框的出现。 - 选择列表项: 单击所需的列表项。
下面是更新后的示例代码,假设下拉列表框的选择项使用 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()
方法输入文本后没有正确显示下拉框,这可能是由于以下几个原因导致的:
-
输入速度和事件触发: 有些网页的下拉框可能需要一定的时间来响应输入内容并显示匹配的下拉选项。有时候,输入过快可能会导致下拉框没有正确显示。你可以在
send_keys()
后加入适当的等待时间。 -
输入内容是否匹配: 确保使用
send_keys()
输入的内容与下拉框中的选项匹配。有时输入的内容不精确可能导致下拉框没有正确显示。 -
页面动态加载: 如果页面使用了动态加载或者 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:
是的,有些网页中的输入框可能需要先单击获取焦点,然后才能正确输入内容并触发下拉框的显示。这种情况下,可以通过以下方式调整代码:
-
先单击获取焦点: 在使用
send_keys()
方法之前,先使用click()
方法单击输入框,确保输入框获取了焦点。 -
输入文本后等待: 在输入文本后,等待一段时间以确保下拉框能正确显示。
下面是一个示例代码,演示了先单击输入框获取焦点,然后输入文本并等待一段时间,最后选择特定的下拉列表项和点击提交按钮的操作:
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在指定的时间内无法找到期望的元素。这可能是由于以下几个原因导致的:
-
元素选择器不正确: 确保使用的选择器(如CLASS_NAME、CSS_SELECTOR等)能够准确地定位到目标元素。有时候网页结构或元素的class或id可能会变化,需要根据实际情况进行调整。
-
页面加载时间过长: 如果页面加载速度较慢,可能会导致元素在预期时间内未能加载完成。可以增加等待的时间,或者使用隐式等待来提高稳定性。
-
元素确实未出现: 如果元素是动态加载的,并且在指定的等待时间内未能出现,可能需要重新审视页面加载的逻辑和元素的加载时机。
针对你的情况,建议尝试以下几点来解决问题:
-
确认选择器是否正确: 确保
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在等待期间未能找到预期的元素。这可能是由于以下几个原因导致的:
-
选择器不正确: 确保使用的选择器能够准确地定位到目标元素。在你的情况中,使用了
By.ID
来定位元素,需要确保'mat-autocomplete-36'
对应的ID确实存在于页面中。 -
页面加载时间过长: 如果页面加载速度较慢,可能会导致元素在预期时间内未能加载完成。可以尝试增加等待的时间。
-
元素确实未出现: 如果元素是动态加载的,并且在指定的等待时间内未能出现,可能需要重新审视页面加载的逻辑和元素的加载时机。
在你的代码中,尝试将等待时间从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:
如果手动输入空格可以弹出下拉框,而程序模拟输入空格不行,可能是因为模拟输入的速度太快,或者需要一些其他的交互来触发下拉框弹出。我们可以尝试以下步骤:
- 输入 ‘Port’ 后,等待一下,然后再输入空格。
- 通过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:
如果模拟输入仍然无法触发下拉框出现,可以尝试添加更多的延迟或更复杂的模拟输入交互过程。以下是进一步的调整:
- 添加延迟:在每个键输入之间添加延迟,确保每个字符输入后有足够的时间让下拉框响应。
- 逐字符输入:逐字符输入 ‘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
事件,并且添加了适当的延迟,以确保输入的每个字符都有足够的时间被处理,从而使下拉框能够正常弹出。
============================
最终解决问题。
相关文章:
ChatGPT对话:Python程序自动模拟操作网页,无法弹出下拉列表框
【编者按】需要编写Python程序自动模拟操作网页。编者有编程经验,但没有前端编程经验,完全不知道如何编写这种程序。通过与ChatGPT讨论,1天完成了任务。因为没有这类程序的编程经验,需要边学习,边编程,遇到…...
Unity 之 抖音小游戏集成排行榜功能详解
Unity 之 抖音小游戏集成排行榜功能详解 一,前言1.1 为游戏设计利于传播的元素2.2 多人竞技、社交传播二,集成说明2.1 功能介绍2.2 完整代码2.3 效果展示三,发现的问题和迭代计划一,前言 对于 Unity 开发者而言,在开发抖音小游戏时集成排行榜功能是提升游戏社交性和玩…...
【学习笔记】Redis学习笔记——第13章 客户端
第13章 客户端 redisServer通过clients链表保存全部客户端的状态信息。 13.1 客户端属性 13.1.1 套接字描述符 fd:-1时伪客户端,载入AOF文件或Lua脚本。 13.1.2 名字 默认无客户端名,可以通过SETNAME命令设置。 13.1.3 标志 flags&am…...
Android中的JSON解析:从基础到实践
在Android应用开发中,JSON(JavaScript Object Notation)是最常用的数据交换格式之一,因其轻量级、易读性强以及跨平台兼容性好等特点,被广泛应用于服务器与客户端之间的数据传输。解析JSON数据对于提取和处理这些信息至…...
力扣-回溯法
何为回溯法? 在搜索到某一节点的时候,如果我们发现目前的节点(及其子节点)并不是需求目标时,我们回退到原来的节点继续搜索,并且把在目前节点修改的状态还原。 记住两个小诀窍,一是按引用传状态…...
240713_昇思学习打卡-Day25-LSTM+CRF序列标注(4)
240713_昇思学习打卡-Day25-LSTMCRF序列标注(4) 最后一天咯,做第四部分。 BiLSTMCRF模型 在实现CRF后,我们设计一个双向LSTMCRF的模型来进行命名实体识别任务的训练。模型结构如下: nn.Embedding -> nn.LSTM -&…...
python requests关闭https校验
python requests关闭https校验 import requests# 关闭SSL验证 requests.get(https://***.com, verifyFalse)...
PG大会周五于杭州举办;Pika发布4.0;阿里云MySQL上线Zero-ETL集成能力
重要更新 1. PostgreSQL中国技术大会举行12日(周五)于杭州举办,是PostgreSQL社区年度的大会,举办地点:杭州君尚云郦酒店(杭州市上城区临丁路1188号),感兴趣的可以考虑现场参加 ( [1]…...
虚拟机vmware网络设置
一、网络分类 打开vmware workstation网络编辑器可以知道有三种网络类型,分别是:桥接模式、nat模式、仅主机模式。 1、桥接模式 桥接模式是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信。在桥接的作用下, 类似于把物理主机虚拟为一个交换机, 所有设…...
数学建模国赛入门指南
文章目录 认识数学建模及国赛认识数学建模什么是数学建模?数学建模比赛 国赛参赛规则、评奖原则如何评省、国奖评奖规则如何才能获奖 国赛赛题分类及选题技巧国赛赛题特点赛题分类 国赛历年题型及优秀论文 数学建模分工技巧数模必备软件数模资料文献数据收集资料收集…...
Java基础之集合
集合和数组的类比 数组: 长度固定可以存基本数据类型和引用数据类型 集合: 长度可变只能存引用数据类型存储基本数据类型要把他转化为对应的包装类 ArrayList集合 ArrayList成员方法 添加元素 删除元素 索引删除 查询 遍历数组...
深度学习和NLP中的注意力和记忆
深度学习和NLP中的注意力和记忆 文章目录 一、说明二、注意力解决了什么问题?#三、关注的代价#四、机器翻译之外的关注#五、注意力(模糊)记忆?# 一、说明 深度学习的最新趋势是注意力机制。在一次采访中,现任 OpenAI 研…...
自用的C++20协程学习资料
C20的一个重要更新就是加入了协程。 在网上找了很多学习资料,看了之后还是不明白。 最后找到下面这些资料总算是讲得比较明白,大家可以按照顺序阅读: 渡劫 C 协程(1):C 协程概览C20协程原理和应用...
【C++】优先级队列(底层代码解释)
一. 定义 优先级队列是一个容器适配器,他可以根据不同的需求采用不同的容器来实现这个数据结构,优先级队列采用了堆的数据结构,默认使用vector作为容器,且采用大堆的结构进行存储数据。 (1)在第一个构造函数…...
华为模拟器防火墙配置实验(二)
一.实验拓扑 二.实验要求 1,DMZ区内的服务器,办公区仅能在办公时间内(9:00 - 18:00)可以访问,生产区的设备全天可以访问. 2,生产区不允许访问互联网,办公区和游客区允许…...
group 与查询字段
需求 每周周一,统计菜单在过去一周,点击次数,和点击人数(同一个人访问多次按一次计算) 表及数据 日志表 CREATE TABLE t_data_log ( id varchar(50) NOT NULL COMMENT 主键id, operation_object varchar(500) DE…...
PlantUML 教程:绘制时序图
绘制时序图是 PlantUML 的一个强大功能,下面是详细的 PlantUML 时序图教程,帮助你理解如何使用它来创建清晰的时序图。 基本概念 时序图(Sequence Diagram)用于展示对象之间的交互以及它们之间的消息传递顺序。它主要由以下元素…...
自定义ViewGroup-流式布局FlowLayout(重点:测量和布局)
效果 child按行显示,显示不下就换行。 分析 继承ViewGrouponDraw()不重写,使用ViewGroup的测量-重点 (测量child、测量自己)布局-重点 (布局child) 知识点 执行顺序 构造函数 -> onMeasure() -> …...
C++的入门基础(二)
目录 引用的概念和定义引用的特性引用的使用const引用指针和引用的关系引用的实际作用inlinenullptr 引用的概念和定义 在语法上引用是给一个变量取别名,和这个变量共用同一块空间,并不会给引用开一块空间。 取别名就是一块空间有多个名字 类型& …...
显示产业如何突破芯片短板
尽管中国在显示IC领域面临一定的不足,但新技术的不断涌现为中国企业提供了重要的发展机遇。随着手机、平板电脑和液晶电视对显示屏性能要求的不断提高,显示驱动IC也必须相应地发展,向更高分辨率、更大尺寸和更低功耗的方向迈进。例如…...
STM32HAL库+ESP8266+cJSON+微信小程序_连接华为云物联网平台
STM32HAL库ESP8266cJSON微信小程序_连接华为云物联网平台 实验使用资源:正点原子F407 USART1:PA9P、A10(串口打印调试) USART3:PB10、PB11(WiFi模块) DHT11:PG9(采集数据…...
debian或Ubuntu中开启ssh允许root远程ssh登录的方法
debian或Ubuntu中开启ssh允许root远程ssh登录的方法 前因: 因开发需要,需要设置开发板的ssh远程连接。 操作步骤如下: 安装openssh-server sudo apt install openssh-server设置root用户密码: sudo passwd root允许root用户…...
C++《日期》实现
C《日期》实现 头文件实现文件 头文件 在该文件中是为了声明函数和定义类成员 using namespace std; class Date {friend ostream& operator<<(ostream& out, const Date& d);//友元friend istream& operator>>(istream& cin, Date& d);//…...
【面试题】MySQL(第三篇)
目录 1. MySQL中如何处理死锁? 2. MySQL中的主从复制是如何实现的? 3. MySQL中的慢查询日志是什么?如何使用它来优化性能? 4.存储过程 一、定义与基本概念 二、特点与优势 三、类型与分类 四、创建与执行 五、示例 六、总…...
tensorflow之欠拟合与过拟合,正则化缓解
过拟合泛化性弱 欠拟合解决方法: 增加输入特征项 增加网络参数 减少正则化参数 过拟合的解决方法: 数据清洗 增大训练集 采用正则化 增大正则化参数 正则化缓解过拟合 正则化在损失函数中引入模型复杂度指标,利用给w增加权重,…...
vue实现a-model弹窗拖拽移动
通过自定义拖拽指令实现 实现效果 拖动顶部,可对整个弹窗实施拖拽(如果需要拖动底部、中间内容实现拖拽,把下面的ant-modal-header对应改掉就行) 代码实现 编写自定义指令 新建一个ts / js文件,用ts举例 import V…...
速盾:如何加强网站的安全性
随着互联网的快速发展,网站的安全性变得越来越重要。CDN(内容分发网络)是一种常见的网络加速服务,它可以将网站的静态内容分发到全球各地的服务器上,以提供更快的访问速度。然而,CDN 也存在一些安全风险&am…...
【PyTorch单点知识】自动求导机制的原理与实践
文章目录 0. 前言1. 自动求导的基本原理2. PyTorch中的自动求导2.1 创建计算图2.2 反向传播2.3 反向传播详解2.4 梯度清零2.5 定制自动求导 3. 代码实例:线性回归的自动求导4. 结论 0. 前言 按照国际惯例,首先声明:本文只是我自己学习的理解&…...
【Java】搜索引擎设计:信息搜索怎么避免大海捞针?
一、内容分析 我们准备开发一个针对全网内容的搜索引擎,产品名称为“Bingoo”。 Bingoo的主要技术挑战包括: 针对爬虫获取的海量数据,如何高效地进行数据管理;当用户输入搜索词的时候,如何快速查找包含搜索词的网页…...
【Python】ModuleNotFoundError: No module named ‘distutils.util‘ bug fix
【Python】ModuleNotFoundError: No module named distutils.util bug fix 1. error like this2. how to fix why this error occured , because i remove the origin version python of ubuntu of 20.04. then the system trapped in tty1 , you must make sure the laptop li…...
莆田哪里有做网站的/如何进行搜索引擎优化
不敢发首页,放在家里纯属观摩 上回:博客园的故事-愤怒时的呐喊 上回说到,摩登女郎并不安分,偶尔制造“门事件”扩大影响,一时和尚门看到也颇感新鲜,竞相传阅,一时不亦乐乎…...
做课件可赚钱的网站/品牌推广公司
简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。 首先:强调一个概念定义一个函数为虚函数,不代表函数为不被实现的函数。定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。定义一个函数为纯虚函数࿰…...
做国外网站用什么颜色/潍坊网站seo
网上各种的说法,不外乎这么几种 第一种简单的说呢就是这样的: 第一步:客户机提出域名解析请求,并将该请求发送给本地的域名服务器。 第二步:当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器…...
WordPress多站點支付插件/中国优化网
26 内积 给定长度为NNN的AAA数组,长度为KKK的BBB数组 你可以从AAA数组里取KKK个数 规则如下: 每个AiA_iAi只能被取出一次 i1oriNi1 \quad or \quad iNi1oriN 可以直接取出AiA_i\quadAi 2≤i≤N−12 \leq i \leq N-1\quad2≤i≤N…...
网站建设合同付款方式/郑州seo排名哪有
PaaS选择多多 首先,我想我们恐怕需要给平台即服务(PaaS)下个定义。PaaS环境是云计算服务平台,让开发人员可以构建并管理其Web应用程序,没必要面临基础设施的搭建和维护带来的复杂性。 或者换而言之:PaaS平台…...
切图做网站/二次感染即将大爆发
传送门 题意:有个房间,房间的值用四面的门加起来的值表示,非常巧妙,西门用1表示,北门用2表示,东门用4表示,南门用8表示,最后判断是否连通的方法使用&,非常巧妙。 题…...