2016-09-17 3 views
2

Я использую селен Python для автоматизации ввода моего посетителя. Он работал отлично, теперь я хотел попробовать, изменив исходный код. Я видел несколько сообщений о том, что их можно изменить с помощью driver.execute_script(), и он работает для JavaScript, но в моем случае мне нужно изменить исходный код под тегом select. Я смог изменить исходный код, используя inspect element. Ниже приведен select теги исходный код:Python selenium - изменение исходного кода веб-страницы

<select name="date1"> 
    <option value="2016-09-17">2016-09-17</option> 
    <option value="2016-09-16">2016-09-16</option> 
    <option value="2016-09-14">2016-09-14</option> 
</select> 

Я пытался сделать это с driver.execute_script(). Ниже мой код:

sel = driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/form/table/tbody/tr[2]/td[3]/select') 
input_list = sel.find_element_by_tag_name('option') 
cmd = "input_list.value = '2016-09-07'" 
driver.execute_script(cmd) 

Но приведенный выше код дает мне следующее сообщение об ошибке:

selenium.common.exceptions.WebDriverException: Message: input_list is not defined

Я могу изменить исходный код, используя inspect element окно. Есть ли способ изменить исходный код с помощью селена?

ответ

0

Попробуйте следующее решение и сообщите мне, возникли ли какие-либо проблемы:

driver.execute_script("""document.querySelector("select[name='date1'] option").value="2016-09-07";""") 

P.S. Я советую вам не использовать абсолютный XPath в ваших селекторах, но относительный вместо этого

+0

Большое спасибо. Это сработало. В коде была небольшая ошибка, я ее отредактировал. – Jeril

2

Проблема заключается в том, что execute_script выполняет JavaScript внутри браузера [1], который ничего не знает о переменных python в скрипте python. В частности, input_list не определен для JavaScript, так как это переменная python.

Чтобы исправить это, вы можете выбрать элемент внутри файла JavaScript. Чтобы сделать это, вы можете установить ЦМД на что-то вроде этого [2]:

function getElementByXpath(path) { 
 
     return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; 
 
    } 
 

 
    getElementByXpath("/html/body/div[3]/div/div[2]/form/table/tbody/tr[2]/td[3]/select/option[1]").value = '2016-09-07';
<html> 
 
    <body> 
 
    <div></div> 
 
    <div></div> 
 
    <div> 
 
     <div> 
 
     <div></div> 
 
     <div> 
 
      <form> 
 
      <table> 
 
       <tbody> 
 
       <tr></tr> 
 
       <tr> 
 
        <td></td> 
 
        <td></td> 
 
        <td> 
 
        <select name="date1"> 
 
         <option value="2016-09-17">2016-09-17</option> 
 
         <option value="2016-09-16">2016-09-16</option> 
 
         <option value="2016-09-14">2016-09-14</option> 
 
        </select> 
 
        </td> 
 
       </tr> 
 
       </tbody> 
 
      </table> 
 
      </form> 
 
     </div> 
 
     </div> 
 
    </div> 
 

[1] https://selenium-python.readthedocs.io/api.html#selenium.webdriver.remote.webdriver.WebDriver.execute_script

[2] Is there a way to get element by Xpath using JavaScript in Selenium WebDriver?

+0

Большое спасибо, но сценарий, предложенный Андерсоном, работал без дополнительного JavaScript. – Jeril