使用 Python/Selenium 在 WordPress 中编辑链接



我正在尝试编辑WordPress页面的链接,作为自动化更大过程的一部分。 我已经设法登录管理仪表板,上传一个新文件,并获取该新文件的URL。 现在我需要更新特定页面上的链接以指向该文件。

通常,我通过该页面的管理仪表板"手动"完成此操作。 我正在尝试使用Python/Selenium来做到这一点,但是我陷入了如何编辑该链接

的困境。为更新而编辑;这是我作为一个相对独立的代码示例:

from selenium import webdriver
browser = webdriver.Chrome()
browser.get('http://example.com/wp-admin')
assert 'Log In' in browser.title
wp_login = browser.find_element_by_id('user_login')
wp_login.send_keys('admin')
wp_passwd = browser.find_element_by_id('user_pass')
wp_passwd.send_keys('foobarbaz')
wp_submit = browser.find_element_by_id('wp-submit')
wp_submit.click()
assert 'Dashboard' in browser.title
# Open up the Newsletter page in 'Edit' mode
browser.get('http://www.example.com/wp-admin/post.php?post=6&action=edit')
assert 'Edit Page' in browser.title
header = browser.find_element_by_tag_name('h4')
header.click()
edit_button = browser.find_element_by_class_name('dashicons-edit')
edit_button.click()
txtBox = browser.find_element_by_class_name('editor-url-input')
txtBox = browser.find_element_by_css_selector('#editor > div > div > div > div:nth-child(4) > div > div > div > div > div > form > div > input[type="text"]')
txtBox.clear()
txtBox.send_keys('http://www.example.com/wp-content/uploads/2019/08/lorem-ipsum.pdf')
submit = browser.find_element_by_class_name('dashicons-editor-break')
txtBox.submit()
updateBtn = browser.find_element_by_class_name('editor-post-publish-button')
updateBtn.click()

事情崩溃的地方是在txtBox部分......有时有效,有时无效。 我无法始终如一地将焦点转移到文本框并清除它。 有时,当我手动单击内容以尝试查看类名、选择器等时,它会起作用。 但是当我从头到尾运行这些行时,这就是它因以下错误而挂起的地方:

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"#editor > div > div > div > div:nth-child(4) > div > div > div > div > div > form > div > input[type="text"]"}

驱动程序可能无法通过链接文本找到该元素。您可以尝试其他方法来标识元素。 例如:

find_element_by_idfind_element_by_partial_link_textfind_element_by_xpath

等等。您可以参考 https://www.techbeamers.com/locate-elements-selenium-python/以获取详细示例

如果使用部分文本/xpath 识别元素仍然不适合您,我通常只将宏与 AppRobotic 一起使用来最大化浏览器窗口以保持相对于屏幕的 x/y 坐标相同,使用其 UI 工具识别 x/y 坐标,将鼠标移动到这些坐标并单击。从那里,很容易更新元素:

import win32com.client
x = win32com.client.Dispatch("AppRobotic.API")
x.MoveCursor(100,100)
x.MouseLeftClick
x.Type("{BACKSPACE}")
# wait 200 milliseconds
x.Wait(200)
#Type 'test' while waiting between each letter
x.Type("t")
x.Wait(200)
x.Type("e")
x.Wait(200)
x.Type("s")
x.Wait(200)
x.Type("t")
x.Wait(200)
x.Type("{ENTER}")

最新更新