Как найти элемент на веб-странице, используя Selenium и Python 3.6 - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь подготовить скрипт 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]')

Не могли бы вы посоветовать мне, как мне решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 02 апреля 2019

Меню Copy Xpath не очень хороший инструмент, по моему мнению.На самом деле вы должны избегать использования локатора Xpath и использовать его только в качестве крайней меры.Сначала вы должны проверить:

1) Если элемент имеет идентификатор, имя или className, это идеальный локатор, поэтому у вас есть прямой доступ к элементу

2) Если вы можете CSSлокатор

3) Только тогда вы должны использовать локатор xpath.

xpath - очень слабый локатор, как будто завтра разработчик внешнего интерфейса изменяет веб-страницу и помещает заголовок над полем имени пользователя(тот, к которому вы пытаетесь обратиться), найденный вами 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">

name = "ИМЯ ПОЛЬЗОВАТЕЛЯ"

Разработчик может переместить ввод в любое место на странице, и вашtest все равно найдет элемент и не сломается.

Так что просто используйте: driver.find_element_by_name ("USERNAME");чтобы найти элемент.

Существуют более эффективные способы сделать это (объектная модель страницы), но сейчас, так как вы учитесь, этот путь вполне подойдет.

Удачи!

0 голосов
/ 02 апреля 2019

Из ваших испытаний кода /html/body/div/form/div/div[5]/input[1] кажется, вы пытаетесь найти тег <input> adhusent для элемента с текстом как Имя пользователя .Чтобы отправить последовательность символов в нужное поле, вам нужно настроить 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
    
0 голосов
/ 02 апреля 2019

Все, что вам нужно сделать, это дождаться поля имени пользователя и затем взаимодействовать с ним.

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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...