Селен Python, как я могу удалить элемент?

Я пытался последний час удалить элемент без каких-либо успехов. И доступ к элементу возможен только через имя класса. Я пытался:

js = "var aa=document.getElementsByClassName('classname')[0];aa.parentNode.removeChild(aa)"
driver.execute_script(js)

Я получаю сообщение об ошибке, что parentNode не определен.

Итак, как лучше всего удалить элемент с помощью Selenium?


person Captain_Meow_Meow    schedule 19.03.2014    source источник


Ответы (2)


getElementByClassName не является методом document. Вы захотите использовать

getElementsByClassName('classname')[0]...

но только если вы уверены, что это единственный с этим классом.

person jstaab    schedule 19.03.2014
comment
о, спасибо, я тоже его отредактировал, но остается вопрос, как удалить элемент :) - person Captain_Meow_Meow; 19.03.2014
comment
Ваш метод должен работать. Если .parentNode не определено, то aa не является узлом (или это тег тела или что-то в этом роде). ты добавил [0]? - person jstaab; 19.03.2014
comment
Я сделал, затем добавил «удаляемый объект», и теперь он работает, спасибо за помощь! - person Captain_Meow_Meow; 19.03.2014

Я не знаю метода Selenium, разработанного специально для удаления элементов. Однако вы можете сделать это с помощью:

element = driver.find_element_by_class_name('classname')
driver.execute_script("""
var element = arguments[0];
element.parentNode.removeChild(element);
""", element)

find_element_by_class_name вызовет исключение, если элемент не существует. Таким образом, вам не нужно проверять, установлено ли element разумное значение. Если метод возвращается, то он установлен. Затем вы передаете элемент обратно в execute_script. Аргументы, переданные в execute_script в Python, отображаются в JavaScript как объект arguments. (Это то же самое, что и объект arguments, который вы обычно получаете с любой функцией JavaScript. За кулисами Selenium оборачивает код JavaScript в анонимную функцию.)

Или вы можете использовать решение, основанное на JavaScript, для поиска элемента:

driver.execute_script("""
var element = document.querySelector(".classname");
if (element)
    element.parentNode.removeChild(element);
""")

Это решение гораздо лучше, если вы используете удаленный сервер для запуска теста (например, Sauce Labs или BrowserStack). Стоимость связи между клиентом Selenium и сервером незначительна.

person Louis    schedule 19.03.2014