#python #selenium
#python #selenium
Вопрос:
Я новичок в Python, но я искал в течение последнего часа о том, как это сделать, и этот код почти работает. Мне нужно открыть каждую категорию в сворачивающемся (выпадающем) меню, а затем Ctrl t для каждой ссылки в этом now .active классе. Открывается браузер, и также открываются все категории, но я не получаю ни одной из активных ссылок, открываемых на новых вкладках. Я был бы признателен за любую помощь.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("pioneerdoctor.com/productpage.cfm")
cat = driver.find_elements_by_css_selector("a[href*='Product_home']")
for i in cat:
i.click()
child = driver.find_elements_by_css_selector("li.active > a[href*='ProductPage']")
for m in child:
m.send_keys(Keys.CONTROL 't')
Редактировать:
Вот текущий обходной путь, который я получил, записав в текстовый файл и используя webbrowser. Единственная проблема, которую я вижу, заключается в том, что он записывает дубликаты результатов несколько раз. Позже я просмотрю комментарии, чтобы узнать, смогу ли я заставить его работать лучше (что, я уверен, есть).
from selenium import webdriver
import webbrowser
print("Opening Google Chrome..")
driver = webdriver.Chrome()
driver.get("http://pioneerdoctor.com/productpage.cfm")
driver.implicitly_wait(.5)
driver.maximize_window()
cat = driver.find_elements_by_css_selector("a[href*='Product_home']")
print("Writing URLS to file..")
for i in cat:
i.click()
child = driver.find_elements_by_css_selector("a[href*='ProductPage']")
for i in child:
child = i.get_attribute("href")
file = open("Output.txt", "a")
file.write(str(child) 'n')
file.close()
driver.quit
file = open("Output.txt", "r")
Loop = input("Loop Number, Enter 0 to quit: ")
Loop = int(Loop)
x = 0
if Loop == 0:
print("Quitting..")
else:
for z in file:
if x == Loop:
break
print("Done.n")
else:
webbrowser.open_new_tab(z)
x = 1
Комментарии:
1. каков реальный URL?
2. pioneerdoctor.com/productpage.cfm
3. Спасибо за тестирование — я получал сообщение об ошибке не удается найти элемент, которое я вырезал, развернув окно, прежде чем что-либо делать. Я соответствующим образом отредактирую код. Я думал о том, чтобы, возможно, записать «дочерний» список в текстовый файл, выйти из драйвера и прочитать эти строки через цикл для webbrowser. откройте в новой вкладке. Не уверен, что это лучший способ продолжить здесь. — Да, нет .active . Список становится активным, и я пытаюсь получить доступ ко 2-й ссылке, являющейся его потомком, поэтому я ввел («li.active > a[href*=’ProductPage’]»), чтобы уточнить.
Ответ №1:
Ни одна из ссылок в этих категориях не найдена, потому что css-селектор для ссылок неверен. Удалите >
вход li.active > a[href*='ProductPage']
. Почему? p > q
дает вам непосредственные дочерние элементы p. Space или «p q» дает вам все «q» внутри p. Интересующие вас ссылки НЕ являются непосредственными дочерними элементами li. Они находятся внутри UL, который находится внутри li.
Другая проблема заключается в том, как вы открываете ссылки на новых вкладках. Вместо этого используйте этот код:
combo = Keys.chord(Keys.CONTROL, Keys.RETURN)
m.sendKeys(combo)
Вот как я это делаю на Java. Я думаю, что в python должны быть Keys.chord. На вашем месте я бы открыл ссылки в другом экземпляре браузера. Я видел, что переключение между вкладками и окнами плохо поддерживается самим selenium. Могут случиться плохие вещи.
Прежде чем пытаться использовать какие-либо вкладки, создайте простой пример, чтобы открыть новую вкладку и вернуться к предыдущей вкладке. Выполните движение вперед и назад 3-4 раза. Работает ли это гладко? Хорошо. Затем сделайте это с 3-5 вкладками. Расскажите мне, как прошел ваш опыт.
Комментарии:
1. Я изучал CSS в прошлом году, поэтому я не уверен в своих селекторах, но вы правы. Я разберусь с этим. Это Keys.chord именно то, что я ищу. Небольшое тестирование — отличный способ разобраться. Легко перейти к тому, чтобы сделать это как можно более «готовым», но это гораздо сложнее протестировать. Несколько действительно отличных советов. Спасибо за вашу помощь, Джо! Первый раз на Stack Overflow, и это был отличный опыт.