如何使用Selenium和Python定位网页上的元素 3.6

How to locate an element on the webpage using Selenium and Python 3.6

我正在尝试为 selenium 中的一个进程自动化准备 python 脚本。这是我第一次使用 xpath,我不知道为什么这个 xpath 不起作用。

我从 chrome webinspect (F12) 得到它并点击文本框并复制为 xpath: '/html/body/div/form/div/div[5]/input[1]' 但是 python 说程序在页面上找不到这样的 xpath,你能帮我解决这个问题吗?

我还认为可能 python 试图检查得太快所以我试图延迟它直到页面加载但它没有用。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common import by
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox(executable_path='C:\webdrive\geckodriver.exe')

url= "https://b2b-sso.bmw.com/login/login_b2b.fcc? TYPE=33619969&REALMOID=06-88882215-3ed6-4d48-a202-c1198bb66e4d&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$fF%2fInZ1t%2b%2f1x7LPZ9ZpPr3Jmh3cKinaBuNkYKXWRFpXzW38w4hPWpxtCselZqile&TARGET=$SM$HTTPS%3a%2f%2fb2b%2ebmw%2ecom%2fgroup%2fb2b%3flang%3den"

driver.get(url)


try:
element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.xpath('//*[@id="mainContent"]/div[2]/ul/li[2]/a')))
)
finally:

us =     driver.find_element_by_xpath('/html/body/div/form/div/div[5]/input[1]')

请问我该如何解决?

您所要做的就是等待用户名字段,然后与之交互。

driver = webdriver.Firefox(executable_path='C:\webdrive\geckodriver.exe')

url= "https://b2b-sso.bmw.com/login/login_b2b.fcc? TYPE=33619969&REALMOID=06-88882215-3ed6-4d48-a202-c1198bb66e4d&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$fF%2fInZ1t%2b%2f1x7LPZ9ZpPr3Jmh3cKinaBuNkYKXWRFpXzW38w4hPWpxtCselZqile&TARGET=$SM$HTTPS%3a%2f%2fb2b%2ebmw%2ecom%2fgroup%2fb2b%3flang%3den"

driver.get(url)
userName = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//input[@name='USERNAME']")))
userName.send_keys("hello")

这里是通用的 xpath 表示法。

//tag[@attribute='attribute_value']

如果你想指定更多的属性,那么使用下面的。

//tag[@attribtue1='attribute_value1' and @attribute2 = 'attribute_value2']

在我看来,Copy Xpath 菜单不是一个好工具。实际上,您应该避免使用 Xpath 定位器,并且仅将其用作最后的手段。您应该首先检查:

1) 如果元素有 id、name 或 className,这是理想的定位器,因此您可以直接访问元素

2) 如果可以的话,CSS 定位器

3) 只有这样你才应该使用 xpath 定位器。

xpath 是一个非常弱的定位器,就好像明天前端开发人员更改网页并将一些 header 放在用户名字段(您尝试访问的那个)上方,您找到的 Xpath“ /html/body/div/form/div/div[5]/input[1]" 将更改,您的代码将中断。

现在,如果您直接访问您的元素:

<input onkeypress="return Kernel.submitFormOnEnter(event)" tabindex="1" class="loginField loginFieldUser" name="USERNAME" size="13">

姓名="USERNAME"

开发人员可以将输入移动到页面中的任何位置,您的测试仍会找到元素并且不会中断。

所以只需使用:driver.find_element_by_name("USERNAME");找到元素。

有更好的方法可以做到这一点(第 Object 页模型),但目前您正在学习这种方式应该没问题。

祝你好运!

从您的代码试验来看,/html/body/div/form/div/div[5]/input[1] 看来您正试图找到 <input> 标签附加到文本为 Username 的元素。要将 字符序列 发送到所需的字段,您需要为所需的 元素诱导 WebDriverWait 可点击 并且您可以使用以下任一项 :

  • 使用CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.loginField.loginFieldUser[name='USERNAME']"))).send_keys("mikzielinski")
    
  • 使用XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='loginField loginFieldUser' and @name='USERNAME']"))).send_keys("mikzielinski")
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC