如何访问 selenium 网络驱动程序中没有名称属性的 div 按钮?

How to access button of div that has no name attribute in selenium web driver?

我写了这段代码,想用 selenium web driver 登录 Twitter。但是之后 填写用户名 我无法单击 下一步 按钮,因为它没有nameid 属性。我该怎么做?

from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())

driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://twitter.com/login?lang=en-gb")
time.sleep(3)
driver.find_element_by_name('text').send_keys('username')
time.sleep(3)
driver.find_element_by_class_name('').click()

time.sleep(3)
print('TEst Completed')

要单击 Next 元素,您可以使用以下任一方法 :

  • 使用 xpathtext():

    driver.find_element(By.XPATH, "//span[text()='Next']").click()
    
  • 使用 xpathcontains():

    driver.find_element(By.XPATH, "//span[contains(., 'Next')]").click()
    

在 Chrome 中,您可以通过右键单击感兴趣的元素(Next 按钮)并从弹出窗口中 selecting Inspect 来调出检查器。然后在 Inspector window 中,用鼠标右键单击您感兴趣的元素(它应该已经突出显示),然后 select Copy 然后 Copy full XPath。然后,您可以将结果粘贴到 find_element_by_xpath 调用中。

顺便说一句,如果您希望您的程序以慢动作 运行 来查看正在发生的事情,那么使用 time.sleep 调用是可以的,但是如果您希望它 运行 以最快的速度,您应该首先调用 driver.implcitly_wait(n),其中 n 是一些秒数(例如,3)。然后,当您在 driver.get 之后执行 find_element 调用时,驱动程序将在超时前最多等待 3 秒让所需元素出现,但不会等待超过必要的时间。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())

try:
    driver = webdriver.Chrome()
    driver.maximize_window()
    # Wait for up to 3 seconds (but maybe less) for sought after
    # elemt to appear:
    driver.implicitly_wait(3)
    driver.get("https://twitter.com/login?lang=en-gb")
    driver.find_element_by_name('text').send_keys('username')
    driver.find_element_by_xpath('/html/body/div/div/div/div[1]/div/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[1]/div/div[6]/div/span/span').click()
    print('Test Completed')
except Exception as e:
    print("Got exception:", e)
finally:
    # Come here even on exceptions to be sure we "quit" the driver:
    input('Pausing until you hit enter...')
    driver.quit()

更新

并非每个元素都有固定的 idname 甚至 class 属性。
在这种特殊情况下,元素具有动态 class 名称,因此这里最稳定的方法是使用 Next 文本。
这可以使用 XPath 定位器完成,如下所示:

driver.find_element_by_xpath("//span[text()='Next']").click()