Поиск URL-адреса кнопки отправки с помощью Selenium Python

#python #selenium

Вопрос:

Я пытаюсь добраться до URL-адреса за кнопкой отправки:

HTML

  from selenium import webdriver

browser = webdriver.Safari(executable_path = '/usr/bin/safaridriver') 

#Fill in the required field
default_input = '111'
browser.get('https://trackapkg.com/aramex-tracking-number')
field = browser.find_element_by_xpath('//*[@id="ShipmentNumber"]')
field.send_keys(default_input)

url = browser.current_url 

#Click submit button to get the new URL
browser.find_element_by_xpath("//span[@class='input-group-btn']").click();
while url == browser.current_url:
    time.sleep(5)
url = browser.current_url
print(url)
 

Отправка работ (хотя и непоследовательно), но, по-видимому, есть проблема с Xpath для самой кнопки, поэтому она не нажимается, и URL-адрес не может быть пойман. Я перепробовал несколько вариантов:

 browser.find_element_by_xpath("//*[@id='ShipmentNumber']/input[@class='btn btn-success']").click()
 

Или это:

 browser.find_element_by_xpath("//input[@class='btn btn-success']").click()
 

Но все равно могу найти решение. Я буду признателен за ваш совет

Ответ №1:

Вещи, которые нужно записать.

  1. Используйте Explicit waits для большей стабильности.
  2. Используйте относительный xpath, предпочитайте css xpath. Также я вижу id , что и » Имя «уникально, поэтому используйте id и «Имя», а не xpath . Пожалуйста, смотрите иллюстрацию ниже.
  3. Запустите браузер в full screen mode .
  4. Когда мы нажимаем на GO кнопку , она открывает new tab , в Selenium мы должны сначала переключиться на новую вкладку, прежде чем обращаться к чему-либо в новой вкладке.

Пример кода:

 from selenium import webdriver

browser = webdriver.Safari(executable_path = '/usr/bin/safaridriver')

browser.maximize_window()
browser.implicitly_wait(50)
wait = WebDriverWait(browser, 20)
driver.get("https://trackapkg.com/aramex-tracking-number")
default_input = '111'

field = wait.until(EC.visibility_of_element_located((By.ID, "ShipmentNumber")))
field.send_keys(default_input)


url = browser.current_url
print('current url', url)

#Click submit button to get the new URL
wait.until(EC.element_to_be_clickable((By.NAME, "track"))).click()
time.sleep(5)

#When we click on GO, it opens a new tab, in Selenium we have to switch to new tab first before accessing anything in the new tab.

all_handles = browser.window_handles
browser.switch_to.window(all_handles[1])
new_url = browser.current_url
print('new url', new_url)
 

Выход :

 current url https://trackapkg.com/aramex-tracking-number
new url https://www.aramex.com/in/en/track/shipment-details?q=c2hpcG1lbnRJZD0xMTEmcHJvZHVjdEdyb3VwPUZSVCZzaGlwbWVudFR5cGU9Y2FyZ293aXNlJnNlYXJjaE1vZGU9YnlJZCY=-nc4VTy84z6w=
 

Комментарии:

1. Это творит чудеса! И отдельное спасибо вам за то, что отметили новую вкладку, которая может стать моим следующим выпуском

Ответ №2:

Ошибка может заключаться в том, что вы не дождались, пока элемент станет доступным для кликабельности. Вы могли бы использовать

 from selenium.webdriver.support.ui import WebDriverWait

submit = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//input[@class='btn btn-success']"))) 
submit.click()
 

Комментарии:

1. К сожалению, это не так. Ошибка появляется прямо в тот момент, когда вводится ввод без какого-либо времени ожидания

Ответ №3:

Если щелчки по кнопке прерываются в браузере safari. Тогда вот один обходной путь. Вы можете использовать клавишу ввода, чтобы нажать на поле поиска.

 default_input = '111'
browser.get('https://trackapkg.com/aramex-tracking-number')
field = browser.find_element_by_xpath('//*[@id="ShipmentNumber"]')
field.send_keys(default_input)
field.send_keys(Keys.ENTER)
 

Вам необходимо импортировать следующую библиотеку.

 from selenium.webdriver.common.keys import Keys
 

Поэтому ваш блок кода будет выглядеть следующим образом

 default_input = '111'
browser.get('https://trackapkg.com/aramex-tracking-number')
field = browser.find_element_by_xpath('//*[@id="ShipmentNumber"]')
field.send_keys(default_input)

url = browser.current_url 

field.send_keys(Keys.ENTER)# press enter key for search

time.sleep(1) # wait for 1 second to check
while url == browser.current_url:
    time.sleep(5)
url = browser.current_url
print(url)