如何使用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
我正在尝试为 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