Как динамически обновлять xpath на основе значения из книги, используя python / selenium - PullRequest
1 голос
/ 03 июля 2019

Я должен выбрать любой год в зависимости от года, указанного в листе Excel, сейчас я дал год непосредственно в коде. Возможность получить данные, написанные для города, непосредственно из листа Excel, и также работает жесткое кодирование года. .В проблеме есть n лет в виде ссылок (не в раскрывающихся списках) вместо написания xpath для каждого года, есть ли способ получить значение, указанное в листе Excel, и поместить его в xpath, например, «год»? , Yearlink = driver.find_element_by_xpath ( '// диапазон [содержит (текст (), "год")]'); Я сейчас использую spyder-python 3.7

Пожалуйста, найдите код, который я пробовал

driver = webdriver.Chrome  
driver.fullscreen_window();
driver.get('url');
time.sleep(5) 
Workbook=xlrd.open_workbook("excel path")
Details = Workbook.sheet_by_index(0);
city=Details .cell(1,0)
Citytextbox=driver.find_element_by_xpath('//input[@id="city"]');
Citytextbox.send_keys(city.value);
Yearlink=driver.find_element_by_xpath('//span[contains(text(),"2000")]');
Yearlink.click();
time.sleep(10)

Обновление: добавление некоторой части html, если есть какие-либо другие методы, также сообщите мне

<span _ngcontent-c26="" class="toggle link" ng-reflect-klass="toggle link" ng-reflect-ng-class="">

        1910

      </span>

    </li><li _ngcontent-c26="" class="option">

      <span _ngcontent-c26="" class="toggle link" ng-reflect-klass="toggle link" ng-reflect-ng-class="">

        1911

      </span>

    </li><li _ngcontent-c26="" class="option">

      <span _ngcontent-c26="" class="toggle link" ng-reflect-klass="toggle link" ng-reflect-ng-class="">

        1912

      </span>

    </li><li _ngcontent-c26="" class="option">

      <span _ngcontent-c26="" class="toggle link" ng-reflect-klass="toggle link" ng-reflect-ng-class="">

        1913

      </span>

    </li><li _ngcontent-c26="" class="option">

      <span _ngcontent-c26="" class="toggle link" ng-reflect-klass="toggle link" ng-reflect-ng-class="">

        1914

      </span>

    </li><li _ngcontent-c26="" class="option">

      <span _ngcontent-c26="" class="toggle link" ng-reflect-klass="toggle link" ng-reflect-ng-class="">

        1915

      </span>

    </li><li _ngcontent-c26="" class="option">

      <span _ngcontent-c26="" class="toggle link" ng-reflect-klass="toggle link" ng-reflect-ng-class="">

        1916

      </span>    

UPDATE Когда я пытаюсь описать метод ниже, я получаю эту ошибку. Я передаю значение 1979 из Excel, я передаю '1979 из Excel, если я не добавляю', он принимает его как числовое значение.

InvalidSelectorException: invalid selector: Unable to locate an element with the xpath expression //span[normalize-space(.)='text:'1979''] because of the following error:
SyntaxError: Failed to execute 'evaluate' on 'Document': The string '//span[normalize-space(.)='text:'1979'']' is not a valid XPath expression. 

Excel изображение Excel screenshots

Ответы [ 2 ]

1 голос
/ 08 июля 2019

С точки зрения локатора, в идеале вы хотите сделать это:

year_from_excel = "2000"
year_link = driver.find_element_by_xpath("//span[normalize-space(.)='{}']".format(year_from_excel))

Это приведет к использованию следующего пути:

//span[normalize-space(.)='2000']

Это XPath, который найдет элемент <span> с текстом 2000, однако при сравнении будет удален весь окружающий пробел.

Следующим шагом является обеспечение того, чтобы year_from_excel было установлено в значение в вашей электронной таблице Excel. Исходя из вашего существующего кода, я собираюсь пойти на:

workbook = xlrd.open_workbook("excel path")
sheet = workbook.sheet_by_index(0)
year_from_excel = sheet.cell(1, 1)

Я не знаю, как отформатирован ваш лист Excel, так что это может быть неправильно. Я сделал предположение, что значение года находится в той же строке, но в следующем столбце.

Итак, если вы соберете все это вместе, вы получите:

workbook = xlrd.open_workbook("excel path")
sheet = workbook.sheet_by_index(0)
year_from_excel = sheet.cell(1, 1)
year_link = driver.find_element_by_xpath("//span[normalize-space(.)='{}']".format(year_from_excel))
year_link.click()
0 голосов
/ 16 июля 2019

Мне удалось найти решение на основе предоставленных предложений. Необходимо добавить «Значение», чтобы вышеуказанное решение работало

workbook = xlrd.open_workbook("excel path")
sheet = workbook.sheet_by_index(0)
year_from_excel = sheet.cell(1, 1)
year_link = driver.find_element_by_xpath("//span[normalizespace(.)='{}']".format(year_from_excel.Value))
year_link.click()
...