Selenium与Python:Shift+Enter的换行符起作用,但会弄乱文本

2024-09-28 05:18:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试自动发送消息,因此我需要转到一个换行符,我通过使用Shift+Enter来完成,就像在this线程中回答的那样

这是我的代码:

string = f"Lorem ipsum dolor sit amet\nconsectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.\n\nPS: Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus."
action = ActionChains(browser)
for part in string.split('\n'):
            action.send_keys(part)
            action.key_down(Keys.SHIFT).key_down(Keys.ENTER).key_up(Keys.ENTER).key_up(Keys.SHIFT).perform()

我应该得到的输出是:

Lorem ipsum dolor sit amet
consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.

PS: Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

但我得到的结果更像是:

Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet consectetuer adipiscing elit. Aenean commodo ligula eget Lorem ipsum dolor sit amet consectetuer adipiscing elit. Lorem ipsum dolor sit amet consectetuer adipiscing elit. Lorem ipsum dolor sit amet consectetuer adipiscing elit. Lorem ipsum dolor sit amet consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.  PS: Cum sociis natoque penatibus et magnis dis parturient montes, Lorem ipsum dolor sit amet consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.  PS: Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. nascetur ridiculus mus.
Aenean commodo ligula eget dolor. Aenean massa.  
Aenean commodo ligula eget dolor. Aenean massa. 
Aenean commodo ligula eget dolor. Aenean massa. 
dolor. Aenean massa.

有什么想法吗?提前谢谢

编辑:为了获得更多的上下文信息,我想在messenger.com中编写,因此我不能只执行Keys.ENTER,我必须执行SHIFT+ENTER


Tags: keysipsumloremdolorametsitcumelit
3条回答

您必须重置操作以删除内存中的操作,否则在执行操作时,它也将重复前面的操作:

如果您使用的是selenium v3:

有两种解决方案:

第一个:

在for循环内移动操作声明:

for part in string.split('\n'):
    action = webdriver.ActionChains(driver)
    action.send_keys(part)
    action.key_down(Keys.SHIFT).key_down(Keys.ENTER).key_up(
        Keys.ENTER).key_up(Keys.SHIFT).perform()

这将重置操作顺序

第二次接近:

为此,在操作链中有reset_actions()方法,但有一个:

https://github.com/SeleniumHQ/selenium/issues/6837

因此,请使用以下方法:

for part in string.split('\n'):
    print(part)
    action.send_keys(part)
    action.key_down(Keys.SHIFT).key_down(Keys.ENTER).key_up(
        Keys.ENTER).key_up(Keys.SHIFT).perform()
    action.w3c_actions.clear_actions()
    for device in action.w3c_actions.devices:
      device.clear_actions()

如果您使用的是selenium v4:

该错误已修复:

要安装selenium v4:pip install selenium==4.0.0.a7

for part in string.split('\n'):
    action.send_keys(part)
    action.key_down(Keys.SHIFT).key_down(Keys.ENTER).key_up(
        Keys.ENTER).key_up(Keys.SHIFT).perform()
   action.reset_actions()

与此同时,我已经用一种可怕的、不可伸缩的方式完成了这项工作,但现在它完成了这项工作

代码如下:

one = 'Lorem ipsum dolor sit amet'
two = 'Consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.'
last = 'PS: Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.'

action = ActionChains(browser)
def newline():
    action.key_down(Keys.SHIFT).key_down(Keys.ENTER).key_up(Keys.ENTER).key_up(Keys.SHIFT)

action.send_keys(one)
newline()
action.send_keys(two)
newline()
newline()
action.send_keys(last)
action.perform()

我不会接受这个答案,因为它非常糟糕,所以如果有人想给出一个更好、更清晰的答案,我完全欢迎

如果对你有用,请现在告诉我

字符串由newline运算符分割,因此必须使用额外的换行符对其进行增强

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

driver = webdriver.Chrome('/home/stefan/Downloads/chromedriver')
driver.get("https://pastebin.com/")
text_area = driver.find_element_by_id("postform-text")

string = "Lorem ipsum dolor sit amet\nconsectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.\n\nPS: Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus."
#action = ActionChains(browser)
for part in string.split('\n'):
        print(part)
        text_area.send_keys(part)
        text_area.send_keys(Keys.ENTER)
                      
#action.key_down(Keys.SHIFT).key_down(Keys.ENTER).key_up(Keys.ENTER).key_up(Keys.SHIFT).perform()
            
driver.close()

我得到的结果是: enter image description here

更新-作为单个消息发送

如果你想把它作为一个单一的消息发送,那么你就不必拆分它

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

driver = webdriver.Chrome('/home/stefan/Downloads/chromedriver')
driver.get("https://pastebin.com/")
text_area = driver.find_element_by_id("postform-text")

string = "Lorem ipsum dolor sit amet\nconsectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.\n\nPS: Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus."

# send as single message
text_area.send_keys(part)
text_area.send_keys(Keys.ENTER)
 
driver.close()

更新2-特别针对信使

如果我是对的,您希望按多个键在messenger中获得新行,因此您可以尝试text_area.send_keys(Keys.SHIFT + Keys.ENTER).perform();

for part in string.split('\n'):
        text_area.send_keys(part)
        text_area.send_keys(Keys.SHIFT + Keys.ENTER).perform();

相关问题 更多 >

    热门问题