Selenium键盘Ctrl+v操作调试成功但正式运行不成功

python中Selenium键盘Ctrl+v操作,调试的时候可以成功实现,但正式运行的时候不成功
python源代码如下

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
# 导入时间包
from time import sleep
# 导入Keys包(键盘控制)
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get('https://www.csdn.net/')
# driver.get('https://blog.csdn.net/YON_dog')
sleep(1)

# 定位'会员中心'栏  find(找到)  element(移动)
collect = driver.find_element(By.XPATH,'//*[@id="csdn-toolbar"]/div/div/div[3]/div/div[2]/a')
# 悬浮至'会员中心'标签处   move(移动)             perform(执行)
ActionChains(driver).move_to_element(collect).perform()
sleep(1)

# 定位文本框并输入文本                                send(发送)  key(键)
driver.find_element(By.ID,'toolbar-search-input').send_keys('YON_dogs')
sleep(1)
# 模拟回车键进行跳转(输入内容后)                                      ENTER(输入)
driver.find_element(By.ID,'toolbar-search-button').send_keys(Keys.ENTER)
sleep(1)

# 此时会打开一个新的页面,但代码并没有切换到最新页面中,所以标签定位会定位不到
# 获取打开的多个窗口句柄    handles(处理)
windows = driver.window_handles
# 切换到当前最新打开的窗口   switch(开关)
driver.switch_to.window(windows[-1])
sleep(1)

# 使用Backspace来删除一个字符                                       BACK_SPACE(退格)
driver.find_element(By.XPATH,'//*[@id="keyword"]').send_keys(Keys.BACK_SPACE)
sleep(1)
# Ctrl+A 全选输入框中的内容                                         CONTROL(控制)
driver.find_element(By.XPATH,'//*[@id="keyword"]').send_keys(Keys.CONTROL,'a')
sleep(1)
# Ctrl+C 复制输入框中的内容
driver.find_element(By.XPATH,'//*[@id="keyword"]').send_keys(Keys.CONTROL,'c')
sleep(1)
# Ctrl+V 粘贴输入框中的内容
driver.find_element(By.XPATH,'//*[@id="keyword"]').send_keys(Keys.CONTROL,'v')
sleep(1)
# 回车键
driver.find_element(By.XPATH,'//*[@id="keyword"]').send_keys(Keys.ENTER)

下面是调试截图

img

img

页面是能显示粘贴成功的,并且回车再次搜索时是以粘贴之后的内容进行搜索的

img

但在正式页面粘贴不成功,回车再次搜索时也是以粘贴之前的内容进行搜索

img

请问这是为什么呢?应该怎么解决呢?

该回答引用GPTᴼᴾᴱᴺᴬᴵ
这可能是因为在实际运行时,Selenium有时候无法正确地获取当前浏览器窗口的焦点,因此Ctrl + v操作可能不起作用。为了解决这个问题,你可以尝试使用ActionChains类的send_keys_to_element()方法,该方法可以发送一系列按键操作,包括Ctrl + v。以下是一个可能的解决方案:

from selenium.webdriver.common.action_chains import ActionChains

# 定位输入框
input_box = driver.find_element(By.XPATH,'//*[@id="keyword"]')

# 复制内容
input_box.send_keys(Keys.CONTROL, 'a')
input_box.send_keys(Keys.CONTROL, 'c')

# 粘贴内容
ActionChains(driver).move_to_element(input_box).click().key_down(Keys.CONTROL).send_keys('v').key_up(Keys.CONTROL).perform()

# 回车
input_box.send_keys(Keys.ENTER)


这个解决方案将使用ActionChains类模拟粘贴操作。首先,使用send_keys()方法将内容复制到剪贴板。然后,使用move_to_element()方法将鼠标移动到输入框上,并使用click()方法单击输入框以确保它已获取焦点。接下来,使用key_down()方法按下Ctrl键,然后使用send_keys()方法发送字符'v',最后使用key_up()方法释放Ctrl键。最后,使用send_keys()方法发送回车键。这应该可以正确地执行Ctrl + v操作。

解决方法 :在粘贴之前再点击一下输入框就行了。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
# 导入时间包
from time import sleep
# 导入Keys包(键盘控制)
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get('https://www.csdn.net/')
# driver.get('https://blog.csdn.net/YON_dog')
sleep(1)

# 定位'会员中心'栏  find(找到)  element(移动)
collect = driver.find_element(By.XPATH, '//*[@id="csdn-toolbar"]/div/div/div[3]/div/div[2]/a')
# 悬浮至'会员中心'标签处   move(移动)             perform(执行)
ActionChains(driver).move_to_element(collect).perform()
sleep(1)

# 定位文本框并输入文本                                send(发送)  key(键)
driver.find_element(By.ID, 'toolbar-search-input').send_keys('YON_dogs')
sleep(1)
# 模拟回车键进行跳转(输入内容后)                                      ENTER(输入)
driver.find_element(By.ID, 'toolbar-search-button').send_keys(Keys.ENTER)
sleep(1)

# 此时会打开一个新的页面,但代码并没有切换到最新页面中,所以标签定位会定位不到
# 获取打开的多个窗口句柄    handles(处理)
windows = driver.window_handles
# 切换到当前最新打开的窗口   switch(开关)
driver.switch_to.window(windows[-1])
sleep(1)

# 使用Backspace来删除一个字符                                       BACK_SPACE(退格)
driver.find_element(By.XPATH, '//*[@id="keyword"]').send_keys(Keys.BACK_SPACE)
sleep(1)
# Ctrl+A 全选输入框中的内容                                         CONTROL(控制)
driver.find_element(By.XPATH, '//*[@id="keyword"]').send_keys(Keys.CONTROL, 'a')
sleep(1)
# Ctrl+C 复制输入框中的内容
text = driver.find_element(By.XPATH, '//*[@id="keyword"]').send_keys(Keys.CONTROL, 'c')
sleep(1)
# Ctrl+V 粘贴输入框中的内容
driver.find_element(By.XPATH,'//*[@id="keyword"]').click()

driver.find_element(By.XPATH, '//*[@id="keyword"]').send_keys(Keys.CONTROL, 'v')
sleep(1)

# 回车键
driver.find_element(By.XPATH, '//*[@id="keyword"]').send_keys(Keys.ENTER)

效果 :

img

原因 :。。我猜是调试的时候在执行粘贴操作时可能默认先执行点击,再进行粘贴,而实际执行过程中,由于都是针对同一个元素,就不会有额外点击的动作,粘贴时将原本的Yon_dog给覆盖了。也就达不成我们想要的结果