Установка флажков с помощью веб-драйвера selenium с помощью python

#python #selenium #xpath #checkbox

#python #selenium #xpath #флажок

Вопрос:

Я пытаюсь выполнить тест на Amazon.com флажки категорий с использованием веб-драйвера selenium с кодом python, и я попробовал несколько способов, но я не уверен, как установить флажок категории книг, например, без указания ее идентификатора или имени. Я использовал некоторые плагины, чтобы получить правильный xpath, например XPath Helper для Chrome и path checker в Firefox…

Вот мой код, и мои попытки прокомментированы.

 from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from time import sleep
import unittest

class Test_PythonOrg(unittest.TestCase):

    def setUp(self):
        self.browser = webdriver.Firefox()

    def tearDown(self):
        sleep(4)
        self.browser.close()
        self.browser = None


    def test_07_ListOfTodayDeals(self):
        self.browser.get("http://www.amazon.com")
        deals = self.browser.find_element_by_link_text("Today's Deals")
        deals.click()
        books = self.browser.find_element_by_id("widgetFilters")
        books.find_element_by_xpath("/x:div[1]/x:div/x:span[8]/x:div/x:label/x:span").click()

        #for i in range(20):
            #try:
                #self.browser.find_element_by_xpath(".//*[contains(text(), 'Books')]").click()
                #break
            #except NoSuchElementException as e:
                #print('retry')
                #time.sleep(1)
        #else:
            #print('Test Failed')

        browser.close()
        #sign_in_button = self.browser.find_element(By_XPATH,'(//input[@name=''])[8]')
        #sign_in_button.find_element_by_xpath("//select[@name='element_name']/option[text()='option_text']").click()
        #sleep(5)
        #self.assertTrue("No results found." not in self.browser.page_source)



if __name__ == "__main__":
    unittest.main(verbosity=2)
  

HTML

 <span class="a-declarative" data-action="gbfilter-checkbox" data-gbfilter-checkbox="{amp;quot;attributeamp;quot;:amp;quot;whitelist_categoriesamp;quot;,amp;quot;valueamp;quot;:amp;quot;283155amp;quot;,amp;quot;rangeEndamp;quot;:amp;quot;amp;quot;,amp;quot;rangeStartamp;quot;:amp;quot;amp;quot;,amp;quot;filterTypeamp;quot;:amp;quot;checkboxesamp;quot;}">

                <div class="a-checkbox checkbox checked a-spacing-micro"><label><input name="" value="" checked="" type="checkbox"><i class="a-icon a-icon-checkbox"></i><span class="a-label a-checkbox-label">


                        Books
                </span></label></div>

        </span>
  

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

1. Не могли бы вы также поделиться соответствующим HTML

2. просто добавил HTML в сообщение

Ответ №1:

Я решил свою проблему с помощью очень простой строки кода, используя правильный xpath:

 self.browser.find_element_by_xpath("(//input[@name=''])[8]").click()
  

и это отлично сработало!

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

1. Что произошло, если вы попробовали мой предложенный ответ?? Потому что ваше решение не будет более стабильным, если элемент checkbox изменит свой индекс позиции..

2. Обе предложенные строки кода плохо работали со мной, извините за это и спасибо за сотрудничество.

Ответ №2:

Я изменил ваш код, и теперь он работает

 from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from time import sleep
import unittest

class Test_PythonOrg(unittest.TestCase):

    def setUp(self):
        self.browser = webdriver.Firefox()

    def tearDown(self):
        sleep(4)
        self.browser.close()
        self.browser = None


    def test_07_ListOfTodayDeals(self):
        self.browser.get("http://www.amazon.com")
        deals = self.browser.find_element_by_link_text("Today's Deals")
        deals.click()
        sleep(5)
        self.browser.find_element_by_xpath("//span[@class='a-label a-checkbox-label' and contains(text(),'Books')]/preceding-sibling::input[1]").click()
        self.browser.close()


if __name__ == "__main__":
    unittest.main(verbosity=2)
  

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

1. Я проверил свою машину, она работает идеально. можете ли вы дать мне свою конфигурацию