#python #selenium
Вопрос:
Я пытаюсь добраться до URL-адреса за кнопкой отправки:
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:
Вещи, которые нужно записать.
- Используйте
Explicit waits
для большей стабильности. - Используйте относительный xpath, предпочитайте css xpath. Также я вижу
id
, что и » Имя «уникально, поэтому используйтеid
и «Имя», а неxpath
. Пожалуйста, смотрите иллюстрацию ниже. - Запустите браузер в
full screen mode
. - Когда мы нажимаем на
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)